Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Избавляемся от выпадающих списков в фильтре над списком товаров и переносим пагинацию.


Yoda

Recommended Posts

**** ДЕЛАЙТЕ БЕКАПЫ ПЕРЕД ЛЮБЫМИ ИЗМЕНЕНИЯМИ !!!*******

**** Сохраняйте файлы в UTF-8 без BOM чтобы не было кракозябр!!! *******

Достали меня дефолтный выпадающий список и внешний вид пагинации, и наконец то до них дошли руки.

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

Получилось вот такое:

Изображение

  • Вся эта петрушка отображается только если товаров у вас больше минимального значения вывода на страницу установленного в амдинке магазина. (если товаров 25, а у вас стоит лимит в 30 - то панель просто не отображается).
  • Слева упихал пагинацию и убрал из нее перейти в конец перейти в начало, потому что у меня нет столько товаров в категориях чтобы они были нужны.
  • Убрал информацию о кол-ве отображаемых и общем количестве товаров (косметически)
  • Сортировку освободил от уз выпадающего списка и сделал в виде трех кликабельных блоков (при первом клике идет прямая сортировка и блок становится активным, при повторном клике по блоку отображается обратная сортировка).
  • Вставил проверку кол-ва элементов вывода (т.е. если у вас товаров меньше 60 - у вас не будет 90 и 120 штук к показу).
Подробно попытаюсь описать на примере шаблона категории, остальные шаблоны со списками - включайте мозги дорогие и пилите сами, или же может кто вкумод удосужится соорудить.

Кроме css - файлы приложил, не загружался tpl - переименовал его в tpl.php/

Итак по порядку

1. Идем в админку и смотрим сколько у нас там товаров для вывода по дефолту. Я себе поставил 30.

2. Откываем catalog/controller/category.php

находим там вот такие строки

$this->data['limits'] = array();
  
   $this->data['limits'][] = array(
	'text'  => $this->config->get('config_catalog_limit'),
	'value' => $this->config->get('config_catalog_limit'),
	'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&limit=' . $this->config->get('config_catalog_limit'))
   );
	
   $this->data['limits'][] = array(
	'text'  => 25,
	'value' => 25,
	'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&limit=25')
   );
  
   $this->data['limits'][] = array(
	'text'  => 50,
	'value' => 50,
	'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&limit=50')
   );
   $this->data['limits'][] = array(
	'text'  => 75,
	'value' => 75,
	'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&limit=75')
   );
  
   $this->data['limits'][] = array(
	'text'  => 100,
	'value' => 100,
	'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&limit=100')
   );
	
   $url = '';
И либо убираем либо комментируем ненужное и меняем если надо шаг.

я для себя сделал вот так:

$this->data['limits'] = array();
  
   $this->data['limits'][] = array(
	'text'  => $this->config->get('config_catalog_limit'),
	'value' => $this->config->get('config_catalog_limit'),
	'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&limit=' . $this->config->get('config_catalog_limit'))
   );
	
  /* $this->data['limits'][] = array(
	'text'  => 30,
	'value' => 30,
	'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&limit=30')
   );*/
  
   $this->data['limits'][] = array(
	'text'  => 60,
	'value' => 60,
	'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&limit=60')
   );
   $this->data['limits'][] = array(
	'text'  => 90,
	'value' => 90,
	'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&limit=90')
   );
  
   $this->data['limits'][] = array(
	'text'  => 120,
	'value' => 120,
	'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&limit=120')
   );
	
   $url = '';

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

Дальше где то в районе 340 строки

после

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

добавляем

   $this->data['product_total'] = $product_total;

Нам нужно передать общее кол-во товаров из для того чтобы включать отключать панель, когда при выводе у вас товаров меньше минимального лимита.

С контроллером закончили...

Теперь берем шаблон категории..

catalogviewthemedefaulttemplateproductcategory.tpl

И добавляем в него

