Fenom вместо getImageList MIGx
Есть обработка MIGx полей через Fenom с условиями:
Решение
{set $rows = json_decode($_modx->resource.tv_name, true)}
{foreach $rows as $_list $row}
{if $_last==1}
'какойто коТ'
{/if}
{/foreach}Все замечательно работает, но если мне к примеру помимо _last нужны поля idx, _alt, _first и прочее, как быть в таком случае? Неужели без getImageList все же не обойтись?Решение
{set $rows = json_decode($_modx->resource.migx_tv, true)}
{set $idx = 0}
{foreach $rows as $idxArr => $row}
{set $row['idx'] = $idx++} {* idx от созданной переменной с инкриментом*}
{set $row['idxForeach'] = $row@index} {* idx от foreach*}
{*set $idxMIGX = $row['MIGX_id']*} {* idx от MIGX*}
{if $row@first}
{set $row['_first'] = 'first item'}
{/if}
{if $row@last}
{set $row['_last'] = 'last item'}
{/if}
{if !($idx % 2)}
{set $row['_alt'] = 'odd item'}
{/if}
{$row | print_r}
{/foreach} Комментарии: 48
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Вот эти поля мне нужны к примеру, после Fenom модификатора json_decode все они теряются непонятно куда, остается только [MIGX_id]. _alt _first _last теряются потому что в PHP имя переменной не может начинаться с _, а вот idx почему теряется? И как к этим полям добраться? Еще раз повторюсь, итерации цикла FOREACH здесь совершенно не при чем, то что итерации имеют схожее название last и first с полями _last и _first, здесь совершенно не при чем.
это как пытаться вилкой суп есть и кричать «Почему, плядь, без ложки не обойтись? обязательно ложку брать?»
работает и выводит именно поле _last?? Ведь я его нигде не создавал, никак не объявлял. Значит _last в исходном массиве все таки существует, так ведь? И idx точно так же)) И более того, значения у них такие же как если бы я через getImageList их вывел. Прямо какая-то магия ей богу, ахахах)
То Fenom даже не скомпилит ничего, выдав в логе ошибку, потому как цикл foreach не имеет никаких idx, а так же _last и _first. Читайте внимательно вопрос в следующий раз, и в документацию меня не надо носом тыкать, прежде чем сюда прийти и написать вопрос я документацию просмотрел. Выше я немного неточно написал, со знака подчеркивания имя переменной может начинаться в PHP, это с цифры не может. Но это не объясняет куда деваются эти нужные поля.
на что в логах идет вот такое вот:
Работает, но у нас получается цикл в цикле, а соотсветственно если я так буду обрабатывать массив с полями MIGx, то я их получу во столько раз больше сколько значений может иметь к примеру _last. То есть при первом прохождении массива мы получим _last = 0, во втором цикле выведутся все записи исходя из того сколько у нас их там есть, так как idx это порядковый номер записи. Во второй итерации первого цикла _last = 1, оно и имеет то всего два значения, точнее даже не 0 и 1, а true и false как я понимаю. И второй цикл во второй итерации первого цикла также выведет все записи. В итоге мы имеем два круга вывода записей.
А как еще можно пройтись по массиву?
Если зайти в сниппет getImageList можно найти такие строчки
Надо просто применить их на феноме:
Ну минуса справедливые ведь) Вы просто тут какой-то «неадекват» развели) Еще и умниками «всех» называете))
А массив если изощряться еще и циклом «for» можно перебрать если мне память не изменяет) На самом деле да, ошибка моя. Для теста было создано всего два элемента MIGx и поэтому
такое проканало как говорится) Отсюда и сделал поспешные выводы что _last и прочие поля все таки есть в массиве просто их съедает по какой-то причине модификатор «json_decode».
for и foreach это конечно понятно, просто у вас так прозвучало, что мол должен существовать другой метод, без циклов)
Главное разобрались!
Бывает у многих и я этим грешил, спать надо Сергей)
В очередной раз убеждаюсь, что стоит тихо почитывать документацию, Василия, Николая, Сергея, Илью, Ивана, Павла, Михаила, Евгения, Боба, Марка и иже с ними, читать код, самостоятельно экспериментировать и вникать.
И плевать на подобные вопросы, обсосанные уж много раз и в конечном счете с единственным посылом — «сделайте всю работу за меня».
Если не сложно, решение Константина было бы неплохо поместить в сам пост, чтобы проще было искать.
А еще вопрос, будет ли таким способом кешироваться чанк задаваемый в параметре chunk в виде файла?
вот так:
На счет кеширования точно сказать не могу, но насколько я понимаю кешируется сниппет и все что в нем, если вызывать его кешированным.
эту строчку лучше вынести за foreach, т.к. лучше один раз присвоить переменной, чем каждый раз обращаться.
ну об этом тоже подумал, только вот а выводить потом как, не могу просто додуматься как в $output потом еще и с вложенного цикла вывести плейсхолдеры вложенного массива.
и т.д. То есть $rows = $modx->fromJSON($tv); не массив, потом попробовал $rows = json_decode($tv,1); ошибки не исчезли. Сделал проверку
Говорит что массив но ошибки говорят иное)) Не пойму что не так?
Хотя код работает нормально не смотря на эти PHP warning.
Просто return надо поменять на echo и поместить в цикл.
Кстати:
Что устанавливает параметр false для getChunk и на что он влияет? нагуглить эту информацию что-то я не смог.
И если не составит не можете подсказать почему после
в логи MODx сыпит ошибки вида
Хотя $rows на самом деле является массивом и проходит проверку is_array, и сам код отрабатывает нормально?
Сниппет предназначен для использования синтаксиса Fenom в чанках, если Fenom не используется то getImageList справится лучше, хотя надеюсь что благодаря парсеру pdoTools этот сниппет будет работать быстрее.
Вызывается он вот так вот:
Естественно вызывать сниппет можно как вашей душе угодно, так же как и вложенный чанк вызывать из файла, вроде проблем не было. @INLINE тут просто для примера. В главном чанке просто вызываем вложенный MIGx и у нас на его место подставляется обработанный chunk_in в таком виде в каком вы его задали, с выводом полей вложенного MIGx.
Буду рад если укажите на мои ошибки или способы улучшить сниппет.
P.S. Еще раз спасибо кто помогал мне в написании сего сниппета.
А так же буду благодарен доброму человеку который объяснит для чего в:
параметр false? Потому как сам я этой информации не нашел к сожалению((
так же думаю неплохо было бы добавить и мое совместное решение в шапку, если автор объявится естественно.
Вот, делает всё, что тебе надо, и даже больше:
вы имеете в виду то что все символы json строки вложенного MIGx переводятся в нижний регистр, то согласен) А у меня к примеру во втором MIGx ссылка на видео youtube регистрозависимая, и как теперь ее выводить?
Еще и какой-то пробел появился перед migx_id.
Сейчас в чанке через data попробую, может тогда все нормально будет.
ненене! ничего никуда принудительно не переводится.
Я имею в виду, что этому сниппету можно скормить:
— обычный массив,
— json-строку,
— название migx'ового tv, в значении которого тоже лежит обычный json.
И данные можно:
— отрендерить,
— вернуть как есть в виде обычного массива, чтобы потом делать с ними другие непотребства.
Т.е. для примера:
этот снипет у вас называется data.renderer, а у документа с id равным 123 в значении migx'овой tv с названием tv.migx лежит вот такой json:
Тогда вот такой вызов сниппета:
возможно ещё в вызове вложенного сниппета надо кавычки поэкранировать
Вернёт вот такой результат:
В чанке доступны:
$_idx — порядковый номер
$_total — сколько строк всего
$_first — это понятно
$_last — это тоже
$_even — чётная строка
$_odd — нечётная строка
Видимо:
Скину полностью сюда содержимое чанка, он тестовый так что особо не пугайтесь)
br скушивает))
переносы строк если что это уже я тут сделал. Обычно массив же в () таких скобках выводится.
Зато сейчас вижу что действительно, никуда регистр символов во втором MIGx не делся))
тестировали как я понял скорость обработки, ну я и глядя на самые маленькие цифры по обработке и с условием что «чанк обрабатывается полностью» и скопипастил оттуда этот кусок кода, при сознаюсь чем даже толком не разобравшись во всех тонкостях. Но как видите:
Если у кого-то есть решение, как оптимизировать код, чтобы он стал меньше, то сочту за честь