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

Здравствуйте.

Написал код, который выводит нужные поля ресурса. Проблема моя в том, что я не знаю как сделать так, чтобы он выводил эти значения поочередно.

То есть у меня в некоторых полях хранится 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);

Comments

у меня в некоторых полях хранится 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";
}

Накидал такой вот код, но проблема в том, что на выходе имею только последние значения из каждого из полей.

$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>

Если длина массивов (кол-во элементов) одинакова то вот:

$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.=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 (productasproduct as output) { ...

Да, я уже выяснил, что это с этого foreach вылезает массив. Спасибо огромное за помощь!!!