Здравствуйте.
Написал код, который выводит нужные поля ресурса. Проблема моя в том, что я не знаю как сделать так, чтобы он выводил эти значения поочередно.
То есть у меня в некоторых полях хранится json массив со значениями, которые по порядку совпадают друг с другом.
Мне сейчас выводит все сразу:
Значение 1, значение 2 и т.д.
А хотелось бы чтобы вывод был с использованием чанка, чтобы в первом блоке выводилось значение 1, во втором — значение 2
Сам код сниппета:
//$ids = $modx->resource->get('id'); $ids = 13; $resources = $modx->getCollection('modResource',$ids); foreach ($resources as $res) { $output .= '<h2>'.$res->get('pagetitle').'</h2>'; $output .= '<p>'.implode(',', $res->get('color')).'</p>'; $output .= '<p><img src='.implode(',', $res->get('put_kartinka')).'></p>'; $output .= '<p>'.implode(',', $res->get('nacenka_kartinka')).'</p>'; } print_r($output);
у меня в некоторых полях хранится json массив со значениями, которые по порядку совпадают друг с другом.
Чито? Пример?
у меня в некоторых полях хранится json
<img src='.implode(',', $res->get('put_kartinka')).'>
$res->get('put_kartinka') массив возвращает? В таком случаи у вас будет несколько «put_kartinka» через запятую в одном src.
А хотелось бы чтобы вывод был с использованием чанка
rtfm.modx.com/revolution/2.x/developing-in-modx/other-development-resources/class-reference/modx/modx.getchunk
Принимает как раз массив.
Не будут открываться ссылки с 400 ошибкой — перетащите ссылки в адресную строку браузера.
В поле color такие значения (к примеру) [«Венге»,«Дуб молочный»]
В поле put_kartinka ["/images/venge.jpg",«dub.jpg»]
В поле nacenka_kartinka [«1500»,«2000»]
Мне нужно сделать вывод так, чтобы за первый обход вывелись все первые значения, потом все вторые и т.д. А у меня все просто в кучу выводит.
Т.е. вам нужно несколько строк
<img src=… т.е. несколько картинок, угу? Вы уже получали массив данных $resources и как-то обработали его с помощью форычА, так? Ну вот вы имеете неск. других массивов, которые правда в джейсоне, но которые тоже нужно как-то обработать. Ну, переводите джейсон в массив и обрабатывайте форычем.
То есть мне тут:
foreach ($resources as $res) { // ... $output .= '<p>'.implode(',', $res->get('color')).'</p>'; // ... }
не надо сразу писать в переменную $output, а сначала сделать еще одну обработку foreach?
Если да, то я тут и завис. Подскажите на примере одной строки, пожалуйста.
Вот так сделал foreach для поля color. Выводит построчно все значения.
А как мне сюда подвязать плейсхолдеры и сделать вывод через чанк?
Что-то не разберусь с getChunk никак.
foreach ($resources as $res) { $color = $res ->get('color'); foreach ($color as $col) { $output .= '<p>'.$col.'</p>'; echo "Значение: $col<br />\n"; }
Накидал такой вот код, но проблема в том, что на выходе имею только последние значения из каждого из полей.
<?php $ids = $modx->resource->get('id'); if ($product = $modx->getObject('msProduct', $ids)) { $output .= $product->get('pagetitle'); foreach ($product as $output) { $color = $product->get('color'); foreach ($color as $cval) { $output .= $cval; } $putkart = $product->get('put_kartinka'); foreach ($putkart as $putval) { $output .= $putval; } $nackart = $product->get('nacenka_kartinka'); foreach ($nackart as $ncval) { $output .= $ncval; } //var_dump($output); } } $output .= $modx->getChunk('Test', array('color' =>$cval, 'nacenka' => $ncval, 'putkart' => $putval) ); return $output;
Чанк Test для проверки вывода, без верстки:
<div> Цвет: [[+color]] Картинка: <img src="[[+putkart]]" width=200> Наценка: [[+nacenka]] </div>
Выводит такую штуку:
<div> Цвет: Дуб молочный Картинка: <img src="/img/color/dub.jpg" width="200"> Наценка: 2000 </div>
Если длина массивов (кол-во элементов) одинакова то вот:
<?php $output = ""; $ids = $modx->resource->get('id'); if ($product = $modx->getObject('msProduct', $ids)) { $output .= $product->get('pagetitle'); //(сомневаюсь что тебе это нужно здесь :) foreach ($product as $output) { $colors = $product->get('color'); $putkart = $product->get('put_kartinka'); $nackart = $product->get('nacenka_kartinka'); foreach ($colors as $vid => $cval) { $output .= $modx->getChunk('Test', array('color' =>$color, 'nacenka' => $nackart[$vid], 'putkart' => $nackart[$vid])); } } } return $output;
Спасибо, добрый человек!
$output .= $product->get('pagetitle'); //(сомневаюсь что тебе это нужно здесь
Это да, мне тут не нужно, ты прав :)
Все выводит отлично, с небольшими изменениями твоего кода, но самое главное, ты меня «пнул» в нужном направлении…
Но почему-то выводит помимо блоков с информацией еще и Array. Откуда берется не пойму.
Вот полностью рабочий код:
<?php $output = ""; $ids = $modx->resource->get('id'); if ($product = $modx->getObject('msProduct', $ids)) { foreach ($product as $output) { $colors = $product->get('color'); $putkart = $product->get('put_kartinka'); $nackart = $product->get('nacenka_kartinka'); foreach ($colors as $vid => $cval) { $output .= $modx->getChunk('Test', array( 'color' =>$colors[$vid], 'nacenka' => $nackart[$vid], 'putkart' => $putkart[$vid])); } } } return $output;
Думаю вот это:
... foreach ($product as $output) { ...
Оставь просто:
<?php $output = ""; $ids = $modx->resource->get('id'); if ($product = $modx->getObject('msProduct', $ids)) { $colors = $product->get('color'); $putkart = $product->get('put_kartinka'); $nackart = $product->get('nacenka_kartinka'); foreach ($colors as $vid => $cval) { $output .= $modx->getChunk('Test', array( 'color' =>$colors[$vid], 'nacenka' => $nackart[$vid], 'putkart' => $putkart[$vid])); } } return $output;
… foreach ($product as $output) { ...
Да, я уже выяснил, что это с этого foreach вылезает массив.
Спасибо огромное за помощь!!!
Не за что :)