Как разделить прайс лист на страницы

Статус
В этой теме нельзя размещать новые ответы.
Ладно народ уговорили!
надоело мне видеть данную тему с бессмыслеными топиками. просьба модераторов закройте ее!
Я же в свою очередь выкладываю алгаритм разбиения по листам с фиксированым количеством товаров!
Заметьте имено фиксированом товаров а не строк. тоесть если вы ставите показывать 10 позиций то строк будет всеравно больше пример:
Код:
-Категория1
--Категория2
---Категория3
----Товар 1
----Товар 2
----Товар 3
----Товар 4
----Товар 5
----Товар 6
----Товар 7
----Товар 8
----Товар 9
----Товар 10

Итого строк 13 товаров отображено 10

другой вариант

Код:
-Категория1
--Категория2
---Категория3-1
----Товар 1
---Категория3-2
----Товар 2
---Категория3-3
----Товар 3
---Категория3-4
----Товар 4
---Категория3-5
----Товар 5
---Категория3-6
----Товар 6
---Категория3-7
----Товар 7
---Категория3-8
----Товар 8
---Категория3-9
----Товар 9
---Категория3-10
----Товар 10
Итого строк 22 товаров отображено 10

Как видите во втором варианте количество ссылок резко возрастает так что при настройке скрипта вам надо это учитавать.
Я не буду расписывать где что поменял в файле вот текст файла includes/pricelist.php просто заменяйте все на это.
PHP:
<?php
	define("MAX_TOWAR_IN_PRAIS_LIST",20);
	// show whole price list
	$_GET["mmm"]=0;
	function pricessCategories($parent,$level)
	{
		//same as processCategories(), except it creates a pricelist of the shop
		$out = array();
		$cnt = 0;
		$q1 = db_query("select categoryID, name from ".CATEGORIES_TABLE.
			" where parent=$parent order by sort_order, name") or die (db_error());
		while (($row = db_fetch_row($q1))&&($_GET["mmm"]<MAX_TOWAR_IN_PRAIS_LIST+$_GET["page"])){
			//define back color of the cell
			$r = hexdec(substr(CONF_MIDDLE_COLOR, 0, 2)); 
			$g = hexdec(substr(CONF_MIDDLE_COLOR, 2, 2)); 
			$b = hexdec(substr(CONF_MIDDLE_COLOR, 4, 2)); 
			$m = (float)max($r, max($g,$b));
			$r = round((190+20*min($level,3))*$r/$m);
			$g = round((190+20*min($level,3))*$g/$m);
			$b = round((190+20*min($level,3))*$b/$m);
			$c = dechex($r).dechex($g).dechex($b); //final color

			//add category to the output
			$out[$cnt][0] = $row[0];
			$out[$cnt][1] = $row[1];
			$out[$cnt][2] = $level;
			$out[$cnt][3] = $c;
			$out[$cnt][4] = 0; //0 is for category, 1 - product
			$cnt++;

			if ( !isset($_GET["sort"]) )
				$order_clause = "order by sort_order";
			else
			{
				//verify $_GET["sort"]
				switch ($_GET["sort"]){
					default:
						$_GET["sort"] = "name";
					case 'name':
					case 'Price':
					case 'customers_rating':
						break;
				}

				$order_clause = " order by ".$_GET["sort"];
				if ( isset($_GET["direction"]) )
				{
					if ( !strcmp( $_GET["direction"] , "DESC" ) )
						$order_clause .= " DESC ";
					else
						$order_clause .= " ASC ";
				}
			}

			$sql = "
				select productID, name, Price, in_stock from ".PRODUCTS_TABLE.
				" where categoryID=".$row[0]."  and enabled=1 ".
				$order_clause."
			";
			//add products
			$q = db_query( $sql ) or die (db_error());
			while ($row1 = db_fetch_row($q))
			{
				$_GET["mmm"]++;
				if ($_GET["mmm"]>$_GET["page"]&&$_GET["mmm"]<=$_GET["page"]+MAX_TOWAR_IN_PRAIS_LIST){
					if ($row1[2] <= 0)
						$row1[2]= "n/a";
					else
						$row1[2] = show_price($row1[2]);
					//add product to the output
					$out[$cnt][0] = $row1[0];
					$out[$cnt][1] = $row1[1];
					$out[$cnt][2] = $level;
					$out[$cnt][3] = "FFFFFF";
					$out[$cnt][4] = 1; //0 is for category, 1 - product
					$out[$cnt][5] = $row1[2];
					$out[$cnt][6] = $row1[3];
					$cnt++;
				}
			}
			//process all subcategories
			if ($_GET["mmm"]<=($_GET["page"]+MAX_TOWAR_IN_PRAIS_LIST)){
				$sub_out = pricessCategories($row[0], $level+1);
			}
			//add $sub_out to the end of $out
			for ($j=0; $j<count($sub_out); $j++){
				$out[] = $sub_out[$j];
				$cnt++;
			}
 		}
		return $out;
	} //pricessCategories

	function _sortPriceListSetting( &$smarty, $urlToSort )
	{
		$sort_string = STRING_PRICELIST_ITEM_SORT;
		$sort_string = str_replace( "{ASC_NAME}",   
			"<a href='".$urlToSort."&sort=name&direction=ASC'>".STRING_ASC."</a>",	$sort_string );
		$sort_string = str_replace( "{DESC_NAME}",  
			"<a href='".$urlToSort."&sort=name&direction=DESC'>".STRING_DESC."</a>",	$sort_string );
		$sort_string = str_replace( "{ASC_PRICE}",   
			"<a href='".$urlToSort."&sort=Price&direction=ASC'>".STRING_ASC."</a>",	$sort_string );
		$sort_string = str_replace( "{DESC_PRICE}",  
			"<a href='".$urlToSort."&sort=Price&direction=DESC'>".STRING_DESC."</a>",	$sort_string );
		$smarty->assign( "string_product_sort", $sort_string );
	}

	if (isset($_GET["show_price"])) //show pricelist
	{
		_sortPriceListSetting( $smarty, "index.php?show_price=yes" );
		list($max_product)=mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM ".PRODUCTS_TABLE." WHERE `enabled`=1&&categoryID!=1"));
		$max_pages=ceil($max_product/MAX_TOWAR_IN_PRAIS_LIST);
		$_GET["page"]=(isset($_GET["page"])&&(int)$_GET["page"]>=0&&(int)$_GET["page"]<$max_pages)?(int)$_GET["page"]*MAX_TOWAR_IN_PRAIS_LIST:0;
		$pricelist_elements = pricessCategories(1,0);
		$pricelist_elements=array_reverse($pricelist_elements);
		foreach ($pricelist_elements as $key=>$val){
			if ($val[4]==1){
				$maximym=$val[2];
			}else{
				if ($val[2]<=$maximym)$maximym--; else unset($pricelist_elements[$key]);
			}
		}
		$pricelist_elements=array_reverse($pricelist_elements);
		$smarty->assign("pricelist_pages", $max_pages);
		$smarty->assign("pricelist_now_page", (int)$_GET["page"]/MAX_TOWAR_IN_PRAIS_LIST);
		$smarty->assign("pricelist_elements", $pricelist_elements);
		$smarty->assign("main_content_template", "pricelist.tpl.html");
	}

