Ruslan Brest, rb.labtodo.com
Backend web-developer: CodeIgniter, PHP, MySQL, OpenCart, PrestaShop, MaxSite CMS

Opencart 1.5.x (admin): улучшения при вводе атрибутов товаров

Просмотров: 16501 RSS 34
Howto » OpenCart
,

Кому нравится способ ввода атрибутов товаров в OpenCart 1.5.1.2? Думаю, что никому: если их хотя бы десяток, начинаешь забывать, путаться или упорно пытаться вспомнить, как этот атрибут назвали ранее. Кабель? Шнур питания? Длина шнура? Ох... Почему по умолчанию везде в админке сделан поиск по "сначалам" названий (и в связях товаров, и в атрибутах, и в рекомендуемых, и... да везде, в общем) -- мне совершенно непонятно. Это неудобно. Мешает, утомляет, раздражает и тормозит.

Некоторым вначале даже может показаться, что в Опенкарт не работает добавление атрибутов: атрибуты ещё не заведены, в подсказке ничего не выпадает. Люди пытаются ввести своё название атрибута и ожидают, что оно сохранится. А оно не сохраняется. И логика поведения неочевидна. На самом деле надо предварительно зарегистрировать атрибуты (см. меню Каталог - Атрибуты), а затем в этих полях выбирать их из выпадающего списка по мере набора первых букв названий атрибутов.

В идеале я бы предпочёл видеть и редактировать атрибуты товаров в виде таблицы. Или хотя бы выпадающие списки. Почти как сейчас, но чтобы не приходилось мучительно вспоминать первую букву или держать рядом страницу со списком. Ну а пока таблицы нет, можно существенно облегчить себе ввод атрибутов, внеся совсем небольшое исправление.

Которое реализует:

  • поиск любого вхождения введённых символов, а не только с начала названий атрибутов;
  • при вводе "." в пустое поле показывается полный список атрибутов, остаётся только выбрать необходимый.

У нас в магазине сейчас заведено около 20 атрибутов -- облегчение даже на таком количестве колоссальное.

Модификации для 1.5.1.2 и ниже (1.5.x)

diff --git a/public_html/admin/controller/catalog/attribute.php b/public_html/admin/controller/catalog/attribute.php
index 637ab6c..8097fc1 100644
--- a/public_html/admin/controller/catalog/attribute.php
+++ b/public_html/admin/controller/catalog/attribute.php
@@ -432,6 +432,7 @@ class ControllerCatalogAttribute extends Controller {
 			}
 		}
 
+		/*
 		$sort_order = array();
 
 		foreach ($json as $key => $value) {
@@ -439,6 +440,7 @@ class ControllerCatalogAttribute extends Controller {
 		}
 
 		array_multisort($sort_order, SORT_ASC, $json);
+		*/
 
 		$this->load->library('json');
 
