Jump to content
axaxaxa

Отображение товаров в категории (сортировка)

Recommended Posts

1) Заметил такой не приятный момент, если я не ошибаются то в opencart сортировка по умолчанию  идет по алфавиту?  У меня на одной и той же странице при перезагрузке страницы товары постоянно появляются (строятся) рандомно??? Есть предположение почему это происходит (у многих товаров одинаковые названия, и в своих приделах например на странице 5 товаров с одинаковым названием и они постоянно рандомно генерируют порядок), как их упорядочить что бы постоянно были в адекватном порядке....

 

2) Еще очень плохое что то с пагинацией, допустим при переходе с первой страницы на 2-ю страницу пагинации попадаются товары с первой страницы(бывает даже по несколько товаров).... это вообще как??? это точно нужно исправлять!

https://imperiazolota.ua/ring  протестите

Edited by axaxaxa

Share this post


Link to post
Share on other sites
11 минут назад, axaxaxa сказал:

1) Заметил такой не приятный момент, если я не ошибаются то в opencart сортировка по умолчанию  идет по алфавиту?  У меня на одной и той же странице при перезагрузке страницы товары постоянно появляются (строятся) рандомно??? Есть предположение почему это происходит (у многих товаров одинаковые названия, и в своих приделах например на странице 5 товаров с одинаковым названием и они постоянно рандомно генерируют порядок), как их упорядочить что бы постоянно были в адекватном порядке....

 

2) Еще очень плохое что то с пагинацией, допустим при переходе с первой страницы на 2-ю страницу пагинации попадаются товары с первой страницы(бывает даже по несколько товаров).... это вообще как??? это точно нужно исправлять!

https://imperiazolota.ua/ring  протестите

по стандарту sort_order

Share this post


Link to post
Share on other sites

покажите файл контролера категорий

к примеру у меня так

 

		if (isset($this->request->get['sort'])) {
			$sort = $this->request->get['sort'];
		} else {
			$sort = 'p.price';
		}

		if (isset($this->request->get['order'])) {
			$order = $this->request->get['order'];
		} else {
			$order = 'ASC';
		}

 

Share this post


Link to post
Share on other sites
9 минут назад, Ptenec сказал:

покажите файл контролера категорий

к примеру у меня так

 


		if (isset($this->request->get['sort'])) {
			$sort = $this->request->get['sort'];
		} else {
			$sort = 'p.price';
		}

		if (isset($this->request->get['order'])) {
			$order = $this->request->get['order'];
		} else {
			$order = 'ASC';
		}

 

у вас не рандомит товары??? пробовали у меня на сайте как происходит ????

Спойлер

<?php
// *	@source		See SOURCE.txt for source and other copyright.
// *	@license	GNU General Public License version 3; see LICENSE.txt

