Сообщение об ошибке

  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 126 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 131 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_process() (строка 231 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 126 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 131 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_process() (строка 231 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 126 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 131 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_process() (строка 231 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 126 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 131 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_process() (строка 231 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 126 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 131 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_process() (строка 231 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 126 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 131 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_process() (строка 231 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 126 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 131 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_process() (строка 231 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 126 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 131 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_process() (строка 231 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 126 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 131 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_process() (строка 231 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).

PrestaShop

Добрый человек описал алгоритм и функцию перестройки левого и правого индексов для Nested Sets.
Статья на хабре
Код на SQL Fiddle

Происходит восстановление индексов для значения по id_parent

Для PrestaShop этот код выглядит так:
-- По умолчанию у индексов значение 0, сменим на NULL
alter table pref_category modify nleft int unsigned default null;
alter table pref_category modify nright int unsigned default null;

DELIMITER //

-- Создаём ту самую функцию
DROP FUNCTION IF EXISTS rebuild_nested_set_tree//
CREATE FUNCTION rebuild_nested_set_tree()
RETURNS INT DETERMINISTIC MODIFIES SQL DATA
BEGIN
-- Изначально сбрасываем все границы в NULL
UPDATE pref_category t SET nleft = NULL, nright = NULL;

-- Устанавливаем границы корневым элементам
SET @i := 0;
UPDATE pref_category t SET nleft = (@i := @i + 1), nright = (@i := @i + 1)
WHERE t.id_parent = 0;

forever: LOOP
-- Находим элемент с минимальной правой границей -- самый левый в дереве
SET @id_parent := NULL;
SELECT t.id_category, t.nright FROM pref_category t, pref_category tc
WHERE t.id_category = tc.id_parent AND tc.nleft IS NULL AND t.nright IS NOT NULL
ORDER BY t.nright LIMIT 1 INTO @id_parent, @parent_right;

-- Выходим из бесконечности, когда у нас уже нет незаполненных элементов
IF @id_parent IS NULL THEN LEAVE forever; END IF;

-- Сохраняем левую границу текущего ряда
SET @current_left := @parent_right;

-- Вычисляем максимальную правую границу текущего ряда
SELECT @current_left + COUNT(*) * 2 FROM pref_category
WHERE id_parent = @id_parent INTO @parent_right;

-- Вычисляем длину текущего ряда
SET @current_length := @parent_right - @current_left;

-- Обновляем правые границы всех элементов, которые правее
UPDATE pref_category t SET nright = nright + @current_length
WHERE nright >= @current_left ORDER BY nright;

-- Обновляем левые границы всех элементов, которые правее
UPDATE pref_category t SET nleft = nleft + @current_length
WHERE nleft > @current_left ORDER BY nleft;

-- И только сейчас обновляем границы текущего ряда
SET @i := (@current_left - 1);
UPDATE pref_category t SET nleft = (@i := @i + 1), nright = (@i := @i + 1)
WHERE id_parent = @id_parent ORDER BY id_category;
END LOOP;

-- Возвращаем самый самую правую границу для дальнейшего использования
RETURN (SELECT MAX(nright) FROM pref_category t);
END//

DELIMITER ;


Запускаем переиндексацию:
SELECT rebuild_nested_set_tree();


Вот и все, дерево переиндексировано. Вернем на место значения по умолчанию для индексов, так как с null индексы не работают, их и не должно быть:
alter table pref_category modify nleft int unsigned default 0;
alter table pref_category modify nright int unsigned default 0;

cart

Чтобы получить содержимое корзины достаточно столь короткого кода:

$cart = new Cart($this->context->cookie->id_cart);
$cartProducts = $cart->getProducts();

Так же, чтобы увидеть больше можно взглянуть на файл контроллера корзины, который находиться в /classes/Cart.php

PrestaShop позволяет кешировать данные. Для этого нужно выбрать метод кеширования в админке и внутри модуля использовать функции для работы с кешем.

Чтобы не быть многословным, проще показать кусок кода:

Контроллеры в PrestaShop

Предисловие

Сейчас мы рассмотрим Контроллеры в архитектуре PrestaShop, чтобы еще больше разложить по полочкам понимания работы самой PrestaShop. Это сильно поможет нам в дальнейшем не делать лишних действий, покажет нам где брать образцы кода для собственных модулей и покажет что и как работает. Дальше, текст в большей мере представляет перевод официальной документации PrestaShop, который может быть найден тут.

В MVC архитектуре, контроллер управляет синхронизацией данных между Представлением(View) и Моделью(Model). Контроллеры обрабатывают все события и триггеры событий вызываемые пользователем.
Если нужно чтобы какие-то данные были изменены, Контроллер говорит об этом Модели, и передает данные запрошенные/возвращенные из Модели в Представление.
Все контроллеры в PrestaShop могут быть перекрыты классами контроллеров которые наследуют класс-родитель, например AdminController, ModuleAdminController, FrontController или же ModuleFrontController.

Presta Контроллер категорий и товаров

Приветствую, Читатель!

Интро

Ну вот очередной перевод "для себя" и заодно для вас, читатели. Так как тема PrestaShop для меня на текущий момент весьма актуальна, а материала по нему в ру-язычном сегменте достаточно мало, а платить за модули готовые для разработчика дело... не правильное. Тем более там по большей части украшалки и ничего толкового. Мое имхо как итого: можно сделать хороший высоконагруженный магазин, но только если взять за основу саму архитектуру CMS и полностью перепилять ее модули и контроллеры. Как итого я уже сделал для себя модуль меню(блок категорий) который при 300+ категориях делает всего 2 запроса, вместо 300 как у того что присутствует в поставке самой CMS. Так же я доделываю фильтры и контроллер категорий. Все это в одном модуле. Все в купе вместо 1200+ запросов к базе кушает около 40+ запросов. Приятно? Очень.

Я отвлекся. В общем и целом дальше перевод статьи Category/Catalog page (Controller, Modules, Hooks) in Prestashop, которая даст нам еще больше понять и прояснить в архитектуре и работе PrestaShop.

Дальше сам перевод.


Контроллер CategoryController

/controllers/front/CategoryController.php

CаtegоryCоntrоller контроллер ответственный за генерацию страниц каталога. Наследуется от класса FrontController. Давайте рассмотрим методы вызываемые этим контроллером. Но сперва давайте упорядочим в том порядке, в котором они вызываются.

Методы класса CаtegоryCоntrоller:

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

1) Качаем новую версию с сайта престы.
2) Создаем по соседству с сайтом папочку, к примеру presta155
3) Заливаем в нее скачанную новую версию престы.
4) Заливаем с текущей в новую версию папки в которых есть кастомные наши файлы(images, logos, photos, translations, modules, другие)
5) Делаем бекап базы(mysqldump -p prestadb154 > /путь/prestadb155.sql) и заливаем его в созданную по соседству новую базу, к примеру presta155(mysql -p prestadb155путь/prestadb155.sql)
6) перезаливаем конфиг с старой версии в новую скопировав файл /config/settings.inc.php, меняем реквизиты на новую базу prestadb155

Как создавать контроллер в собственном модуле можно посмотреть в двух сегодняшних заметках:

Теперь конкретно пример контроллера отдающего данные в JSON формате, к которому можно обращаться через Ajax:
/filtershop/controllers/front/ajax.php

class filtershopajaxModuleFrontController extends ModuleFrontController
{
    public function init() {
        parent::init();
    }

    public function initContent()
    {
        parent::initContent();
        die(Tools::jsonEncode(array("test"=>1,"t2"=>2)));
    }
}

Таким образом перейдя по ссылке /index.php?fc=module&module=filtershop&controller=ajax увидим вывод наших данных в JSON:

{"test":1,"t2":2}

Вывод шаблона Smarty

Предисловие

Вслед за PrestaShop 1.5: Добавляем контроллер в собственный модуль(Перевод) решил сразу добавить перевод еще одной небольшой заметки. Перевод для логичности с небольшими изменениями оригинального текста.


Оригинал

Prestashop предоставляет возможность добавить новые страницы в ваш модуль. Несколько шагов ниже позволят вам создать новую страницу.

Шаг 1 - Создание нужной структуры директорий

Переводчик: Создание и установка их описана в большом количестве статей и легко доступна в интернете.

Допустим название вашего модуля testmodule, тогда после установки вы можете проверить директорию module в которой найдете директорию testmodule

Собственный контроллер модуля

Предисловие к переводу

Статей о том как создать собственный модуль для PrestaShop в принципе достаточно. А вот на счет добавления контроллера в собственный модуль все обстоит гораздо печальнее. Так как мне нужно создать модуль для PrestaShop 1.5., а значит в любом случае читать материал на английском, заодно сразу и переведу. Может еще кому помогу, возьму, так сказать, на карму себе доброе дело )) Но вполне вероятно есть неточности перевода, а значит будьте внимательны.


