Поступил тут один вопрос, который я хотел бы разобрать в паблике поподробней (к слову: задавайте такие вопросы не в личку, а в паблик. Ничего зазорного здесь нет, а материал будет полезен и другим).
Вопрос и ответ под катом.
Пытаюсь разобраться с написанием процессоров для использования с modxsmarty, че-то не клеится.
Взял Ваш getList шаблон из shopmodx (ShopmodxWebGetlistProcessor), немного его модифицировал:
class SiteNewsGetlistProcessor extends modObjectGetListProcessor {
public $classKey = 'modResource';
public $defaultSortField = 'publishedon';
public $defaultSortDirection = 'DESC';
public $objectType = 'modResource';
protected $total = 0;
public function prepareQueryBeforeCount(xPDOQuery $c) {
$p=0;
if(isset($scriptProperties['parent']))
$p=$scriptProperties['parent'];
$c->where(array(
'parent' => $p
));
$c->limit(8);
return $c;
}
. . .
Дальше все как у Вас.
В консоли отрабатывается, получаю ресурсы, но процессор не видит передаваемый параметр parent:
<?php
$ns=$modx->getObject('modNamespace','site');
$p=$ns->getCorePath();
$response=$modx->runProcessor('getnews', array('parent'=>4,),array('processors_path'=>$p));
print_r($response->getResponse());
выдает результат с $p=0.
Это первая проблема.
А вторая — вызываю процессор в smarty:
{processor action="getnews" ns="site" assign=result}
<ul class="carousel2">
{if $result.success}
{foreach $object.object as $object}
{include file="news.tpl"}
{/foreach}
{else}
<li>
<strong>error {$result.success}</strong>
</li>
{/if}
Выводится «error»
Если вместо error {$result.success} пишу error {$result}, то выводит «error Array».
Насколько я понимаю, smarty почему-то не видит элементы массива (например $result.success).
И подскажите пожалуйста, как я могу разрешить исполнение блоков {php} в modxsmarty?
1. Следите за переменными.
Переменные просто так ни от куда не берутся. Вот кусочек кода:
public function prepareQueryBeforeCount(xPDOQuery $c) {
$p=0;
if(isset($scriptProperties['parent']))
А откуда здесь взялась переменная $scriptProperties? Ее здесь нет. Это раньше (в неклассовых процессорах) была переменная $scriptProperties. Но она создавалась MODX-ом в функции $modx->runProcessor(), то есть передавалась дальше в процессор. А в классных процессорах этого нет. Все параметры процессора находятся в элементе array $this->properties, и для работы с этой переменной есть методы $this->getProperties(), $this->getProperty(), $this->stProperties() и $this->setProperty();
Вот если бы создали эту переменную вот так, то у вас бы все заработало:
public function prepareQueryBeforeCount(xPDOQuery $c) {
$p=0;
$scriptProperties = $this->getProperties();
if(isset($scriptProperties['parent']))
Но это не по фэн-шую. Правильно использовать методы по умолчанию. К примеру так:
public function prepareQueryBeforeCount(xPDOQuery $c) {
// Второй параметр 0 - это значение по умолчанию
$p = $this->getProperty('parent', 0);
$c->where(array(
'parent' => $p
));
$c->limit(8);
return $c;
}
. . .
А еще правильней делать вот так:
// Эта функция вызывается в первых рядах запуска процессора
public function initialize(){
// Устанавливаем значения по умолчанию
// Не перетирает уже имеющиеся свойства
$this->setDefaultProperties(array(
'parent' => 0,
));
return parent::initialize();
}
public function prepareQueryBeforeCount(xPDOQuery $c) {
$c->where(array(
'parent' => $this->getProperty('parent'),
));
$c->limit(8);
return $c;
}
. . .
Вот так у вас и важные переменные сразу будет видно, и дефолтовые значения указаны, и их можно будет перегрузить как на уровне входящих параметров, так и на уровне расширяющих процессоров.
2. Тоже следите за переменными:
{processor action="getnews" ns="site" assign=result}
<ul class="carousel2">
{if $result.success}
{foreach $object.object as $object}
{include file="news.tpl"}
{/foreach}
{else}
<li>
<strong>error {$result.success}</strong>
</li>
{/if}
Присваиваете переменной result (assign=result), а пытаетесь использовать переменную $object ({foreach $object.object as $object})
В данном случае правильно {foreach $result.object as $object}.
И подскажите пожалуйста, как я могу разрешить исполнение блоков {php} в modxsmarty?
Это не зависит уже от самого modxSmarty. Это же все на совести Smarty, так что все должно работать (читайте манны Smarty).
Выводится «error»
Если вместо error {$result.success} пишу error {$result}, то выводит «error Array».
$result.success — это логическое. Оно возвращает только true или false (если никто не будет нарушать стандарта). Логическое true просто так в виде текста не выводится. А {$result} — это равносильно print $array. print не выводит содержимого массива, а просто пишет, что это массив (array).
Если хотите четко видеть какой ответ возвращается, то выводите весь ответ так:
<pre>
{print_r($result)}
</pre>