Общение с пользователями системы PHPShop.CMS Free и попадание их на одни и те же «грабли» подтолкнуло меня написать полезные советы.
Полезные советы по использованию функций шаблонизации.
Метод set() назначает переменную шаблонизатора для использования в шаблонах в виде var@, пример:
и вставка ее вида @my_var@ в файл tpl шаблона позволит вывести фразу «Мы любим Хабр» на сайте. Часто в модулях, таких как formgenerator или comment, используется перехват и изменение переменных. Если мы в функции хука используем модель $this->set('my_var',$var), то мы полностью переписываем значение переменной, в нашем примере переписываем содержание страницы. Все бы хорошо, но это правило работает, если у нас включен только один модуль, который перехватывает содержание страницы, а если у нас их больше, то каждый новый модуль будет затирать результат работы вывода другого модуля. В таких случаях на помощь приходит третий аргумент метода $this->set, принимающий значение true. Использование этого аргумента позволит не переписать переменную, а ее дополнить, те позволит поочередно вывести результат работы модулей — вывод формы и комментариев.
Решение:
Если в модуле используется шаблон этого модуля, описанный в config.ini модуля, то запись вида:
выведет пустой результат. Для использования глобальной функции шаблонизации ParseTemplateReturn() в модулях необходимо указать второй аргумент true, переводящий функции в режим чтения файлов шаблонов из папки модулей, а не из общей phpshop/templates/.
Решение:
Шаблонизатор позволяет использовать php-функции. Формат вставки:
Во избежании ошибок в php компиляторе используются двойные кавычки ", вместо одинарных ', пример:
Полезные советы по использованию функций доступа к данным БД.
Быстрая выборка настроек модуля
Есть очень хороший и короткий способ получить настройки модуля, которые хранятся в базе modulename_systems:
В этой записи нам нужно указать имя БД, из которой мы хотим получить данные, например
и перечислить через запятую имена полей, которые нам нужны
Для доступа к этим данным используется:
Для работа с MySQL используется PHPShopOrm. Пример обычной выборки имеет вид:
Это все упрощает и стандартизирует запросы, но если нужно выполнить сложные выборки с совмещением таблиц? В таких случаях используются метод $PHPShopOrm->query(), например:
Частый «бок» встает на пути у разработчика, когда при выборке $PHPShopOrm->select() и условии, что в БД 1 запись выводится одномерный массив, а если больше, то многомерный. Для обхода такой неопределенности используется аргумент array('limit'=>1), при котором всегда массив будет одномерный и работать с ним через запись вида:
в случаях явной предрасположенности результата к множественным полям используется формат записи с явным указанием лимита array('limit'=>1000):
Источник wiki.phpshopcms.ru
UPD: Часть 2
Шаблонизатор
Полезные советы по использованию функций шаблонизации.
Хитрости с 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