class ControllerProductCategory extends Controller {
	public function index() {
		$this->load->language('product/category');

		$this->load->model('catalog/category');

		$this->load->model('catalog/product');

		$this->load->model('tool/image');
		
		
		$data['text_empty'] = $this->language->get('text_empty');
		$data['text_model'] = $this->language->get('text_model');

		if (isset($this->request->get['filter'])) {
			$filter = $this->request->get['filter'];
			$this->document->setRobots('noindex,follow');
		} else {
			$filter = '';
		}

		if (isset($this->request->get['sort'])) {
			$sort = $this->request->get['sort'];
			$this->document->setRobots('noindex,follow');
		} else {
			$sort = 'p.sort_order';
		}

		if (isset($this->request->get['order'])) {
			$order = $this->request->get['order'];
			$this->document->setRobots('noindex,follow');
		} else {
			$order = 'ASC';
		}

		if (isset($this->request->get['page'])) {
			$page = $this->request->get['page'];
			$this->document->setRobots('noindex,follow');
		} else {
			$page = 1;
		}

		if (isset($this->request->get['limit'])) {
			$limit = (int)$this->request->get['limit'];
			$this->document->setRobots('noindex,follow');
		} else {
			$limit = $this->config->get('theme_' . $this->config->get('config_theme') . '_product_limit');
		}

		$data['breadcrumbs'] = array();

		$data['breadcrumbs'][] = array(
			'text' => $this->language->get('text_home'),
			'href' => $this->url->link('common/home')
		);

		if (isset($this->request->get['path'])) {
			$url = '';

			if (isset($this->request->get['sort'])) {
				$url .= '&sort=' . $this->request->get['sort'];
			}

			if (isset($this->request->get['order'])) {
				$url .= '&order=' . $this->request->get['order'];
			}

			if (isset($this->request->get['limit'])) {
				$url .= '&limit=' . $this->request->get['limit'];
			}

			$path = '';

			$parts = explode('_', (string)$this->request->get['path']);

			$category_id = (int)array_pop($parts);

			foreach ($parts as $path_id) {
				if (!$path) {
					$path = (int)$path_id;
				} else {
					$path .= '_' . (int)$path_id;
				}

				$category_info = $this->model_catalog_category->getCategory($path_id);

				if ($category_info) {
					$data['breadcrumbs'][] = array(
						'text' => $category_info['name'],
						'href' => $this->url->link('product/category', 'path=' . $path . $url)
					);
				}
			}
		} else {
			$category_id = 0;
		}

		$category_info = $this->model_catalog_category->getCategory($category_id);

		if ($category_info) {
			
			if ($category_info['meta_title']) {
				$this->document->setTitle($category_info['meta_title']);
			} else {
				$this->document->setTitle($category_info['name']);
			}
			
			if ($category_info['noindex'] <= 0) {
				$this->document->setRobots('noindex,follow');
			}
			
			if ($category_info['meta_h1']) {
				$data['heading_title'] = $category_info['meta_h1'];
			} else {
				$data['heading_title'] = $category_info['name'];
			}
			
			$this->document->setDescription($category_info['meta_description']);
			$this->document->setKeywords($category_info['meta_keyword']);

			$data['text_compare'] = sprintf($this->language->get('text_compare'), (isset($this->session->data['compare']) ? count($this->session->data['compare']) : 0));

			// Set the last category breadcrumb
			$data['breadcrumbs'][] = array(
				'text' => $category_info['name'],
				'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'])
			);

			if ($category_info['image']) {
				$data['thumb'] = $this->model_tool_image->resize($category_info['image'], $this->config->get('theme_' . $this->config->get('config_theme') . '_image_category_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_category_height'));
			} else {
				$data['thumb'] = '';
			}

			$data['description'] = html_entity_decode($category_info['description'], ENT_QUOTES, 'UTF-8');
			$data['compare'] = $this->url->link('product/compare');

			$url = '';

			if (isset($this->request->get['filter'])) {
				$url .= '&filter=' . $this->request->get['filter'];
			}

			if (isset($this->request->get['sort'])) {
				$url .= '&sort=' . $this->request->get['sort'];
			}

			if (isset($this->request->get['order'])) {
				$url .= '&order=' . $this->request->get['order'];
			}

			if (isset($this->request->get['limit'])) {
				$url .= '&limit=' . $this->request->get['limit'];
			}

			$data['categories'] = array();

			$results = $this->model_catalog_category->getCategories($category_id);

