Opencart 1.5.x: индикация текущей категории в главном меню

- Posted in Uncategorized by

Добавляем визуальную индикацию текущей выбранной категории в главном меню магазина. Учитывается только первая указанная в пути категория, возможные альтернативы не обрабатываются.

Модифицируемые файлы:

catalog/controller/common/header.php
catalog/view/theme/default/stylesheet/stylesheet.css
catalog/view/theme/default/template/common/header.tpl

В файле catalog/controller/common/header.php ищем

// Level 1
                $this->data['categories'][] = array(
                    'name'     => $category['name'],
                    'children' => $children_data,
                    'column'   => $category['column'] ? $category['column'] : 1,
                    'href'     => $this->url->link('product/category', 'path=' . $category['category_id'])
                );
            }
        }

изменяем:

// Level 1
                $this->data['categories'][] = array(
                    'name'     => $category['name'],
                    'children' => $children_data,
                    'column'   => $category['column'] ? $category['column'] : 1,
                    'href'     => $this->url->link('product/category', 'path=' . $category['category_id']),
                    'category_id' => $category['category_id']    // http://rb.labtodo.com/opencart-15x-show-current-category-in-menu
                );
            }
        }
        // http://rb.labtodo.com/opencart-15x-show-current-category-in-menu :: BEGIN
        if (isset($this->request->get['path'])) {
            $parts = explode('_', (string)$this->request->get['path']);
        } else {
            $parts = array();
        }
        if (isset($parts[0])) {
            $this->data['category_id'] = $parts[0];
        } else {
            $this->data['category_id'] = 0;
        }
        // http://rb.labtodo.com/opencart-15x-show-current-category-in-menu :: END

В файле catalog/view/theme/default/stylesheet/stylesheet.css ищем

#menu > ul > li:hover {
    background: #000;
}

добавляем:

#menu > ul > li:hover {
    background: #000;
}
#menu > ul > li > a.active {
    background: #000;
}

В файле catalog/view/theme/default/template/common/header.tpl ищем

