Яндексу потребовалось 12 дней, чтобы проиндексировать наш интернет-магазин

- Posted in Webdev by

Я удивлён таким чудовищным сроком. Sitemap.xml был добавлен 11-го числа на http://webmaster.yandex.ua/, и только сегодня (23 сентября) наконец-то сайт попал в поисковую выдачу, а надпись про "сайт успешно добавлен в очередь, ждите" сменилась информацией о том, что столько-то страниц проиндексировано.

Обычно люди говорят о 2-3 днях на индексацию.

Я уж думал, что мы попали в немилость -- предположим, посчитали злостными копипастерами. В той области, кстати, которой мы занялись, выглядеть оригинально по части текстов весьма затруднительно. По фотографиям тоже, поскольку основная масса фото берётся с сайтов производителей и, разумеется, в сотнях магазинов одинаковые. Но мы над этим работаем.

Для сравнения: Google понадобилось меньше дня. Я даже не собирался проверять раньше, чем через сутки, но приятель накатал всем членам команды вопль радости по email :) Мол, ура, всем радоваться - мы попали в поисковую выдачу. Он случайно обнаружил, я даже не успел сказать ему, что занялся поисковиками.

Google Webmaster Tools

Яндекс.Вебмастер

Хотите грохнуть репозиторий на Google Code, но не знаете как?

- Posted in Uncategorized by

Смените тип репозитория с SVN на Git. Это не сконвертирует его, как можно было бы предположить, а молча удалит. Сюрприз!

Git User's Survey 2011

- Posted in Uncategorized by

UPD: This survey is currently closed. More information can be found on http://git.wiki.kernel.org/index.php/GitSurvey2011


Все на выборы!

В смысле заполните анкетку: https://www.survs.com/survey/VCAGZA8CT5

Результаты наверное будут многим пользователям Git интересны.

Я по ходу дела узнал много новых букв названий интересного Git-софта.

Вывод Git branch в подсказку командной строки

- Posted in Uncategorized by

При активном использовании Git-а и переключений между разными ветками часто хочется видеть, в какой ветке находишься. Удобно добавить вывод названия branch-а в подсказку командной строки bash:

rb@rb-msi:~/projects/opencart-a4u (master)$ 

Для этого в ~/.bashrc находим строку, похожую на PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ':

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

и изменяем (я закомментировал старую строку и добавил новую):

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    # PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(git branch &>/dev/null; if [ $? -eq 0 ]; then echo " ($(git branch | grep '^*' |sed s/\*\ //))"; fi)\$ '
fi

Теперь при попадании в каталог внутри Git репозитория bash prompt будет показывать в скобках имя текущего branch-а, что выглядит примерно так:

rb@rb-msi:~/projects/opencart-a4u (master)$ 

UPD 2012-02-07: See also http://en.newinstance.it/2010/05/23/git-autocompletion-and-enhanced-bash-prompt/

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

- Posted in Uncategorized by

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

Видеокамера на орбите снаружи космической станции

- Posted in Uncategorized by

Johnson Space Center - NASA-ISS-push Streaming ISS Video:

mms://a1709.l1856953708.c18569.g.lm.akamaistream.net/D/1709/18569/v0001/reflector:53708

Смотреть можно в любом видео-плеере, обычно сейчас все умеют кроме "Open File" что-то вроде "Open Location", "Open URL", "Open Network Location" и т.п.

Поток примерно 20-50 килобайт в секунду, 640x360. Иногда можно послушать переговоры астронавтов с Землёй :)

UPD: включил в 17:50 - вовсю идут переговоры по-русски вперемешку с английским.

Камер несколько, смотрят в разные стороны - время от времени происходит переключение.

Орбиту и текущее положение станции можно увидеть здесь: http://www.heavens-above.com/orbit.aspx?satid=25544.

P.S. Доложили, что Totem 2.28.2 (устанавливаемый в Ubuntu по умолчанию видео-плеер) не показывает поток. С Gnome-mplayer и VLC проблем не замечено. Под Windows не пробовал, но если что-то имеющееся под рукой не воспроизводит -- могу порекомендовать GOM Player (с этим плеером у меня приключений за долгие годы не было). Ну и VLC существует под Windows.

Opencart 1.5.1.x (catalog): как вывести третий уровень категорий в главном меню

- Posted in Uncategorized by

UPD 2015-01: Статья написана в 2011 году для актуальных тогда версий OpenCart. Для более новых описанные изменения могут не подойти. Скорей всего описанные изменения актуальны для всех oc151x (делалось на них), может быть до oc153x (не уверен). Есть информация о том, что для v1564 не подходит. Я не пользовался всей этой линейкой версий и соответственно не делал для них изменения. Если не получается разобраться, можно нанять меня, за 10-15 WMZ сделаю для вашей версии.