diff --git a/public_html/admin/model/catalog/attribute.php b/public_html/admin/model/catalog/attribute.php
index 1e438ef..019b155 100644
--- a/public_html/admin/model/catalog/attribute.php
+++ b/public_html/admin/model/catalog/attribute.php
@@ -35,7 +35,10 @@ class ModelCatalogAttribute extends Model {
 		$sql = "SELECT *, (SELECT agd.name FROM " . DB_PREFIX . "attribute_group_description agd WHERE agd.attribute_group_id = a.attribute_group_id AND agd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS attribute_group FROM " . DB_PREFIX . "attribute a LEFT JOIN " . DB_PREFIX . "attribute_description ad ON (a.attribute_id = ad.attribute_id) WHERE ad.language_id = '" . (int)$this->config->get('config_language_id') . "'";
 
 		if (isset($data['filter_name']) && !is_null($data['filter_name'])) {
-			$sql .= " AND LCASE(ad.name) LIKE '" . $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8')) . "%'";
+			if( $data['filter_name'] == '.' )
+				$sql .= " AND LCASE(ad.name) LIKE '%'";
+			else
+				$sql .= " AND LCASE(ad.name) LIKE '%" . $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8')) . "%'";
 		}
 
 		if (isset($data['filter_attribute_group_id']) && !is_null($data['filter_attribute_group_id'])) {

Модификации для 1.5.1.3

diff --git a/upload/admin/model/catalog/attribute.php b/upload/admin/model/catalog/attribute.php
index f38a92e..1d6c8e1 100644
--- a/upload/admin/model/catalog/attribute.php
+++ b/upload/admin/model/catalog/attribute.php
@@ -35,7 +35,10 @@ class ModelCatalogAttribute extends Model {
 		$sql = "SELECT *, (SELECT agd.name FROM " . DB_PREFIX . "attribute_group_description agd WHERE agd.attribute_group_id = a.attribute_group_id AND agd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS attribute_group FROM " . DB_PREFIX . "attribute a LEFT JOIN " . DB_PREFIX . "attribute_description ad ON (a.attribute_id = ad.attribute_id) WHERE ad.language_id = '" . (int)$this->config->get('config_language_id') . "'";
 
 		if (!empty($data['filter_name'])) {
-			$sql .= " AND LCASE(ad.name) LIKE '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "%'";
+			if( $data['filter_name'] == '.' )
+				$sql .= " AND LCASE(ad.name) LIKE '%'";
+			else
+				$sql .= " AND LCASE(ad.name) LIKE '%" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "%'";
 		}
 
 		if (!empty($data['filter_attribute_group_id'])) {

Модификации для 1.5.6

Вообще-то никакой разницы с 1513 нет - просто слегка отличается исходный код (убрали зачем-то LCASE). Поэтому на всякий случай привожу diff для этой версии:

diff --git a/public_html/admin/model/catalog/attribute.php b/public_html/admin/model/catalog/attribute.php
index e527efe..77d8a8b 100644
--- a/public_html/admin/model/catalog/attribute.php
+++ b/public_html/admin/model/catalog/attribute.php
@@ -35,7 +35,10 @@ class ModelCatalogAttribute extends Model {
 		$sql = "SELECT *, (SELECT agd.name FROM " . DB_PREFIX . "attribute_group_description agd WHERE agd.attribute_group_id = a.attribute_group_id AND agd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS attribute_group FROM " . DB_PREFIX . "attribute a LEFT JOIN " . DB_PREFIX . "attribute_description ad ON (a.attribute_id = ad.attribute_id) WHERE ad.language_id = '" . (int)$this->config->get('config_language_id') . "'";
 
 		if (!empty($data['filter_name'])) {
-			$sql .= " AND ad.name LIKE '" . $this->db->escape($data['filter_name']) . "%'";
+			if( $data['filter_name'] == '.' )
+				$sql .= " AND ad.name LIKE '%'";
+			else
+				$sql .= " AND LCASE(ad.name) LIKE '%" . $this->db->escape($data['filter_name']) . "%'";
 		}
 
 		if (!empty($data['filter_attribute_group_id'])) {

См. также коментарий #28 - для тех, кто "не понимает, что такое дифф", там в виде "было / стало".

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru digg.com friendfeed.com liveinternet.ru livejournal.ru yandex.ru del.icio.us
Комментариев: 34
  1. Спасибо огромное.

  2. 2011-10-06 в 22:45:27 | Андрей

    Нормально разложить код нельзя было? Что это за порнография?

  3. 2011-10-06 в 23:33:13 | Ruslan Brest

    10 баксов. И я решу эту Вашу проблему вместо какой-нибудь своей.

    Помочь в гугле "diff" набрать? Это стандарт, а не порнография. Легко понятный в том числе и простому человеку.

    http://ru.wikipedia.org/wiki/Diff#.D0.9A.D0.BE.D0.BD.D1.82.D0.B5.D0.BA.D1.81.D1.82.D0.BD.D1.8B.D0.B9_.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.82

    А чуть менее простому (программисту с минимальной квалификацией) - сильно облегчающий жизнь. Поэтому какой из способов публикации изменений является порнографией -- вопрос давно решённый.

    P.S. Какой вопрос - такой и ответ. Третий закон Ньютона.

  4. 2011-10-16 в 16:24:29 | михаил

    а куда встатить этот php-код. спасибо!

  5. 2011-10-16 в 17:05:02 | Ruslan Brest

    Это список изменений. В начале строк - индикаторы: что убрать (минусы, красный цвет) в старом файле и что добавить (плюсики, зелёный цвет).

    В каких именно файлах - указано утроенным значком (---, +++)

    @@ -106,10 +106,12 @@ -- строки, т.е. примерно на 106 строке вы должны найти похожий кусок кода, перед и после блока изменений обычно выводится пара строк текста. "Примерно 106" - потому что я множество правок вношу в свой магазин и содержимое файлов может не совпадать с оригинальным OpenCart 1.5.1.1 или с тем правками, которые внесены у вас до меня.

    Правки индицируются значками "-" и "+" в самом начале строки: те, что с минусом, были убраны (они должны совпадать с тем, что вы у себя видите перед внесением изменений), а те, что с плюсом -- добавлены в это место. Поэтому можно руками внести и проконтролировать все изменения.

    В данном случае надо закомментировать небольшую часть в файле admin/controller/catalog/attribute.php и модифицировать одну строку в admin/model/catalog/attribute.php (заменить её на несколько новых, которые можно скопировать и убрать плюсики в начале строк)

  6. Стоит движок 1.5.1.3, тут какое-то не сходство...

    А именно в файле \admin\model\catalog\attribute.php

    строки не совпадают...

    Помогите пожалуйста, заранее спасибо.

  7. 2011-10-18 в 02:01:13 | Ruslan Brest

    Помогу, но не сразу. В течение нескольких дней. Очень сейчас занят. Хотя тут мало, может сегодня посмотрю.

    Несовпадения могут быть - в 1.5.1.3 много изменили, а у меня основной пока остаётся 1.5.1.2. Для 1.5.1.3 кое-что переделывается и адаптируется, но по мере возникновения потребности.

  8. 2011-10-18 в 02:45:01 | Ruslan Brest

    Оказалось проще сразу сделать. Обновил для 1.5.1.3, см. соответствующую вкладку.

  9. Большое спасибо! ждем еще ваших идей по усовершенствованию движка.

    Спасибо Вам!

  10. 2011-10-19 в 01:51:09 | Ruslan Brest

    И Вам спасибо за поддержку! :)

  11. Большое спасибо!

  12. Спасибо.

  13. 2011-12-08 в 22:23:36 | Александр

    для opencart 1.5.1.3 достаточно ввести в поле атрибута знак % и все атрибуты высветятся

  14. 2011-12-08 в 23:23:37 | Ruslan Brest

    Тоже вариант. Но, во-первых, не все, а только 20 (впрочем, как и по моей точке), а во-вторых, не решает проблему поиска по началам слов (в отличие от моего варианта). Поэтому или увеличивать кол-во и действительно вываливать ВСЁ, либо модифицировать и получить меньше ограничений при вводе части слова и короткие списки.

    Если меньше 20 атрибутов - то да, % и без всяких модификаций можно обойтись. Будет вполне удобно.

  15. 2011-12-08 в 23:49:43 | Александр

    Не знал про ограничения! Буду использовать ваш вариант.

  16. 2011-12-09 в 00:19:27 | Ruslan Brest

    Там стоит LIMIT 20 по умолчанию. Можно его исправить, если удобно из большого списка выбирать.

    catalog/controller/attribute.php, function autocomplete()

    Искать 'limit' => 20

  17. Вопрос почти по теме, как можно добавить в счет фактуру пункт: производитель товара?

    Код выдает ошибку.

    Этот код: echo $manufacturer

  18. 2012-01-11 в 07:55:27 | Ruslan Brest

    Samvel, если производителя предварительно не вынули из базы и не подготовили в конктроллере, то он не будет доступен в шаблоне просто так. Надо там сперва эту переменную подготовить и передать во view.

    Решение здесь: http://rb.labtodo.com/uploads/opencart15/oc1513.admin-invoice-add-manufacturer_.diff

  19. А если атрибутов больше 20 то как удлинить выпадающий список,там больше 20 не выпадает даже если в настройках ( Элементов на страницу (Админка):) указать 100.

  20. 2012-04-06 в 05:20:07 | Ruslan Brest

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

  21. А в каком конфиге хоть подскажите пожалуйста а то не возможно набивать товар ужас.

  22. О спасибо нашел кому надо /admin/controller/catalog/attribute.php

    419 строка 'limit' => 20

  23. А можно ли сделать так, чтоб значения самих атрибутов задавать из раскрывающегося списка, а не вписывать вручную в текстовое поле?

    И как сделать чтоб не отображался английский вариант атрибута?

  24. 2012-08-12 в 18:10:14 | Ruslan Brest

    Где-то встречал такие переделки в список, поищите среди расширений или на форумах. Мне гораздо удобней набрать 1-2 буквы, чтобы отфильтровать список сразу до 1-2 значений: при заполнении всё активно с клавиатуры вводится и на мышь отвлекаться неудобно, если же даже пользоваться Alt-Down, то искать надо в очень длинном списке с быстрой навигацией только по первой букве (которую я обычно и не помню точно) - поэтому я подобными модификациями не занимался и не интересовался.

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

  25. 2012-11-14 в 10:11:08 | Андрей

    Помогите пожалуйста.... Переделываю коды... меняю все.... но как были не активны, так и есть атрибуты и опции, после сохранения все пропадает.... Не показывает список аяксом... 1,5,1,3 опенкарт

  26. 2013-03-18 в 11:26:12 | Сергей

    На версии 1.5.4.1 - работает вариант модификации для 1.5.1.3

    Спасибо!

  27. Версия 1.5.6

    вношу изменения как для 1.5.1.3

    ругается на:

    Parse error: syntax error, unexpected '}' in /home/t/trsteep/5devices.ru/public_html/admin/model/catalog/attribute.php on line 41

    а именно на строку else

  28. 2013-08-19 в 08:05:40 | Ruslan Brest

    Код там одинаковый, вплоть до совпадающих номеров строк. Было

    if (!empty($data['filter_name'])) {
       $sql .= " AND ad.name LIKE '" . $this->db->escape($data['filter_name']) . "%'";
      }

    стало

    if (!empty($data['filter_name'])) {
       if( $data['filter_name'] == '.' )
        $sql .= " AND ad.name LIKE '%'";
       else
        $sql .= " AND LCASE(ad.name) LIKE '%" . $this->db->escape($data['filter_name']) . "%'";
      }

    И все изменения. Так что у вас при переносе где-то ошибка - где-то лишнюю "}" скорей всего дописали. Ругается явно не строку с "else", а на её окрестности.

  29. Ну в общем не знаю что ему не нравилось, решил оставить только строчку:

    $sql .= " AND LCASE(ad.name) LIKE '%" . $this->db->escape($data['filter_name']) . "%'";

    Без условий. Так заработало

    А вместо "." можно и "%" использовать ;)

  30. Добрый день Руслан.

    Подскажите, как сделать то-же самое для опций?

    Пробовал сделать по аналогии, заменив в файле \admin\model\catalog\option.php все строки

    $sql .= " AND od.name LIKE '" . $this->db->escape($data['filter_name']) . "%'";

    на

    if( $data['filter_name'] == '.' )
        $sql .= " AND ad.name LIKE '%'";
       else
        $sql .= " AND LCASE(ad.name) LIKE '%" . $this->db->escape($data['filter_name']) . "%'";

    но так вообще не работает...

  31. Илья. делайте как я замените (ad.name)на (od.name)и все заработает...

    так же можно сделать и для фильтров но там уже (fd.name)

  32. Блин пропал комментарий...

    Подскажите название модулей или способ как сделать выпадающий список атрибутов и опций (что бы не надо было вводить . или %, просто кликаешь и выпадает список с названиями).

    Благодарю за урок, как всегда всё доступно и понятно, спасибо.

  33. 2014-02-11 в 19:27:17 | Марина

    Большое спасибо! На 1.5.4 всё получилось! И с опциями тоже!

  34. 2015-01-29 в 07:33:00 | Аноним

    Спасибо. довольно простая логика. странно, что сам не додумался так сделать. Облегчил. лайк)

    пс: не пойму, что там не понятно, всё стало, как родное

Оставьте комментарий!

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

Авторизация  Facebook. MaxSiteAuth. Loginza

(обязательно)