Показаны сообщения с ярлыком Opencart. Показать все сообщения
Показаны сообщения с ярлыком Opencart. Показать все сообщения

среда, 1 мая 2013 г.

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


Так выглядит:
И так это делается:
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>

отсюда:
http://rb.labtodo.com/page/opencart-15x-admin-pokaz-v-spiske-kategorij-ih-seo-keyword

понедельник, 22 апреля 2013 г.

SafePatch -- альтернатива vQmod


Идея патчей и vQmod совершенно одинаковая. И в одном, и другом случае файл с изменениями накладывается на некую известную основу. И если эта основа изменилась -- и патч, и vQmod могут "поломаться": не смогут внести изменения, если не найдут точного соответствия, необходимого для внесения правок.
Поэтому те, кто наивно полагает, что vQmod спасёт их от всех бед и является волшебной таблеткой и позволит без проблем обновлять версии и ни о чем не беспокоиться - сильно заблуждаются.
А те, кто знает об этом и вынужден хоть так, хоть иначе контролировать логи ошибок -- знают, что заниматься отладкой vQmod гораздо менее удобно, чем иметь изменения сразу на месте, в коде, и не гадать, откуда именно берется исполняемый код.
К тому же vQmod - рантайм решение. То есть работает при каждом запросе к серверу. Конечно, многое решается кешированием. Но я из тех разработчиков, которые не совсем понимают, зачем нужно вводить лишнее звено, если то же самое делается без дополнительных костылей (а технологии внесения и убирания этих изменений существуют уже лет 40 и протестированы не одним поколением программистов -- я говорю об утилитах `patch` и `diff`).
И вот совсем недавно, в поисках PHP-реализации утилиты `patch` или автоматического конвертера DIFF в vQmod XML, я наткнулся на замечательный вариант: утилиту SafePatch.
Если кратко и своими словами -- это "менеджер пакетов" (расширений). Но в отличие от vQmod (runtime) он эти изменения вносит непосредственно в исходный код (как `patch`).
Так что те, кто интересуется вопросом - встречайте. По-моему, хороший инструмент.
See also:

пятница, 11 января 2013 г.

Бекап Opencart сайта - checklist


Сайт обычно располагается в папке `public_html`.
  1. Папки `admin`, `catalog`, `download`, `system`, а также файлы `.htaccess`, `config.php`, `humans.txt`, `robots.txt`, `yandex_*.txt` -- это всё движок магазина. Те, кто использует VQmod, должны добавить к списку ещё папку `vqmod`.
    • файлы с точкой впереди - системные/скрытые. Поэтому их может быть не видно и надо включить в настройках FTP-клиента опцию их показа. `.htaccess` очень важен для работы сайта. Если у него есть расширение (.TXT или любое другое) - значит он сервером не используется (отключен). В этом случае не будут работать SEO URL;
    • в указанных папках есть 2 "лишние", их нежелательно включать в бекап: `system/cache`, `system/logs`. Это кешированные файлы и лог ошибок. Они нужны для работы и диагностики, но хранить их - смысла мало. Особенно если они большого объёма;
    • если вы пользуетесь VQmod-ом: папку `vqmod/logs` желательно исключить из бекапа. Папку 'vqmod/vqcache' можно бекапить, а можно и нет. Самое ценное здесь - содержимое `vqmod/xml`. Остальное несложно восстановить.
  2. Вторая важная часть сайта - картинки/фото.
  3. Они находятся в папке `image` (`public_html/image`). Оригиналы картинок - в паке `image/data`. Это самое ценное. Остальное несложно восстановить.
    • Что здесь бекапить: всю папку `image` за исключением `image/cache`
    • `image/cache` очень объемная. Эти файлы генерируются сайтом на лету при просмотре сайта. Ссылки на них могут использоваться в `sitemap.xml`.
  4. Третья критически важная часть сайта - база данных магазина. Её через FTP не скопируешь. Её надо бекапить либо Adminer-ом, либо phpMyAdmin (обычно есть в панели управления хостинга).

суббота, 1 сентября 2012 г.

Продвинутое кэширование в Opencart

В архиве два измененных файла из версии OpenCart 1.4.9.4. 

1. Поддержка кэширования через Memcached.

Установка:
1. Берете файл cache.php и перезаписываете им файл system/library/cache.php. Эта процедура не нарушит работу сайта - будет использоватся обычный файловый кэшь.
2. Устанавливаете в системе (или на другом сервере) сервер memcached и запускаете его. Это делается просто - без каких-то особенностей. Единственное, что если будете использовать кэширование в memcached совместно с mysql_cached, скорей всего в конфиге memcached нужно будет увеличить размер используемой памяти. На CentOS, например, после установки выделяется 65 Мб.
2. Идете в корень магазина и текстовым редактором дописываете в config.php строки конфигурации (с параметрами своего memcached сервера):