Если используется тема, отличная от default, изменения надо производить в её файлах, разумеется (css, tpl). И только в случае отсутствия их в используемой теме их следует искать в default. И в этом случае может понадобиться индивидуальный подход, поскольку CSS может значительно отличаться. Так что будьте особенно аккуратны, делайте резервные копии изменяемых файлов.

Имейте в виду, что оригинальное решение, принятое в Опенкарт, очень неоптимальное по производительности и при большом количестве категорий и товаров этот блок надо переделать и сделать совершенно по-другому. Здесь показан способ, использующий стандартный механизм Опенкарт.

 

diff --git a/public_html/catalog/controller/common/header.php b/public_html/catalog/controller/common/header.php
index 21bfe6f..a603a5f 100644
--- a/public_html/catalog/controller/common/header.php
+++ b/public_html/catalog/controller/common/header.php
@@ -200,10 +200,11 @@ class ControllerCommonHeader extends Controller {
                                    
                    $children_data[] = array(
                        'name'  => $child['name'] . ' (' . $product_total . ')',
-                       'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])  
-                   );                  
+                       'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id']),
+                       'children' => $this->getChildrenData($child['category_id'], $category['category_id']) // rb, 2011-09-03: menu 3rd level
+                   );
                }
-               
+
                // Level 1
                $this->data['categories'][] = array(
                    'name'     => $category['name'],
@@ -237,6 +238,28 @@ class ControllerCommonHeader extends Controller {
        }
        
        $this->render();
-   }   
+   }
+
+   // http://rb.labtodo.com/, 2011-09-03: menu 3rd level
+   private function getChildrenData( $ctg_id, $path_prefix )
+   {
+       $children_data = array();
+       $children = $this->model_catalog_category->getCategories($ctg_id);
+
+       foreach ($children as $child) {
+           $data = array(
+               'filter_category_id'  => $child['category_id'],
+               'filter_sub_category' => true
+           );
+
+           $product_total = $this->model_catalog_product->getTotalProducts($data);
+
+           $children_data[] = array(
+               'name'  => $child['name'] . ' (' . $product_total . ')',
+               'href'  => $this->url->link('product/category', 'path=' . $path_prefix . '_' . $child['category_id'])
+           );
+       }
+       return $children_data;
+   }
 }
 ?>
\ No newline at end of file
diff --git a/public_html/catalog/view/theme/default/stylesheet/stylesheet.css b/public_html/catalog/view/theme/default/stylesheet/stylesheet.css
index ecee15b..3f89efa 100644
--- a/public_html/catalog/view/theme/default/stylesheet/stylesheet.css
+++ b/public_html/catalog/view/theme/default/stylesheet/stylesheet.css
@@ -343,7 +343,9 @@ label {
 #menu > ul > li > a.active {
    background: #000;
 }