<div id="menu">
  <ul>
    <?php foreach ($categories as $category) { ?>
    <li><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a>

изменяем:

<div id="menu">
  <ul>
    <?php foreach ($categories as $category) { ?>
    <li><?php if ($category['category_id'] == $category_id) { ?>
    <a href="<?php echo $category['href']; ?>" class="active"><?php echo $category['name']; ?></a>
    <?php } else { ?>
    <a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a>
    <?php } ?>

Изменяем длину описаний товаров в каталоге OpenCart 1.5.x

- Posted in Uncategorized by
Это решение также убирает "черные ромбики" и иероглифы в конце русских описаний товаров в каталоге. В других местах делается аналогично.

Вероятно, вас тоже удивляет, почему описания товаров, которые выводятся при просмотре каталога магазина, так бездарно и коротко обрезаются. Ведь даже в стандартном дизайне OpenCart v1.5 там могло бы поместиться ещё 2-3 таких же строки с весьма полезной информацией как для покупателя, так и для поисковых систем. Впрочем, и для внешнего вида стандартного шаблона польза немалая.

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

Вот как выглядит страница каталога с описаниями товаров до и после предлагаемой модификации:

<

p>Чтобы увеличить длину описаний товаров на страницах каталога, необходимо:

  1. Открыть файл catalog/controller/product/category.php
  2. найти поиском строку "substr" (она там одна, OpenCart v1.5.0.5 — 1.5.1.1). Вы увидите небольшой блок из десятка строчек, который начинается с $this->data['products'][] = array(. Перед этой строчкой вставляем 6 строк, приведённых ниже, сразу после этого списка;
  3. Найденную строку 'description' => ... заменяем на 'description' => $descr_plaintext,

В результате должно получиться:

$cut_descr_symbols = 400;
$descr_plaintext = strip_tags(html_entity_decode($result['description'],
    ENT_QUOTES, 'UTF-8'));
if( mb_strlen($descr_plaintext, 'UTF-8') > $cut_descr_symbols )
{
    $descr_plaintext = mb_substr($descr_plaintext, 0,
        $cut_descr_symbols, 'UTF-8') . '&nbsp;&hellip;';
}
$this->data['products'][] = array(
    'product_id'  => $result['product_id'],
    'thumb'       => $image,
    'name'        => $result['name'],
    'description' => $descr_plaintext,
    'price'       => $price,
    'special'     => $special,
    'tax'         => $tax,
    'rating'      => $result['rating'],
    'reviews'     => sprintf($this->language->get('text_reviews'),
        (int)$result['reviews']),
    'href'        => $this->url->link('product/product', 'path='
        . $this->request->get['path']
        . '&product_id=' . $result['product_id'])
);

Длина описания регулируется переменной $cut_descr_symbols. В зависимости от дизайна вам может потребоваться изменить эту величину.

Что исправлено:

  • До модификации строки укорачивались до 100 символов. Описания длиной 300-500 символов выглядят гораздо лучше;
  • символы ".." добавлялись даже к полностью поместившимся описаниям: сейчас символ заменён на HTML-ное троеточие и добавляется только к обрезанным описаниям;
  • ну и mbstring, разумеется. Про которую англоязычные авторы часто забывают.

Аналогичным образом стоит сразу же изменить файлы:

  • catalog/controller/product/search.php
  • catalog/controller/product/special.php
  • catalog/controller/product/compare.php
  • catalog/controller/product/manufacturer.php

То есть найти похожие места (например, по строке "substr") и внести аналогичные изменения.

То же самое для VQmod / Opencart 1.5.1.3.1

<

dl>

stalker780:

Мож кому пригодится vqmod для 1.5.1.3.1 http://shop.clicker.com.ua/download/vqmod_product_long_description_1.0_oc_1.5.1.3.1.zip (локальная копия файла)

Как сделать, чтобы слова не обрезались посередине

А как сделать чтобы слова не обрезались, а последнее слово дописывалось полностью?

Можно строку внутри { ... } заменить на две:

$descr_plaintext = mb_substr($descr_plaintext, 0, $cut_descr_symbols, 'UTF-8');
$descr_plaintext = mb_substr($descr_plaintext, 0, mb_strripos($descr_plaintext, ' ', 0, 'UTF-8'), 'UTF-8') . '&nbsp;&hellip;';

Не отображаются кириллические (русские) буквы в "Производители"

В версиях 1.5.х до 1.5.1.2 надо в файле catalog/controller/product/manufacturer.php найти строку

$key = '0 - 9';

и её окрестности (должно быть примерно в районе 35-40 строк). И изменить там 2 строки, чтобы результат был такой:

foreach ($results as $result) {
    if (is_int(mb_substr($result['name'], 0, 1, 'UTF-8'))) {
        $key = '0 - 9';
    } else {
        $key = mb_substr(mb_strtoupper($result['name'], 'UTF-8'), 0, 1, 'UTF-8');
    }

Типичные проблемы, которые решаются этими правками

[...] когда я делаю длинные описания товара (превью описания в разделе) то в конце иногда появляются непонятные символы-иероглифы. [...]

Как можно исправить проблему с ромбиками/иероглифами/вопросиками проще, не меняя многие файлы?

Попробуйте в файл .htaccess в корне сайта вставить строки:

# php_value mbstring.internal_encoding UTF-8
# php_value default_charset UTF-8
# php_value mbstring.http_output UTF-8
# php_value mbstring.encoding_translation On
# php_value mbstring.detect_order UTF-8
# php_value mbstring.func_overload 6

Они закомментированы (символ "#" в начале строки). Раскомментируйте их все (в идеале). Если возникнет ошибка - закомментируйте и пробуйте включать по одной строке. Ту, на которой возникает ошибка, оставьте закомментированной. Возможно, это поможет решить проблему проще и быстрее.

Просто не у всех хостеров это работает. Либо спросите в техподдержке, как этот код в .htaccess правильно указать и возможно ли это. У некоторых вместо php_value применяется php_admin_value, у кого-то запрещено совсем. А у кого-то это делается через php.ini или может через панель управления.

Bash and Tar: скрипт инкрементального бекапа с помощь after-date

- Posted in Webdev by

Подробная статья о том, как весь этот процесс обустраивается: http://ilab.me/howto/bash-tar-vps-backup/

Я обычно делал гораздо проще (бекап по списку, который берётся из файла), без инкрементальных заморочек: http://baadoo.livejournal.com/25398.html.

Но только потому, что архивы были невелики и усложнять себе жизнь не было мотивов.

Джон Бартон прекращает работу над Firebug

- Posted in Uncategorized by

Ну вот, приплыли. А я держу Firefox считай только из-за него.

http://web-standards.ru/news/384/ Джон Бартон (John J Barton), один из главных разработчиков Firebug, прекращает работу над популярным отладчиком и уходит из IBM в Google для работы вместе с командой Chrome «над новым поколением инструментов для разработки». В своём прощальном письме Джон говорит, что не видит смысла конкурировать с отладчиками, встроенными в браузеры.

Мне Firefox нужен из-за HTML Validator, Firebug и немного YSlow for Firebug. А основным броузером уже лет 10 является Opera. Медленным Firefox'ом после Оперы пользоваться очень трудно, а для исправления интерфейса (чтобы сделать работу удобней и на ноутбуке, и на десктопе) надо ещё найти и поставить неизвестное количество плагинов, которые его явно не ускоряют.

P.S. Тем не менее, http://www.getfirebug.com/. Пока жив.

Русский перевод Opencart v1.5.0.5, v1.5.1, 1.5.2, 1.5.3, 1.5.4/1.5.5, 1.5.6. Информация о других переводах (русский, украинский языки)

- Posted in Uncategorized by

Перевёл пользовательскую часть OpenCart v1.5.0.5. Админку не трогал: на её перевод сейчас нет времени. Возможные проблемы и неточности:

  • Wishlist перевёл как закладки, ничего более подходящего и короткого не придумывается, а по смыслу подходит прекрасно;
  • в районе налогов скорей всего ошибка: в оригинале было "Ex Tax". Я не знаю, что это такое, хотя может оказаться, что "excluding tax", т.е. без НДС или что-то в этом роде. В общем, в этих местах я писал "Без НДС" "НДС", и скорей всего это неправильно. Мы в своём магазине ещё будем это смотреть и проверять с партнёрами, а я пока предупреждаю, что здесь может быть засада.
  • Мне не понравилось стандартное оформление сообщений пары способов доставки (2 практически одинаковые строчки) при оформлении заказа, поэтому принял несколько спорное решение: включил цену доставки прямо в сообщение. То есть цена указана прямо в языковых файлах и изменить её из админки не удастся. Получилось замечательно, но имейте этот момент в виду. В языковых файлах всего в паре мест должна встречаться строчка "грн". Поэтому достаточно найти и убрать упоминания "грн" и конкретной стоимости в 4 файлах:
    • catalog/language/russian/shipping/free.php
    • catalog/language/russian/shipping/flat.php
    • admin/language/russian/shipping/free.php
    • admin/language/russian/shipping/flat.php

Базовым вариантом послужил русский перевод пользователя alsrmurad от 22 июня 2011 года. Но многие строки там были предельно кошмарны и с ошибками: то ли машинный перевод, то ли переводчик не русский, а просто знает язык недостаточно хорошо. Или банально спешил выложить. Во всяком случае я по-любому благодарен автору за частично сделанный перевод: это сэкономило немало времени и избавило от приличной части рутинных операций.

UPD 2011-07-21: небольшие обновления и исправления ошибок. Узнал также о существовании ещё одного перевода Opencart, есть SVN. См. также ветку форума opencartforum.ru.

UPD 2011-07-25: Dmitry добавил свой перевод административной части Opencart 1.5.0-1.5.1. Правда, скачать без регистрации невозможно.

UPD 2011-07-29: Очередное обновление замеченных ошибок, неточностей и корявостей. На этом я прощаюсь с версией 1.5.0.5 и мигрирую на 1.5.1.1 - они очень похожи, но мелкие отличия в языковых файлах есть. Собираюсь держать свою версию перевода 1.5.1 здесь же рядом с 1.5.0.5, и может быть на этот раз будет время заняться административной частью. Я присоединился к команде переводчиков ocStore (русской сборки OpenCart) на assembla.com (см. выше про SVN), поэтому частично мои правки попадают туда (коммичу не все свои варианты, и местами там не все варианты нравятся), частично многое я возьму оттуда. Но так как там обновляется только текущая версия перевода, а ветки по конкретным версиям не хранятся, я решил продолжать держать у себя те версии, с которыми работаю, в виде отдельных архивов.

UPD 2011-09-16: Исправлен ошибочный перевод в админке, также ранее вносились мелкие изменения.

UPD: Украинским переводом занимаются парни с opencart-ua.org

Скачать

Как можно помочь проекту:

Скачать также можно на официальном сайте opencart.com в расширениях.

Сообщайте о любых неточностях или ошибках! Предложения более удачных вариантов перевода также приветствуются.

Пользователи Github могут помочь улучшению перевода:

  • сообщайте об ошибках и предлагайте варианты в Issues - этот вариант не требует никаких специальных знаний;
  • для небольших исправлений можете найти необходимый файл и отредактировать его или оставить комментарий к конкретным строкам;
  • пользователи, знакомые с работой Git, могут пользоваться пулл-реквестами для предложения своих исправлений и дополнений.

Установка

  1. Скопируйте содержимое архива (папки admin и catalog) в каталог интернет-магазина.
  2. Зайдите в админку и добавьте ещё один язык, русский: System / Localisation / Languages / Insert. Все поля появившейся формы должны быть пустые. Заполните, как показано ниже:
    Language Name: Русский
    Code: ru
    Locale: ru,ru_RU,ru_RU.UTF-8
    Image: ru.png
    Directory: russian
    Filename: russian
    Status: Enabled
    Sort Order: 1

    и нажмите кнопку Save

  3. Проверьте работоспособность добавленного языка: перейдите в магазин и переключитесь там на русский язык. Есил всё отображается без сообщений без ошибок и по-русски, можете переходить к следующему пункту. Если возникают какие-либо ошибки - не переключайте язык админки на русский ни в коем случае, пока не разберётесь с причиной и не исправите ошибки.
  4. перейдите на вкладку System / Settings / [Edit] / Local и выберите в выпадающих списках Language и Administration Language параметр "Русский" (чтобы созданный язык использовался в интерфейсе магазина и в админ-части)

Если у вас проблема с установкой, и не можете справиться

Если не можете найти ошибку и есть возможность - дайте мне доступ к FTP и админке Опенкарта, я проверю. Приватное сообщение мне можно отправить со страницы Контакт.

Если разбираетесь, что к чему у хостера -- лучше сделать для меня временную учетную запись для доступа к FTP/базе (и в Opencart тоже можно заодно отдельный логин в группе администраторов), чтобы не раздавать свой основной логин/пароль. А после того, как всё закончится - вы просто удаляете этот временный доступ.

Желательно, по возможности, чтобы в имени пользователя и пароле к FTP не использовались символы `@` и `:` - они сильно замедляют мне работу, приходится пользоваться неудобными инструментами.

Facebook Like Button плагин для MaxSite CMS

- Posted in Uncategorized by

Написал плагин для MaxSite CMS, который добавляет кнопку Facebook Like внизу страниц.

Настройки в админке ещё не все внёс. Пока хочу найти причину, почему кнопка Like работает не на всех страницах?!?! (Update: уже работает, видимо это были временные проблемы Facebook.) Может дело в самом блоге, которому всего пара дней от роду? Но раз некоторые страницы добавляются, то дело не в коде кнопки и не в плагине, поэтому выкладываю AS IS.

Странно, что его нет в стандартном комплекте, ведь на http://maxsite.org/ эти кнопки присутствуют. Ну и гуглом, разумеется, ничего не нашёл.

Скачать Facebook Like Button плагин для MaxSite CMS 8

Улучшение поиска в OpenCart 1.5: поиск по описанию, подкатегориям, по модели и SKU

- Posted in Uncategorized by

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

Поиск по описаниям и подкатегориям

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

Для того, чтобы исправить поведение поиска по умолчанию в версиях OpenCart от v1.5.0.5 до 1.5.2 (а может и в более поздних, но на данный момент я знаю только про эти), надо отредактировать файл catalog/view/javascript/common.js:

строки #9 и #22 изменить с

url += '&filter_name=' + encodeURIComponent(filter_name);

на

url += '&filter_name=' + encodeURIComponent(filter_name) +
'&filter_sub_category=true&filter_description=true';

Поиск по модели и SKU (артикулу) - вариант для версий 1.5.0.5 - 1.5.1.2 и может более ранних 1.5.x

Чтобы добавить поиск по модели и SKU (артикулу), надо модифицировать ещё один файл:

commit 56a765ccb474075b7073f11474100e2251e0d762
Author: Ruslan Brest <rb@labtodo.com>
Date:   Mon Sep 5 11:55:51 2011 +0300
    [+] catalog: search: добавлен поиск по модели и SKU
diff --git a/public_html/catalog/model/catalog/product.php b/public_html/catalog/model/catalog/product.php
index 520bc34..e9a3d73 100644
--- a/public_html/catalog/model/catalog/product.php
+++ b/public_html/catalog/model/catalog/product.php
@@ -106,10 +106,12 @@ class ModelCatalogProduct extends Model {
            . (int)$this->config->get('config_store_id') . "'";
 
            if (isset($data['filter_name']) && $data['filter_name']) {
+               $sFilterName = $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8'));
+               $sql_search_model_sku = 'LCASE(p.model) LIKE "%' . $sFilterName . '%" OR LCASE(p.sku) LIKE "%' . $sFilterName . '%"';
                if (isset($data['filter_description']) && $data['filter_description']) {
-                   $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8')) . "%' OR p.product_id IN (SELECT pt.product_id FROM " . DB_PREFIX . "product_tag pt WHERE pt.language_id = '" . (int)$this->config->get('config_language_id') . "' AND LCASE(pt.tag) LIKE '%" . $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8')) . "%') OR LCASE(pd.description) LIKE '%" . $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8')) . "%')";
+                   $sql .= " AND (".$sql_search_model_sku." OR LCASE(pd.name) LIKE '%" . $sFilterName . "%' OR p.product_id IN (SELECT pt.product_id FROM " . DB_PREFIX . "product_tag pt WHERE pt.language_id = '" . (int)$this->config->get('config_language_id') . "' AND LCASE(pt.tag) LIKE '%" . $sFilterName . "%') OR LCASE(pd.description) LIKE '%" . $sFilterName . "%')";
                } else {
-                   $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8')) . "%' OR p.product_id IN (SELECT pt.product_id FROM " . DB_PREFIX . "product_tag pt WHERE pt.language_id = '" . (int)$this->config->get('config_language_id') . "' AND LCASE(pt.tag) LIKE '%" . $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8')) . "%'))";
+                   $sql .= " AND (".$sql_search_model_sku." OR LCASE(pd.name) LIKE '%" . $sFilterName . "%' OR p.product_id IN (SELECT pt.product_id FROM " . DB_PREFIX . "product_tag pt WHERE pt.language_id = '" . (int)$this->config->get('config_language_id') . "' AND LCASE(pt.tag) LIKE '%" . $sFilterName . "%'))";
                }
            }

Поиск по модели и SKU (артикулу) - вариант для версии 1.5.1.3 (и наверное выше)

commit 77611b6dcad3fb21484c889bb7726688cb68de34
Author: Ruslan Brest <rb@labtodo.com>
Date:   Mon Oct 10 11:58:24 2011 +0300
    [+] catalog: search by model and SKU
diff --git a/upload/catalog/model/catalog/product.php b/upload/catalog/model/catalog/product.php
index 25a7861..a9ed128 100644
--- a/upload/catalog/model/catalog/product.php
+++ b/upload/catalog/model/catalog/product.php
@@ -54,13 +54,19 @@ class ModelCatalogProduct extends Model {
                    $implode = array();
                    
                    $words = explode(' ', $data['filter_name']);
                    foreach ($words as $word) {
-                       if (!empty($data['filter_description'])) {
-                           $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
-                       } else {
-                           $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
-                       }               
+                       if( !empty($word) )
+                       {
+                           $lword = $this->db->escape(utf8_strtolower(trim($word)));
+                           // Add search by model and SKU
+                           $implode[] = 'LCASE(p.model) LIKE "%' . $lword . '%" OR LCASE(p.sku) LIKE "%' . $lword . '%"';
+                           if (!empty($data['filter_description'])) {
+                               $implode[] = "LCASE(pd.name) LIKE '%" . $lword . "%' OR LCASE(pd.description) LIKE '%" . $lword . "%'";
+                           } else {
+                               $implode[] = "LCASE(pd.name) LIKE '%" . $lword . "%'";
+                           }
+                       }
                    }
                    
                    if ($implode) {

А как же админка? Там тоже SKU не хватает!

Можете также добавить возможность поиска по SKU в админ-зоне магазина.