?>
define("MAX_TOWAR_IN_PRAIS_LIST",20); число 20 меняете на свое это и есть строка отвечающая за колличество товаров на странице.

Далее в templates\frontend\tmpl1\pricelist.tpl.html

там где необходимо вывести страницы пишем:

HTML:
<table cellpadding="0" cellspacing="0" border="0"><tr>
{section name=i loop=$pricelist_pages}
<td width="25">{if $smarty.section.i.index ne $pricelist_now_page}<a href="/index.php?show_price=yes&page={$smarty.section.i.index}">{$smarty.section.i.index+1}</a>{else}{$smarty.section.i.index+1}{/if}</td>	
{/section}
</tr></table>
тупые вопросы расцениваю как нежелание разбиратся и их игнорирую!

Подскажите пожалуйста как сделать чтобы номера страниц в 2 строки были, а то при количестве товара в 5000, и выводе MAX_TOWAR_IN_PRAIS_LIST = 100, весь шаблон разъезжается.

Спасибо.
 
Проверил всё ПРОСТО супер работает но вот какая ошибка вылезает.

Если в магазин входит новый человек и прежде чем оплатить заказ регистрируется как новый покупатель после заполнения анкети выводится ошибка с сылкой на файл includes/pricelist.php,
последний символ этогй страницы.

до этих изменений всё было нормально
 
приведи пример ошибки что пишет?
 
Спасибо большое, все классно!
Одно но:
не нравится ему 86 строка:
Notice: Undefined variable: sub_out in /var/www/vhosts/site.com/httpdocs/includes/pricelist.php on line 86

PHP:
for ($j=0; $j<count($sub_out); $j++){ 
                $out[] = $sub_out[$j]; 
                $cnt++; 
            }
 
Спасибо большое, все классно!
Одно но:
не нравится ему 86 строка:
Notice: Undefined variable: sub_out in /var/www/vhosts/site.com/httpdocs/includes/pricelist.php on line 86

PHP:
for ($j=0; $j<count($sub_out); $j++){ 
                $out[] = $sub_out[$j]; 
                $cnt++; 
            }


PHP:
			if ($_GET["mmm"]<=($_GET["page"]+MAX_TOWAR_IN_PRAIS_LIST)){
				$sub_out = pricessCategories($row[0], $level+1);
			}
			//add $sub_out to the end of $out
			for ($j=0; $j<count($sub_out); $j++){
				$out[] = $sub_out[$j];
				$cnt++;
			}

// меняем на

		if ($_GET["mmm"]<=($_GET["page"]+MAX_TOWAR_IN_PRAIS_LIST)){
				$sub_out = pricessCategories($row[0], $level+1);

			//add $sub_out to the end of $out
			for ($j=0; $j<count($sub_out); $j++){
				$out[] = $sub_out[$j];
				$cnt++;
			}
		}
должно помочь
 
Всё разобрался - ошибки нет.

Но Вот с выводом на печать - почемуто выводися каждый раз только 1 страница.

В привед1нном примере сайта - santehnika04.ru/index.php?show_price=yes&page=17

тоже выводит на печать 1 страницу.
 
Всё разобрался - ошибки нет.

Но Вот с выводом на печать - почемуто выводися каждый раз только 1 страница.

В привед1нном примере сайта - santehnika04.ru/index.php?show_price=yes&page=17

тоже выводит на печать 1 страницу.
ты в шаблоне priselist.tpl.html
HTML:
javascript:open_printable_version('printable.php?show_price=yes');
замени на
HTML:
javascript:open_printable_version('printable.php?show_price=yes&page={$pricelist_now_page}');
 
У меня поначалу не получалось перейти на следующие страницы, пока не поправил в коде путь.
Дело в том, что у меня магаз в подкаталоге "shop"

PHP:
<table cellpadding="0" cellspacing="0" border="0"><tr>
{section name=i loop=$pricelist_pages}
<td width="25">{if $smarty.section.i.index ne $pricelist_now_page}
<a href="/shop/index.php?show_price=yes&page={$smarty.section.i.index}">
{$smarty.section.i.index+1}</a>
{else}{$smarty.section.i.index+1}{/if}</td>	
{/section}
</tr></table>

Это на случай, если у кого то похожая ситуация.
 
Да но вот теперь проблема при
Сортировать по: наименованию .......
Сортировать по: наименованию (возр | убыв), цене (возр | убыв)

идет сортиновка только по первой странице прайса а на 2 прайс выводится не отсортированный?


ПОЧЕМУ!!!!!
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху