Jump to content

Как изменить количество отображаемых товаров на одной странице каталога?


Recommended Posts

Пробежался по всему коду, но не смог найти где можно изменить стандартное значение 30 на какое-то другое. Подскажите, пожалуйста, где это делается.

Link to post
Share on other sites

Пробежался по всему коду, но не смог найти где можно изменить стандартное значение 30 на какое-то другое. Подскажите, пожалуйста, где это делается.

Удосужились бы для начала в админке в настройках глянуть и нашли бы там секцию "Настройки каталога", а в ней пункт "Товаров на странице сайта".

Link to post
Share on other sites

Удосужились бы для начала в админке в настройках глянуть и нашли бы там секцию "Настройки каталога", а в ней пункт "Товаров на странице сайта".

 

OMG, что-то я совсем заработался. Спасибо!

Link to post
Share on other sites

Пробежался по всему коду, но не смог найти где можно изменить стандартное значение 30 на какое-то другое. Подскажите, пожалуйста, где это делается.

Вы либо не там искали либо не искали вообще.

Если попробовать поискать в файле view/ProductsView.php, то можно найти такую строку:

$items_per_page = $this->settings->products_num;
Которая как не сложно догадаться отвечает за количество выводимых товаров на одну страницу каталога.
Link to post
Share on other sites

 

Вы либо не там искали либо не искали вообще.

Если попробовать поискать в файле view/ProductsView.php, то можно найти такую строку:

$items_per_page = $this->settings->products_num;
Которая как не сложно догадаться отвечает за количество выводимых товаров на одну страницу каталога.

 

Я искал цифру 30 :)

Link to post
Share on other sites
  • 2 years later...

Подскажите, хочу вывести на странице каталога возможность выбора кол-ва отображаемых товаров.

 

В  view/ProductsView.php заменил код на:

// Показать все страницы сразу
if($this->request->get('page') == 'all')
    $items_per_page = $products_count; 
elseif($this->request->get('limit','integer') > 0)
    $items_per_page = $this->request->get('limit','integer');
 
$filter['limit'] = $items_per_page;
$filter['page'] = $current_page;   
     
$pages_num = ceil($products_count/$items_per_page);
$this->design->assign('total_pages_num', $pages_num);

а потом в products:

<div class="limit">
    Выводить по
    <a {if !$smarty.get.limit || $smarty.get.limit == 20} class="selected"{/if} href="{url limit=20 page=null}">20</a>
    <a {if $smarty.get.limit == 50}    class="selected"{/if} href="{url limit=50 page=null}">50</a>
    <a {if $smarty.get.limit == 100}     class="selected"{/if} href="{url limit=100 page=null}">100</a>
    <a {if $smarty.get.page == 'all'}     class="selected"{/if} href="{url limit=null page=all}">все</a>
</div>

Работает только отображение всех. Остальное нет. Подскажите в чем проблема??

Link to post
Share on other sites

Скорее всего, потому, что замененный код в view/ProductsView.php выполняется ПОСЛЕ того, как выполнен подсчет

 

// Вычисляем количество страниц

$products_count = $this->products->count_products($filter);

Link to post
Share on other sites

Скорее всего, потому, что замененный код в view/ProductsView.php выполняется ПОСЛЕ того, как выполнен подсчет

 

// Вычисляем количество страниц

$products_count = $this->products->count_products($filter);

Вроде нет

вот весь файл:

<?PHP

/**
 * Simpla CMS
 *
 * @copyright 	2011 Denis Pikusov
 * @link 		http://simplacms.ru
 * @author 		Denis Pikusov
 *
 * Этот класс использует шаблон products.tpl
 *
 */
 
require_once('View.php');

class ProductsView extends View
{
 	/**
	 *
	 * Отображение списка товаров
	 *
	 */	
	function fetch()
	{
		// GET-Параметры
		$category_url = $this->request->get('category', 'string');
		$brand_url    = $this->request->get('brand', 'string');
        $mode    = $this->request->get('mode', 'string');
        
		
		$filter = array();
		$filter['visible'] = 1;	
        
        if ($mode == 'hits')
        {
            $filter['featured'] = 1;
        }
        if ($mode == 'sale')
        {
            $filter['discounted'] = 1;
        } 
        if ($mode == 'new')
        {
            $filter['is_new'] = 1;
        } 
        
        
        

		// Если задан бренд, выберем его из базы
		if (!empty($brand_url))
		{
			$brand = $this->brands->get_brand((string)$brand_url);
			if (empty($brand))
				return false;
			$this->design->assign('brand', $brand);
			$filter['brand_id'] = $brand->id;
		}
		
		// Выберем текущую категорию
		if (!empty($category_url))
		{
			$category = $this->categories->get_category((string)$category_url);
			if (empty($category) || (!$category->visible && empty($_SESSION['admin'])))
				return false;
			$this->design->assign('category', $category);
			$filter['category_id'] = $category->children;
		}

		// Если задано ключевое слово
		$keyword = $this->request->get('keyword');
		if (!empty($keyword))
		{
			$this->design->assign('keyword', $keyword);
			$filter['keyword'] = $keyword;
		}

		// Сортировка товаров, сохраняем в сесси, чтобы текущая сортировка оставалась для всего сайта
		if($sort = $this->request->get('sort', 'string'))
            
			$_SESSION['sort'] = $sort;		
		if (!empty($_SESSION['sort']))
			$filter['sort'] = $_SESSION['sort'];			
		else
			$filter['sort'] = 'position';			
		$this->design->assign('sort', $filter['sort']);
		
		// Свойства товаров
		if(!empty($category))
		{
			$features = array();
            $filter['features'] = array();
			foreach($this->features->get_features(array('category_id'=>$category->id, 'in_filter'=>1)) as $feature)
			{ 
				$features[$feature->id] = $feature;
                
                if(($val = $this->request->get($feature->id))!='')
    $filter['features'][$feature->id] = $val;
                
			}
			
			$options_filter['visible'] = 1;
			
			$features_ids = array_keys($features);
			if(!empty($features_ids))
				$options_filter['feature_id'] = $features_ids;
			$options_filter['category_id'] = $category->children;
			if(isset($filter['features']))
				$options_filter['features'] = $filter['features'];
			if(!empty($brand))
				$options_filter['brand_id'] = $brand->id;
			
			$options = $this->features->get_options($options_filter);

			foreach($options as $option)
			{
				if(isset($features[$option->feature_id]))
					$features[$option->feature_id]->options[] = $option;
			}
			
			foreach($features as $i=>&$feature)
			{ 
				if(empty($feature->options))
					unset($features[$i]);
			}
$this->design->assign('filter_features', $filter['features']);
			$this->design->assign('features', $features);
 		}

		// Постраничная навигация
		$items_per_page = $this->settings->products_num;		
		// Текущая страница в постраничном выводе
		$current_page = $this->request->get('page', 'integer');
		// Если не задана, то равна 1
		$current_page = max(1, $current_page);
		$this->design->assign('current_page_num', $current_page);
		// Вычисляем количество страниц
		$products_count = $this->products->count_products($filter);
		
		// Показать все страницы сразу
	if($this->request->get('page') == 'all')
    $items_per_page = $products_count; 
elseif($this->request->get('limit','integer') > 0)
    $items_per_page = $this->request->get('limit','integer');
 
$filter['limit'] = $items_per_page;
$filter['page'] = $current_page;   
     
$pages_num = ceil($products_count/$items_per_page);
$this->design->assign('total_pages_num', $pages_num);
		
		///////////////////////////////////////////////
		// Постраничная навигация END
		///////////////////////////////////////////////
		

		$discount = 0;
		if(isset($_SESSION['user_id']) && $user = $this->users->get_user(intval($_SESSION['user_id'])))
			$discount = $user->discount;
			
		// Товары 
		$products = array();
		foreach($this->products->get_products($filter) as $p)
			$products[$p->id] = $p;
			
		// Если искали товар и найден ровно один - перенаправляем на него
		if(!empty($keyword) && $products_count == 1)
			header('Location: '.$this->config->root_url.'/products/'.$p->url);
		
		if(!empty($products))
		{
			$products_ids = array_keys($products);
			foreach($products as &$product)
			{
				$product->variants = array();
				$product->images = array();
				$product->properties = array();
			}
	
			$variants = $this->variants->get_variants(array('product_id'=>$products_ids, 'in_stock'=>true));
			
			foreach($variants as &$variant)
			{
				//$variant->price *= (100-$discount)/100;
				$products[$variant->product_id]->variants[] = $variant;
			}
	
			$images = $this->products->get_images(array('product_id'=>$products_ids));
			foreach($images as $image)
				$products[$image->product_id]->images[] = $image;

			foreach($products as &$product)
			{
				if(isset($product->variants[0]))
					$product->variant = $product->variants[0];
				if(isset($product->images[0]))
					$product->image = $product->images[0];
			}
				
	
			/*
			$properties = $this->features->get_options(array('product_id'=>$products_ids));
			foreach($properties as $property)
				$products[$property->product_id]->options[] = $property;
			*/
	
			$this->design->assign('products', $products);
 		}
		
		// Выбираем бренды, они нужны нам в шаблоне	
		if(!empty($category))
		{
			$brands = $this->brands->get_brands(array('category_id'=>$category->children, 'visible'=>1));
			$category->brands = $brands;		
		}
		
		// Устанавливаем мета-теги в зависимости от запроса
		if($this->page)
		{
			$this->design->assign('meta_title', $this->page->meta_title);
			$this->design->assign('meta_keywords', $this->page->meta_keywords);
			$this->design->assign('meta_description', $this->page->meta_description);
		}
		elseif(isset($category))
		{
			$this->design->assign('meta_title', $category->meta_title);
			$this->design->assign('meta_keywords', $category->meta_keywords);
			$this->design->assign('meta_description', $category->meta_description);
		}
		elseif(isset($brand))
		{
			$this->design->assign('meta_title', $brand->meta_title);
			$this->design->assign('meta_keywords', $brand->meta_keywords);
			$this->design->assign('meta_description', $brand->meta_description);
		}
		elseif(isset($keyword))
		{
			$this->design->assign('meta_title', $keyword);
		}
		
			
		$this->body = $this->design->fetch('products.tpl');
		return $this->body;
	}
	
	

}

Link to post
Share on other sites

У меня локально Ваш код работает правильно.

Например

http://localhost/simpla237/catalog/mobilnye-telefony?limit=3

показывает 3 товара

а может это быть связано  с тем, что в админке -> в настройках кол-ва товаров в каталоге у меня стоит у меня стоит 12?

Link to post
Share on other sites

Подскажите, хочу вывести на странице каталога возможность выбора кол-ва отображаемых товаров.

 

В  view/ProductsView.php заменил код на:

// Показать все страницы сразу
if($this->request->get('page') == 'all')
    $items_per_page = $products_count; 
elseif($this->request->get('limit','integer') > 0)
    $items_per_page = $this->request->get('limit','integer');
 
$filter['limit'] = $items_per_page;
$filter['page'] = $current_page;   
     
$pages_num = ceil($products_count/$items_per_page);
$this->design->assign('total_pages_num', $pages_num);

а потом в products:

<div class="limit">
    Выводить по
    <a {if !$smarty.get.limit || $smarty.get.limit == 20} class="selected"{/if} href="{url limit=20 page=null}">20</a>
    <a {if $smarty.get.limit == 50}    class="selected"{/if} href="{url limit=50 page=null}">50</a>
    <a {if $smarty.get.limit == 100}     class="selected"{/if} href="{url limit=100 page=null}">100</a>
    <a {if $smarty.get.page == 'all'}     class="selected"{/if} href="{url limit=null page=all}">все</a>
</div>

Работает только отображение всех. Остальное нет. Подскажите в чем проблема??

Блин, проверил на чистой simpla все работает.

Как найти ошибку?

Link to post
Share on other sites

Точнее я понял, проблема в моем файле view/ProductsView.php. А где именно пока не пойму :unsure: 

Вот ссылка на файл. Помогите найти ошибку, плииииииииииииз

 

у вас там нет кода

elseif($this->request->get('limit','integer') > 0)
    $items_per_page = $this->request->get('limit','integer');
Link to post
Share on other sites

Мишаня, спасибо. мне стыдно -_-

А почему к примеру товаров всего 42.

и есть вот этот код:


<div class="catalog-item-limit"> 
  <a {if !$smarty.get.limit || $smarty.get.limit == 12} class="selected"{/if} href="{url limit=12 page=null}">12</a>
    <a {if $smarty.get.limit == 48}    class="selected"{/if} href="{url limit=48 page=null}">48</a>
    <a {if $smarty.get.page == 'all'}     class="selected"{/if} href="{url limit=null page=all}">Все</a>
</div>

Когда нажимаю "все", то класс "selected" у 12 и у "все"?

Link to post
Share on other sites

Мишаня, спасибо. мне стыдно -_-

А почему к примеру товаров всего 42.

и есть вот этот код:


<div class="catalog-item-limit"> 
  <a {if !$smarty.get.limit || $smarty.get.limit == 12} class="selected"{/if} href="{url limit=12 page=null}">12</a>
    <a {if $smarty.get.limit == 48}    class="selected"{/if} href="{url limit=48 page=null}">48</a>
    <a {if $smarty.get.page == 'all'}     class="selected"{/if} href="{url limit=null page=all}">Все</a>
</div>

Когда нажимаю "все", то класс "selected" у 12 и у "все"?

 

потому что у вас срабатывает условие 1 и условие 3. тоесть у вас фактически нет страницы но выводит все товары. попробуйте так

 

<div class="catalog-item-limit"> 
  <a {if (!$smarty.get.limit && $smarty.get.page != 'all') || $smarty.get.limit == 12} class="selected"{/if} href="{url limit=12 page=null}">12</a>
    <a {if $smarty.get.limit == 48}    class="selected"{/if} href="{url limit=48 page=null}">48</a>
    <a {if $smarty.get.page == 'all'}     class="selected"{/if} href="{url limit=null page=all}">Все</a>
</div>
Link to post
Share on other sites

 

потому что у вас срабатывает условие 1 и условие 3. тоесть у вас фактически нет страницы но выводит все товары. попробуйте так

 

<div class="catalog-item-limit"> 
  <a {if (!$smarty.get.limit && $smarty.get.page != 'all') || $smarty.get.limit == 12} class="selected"{/if} href="{url limit=12 page=null}">12</a>
    <a {if $smarty.get.limit == 48}    class="selected"{/if} href="{url limit=48 page=null}">48</a>
    <a {if $smarty.get.page == 'all'}     class="selected"{/if} href="{url limit=null page=all}">Все</a>
</div>

Спасибо!Получилось

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...