Оригинал

Prestashop 1.5.x порадовала нас чудесной возможностью создавать контроллеры в модулях. Это главная задача классов ModuleFrontController и ModuleAdminController. Давайте рассмотрим их ближе(уделите особое внимание комментариям):

PrestaShop
Понравилась CMS PrestaShop, в ней есть практически все что нужно для создания интернет-магазина.

Введение

Собственно задача у меня сделать магазин, в котором более 50 тыс. видов товара. Бывшая CMS WebAsyst за сроком годности и ввиду платности отпадает. Как дополнение к выше сказанному - несколько лет работы разных фрилансеров сделали систему крайне тяжелой для поддержки. Как важное условие, CMS должна быть совместима с импортом-экспортом товаров в/из программ разработчика Elbuz Content Creator и Price List Importer(общение с их тех. поддержкой сплошной вынос мозга). Но все это напоролось на крайне медленную производительность сайта. Повторюсь, количество видов товара более 50 тыс. Включение отладки в /config/defines.inc.php:

define('_PS_DEBUG_PROFILING_', true);

Отладка(внизу сайта) показала наличие 903 запросов. И тут я решился взяться за поиски.
Первым на что пал выбор - блок категорий. Ввиду большого уровня вложенности, количество запросов там вполне могло быть достаточно высоким. Но нет... Первое место достается не ему. Блок поставщиков тоже после отключения не снял нагрузки. Ни просмотренные товары, ни другие модули. Но есть несколько кандидатов. Остальное под катом.