I had the same problem (frustrating) but knew it could be done because I'd seen http://paulharris.paulharris.com/catalog/default.php. I couln't find an answer so I've started hacking something together in product_listing.php. It basically uses code from new_products.php. This hasn't been fully tested for pagination yet but the basics are here. Note that this version displays 6 columns of products but this can easily by changed by editing line 54 (if ($col > 5)) and changing td width on line 51 (in the params for the $info_box_contents_array). HTH! :D
<?php
/*
$Id: product_listing.php,v 1.40 2002/11/23 02:08:11 thomasamoulton Exp $
osCommerce, Open Source E-Commerce Solutions
http://www.oscommerce.com
Copyright (c) 2002 osCommerce
Released under the GNU General Public License
*/
?>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<?php
$listing_numrows_sql = $listing_sql;
$listing_split = new splitPageResults($HTTP_GET_VARS['page'], MAX_DISPLAY_SEARCH_RESULTS, $listing_sql, $listing_numrows);
// fix counted products
$listing_numrows = tep_db_query($listing_numrows_sql);
$listing_numrows = tep_db_num_rows($listing_numrows);
if ($listing_numrows > 0 && (PREV_NEXT_BAR_LOCATION == '1' || PREV_NEXT_BAR_LOCATION == '3')) {
?>
<tr>
<td><table border="0" width="100%" cellspacing="0" cellpadding="2">
<tr>
<td class="smallText"> <?php echo $listing_split->display_count($listing_numrows, MAX_DISPLAY_SEARCH_RESULTS, $HTTP_GET_VARS['page'], TEXT_DISPLAY_NUMBER_OF_PRODUCTS); ?> </td>
<td align="right" class="smallText"> <?php echo TEXT_RESULT_PAGE; ?> <?php echo $listing_split->display_links($listing_numrows, MAX_DISPLAY_SEARCH_RESULTS, MAX_DISPLAY_PAGE_LINKS, $HTTP_GET_VARS['page'], tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?> </td>
</tr>
</table></td>
</tr>
<tr>
<td><?php echo tep_draw_separator(); ?></td>
</tr>
<?php
}
?>
<tr>
<td>
<?
$info_box_contents = array();
$row = 0;
$col = 0;
if ($listing_numrows > 0) {
$number_of_products = '0';
$listing = tep_db_query($listing_sql);
while ($listing_values = tep_db_fetch_array($listing)) {
$listing_values['products_name'] = tep_get_products_name($listing_values['products_id']);
$info_box_contents[$row][$col] = array('align' => 'center',
'params' => 'class="smallText" width="16%" valign="top"',
'text' => '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $listing_values['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $listing_values['products_image'], $listing_values['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a><br><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $listing_values['products_id']) . '">' . $listing_values['products_name'] . '</a><br>' . $currencies->display_price($listing_values['products_price'], tep_get_tax_rate($listing_values['products_tax_class_id'])));
$col ++;
if ($col > 5) {
$col = 0;
$row ++;
}
}
new contentBox($info_box_contents);
echo ' </td>' . "n";
echo ' </tr>' . "n";
} else {
?>
<tr class="productListing-odd">
<td class="smallText"> <?php echo ($HTTP_GET_VARS['manufacturers_id'] ? TEXT_NO_PRODUCTS2 : TEXT_NO_PRODUCTS); ?> </td>
</tr>
<?php
}
?>
<tr>
<td><?php echo tep_draw_separator(); ?></td>
</tr>
<?php
if ($listing_numrows > 0 && (PREV_NEXT_BAR_LOCATION == '2' || PREV_NEXT_BAR_LOCATION == '3')) {
?>
<tr>
<td><table border="0" width="100%" cellspacing="0" cellpadding="2">
<tr>
<td class="smallText"> <?php echo $listing_split->display_count($listing_numrows, MAX_DISPLAY_SEARCH_RESULTS, $HTTP_GET_VARS['page'], TEXT_DISPLAY_NUMBER_OF_PRODUCTS); ?> </td>
<td align="right" class="smallText"> <?php echo TEXT_RESULT_PAGE; ?> <?php echo $listing_split->display_links($listing_numrows, MAX_DISPLAY_SEARCH_RESULTS, MAX_DISPLAY_PAGE_LINKS, $HTTP_GET_VARS['page'], tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?> </td>
</tr>
</table></td>
</tr>
<?php
}
?>
</table>