			foreach ($results as $result) {
				$filter_data = array(
					'filter_category_id'  => $result['category_id'],
					'filter_sub_category' => true
				);

				$data['categories'][] = array(
					'name' => $result['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
					'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $result['category_id'] . $url)
				);
			}

			$data['products'] = array();

			$filter_data = array(
				'filter_category_id' => $category_id,
				'filter_filter'      => $filter,
				'sort'               => $sort,
				'order'              => $order,
				'start'              => ($page - 1) * $limit,
				'limit'              => $limit
			);

			$product_total = $this->model_catalog_product->getTotalProducts($filter_data);

			$results = $this->model_catalog_product->getProducts($filter_data);

			if ($this->customer->isLogged()) {
				$this->load->model('account/wishlist');
				$w_list = $this->model_account_wishlist->getWishlist();
				} else if (!empty($this->session->data['wishlist'])) {
				$w_list = $this->session->data['wishlist'];
				} 
				else {
				$w_list = array();
				}

			foreach ($results as $result) {
				if ($result['image']) {
					$image = $this->model_tool_image->resize($result['image'], $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_height'));
				} else {
					$image = $this->model_tool_image->resize('placeholder.png', $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_height'));
				}

				if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) {
					$price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
				} else {
					$price = false;
				}

				if ((float)$result['special']) {
					$special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
				} else {
					$special = false;
				}

				if ($this->config->get('config_tax')) {
					$tax = $this->currency->format((float)$result['special'] ? $result['special'] : $result['price'], $this->session->data['currency']);
				} else {
					$tax = false;
				}

				if ($this->config->get('config_review_status')) {
					$rating = (int)$result['rating'];
				} else {
					$rating = false;
				}

				if (in_array($result['product_id'], $w_list)) {
					$wl_class = 'wl-add';
					} else {
					$wl_class = '';
					}

				$data['products'][] = array(					
					'product_id'  => $result['product_id'],
					'thumb'       => $image,
					'name'        => $result['name'],					
					'model'       => $result['model'],
					'description' => utf8_substr(trim(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8'))), 0, $this->config->get('theme_' . $this->config->get('config_theme') . '_product_description_length')) . '..',
					'price'       => $price,
					'special'     => $special,
					'tax'         => $tax,
					'minimum'     => $result['minimum'] > 0 ? $result['minimum'] : 1,
					'rating'      => $result['rating'],
					'href'        => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url),
					'wl_class'    => $wl_class
				);
			}

			$url = '';

			if (isset($this->request->get['filter'])) {
				$url .= '&filter=' . $this->request->get['filter'];
			}

			if (isset($this->request->get['limit'])) {
				$url .= '&limit=' . $this->request->get['limit'];
			}

			$data['sorts'] = array();

			$data['sorts'][] = array(
				'text'  => $this->language->get('text_default'),
				'value' => 'p.sort_order-ASC',
				'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.sort_order&order=ASC' . $url)
			);

			

			$data['sorts'][] = array(
				'text'  => $this->language->get('text_price_asc'),
				'value' => 'p.price-ASC',
				'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.price&order=ASC' . $url)
			);

			$data['sorts'][] = array(
				'text'  => $this->language->get('text_price_desc'),
				'value' => 'p.price-DESC',
				'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.price&order=DESC' . $url)
			);

			if ($this->config->get('config_review_status')) {
				$data['sorts'][] = array(
					'text'  => $this->language->get('text_rating_desc'),
					'value' => 'rating-DESC',
					'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=rating&order=DESC' . $url)
				);

				
			}

			

			$url = '';

			if (isset($this->request->get['filter'])) {
				$url .= '&filter=' . $this->request->get['filter'];
			}

			if (isset($this->request->get['sort'])) {
				$url .= '&sort=' . $this->request->get['sort'];
			}

			if (isset($this->request->get['order'])) {
				$url .= '&order=' . $this->request->get['order'];
			}

			$data['limits'] = array();

			$limits = array_unique(array($this->config->get('theme_' . $this->config->get('config_theme') . '_product_limit'), 25, 50, 75, 100));

			sort($limits);

			foreach($limits as $value) {
				$data['limits'][] = array(
					'text'  => $value,
					'value' => $value,
					'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&limit=' . $value)
				);
			}

			$url = '';

			if (isset($this->request->get['filter'])) {
				$url .= '&filter=' . $this->request->get['filter'];
			}

			if (isset($this->request->get['sort'])) {
				$url .= '&sort=' . $this->request->get['sort'];
			}

			if (isset($this->request->get['order'])) {
				$url .= '&order=' . $this->request->get['order'];
			}

			if (isset($this->request->get['limit'])) {
				$url .= '&limit=' . $this->request->get['limit'];
			}

			$pagination = new Pagination();
			$pagination->total = $product_total;
			$pagination->page = $page;
			$pagination->limit = $limit;
			$pagination->url = $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&page={page}');

			$data['pagination'] = $pagination->render();

			$data['results'] = sprintf($this->language->get('text_pagination'), ($product_total) ? (($page - 1) * $limit) + 1 : 0, ((($page - 1) * $limit) > ($product_total - $limit)) ? $product_total : ((($page - 1) * $limit) + $limit), $product_total, ceil($product_total / $limit));

			// http://googlewebmastercentral.blogspot.com/2011/09/pagination-with-relnext-and-relprev.html
			if ($page == 1) {
			    $this->document->addLink($this->url->link('product/category', 'path=' . $category_info['category_id']), 'canonical');
			} else {
				$this->document->addLink($this->url->link('product/category', 'path=' . $category_info['category_id'] . '&page='. $page), 'canonical');
			}
			
			if ($page > 1) {
			    $this->document->addLink($this->url->link('product/category', 'path=' . $category_info['category_id'] . (($page - 2) ? '&page='. ($page - 1) : '')), 'prev');
			}

			if ($limit && ceil($product_total / $limit) > $page) {
			    $this->document->addLink($this->url->link('product/category', 'path=' . $category_info['category_id'] . '&page='. ($page + 1)), 'next');
			}

			$data['sort'] = $sort;
			$data['order'] = $order;
			$data['limit'] = $limit;

			$data['continue'] = $this->url->link('common/home');

			$data['column_left'] = $this->load->controller('common/column_left');
			$data['column_right'] = $this->load->controller('common/column_right');
			$data['content_top'] = $this->load->controller('common/content_top');
			$data['content_topf'] = $this->load->controller('common/content_topf');
			$data['content_botf'] = $this->load->controller('common/content_botf');
			$data['content_bottom'] = $this->load->controller('common/content_bottom');
			$data['footer'] = $this->load->controller('common/footer');
			$data['header'] = $this->load->controller('common/header');
			

			$this->response->setOutput($this->load->view('product/category', $data));
		} else {
			$url = '';

			if (isset($this->request->get['path'])) {
				$url .= '&path=' . $this->request->get['path'];
			}

			if (isset($this->request->get['filter'])) {
				$url .= '&filter=' . $this->request->get['filter'];
			}

			if (isset($this->request->get['sort'])) {
				$url .= '&sort=' . $this->request->get['sort'];
			}

			if (isset($this->request->get['order'])) {
				$url .= '&order=' . $this->request->get['order'];
			}

			if (isset($this->request->get['page'])) {
				$url .= '&page=' . $this->request->get['page'];
			}

			if (isset($this->request->get['limit'])) {
				$url .= '&limit=' . $this->request->get['limit'];
			}

			$data['breadcrumbs'][] = array(
				'text' => $this->language->get('text_error'),
				'href' => $this->url->link('product/category', $url)
			);

			$this->document->setTitle($this->language->get('text_error'));

			$data['continue'] = $this->url->link('common/home');

			$this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . ' 404 Not Found');

			$data['column_left'] = $this->load->controller('common/column_left');
			$data['column_right'] = $this->load->controller('common/column_right');
			$data['content_top'] = $this->load->controller('common/content_top');
			$data['content_topf'] = $this->load->controller('common/content_topf');
			$data['content_botf'] = $this->load->controller('common/content_botf');
			$data['content_bottom'] = $this->load->controller('common/content_bottom');
			$data['footer'] = $this->load->controller('common/footer');
			$data['header'] = $this->load->controller('common/header');

			$this->response->setOutput($this->load->view('error/not_found', $data));
		}
	}
}

 

 

Share this post


Link to post
Share on other sites

изначальная сортировка происходит отсюда, если я не ошибаюсь catalog\model\catalog\product.php

Share this post


Link to post
Share on other sites
1 час назад, axaxaxa сказал:

это точно нужно исправлять!