define('CACHE_DRIVER', 'memcached');
define('MEMCACHE_HOSTNAME', 'localhost');
define('MEMCACHE_PORT', '11211');
define('MEMCACHE_NAMESPACE', 'opencart_test');

Если в CACHE_DRIVER установлено другое значение или нет подключения к memcached серверу, будет использоваться стандартный файловый кэш.
Рекомендую эти-же параметры прописать в файле конфигурации админки - admin/config.php. Сейчас это не очень принципиально, но, надеюсь, в будущем в админке добавяться опции управления кэшем.
Параметр MEMCACHE_NAMESPACE нужен для варианта когда одним сервером memcached будут пользоваться разные магазины - для разделения их кэшей.

Проект на GitHub, скачать

Драйвер для БД MySQL с поддержкой кэширования SQL запросов

Нужен для уменьшения нагрузки на БД у магазинов с большим количеством товара и/или трафика.

Дополнительный драйвер БД для Mysql, в котором происходит кэширование всех SELECT запросов. Время кэширования SQL запросов в секундах задается в config.php.

Установка:
1. Копируете файл mysql_cached.php в каталог system/database/.
2. В корне магазина в файле config.php меняете строку
define('DB_DRIVER', 'mysql');
на
define('DB_DRIVER', 'mysql_cached');
и добавляете
define('DB_CACHED_EXPIRE', 120);
НЕ рекомендую ставить этот драйвер в конфигурации админки. Т.к. в админку не встроены средства сброса кэша и это чревато различными "глюками".

Проект на GitHub, Скачать


В качестве общей рекомендации по оптимизации нагрузки на БД, в первую очередь рекомендую сделать индексы в БД. По результатам оптимизации одного из специалистов возник список рекомендованных для добавления индексов (в данном примере все таблицы с префиксом "oc_". Для вашей базы может понадобится другой префикс или его отсуствие):

oc_product:

alter table `oc_product` add KEY `model` (`model`);
alter table `oc_product` add KEY `stock_status_id` (`stock_status_id`);
alter table `oc_product` add KEY `quantity` (`quantity`,`date_available`);
alter table `oc_product` add KEY `tax_class_id` (`tax_class_id`,`weight_class_id`,`length_class_id`);
alter table `oc_product` add KEY `sort_order` (`sort_order`);

oc_product_option_description:

alter table `oc_product_option_description` add KEY `product_id` (`product_id`);

oc_product_option_value:

alter table `oc_product_option_value` add KEY `product_option_id` (`product_option_id`);
alter table `oc_product_option_value` add KEY `product_id` (`product_id`);

oc_url_alias:

alter table `oc_url_alias` add UNIQUE KEY `query` (`query`);
alter table `oc_url_alias` add KEY `keyword` (`keyword`);

oc_zone:

alter table `oc_zone` add KEY `country_id` (`country_id`);


отсюда:

http://forum.opencart.ua/viewtopic.php?f=5&t=79

пятница, 24 августа 2012 г.

Форум для интеграции с Opencart


Форум для Опенкарт 1.5.1.x. Интегрируется с базой Опенкарт (как пользователями, так и покупателями), настраивается из админки. Написан на CakePHP. Живёт на гитхабе.
Оригинал новости на сайте автора: http://tvorzasp.com/blog/forum-dlya-opencart
UPD 2012-09-02: Новый OC Forum 0.2.0alpha. -CakePHP, +Yii

вторник, 1 мая 2012 г.

Opencart: купоны


подскажите по использованию купонов. еще никогда не использовал, но хочу попробовать.
1 купон может быть использован 1 раз или нет?
я хочу каждому покупателю дарить скидочный купон, скажем на 10 гривен. можно ли сделать чтобы всем был один и тот же купон или нужно создавать для каждого покупателя новый купон?
Количество использований купона одним покупателем зависит от настроек купона.
Можно также установить, чтобы купон можно было использовать суммарно не более N раз.
Действуют купоны обычно как ключи к машине - любой, у кого он есть, может воспользоваться. То есть если кто-то о многоразовом купоне расскажет -- они тоже придут и могут воспользоваться. Поэтому если нужны одноразовые - их придется заводить на каждого покупателя со счетчиком = 1.
Может оказаться удобней воспользоваться кредитом магазина, а не купонами. В данном случае.
Это в редактировании покупателей - там есть вкладка "транзакции" . Если начислить там 10 грн (кредит магазина), то при следующей покупке эта сумма покупателем будут использована в счет оплаты заказа.
Купоны наверное больше подходят для каких-то более-менее массовых акций. Например, в какой-то небольшой группе/сообществе/форуме предложить скидку 10% по какому-то поводу (или без повода), со сроком действия или бесконечно, первым ста покупателям или всем подряд. Или отслеживать разные источники покупателей: в одной группе один код купона сообщить, в другой - другой, в третьей - третий. Думаю, можно придумать способ и отследить, какой канал продвижения лучше сработал и дал больше покупателей.
Технологии Blogger.

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Hot Sonakshi Sinha, Car Price in India