-#menu > ul > li > a {
+#menu > ul > li > a
+/*#menu > ul > li > div > ul > li > a*/
+{
    font-size: 13px;
    color: #FFF;
    line-height: 14px;
@@ -353,7 +355,8 @@ label {
    z-index: 6;
    position: relative;
 }
-#menu > ul > li > div {
+#menu > ul > li > div
+{
    display: none;
    background: #FFFFFF;
    position: absolute;
@@ -366,16 +369,39 @@ label {
    border-radius: 0px 0px 5px 5px;
    background: url('../image/menu.png');
 }
-#menu > ul > li:hover > div {
+#menu > ul > li > div > ul > li > div
+{
+   display: none;
+   background: #FFFFFF;
+   position: absolute;
+   z-index: 5;
+   padding: 5px;
+   margin-left: 50px;
+   border: 1px solid #000000;
+   -webkit-border-radius: 0px 0px 5px 5px;
+   -moz-border-radius: 0px 0px 5px 5px;
+   -khtml-border-radius: 0px 0px 5px 5px;
+   border-radius: 0px 0px 5px 5px;
+   background: url('../image/menu.png');
+}
+#menu > ul > li:hover > div,
+#menu > ul > li:hover > div > ul > li:hover > div
+{
    display: table;
 }
-#menu > ul > li > div > ul {
+#menu > ul > li > div > ul,
+#menu > ul > li > div > ul > li > div > ul
+{
    display: table-cell;
 }
-#menu > ul > li ul + ul {
+#menu > ul > li ul + ul,
+#menu > ul > li ul > li ul + ul
+{
    padding-left: 20px;
 }
-#menu > ul > li ul > li > a {
+#menu > ul > li ul > li > a,
+#menu > ul > li ul > li ul > li > a
+{
    text-decoration: none;
    padding: 4px;
    color: #FFFFFF;
@@ -386,9 +412,12 @@ label {
 #menu > ul > li ul > li > a:hover {
    background: #000000;
 }
-#menu > ul > li > div > ul > li > a {
+#menu > ul > li > div > ul > li > a,
+#menu > ul > li > div > ul > li > div > ul > li > a
+{
    color: #FFFFFF;
 }
+
 .breadcrumb {
    color: #CCCCCC;
    margin-bottom: 10px;
diff --git a/public_html/catalog/view/theme/default/template/common/header.tpl b/public_html/catalog/view/theme/default/template/common/header.tpl
index eef4ae7..d93120a 100644
--- a/public_html/catalog/view/theme/default/template/common/header.tpl
+++ b/public_html/catalog/view/theme/default/template/common/header.tpl
@@ -123,7 +123,17 @@ DD_belatedPNG.fix('#logo img');
           <?php $j = $i + ceil(count($category['children']) / $category['column']); ?>
           <?php for (; $i < $j; $i++) { ?>
           <?php if (isset($category['children'][$i])) { ?>
-          <li><a href="<?php echo $category['children'][$i]['href']; ?>"><?php echo $category['children'][$i]['name']; ?></a></li>
+          <li><a href="<?php echo $category['children'][$i]['href']; ?>"><?php echo $category['children'][$i]['name']; ?></a>
+            <?php if( $category['children'][$i]['children'] ) { ?>
+            <div>
+              <ul>
+              <?php foreach( $category['children'][$i]['children'] as $menu3item ) { ?>
+              <li><a href="<?php echo $menu3item['href']; ?>"><?php echo $menu3item['name']; ?></a></li>
+              <?php } ?>
+              </ul>
+            </div>
+            <?php } ?>
+          </li>
           <?php } ?>
           <?php } ?>
         </ul>

Первичные настройки Git

- Posted in Uncategorized by

Представляемся надолго, чтобы коммиты не были ничейными:

git config --global user.name "Your Name Comes Here"
git config --global user.email you@yourdomain.example.com

Облегчаем визуальное восприятие изменений:

git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto
git config --global color.ui auto

Не забываем про заплетающиеся пальцы (вы способны быстро набрать "status" без опечаток?! Раз 50 в день?!?! Ого!):

git config --global alias.st status
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.logd 'log --oneline --graph --decorate'
git config --global alias.logdm 'log --oneline --graph --decorate --no-merges'
git config --global alias.logn 'log --pretty=format:"%cd %C(auto)%h (%an) %s%+b%d" --date=short'
git config --global alias.logst 'log --stat=140,100'
git config --global alias.logf 'log --stat=140,100'
git config --global alias.bav 'branch -av'
git config --global alias.rv 'remote -v'
git config --global alias.diffw 'diff --word-diff'

Проделав это один раз, можно добавить в свой бекап файл ~/.gitconfig, в котором настройки и хранятся. Или скопируйте его в Дропбокс, а в домашнем каталоге оставьте симлинк на этот файл.

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

Если нужен gitk, то перед вторым запуском (первый под Линуксом нужен, чтобы слегка удивиться, проморгаться и взбодриться) исправьте в ~/.gitk интерфейсные шрифты:

set mainfont {{andale mono} 9}
set textfont {{andale mono} 9}
set uifont {clean 10 bold}
set tabstop 4

Хотя это в принципе и через GUI сделать можно.

Opencart 1.5.x (admin): показ в списке категорий их SEO Keyword

- Posted in Uncategorized by

Буду краток:

Рецепт приготовления:

diff --git a/public_html/admin/controller/catalog/category.php b/public_html/admin/controller/catalog/category.php
index d449b87..4a33c14 100644
--- a/public_html/admin/controller/catalog/category.php
+++ b/public_html/admin/controller/catalog/category.php
@@ -108,6 +108,7 @@ class ControllerCatalogCategory extends Controller {
        $this->data['text_no_results'] = $this->language->get('text_no_results');
 
        $this->data['column_name'] = $this->language->get('column_name');
+       $this->data['column_seo_keyword'] = $this->language->get('column_seo_keyword');
        $this->data['column_sort_order'] = $this->language->get('column_sort_order');
        $this->data['column_action'] = $this->language->get('column_action');
 
@@ -406,6 +408,7 @@ class ControllerCatalogCategory extends Controller {
            $output[$result['category_id']] = array(
                'category_id' => $result['category_id'],
                'name'        => $name,
+               'keyword'     => $result['keyword'],
                'sort_order'  => $result['sort_order'],
                'selected'    => $selected,
                'action'      => $action,
diff --git a/public_html/admin/language/english/catalog/category.php b/public_html/admin/language/english/catalog/category.php
index 88a5549..669bb3a 100644
--- a/public_html/admin/language/english/catalog/category.php
+++ b/public_html/admin/language/english/catalog/category.php
@@ -9,6 +9,7 @@ $_['text_image_manager']     = 'Image Manager';
 
 // Column
 $_['column_name']            = 'Category Name';
+$_['column_seo_keyword']     = 'SEO Keyword';
 $_['column_sort_order']      = 'Sort Order';
 $_['column_action']          = 'Action';
 
diff --git a/public_html/admin/language/russian/catalog/category.php b/public_html/admin/language/russian/catalog/category.php
index 6acd92a..faa975b 100644
--- a/public_html/admin/language/russian/catalog/category.php
+++ b/public_html/admin/language/russian/catalog/category.php
@@ -9,6 +9,7 @@ $_['text_image_manager']     = 'Менеджер изображений';
 
 // Column
 $_['column_name']            = 'Название категории';
+$_['column_seo_keyword']     = 'SEO URL';
 $_['column_sort_order']      = 'Порядок сортировки';
 $_['column_action']          = 'Действие';
 
diff --git a/public_html/admin/model/catalog/category.php b/public_html/admin/model/catalog/category.php
index 27a35f4..ffbee94 100644
--- a/public_html/admin/model/catalog/category.php
+++ b/public_html/admin/model/catalog/category.php
@@ -193,7 +193,7 @@ class ModelCatalogCategory extends Model {
    }
 
    public function getCategoriesByParentId($parent_id = 0) {
-       $query = $this->db->query("SELECT *, (SELECT COUNT(parent_id) FROM " . DB_PREFIX . "category WHERE parent_id = c.category_id) AS children FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.parent_id = '" . (int)$parent_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' ORDER BY c.sort_order, cd.name");
+       $query = $this->db->query("SELECT *, (SELECT COUNT(parent_id) FROM " . DB_PREFIX . "category WHERE parent_id = c.category_id) AS children FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) LEFT JOIN `".DB_PREFIX."url_alias` ua ON ( ua.query = CONCAT('category_id=', c.category_id) ) WHERE c.parent_id = '" . (int)$parent_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' ORDER BY c.sort_order, cd.name");
 
        return $query->rows;
    }
diff --git a/public_html/admin/view/template/catalog/category_list.tpl b/public_html/admin/view/template/catalog/category_list.tpl
index 76cdd01..b5d9af9 100644
--- a/public_html/admin/view/template/catalog/category_list.tpl
+++ b/public_html/admin/view/template/catalog/category_list.tpl
@@ -23,6 +23,7 @@
             <tr>
               <td width="1" style="text-align: center;"><input type="checkbox" onclick="$('input[name*=\'selected\']').attr('checked', this.checked);" /></td>
               <td class="left"><?php echo $column_name; ?></td>
+              <td class="left"><?php echo $column_seo_keyword; ?></td>
               <td class="right"><?php echo $column_sort_order; ?></td>
               <td class="right"><?php echo $column_action; ?></td>
             </tr>
@@ -41,6 +42,7 @@
               <?php } else { ?>
                 <td class="left"><?php echo $category['indent']; ?><?php echo $category['name']; ?></td>
               <?php } ?>
+              <td class="left"><?php echo $category['keyword']; ?></td>
               <td class="right"><?php echo $category['sort_order']; ?></td>
               <td class="right"><?php foreach ($category['action'] as $action) { ?>
                 [ <a href="<?php echo $action['href']; ?>"><?php echo $action['text']; ?></a> ]
@@ -49,7 +51,7 @@
             <?php } ?>
             <?php } else { ?>
             <tr>
-              <td class="center" colspan="4"><?php echo $text_no_results; ?></td>
+              <td class="center" colspan="5"><?php echo $text_no_results; ?></td>
             </tr>
             <?php } ?>
           </tbody>

Opencart 1.5.x (catalog): как сделать, чтобы модуль категорий показывал все подкатегории

- Posted in Uncategorized by

Чтобы модуль категорий показывал все подкатегории развёрнуто, а не только выбранную, надо изменить CSS стиль шаблона. Если используется шаблон 'default', то:

diff --git a/public_html/catalog/view/theme/default/stylesheet/stylesheet.css b/public_html/catalog/view/theme/default/stylesheet/stylesheet.css
index 3f89efa..690b824 100644
--- a/public_html/catalog/view/theme/default/stylesheet/stylesheet.css
+++ b/public_html/catalog/view/theme/default/stylesheet/stylesheet.css
@@ -730,7 +730,8 @@ a.button:hover span {
    color: #333;
 }
 .box-category > ul > li ul {
-   display: none;
+   /* display: none; */
+   font-size: 0.8em;
 }
 .box-category > ul > li a.active {
    font-weight: bold;

Пример того, как модуль категорий будет выглядеть, можно видеть на демонстрационном видео: