Исправить результат работы сниппета

Здравствуйте. Написал код, который выводит нужные поля ресурса. Проблема моя в том, что я не знаю как сделать так, чтобы он выводил эти значения поочередно. То есть у меня в некоторых полях хранится 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 rtfm.modx.com/xpdo/2.x/class-reference/xpdoobject/field-accessors/fromjson <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 вылезает массив. Спасибо огромное за помощь!!!

Не за что :)