Pull to refresh

Создание модулей для PHPShop.CMS Free — Спотыкашки (чаcть 1)

Reading time3 min
Views3.8K
Общение с пользователями системы PHPShop.CMS Free и попадание их на одни и те же «грабли» подтолкнуло меня написать полезные советы.

Шаблонизатор


Полезные советы по использованию функций шаблонизации.

Хитрости с set()

Метод set() назначает переменную шаблонизатора для использования в шаблонах в виде var@, пример:
$var = "Мы любим Хабр";
$this->set('my_var',$var);

и вставка ее вида @my_var@ в файл tpl шаблона позволит вывести фразу «Мы любим Хабр» на сайте. Часто в модулях, таких как formgenerator или comment, используется перехват и изменение переменных. Если мы в функции хука используем модель $this->set('my_var',$var), то мы полностью переписываем значение переменной, в нашем примере переписываем содержание страницы. Все бы хорошо, но это правило работает, если у нас включен только один модуль, который перехватывает содержание страницы, а если у нас их больше, то каждый новый модуль будет затирать результат работы вывода другого модуля. В таких случаях на помощь приходит третий аргумент метода $this->set, принимающий значение true. Использование этого аргумента позволит не переписать переменную, а ее дополнить, те позволит поочередно вывести результат работы модулей — вывод формы и комментариев.

Решение:
$this->set('my_var',$var,true);

ParseTemplateReturn() в модулях

Если в модуле используется шаблон этого модуля, описанный в config.ini модуля, то запись вида:
$comment=ParseTemplateReturn($GLOBALS['SysValue']['templates']['comment']['comment_content']);

выведет пустой результат. Для использования глобальной функции шаблонизации ParseTemplateReturn() в модулях необходимо указать второй аргумент true, переводящий функции в режим чтения файлов шаблонов из папки модулей, а не из общей phpshop/templates/.

Решение:
ParseTemplateReturn($GLOBALS['SysValue']['templates']['comment']['comment_content'],true);

Использование php в шаблонах

Шаблонизатор позволяет использовать php-функции. Формат вставки:
@php
...
php@

Во избежании ошибок в php компиляторе используются двойные кавычки ", вместо одинарных ', пример:
@php
echo "Мы любим Хабр!";
php@


Работа с БД


Полезные советы по использованию функций доступа к данным БД.
Быстрая выборка настроек модуля

Есть очень хороший и короткий способ получить настройки модуля, которые хранятся в базе modulename_systems:
// Настройки модуля
PHPShopObj::loadClass("array");
class PHPShopCommentArray extends PHPShopArray {
    function PHPShopCommentArray() {
        $this->objType=3;
        $this->objBase=$GLOBALS['SysValue']['base']['comment']['comment_system'];
        parent::PHPShopArray("enabled","flag","other");
    }
}

В этой записи нам нужно указать имя БД, из которой мы хотим получить данные, например
$this->objBase=$GLOBALS['SysValue']['base']['comment']['comment_system'];

и перечислить через запятую имена полей, которые нам нужны
parent::PHPShopArray("enabled","flag","other");

Для доступа к этим данным используется:
$PHPShopCommentArray = new PHPShopCommentArray();
$enabled = $PHPShopCommentArray->getParam('enabled');


Сложные запросы в ORM

Для работа с MySQL используется PHPShopOrm. Пример обычной выборки имеет вид:
$data=$PHPShopOrm->select(array('id','name'),array('id'=>'=10'),array('order'=>'id DESC'),array('limit'=>1000));
if(is_array($data))
   foreach($data as $row){ .... }

Это все упрощает и стандартизирует запросы, но если нужно выполнить сложные выборки с совмещением таблиц? В таких случаях используются метод $PHPShopOrm->query(), например:
$result = $PHPShopOrm->query('SELECT a.*, b.login FROM '.$GLOBALS['SysValue']['base']['comment']['comment_log'].' AS a
            JOIN '.$GLOBALS['SysValue']['base']['users']['users_base'].' AS b ON a.user_id = b.id
            WHERE a.page="'.$page.'" order by a.id desc');
while($row = mysql_fetch_array($result)) { ..... }

Мешанина с многомерностью результат выборки select()

Частый «бок» встает на пути у разработчика, когда при выборке $PHPShopOrm->select() и условии, что в БД 1 запись выводится одномерный массив, а если больше, то многомерный. Для обхода такой неопределенности используется аргумент array('limit'=>1), при котором всегда массив будет одномерный и работать с ним через запись вида:
$data=$PHPShopOrm->select(array('id','name'),array('id'=>'=10'),array('order'=>'id DESC'),array('limit'=>1000));
if(is_array($data))
   { .... }

в случаях явной предрасположенности результата к множественным полям используется формат записи с явным указанием лимита array('limit'=>1000):
$data=$PHPShopOrm->select(array('id','name'),array('id'=>'=10'),array('order'=>'id DESC'),array('limit'=>1000));
if(is_array($data))
   foreach($data as $row){ .... }


Источник wiki.phpshopcms.ru

UPD: Часть 2
Tags:
Hubs:
-11
Comments2

Articles

Information

Website
www.phpshop.ru
Registered
Founded
Employees
2–10 employees
Location
Россия