<?php if ($product_total>30) { ?>

  <div class="product-filter">
	<div class="display"><b><?php echo $text_display; ?></b> <?php echo $text_list; ?> <b>/</b> <a onclick="display('grid');"><?php echo $text_grid; ?></a></div>

<div class="pagination"><?php echo $pagination; ?></div>

  <div class="limit">

  <ul>

	<li><?php echo $text_limit; ?></li>
	
  <?php foreach ($limits as $limites) { ?>

  <li>

		<?php if ($limites['value'] == $limit) { ?>
		<span class="active"><?php echo $limites['text']; ?></a></span>
		<?php } else { ?>
  <a href="<?php echo $limites['href']; ?>"><?php echo $limites['text']; ?></a>
		<?php } ?>

  </li>

  <?php if ($product_total < (int)$limites['value']) break;  ?>

	 <?php } ?>

  </ul>

	</div>


<div class="sort">
<ul>
<li>
Сортировать по:
</li>
<li>
<span   <?php if (($sorts[1]['value'] == $sort . '-' . $order) or ($sorts[2]['value'] == $sort . '-' . $order)) { ?><?php  echo 'class="active"'; ?><?php } ?>><a href="<?php if ($sorts[1]['value'] == $sort . '-' . $order) echo $sorts[2]['href']; else echo $sorts[1]['href']; ?>">названию</a></span>
</li>
<li >
<span   <?php if (($sorts[3]['value'] == $sort . '-' . $order) or ($sorts[4]['value'] == $sort . '-' . $order)) { ?><?php  echo 'class="active"'; ?><?php } ?>><a href="<?php if ($sorts[3]['value'] == $sort . '-' . $order) echo $sorts[4]['href']; else echo $sorts[3]['href']; ?>">цене</a></span>
</li>

<li >
<span   <?php if (($sorts[5]['value'] == $sort . '-' . $order) or ($sorts[6]['value'] == $sort . '-' . $order)) { ?><?php  echo 'class="active"'; ?><?php } ?>><a href="<?php if ($sorts[5]['value'] == $sort . '-' . $order) echo $sorts[6]['href']; else echo $sorts[5]['href']; ?>">рейтингу</a></span>
</li>


</ul>
</div>

  </div>

   <?php } ?>

Вместо

<div class="product-filter">
	<div class="display"><b><?php echo $text_display; ?></b> <?php echo $text_list; ?> <b>/</b> <a onclick="display('grid');"><?php echo $text_grid; ?></a></div>
	<div class="limit"><b><?php echo $text_limit; ?></b>
	  <select onchange="location = this.value;">
		<?php foreach ($limits as $limits) { ?>
		<?php if ($limits['value'] == $limit) { ?>
		<option value="<?php echo $limits['href']; ?>" selected="selected"><?php echo $limits['text']; ?></option>
		<?php } else { ?>
		<option value="<?php echo $limits['href']; ?>"><?php echo $limits['text']; ?></option>
		<?php } ?>
		<?php } ?>
	  </select>
	</div>
	<div class="sort"><b><?php echo $text_sort; ?></b>
	  <select onchange="location = this.value;">
		<?php foreach ($sorts as $sorts) { ?>
		<?php if ($sorts['value'] == $sort . '-' . $order) { ?>
		<option value="<?php echo $sorts['href']; ?>" selected="selected"><?php echo $sorts['text']; ?></option>
		<?php } else { ?>
		<option value="<?php echo $sorts['href']; ?>"><?php echo $sorts['text']; ?></option>
		<?php } ?>
		<?php } ?>
	  </select>
	</div>
  </div>

Удаляем полностью

<div class="pagination"><?php echo $pagination; ?></div>

И все почти готово.

Осталось немного подправить контроллер пагинации (Это не обязательное действие и если вас устраивают обычные стрелочки-елочки, можете его не трогать)

я просто в нем заккоментировал две строки и поменял вид стрелок.

вот такой вот у меня в итоге получился код в systemlibrarypagination.php

public $total = 0;
public $page = 1;
public $limit = 20;
public $num_links = 5;
public $url = '';
public $text = 'Showing {start} to {end} of {total} ({pages} Pages)';
//public $text_first = '|<';
public $text_first = '';
//public $text_last = '>|';
public $text_last = '';
public $text_next = '→';
public $text_prev = '←';
public $style_links = 'links';
public $style_results = 'results';

По хорошему его надо повырезать ниже, но меня такое решение устроило.

и в catalogviewthemedefaultstylesheetstylesheet.css

добавляем немножко стилей

.sort ul li, .limit  ul li {display: inline-block; color: #777; margin: 0 3px; font-size: 10px;}
.sort ul li a, .limit  ul li a {color: #222; font-size:11px;}
.sort ul li a:hover, .limit  ul li a:hover {text-decoration: none;}
.sort  ul li .active, .limit  ul li .active  {background: #ccc; padding: 1px 4px; color: black; font-weight: bold;}
.sort  ul li .active a, .limit  ul li .active  a{text-decoration: none;}
.sort  ul  a {text-decoration: none;}

И правим стили пагинации.

.pagination {border-top:1px solid #EEE; padding-top:0; display: inline-block; width: 250px; margin-bottom:10px; float: left; margin-left: 10px;}
.pagination .links {float: left;}
.pagination .links a {display: inline-block; padding: 0px 3px; text-decoration: none; color: #A3A3A3;}
.pagination .links b {display: inline-block; padding: 0px 3px; background: #AAA; padding: 1px 4px; color: black; font-weight: bold;}
.pagination .results {display:none; float: right; padding-top: 3px;}

По моему ничего не забыл.

UPD №1: Рекомендации по установке проверены, все работает, если вам что то непонятно - задайте вопрос в ветке, не спамьте личку. Поделочка делалась для себя. Выложил As is. Поддержки и багфикса пока не планируется. С просьбами о допилах и помощи в установке - добро пожаловать в платный раздел.

UPD №2: Файлы приложены для ознакомления и выявления расхождений. Использовать для интеграции не рекомендую, потому что уже не помню сам что в них перепилено было.

UPD №3: Если кто прикрутит на чистую установку и выложит файлы для накатки - будет очень неплохо. Не жмите поделитесь.

post-14042-0-99982600-1333320111_thumb.jpg

category.php

category.tpl.php

pagination.php

  • +1 2
Надіслати
Поділитися на інших сайтах


А зачем она нужна в таком случае ?

Вся эта петрушка отображается только если товаров у вас больше минимального значения вывода на страницу установленного в амдинке магазина. (если товаров 25, а у вас стоит лимит в 30 - то панель просто не отображается).

Тем более ты се можешь навертеть это все как хочешь

Надіслати
Поділитися на інших сайтах


ну вот я и спрашиваю, если товаров мало и паджинация не выводится, может не надо её собирать?

вот это условие вынести в контроллер

if ($product_total>30) {
///логика паджинации
} else {
$pagination = false;
}
Надіслати
Поділитися на інших сайтах

  • 9 months later...

Спасибо, очень пригодилось. Если еще как-нибудь к сортировке стрелочки "вверх" "вниз" прикрутить, что бы было понятно по возрастанию или по убыванию сортировка вообще супер было.

Надіслати
Поділитися на інших сайтах


Спасибо, очень пригодилось. Если еще как-нибудь к сортировке стрелочки "вверх" "вниз" прикрутить, что бы было понятно по возрастанию или по убыванию сортировка вообще супер было.

Покажите картинку, как у Вас получилось, а то у ТСа не работает она :)

Надіслати
Поділитися на інших сайтах


  • 2 weeks later...

господа, у меня дефолт - 15 - как его изменить на 10?

остальные заменил

В Админ>Система>Настройки>Изменить>Опции

Элементов на страницу (Витрина): 10

Надіслати
Поділитися на інших сайтах


  • 3 weeks later...

Прикрутил к способу Saloyadlukae из первого поста стрелочки вверх/вниз. Правда я оставил сортировку только по названию и цене. Вот что получилось:

post-18010-0-16900200-1361114222_thumb.jpg

Сделал так:

в файле: /catalog/language/russian/product/category.php

добавить:

$_['text_sort_no']	  = '   ';
$_['text_sort_asc']	 = '<span style="color: #FF6666;"> ↑ </span>';
$_['text_sort_desc']	= '<span style="color: #FF6666;"> ↓ </span>';
$_['text_sort_name']	= 'названию';
$_['text_sort_price']   = 'цене';

в файле: /catalog/controller/product/category.php

после:

$this->data['text_limit'] = $this->language->get('text_limit');

добавить:

$this->data['text_sort_name'] = $this->language->get('text_sort_name');
  $this->data['text_sort_price'] = $this->language->get('text_sort_price');
  $this->data['text_sort_no'] = $this->language->get('text_sort_no');

заменить:

$this->data['sorts'][] = array(
'text'  => $this->language->get('text_name_asc'),
'value' => 'pd.name-ASC',
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=pd.name&order=ASC' . $url)
  );
  $this->data['sorts'][] = array(
'text'  => $this->language->get('text_name_desc'),
'value' => 'pd.name-DESC',
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=pd.name&order=DESC' . $url)
  );
  $this->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)
  );
  $this->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)
  );

на это:

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

в файле: /catalog/view/theme/default/template/product/category.tpl

заменить:

<span <?php if (($sorts[0]['value'] == $sort . '-' . $order) or ($sorts[1]['value'] == $sort . '-' . $order)) { ?><?php  echo 'class="active"'; ?><?php } ?>><a href="<?php if ($sorts[0]['value'] == $sort . '-' . $order) echo $sorts[1]['href']; else echo $sorts[0]['href']; ?>">названию</a></span>
  <span <?php if (($sorts[2]['value'] == $sort . '-' . $order) or ($sorts[3]['value'] == $sort . '-' . $order)) { ?><?php  echo 'class="active"'; ?><?php } ?>><a href="<?php if ($sorts[2]['value'] == $sort . '-' . $order) echo $sorts[3]['href']; else echo $sorts[2]['href']; ?>">цене</a></span>

на это:

<?php if (($sorts[0]['value'] == $sort . '-' . $order) or ($sorts[1]['value'] == $sort . '-' . $order)) { ?>
 <span class="active">
<?php if ($sorts[0]['value'] == $sort . '-' . $order) { ?>
  <a href="<?php echo $sorts[1]['href']; ?>"><?php echo $text_sort_name; ?><?php echo $sorts[0]['text']; ?></a>
<?php } else { ?>
  <a href="<?php echo $sorts[0]['href']; ?>"><?php echo $text_sort_name; ?><?php echo $sorts[1]['text']; ?></a>
<?php } ?>
 </span>
  <?php } else { ?>
 <span>
<a href="<?php echo $sorts[0]['href']; ?>"><?php echo $text_sort_name; ?><?php echo $text_sort_no; ?></a>
 </span>
  <?php } ?>
  <?php if (($sorts[2]['value'] == $sort . '-' . $order) or ($sorts[3]['value'] == $sort . '-' . $order)) { ?>
 <span class="active">
<?php if ($sorts[2]['value'] == $sort . '-' . $order) { ?>
  <a href="<?php echo $sorts[3]['href']; ?>"><?php echo $text_sort_price; ?><?php echo $sorts[2]['text']; ?></a>
<?php } else { ?>
  <a href="<?php echo $sorts[2]['href']; ?>"><?php echo $text_sort_price; ?><?php echo $sorts[3]['text']; ?></a>
<?php } ?>
 </span>
  <?php } else { ?>
 <span>
<a href="<?php echo $sorts[2]['href']; ?>"><?php echo $text_sort_price; ?><?php echo $text_sort_no; ?></a>
 </span>
  <?php } ?>

Вроде ничего не забыл.

  • +1 2
Надіслати
Поділитися на інших сайтах


  • 2 years later...
  • 5 months later...

Странно, что у других работает, а у меня нет.

Notice: Undefined offset: 3 in ...
Notice: Undefined offset: 4 in ...
Notice: Undefined offset: 5 in ...
Notice: Undefined offset: 6 in ...

вот такое у меня. версия ocstore 1.5.4.1

как теперь можно объявить эти переменные в контроллере?

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.