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

То есть у меня в некоторых полях хранится 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);
11 комментариев
M
MisterN 20 июля 2015г в 14:33 #
у меня в некоторых полях хранится 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 ошибкой — перетащите ссылки в адресную строку браузера.
B
Batyabest 20 июля 2015г в 14:57 #
В поле color такие значения (к примеру) [«Венге»,«Дуб молочный»]
В поле put_kartinka ["/images/venge.jpg",«dub.jpg»]
В поле nacenka_kartinka [«1500»,«2000»]

Мне нужно сделать вывод так, чтобы за первый обход вывелись все первые значения, потом все вторые и т.д. А у меня все просто в кучу выводит.
M
MisterN 20 июля 2015г в 15:57 #
Т.е. вам нужно несколько строк

<img src=… т.е. несколько картинок, угу? Вы уже получали массив данных $resources и как-то обработали его с помощью форычА, так? Ну вот вы имеете неск. других массивов, которые правда в джейсоне, но которые тоже нужно как-то обработать. Ну, переводите джейсон в массив и обрабатывайте форычем.

B
Batyabest 20 июля 2015г в 16:09 #
То есть мне тут:

foreach ($resources as $res) {
// ...
      $output .= '<p>'.implode(',', $res->get('color')).'</p>';
// ...
 }


не надо сразу писать в переменную $output, а сначала сделать еще одну обработку foreach?
Если да, то я тут и завис. Подскажите на примере одной строки, пожалуйста.
B
Batyabest 20 июля 2015г в 18:51 #
Вот так сделал foreach для поля color. Выводит построчно все значения.
А как мне сюда подвязать плейсхолдеры и сделать вывод через чанк?
Что-то не разберусь с getChunk никак.

foreach ($resources as $res) {
$color = $res ->get('color');
  foreach ($color as $col) {
$output .= '<p>'.$col.'</p>';
echo "Значение: $col<br />\n";
}
B
Batyabest 20 июля 2015г в 22:06 #
Накидал такой вот код, но проблема в том, что на выходе имею только последние значения из каждого из полей.
<?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>
o
oobrun 22 июля 2015г в 01:18 #
Если длина массивов (кол-во элементов) одинакова то вот:

<?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;
B
Batyabest 22 июля 2015г в 08:29 #
Спасибо, добрый человек!
$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;
o
oobrun 22 июля 2015г в 08:52 #
Думаю вот это:
...
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;
B
Batyabest 22 июля 2015г в 08:56 #

foreach ($product as $output) {
...

Да, я уже выяснил, что это с этого foreach вылезает массив.
Спасибо огромное за помощь!!!
o
oobrun 22 июля 2015г в 08:58 #
Не за что :)
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.