В общем благодаря помощи Константина Ильина написал, а если быть точнее «намучал» я сниппет для обработки MIGx полей) Просьба не судить строго так как это мой первый сниппет, да и в PHP я силен на уровне чтения документации и просмотра видео уроков в процессе написания кода. А хотя можете и строго судить))
Сниппет предназначен для использования синтаксиса Fenom в чанках, если Fenom не используется то getImageList справится лучше, хотя надеюсь что благодаря парсеру pdoTools этот сниппет будет работать быстрее.
<?php
//$docid - id документа, если не задано берем id текущего документа
//$tvname - поле MIGx
//$tv_in - поле вложенного MIGx
//$chunk - чанк или @INLINE
//$chunk_in - чанк для вывода вложенного MIGX
if (empty($docid)) {
$docid = $modx->resource->get('id');
}
$pdo = $modx->getService('pdoTools');
$tv = $modx->getObject('modResource',$docid);
$tv = $tv->getTVValue($tv_name);
$rows = json_decode($tv,1);
if (is_array($rows)) { //без этого почему то reset() key() им подобные и даже сам цикл ругались что
//в $rows не массив, подозреваю что из-за того что массив содержит json
//строку вложенного MIGx
reset($rows);
$_first = key($rows);
end($rows);
$_last = key($rows);
$total = count($rows);
foreach ($rows as $key => $row) {
$row['idx'] = $key+1;
$row['total'] = $total;
if ($key === $_first)
$row['_first'] = 1;
if ($key === $_last)
$row['_last'] = 1;
if ($key % 2)
$row['_alt'] = 1;
if(!empty($tv_in) && !empty($row[$tv_in])) {
$subArr = $modx->fromJSON($row[$tv_in]);
if (is_array($subArr)) { //аналогичная причина что и выше, плюс дополнительная
//проверка вдруг у нас тут обычное поле
reset($subArr);
$sub_first = key($subArr);
end($subArr);
$sub_last = key($subArr);
$sub_total = count($subArr);
foreach ($subArr as $keySub => $subRow) {
$subRow['idx'] = $keySub+1;
$subRow['total'] = $sub_total;
if ($keySub === $sub_first)
$subRow['_first'] = 1;
if ($keySub === $sub_last)
$subRow['_last'] = 1;
if ($keySub % 2)
$subRow['_alt'] = 1;
$row[$tv_in] = '';
if (empty($chunk_in)) {
$row[$tv_in] .= '<pre>' . $pdo->getChunk('', $subRow) . '</pre>';
} else {
$preout = $pdo->getChunk($chunk_in, $subRow, false);
$row[$tv_in] .= $pdo->fastProcess($preout); //без знака конкатенации "." перед "=" выведет только последний элемент!
}
}
}
}
if (empty($chunk)) {
$output .= '<pre>' . $pdo->getChunk('', $row) . '</pre>';
} else {
$html = $pdo->getChunk($chunk, $row, false);
$output .= $pdo->fastProcess($html); //без знака конкатенации "." перед "=" выведет только последний элемент!
}
}
}
//echo number_format(microtime(true) - $modx->startTime, 4), 's\<br\>';
//echo number_format(memory_get_usage() / 1048576, 4), 'mb\<br\>';
//return print_r($rows);
return $output;
Вызывается он вот так вот:
{'@FILE snippets/migX.php' | snippet : [
'tv_name'=>'migx_tv', //главное MIGx поле
'tv_in'=>'migx_in_tv', //вложенное MIGx поле
'chunk'=>'@FILE chunks/chunk.html', //чанк для вывода главного MIGx в котором будет содержаться уже обработанный chunk_in
'chunk_in'=>'@INLINE {$in_migx_in_tv}']} //чанк для вложенного MIGx поля в котором выводим поля вложенного MIGx(извиняюсь за тавтологию)
Естественно вызывать сниппет можно как вашей душе угодно, так же как и вложенный чанк вызывать из файла, вроде проблем не было. @INLINE тут просто для примера. В главном чанке просто вызываем вложенный MIGx и у нас на его место подставляется обработанный chunk_in в таком виде в каком вы его задали, с выводом полей вложенного MIGx.
Буду рад если укажите на мои ошибки или способы улучшить сниппет.
P.S. Еще раз спасибо кто помогал мне в написании сего сниппета.
А так же буду благодарен доброму человеку который объяснит для чего в:
$pdo->getChunk($chunk, $row, false);
параметр false? Потому как сам я этой информации не нашел к сожалению((
так же думаю неплохо было бы добавить и мое совместное решение в шапку, если автор объявится естественно.
Сниппет предназначен для использования синтаксиса Fenom в чанках, если Fenom не используется то getImageList справится лучше, хотя надеюсь что благодаря парсеру pdoTools этот сниппет будет работать быстрее.
Вызывается он вот так вот:
Естественно вызывать сниппет можно как вашей душе угодно, так же как и вложенный чанк вызывать из файла, вроде проблем не было. @INLINE тут просто для примера. В главном чанке просто вызываем вложенный MIGx и у нас на его место подставляется обработанный chunk_in в таком виде в каком вы его задали, с выводом полей вложенного MIGx.
Буду рад если укажите на мои ошибки или способы улучшить сниппет.
P.S. Еще раз спасибо кто помогал мне в написании сего сниппета.
А так же буду благодарен доброму человеку который объяснит для чего в:
параметр false? Потому как сам я этой информации не нашел к сожалению((
так же думаю неплохо было бы добавить и мое совместное решение в шапку, если автор объявится естественно.
Раньше я использовал такую конструкцию условий:
А сейчас использую такою:
намного понятнее и понятнее.
Даже разбивка на чанки приносит удовольствие:
тут я два раза кликаю и легко заменяю название
а на старом мне надо было выделить слово без знака доллара!
косок условия из чанка обертки проектов:
Так же для 3го проекта использовался отдельный чанк с таким условием:
А чанк вывода всех проектов где происходит непосредственно сам подресурс:
Нашел еще такой короткий вариант:
Небольшой вопрос вдогонку. Как в Fenom сделать конкатенацию строк?
* на всякий тоже можно оставить
— если вам необходимо добавить страницы пользователей в sitemap, то это можно сделать в рамках pdoUsers
— если вам необходимы динамичные заголовки и мета-теги, то можно сделать примерно так:
1. В плагине создаем плейсхолдер user_id
2. В мета-тегах проверяем его наличие:
— надеюсь логика понятна..)
Что же до примера со вторым вариантом, то примерно вот так:
1. Создание страницы пользователя (тикетом)
2. Синхронизируем данные (в одну сторону — от пользователя к странице). Соответственно, если есть потребность редактировать поля пользователя из админки через его страницу, потребуется еще один плагин.
Те. сайт/категория/товар/
конечно, если исходный имеется ввиду текущий, то:
Если в чанке меню, то просто $isfolder