отключи фильтр и попробуй? будет также мешать сортировку или нет?
 

Так как мне кажется фильтр выводит свою сортировку.

Share this post


Link to post
Share on other sites
1 час назад, axaxaxa сказал:

изначальная сортировка происходит отсюда, если я не ошибаюсь catalog\model\catalog\product.php

от туда тоже! но то что я скинул выше стоит в приоритете!  если модификаторы не внесли у вас коррективы

Share this post


Link to post
Share on other sites
5 часов назад, kikaridza123 сказал:

отключи фильтр и попробуй? будет также мешать сортировку или нет?
 

Так как мне кажется фильтр выводит свою сортировку.

без фильтра так же, попробовал

Share this post


Link to post
Share on other sites

ладно уже что после перезагрузки товары перестраиваются, в файле контролера категорий поменял сортировку на 

if (isset($this->request->get['sort'])) {
			$sort = $this->request->get['sort'];
			$this->document->setRobots('noindex,follow');
		} else {
			$sort = 'p.date_added';
		}

		if (isset($this->request->get['order'])) {
			$order = $this->request->get['order'];
			$this->document->setRobots('noindex,follow');
		} else {
			$order = 'ASC';
		}

отсортировало, уже меньше товары  перемешиваются после перезагрузки страницы, но то что товар с первой страницы может отобразиться на 2-й или 3-й, вообще плохо, как решить???

Share this post


Link to post
Share on other sites

Ребята, дайте ответ, как сделать хотя бы что бы в одно сессии товары не прыгали, а дубли(повторы) товаров при пагинации!!! Что делать????

Share this post


Link to post
Share on other sites
1 час назад, Otvet сказал:

модуль 300р

ваш модуль устранит ошибки указанные выше?

Share this post


Link to post
Share on other sites

короче сделал сортировку по ID товара, все мои симптомы пропали, рандомности и дублей нету, но теперь появилась проблемка, при такой сортировке нету возможности поднять товар выше или опустить, в товаре порядок сортировки не влияет, можно как то решить?

Share this post


Link to post
Share on other sites
В 27.09.2019 в 16:04, Otvet сказал:

модуль 300р

 

Share this post


Link to post
Share on other sites
6 минут назад, axaxaxa сказал:

короче сделал сортировку по ID товара, все мои симптомы пропали, рандомности и дублей нету, но теперь появилась проблемка, при такой сортировке нету возможности поднять товар выше или опустить, в товаре порядок сортировки не влияет, можно как то решить?

Модуль сортировка товаров в категории

Share this post


Link to post
Share on other sites
3 часа назад, chukcha сказал:

Модуль сортировка товаров в категории

я спрашиваю совет а не какай модуль купить

Share this post


Link to post
Share on other sites
4 часа назад, axaxaxa сказал:

короче сделал сортировку по ID товара, все мои симптомы пропали, рандомности и дублей нету,

Конечно
потому что у вас неоднозначная сотриовка

Сортировка дефолтная подразумевает двойную
ORDER BY sort_order, pd.name

 

1 . 0 aaa
2 . 0 aaa
3,  0 aaa

Что у вас там.. не знаю, но что 123 321 231 - однозначны
И по каким-либо внутренним параметрам оптимизатора происходит псевдослучайная сортировка .. сортировки

 

  • +1 1

Share this post


Link to post
Share on other sites
4 часа назад, axaxaxa сказал:

можно как то решить?

 

12 минут назад, axaxaxa сказал:

я спрашиваю совет а не какай модуль купить

 

А что не так? :)

Вот, например, на Ваш первый вопрос я находил несколько решений на данном форуме.

Если поиском не владеете (скорее всего нет, раз создали тему), то есть способ проще, надёжнее и качественнее.

Есть обученная программа, которая "в два клика" сделает работу за Вас.

Причем цена у неё смехотворная да ещё с моментальной техподдержкой.

Вот, бы мне на каждой вопрос отвечали модулем))

Share this post


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
You are posting as a guest. If you have an account, please sign in.
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.


  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.