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

Кому нравится способ ввода атрибутов товаров в 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 - для тех, кто "не понимает, что такое дифф", там в виде "было / стало".