Николай Ланец
28 окт. 2013 г., 17:18

Дополнительные параметры товаров

В продолжение вот этого вопроса: modxclub.ru/blog/voprosy-spetsyalistov/257.html
Сейчас это еще не реализовано в официальной сборке, но покажу на примере слингов. Сразу скажу, что действий не мало надо сделать. И еще: для обеспечения обратной совместимости хоть какой-то, придется дополнительно напрячься с переопределением классов. Единственное что могу сказать положительное, это то, что версия 2.1.0 как раз и вышла с дополнениями, которые писались под этот функционал.
Конечно, это не самое лучшее решение, и более правильный функционал появится позже в самой сборке, но если надо срочно, что чтож, значит надо делать. Итак, поехали.
Готовим параметры и базу данных
1. Создаем необходимые TV-параметры
Надо создать TV-шки этих параметров, меняющихся в товарах. В нашем случае это size и color. При этом надо в этих полях не конечное значение указать, а именно перечислить имеющиеся варианты. К примеру, у вас галстук с размерами L,X,XL и цветами Красный, Синий, Зеленый. В самом товаре надо будет выбрать все возможные значения, которые соответствуют наличию товара. Лучше всего заводить TV-поле типа Мульти-список, в котором в возможных вариантах сразу прописать все возможные варианты. Вот так: ?
Или вот так: ?
В нашем случае не принципиально, но все-таки числовые ID-шники всегда предпочтительней. В таблице заполненных данных TV-полей у вас будут примерно такие данные: M||XXL||L. То есть по разделителю || можно будет понять, что по этому товару есть размеры M,XXL,L. Получить массив размеров можно будет через explode('||', $value);
2. Редактируем таблицу Заказ-Товар
Надо отредактировать вручную таблицу modx_billing_order_products (через phpMyAdmin или типа того): 2.1 Добавить колонки этих параметров (повторюсь, в нашем случае это size и color). Тип данных сами определите, но ни в коем случае эти колонки не должны быть nullable, и нельзя вставлять значения null. 2.2 Надо подправить индексы — удалить уникальный ключ order_id-product_id и создать уникальный ключ со своими параметрами. В нашем случае это order_id-product_id-size-color. 2.3 Подправить map-файл класса OrderProduct. Надо в него добавить описание ваших колонок. Лучше всего для этого использовать CMPGenerator. На всякий случай ревизия: gist.github.com/Fi1osof/f0372195175ade7a72fb/revisions
Суть этого действия в том, чтобы получить возможность в одном заказе иметь несколько товаров с одним и тем же id, только с разными параметрами.
3. Правим шаблоны
Все, на этом этапе мы уже имеем возможность добавлять товары с различными параметрами. Теперь нам просто надо в форме вывести чекбоксы или выпадающие списки с размерами и цветами, и эти данные отправить на процессор добавления товара в корзину. С шаблоном ничего показывать не буду — это обычная задача на уровне шаблона добавить поля в форму. Эти данные автоматически будут передаваться в запросе. Нам остается только на сервере поймать эти данные и учесть в добавлении товара. И вот тут начинаются трудности побольше…
Переопределяем процессоры
Для начала немного общей теории по добавлению товаров в корзину.
При добавлении товаров в корзину, запрос идет на процессор orders/products/add. Но если товара нет в заказе, то его надо добавить к заказу новой строчкой. А если уже есть, то тогда запись надо обновить. Это уже два разных действия и два совершенно разных процессора: один — create-процессор, создающий новую запись, а второй — update-процессор, обновляющий существующую запись.
Как это работает?
Есть add-процессор modMgrOrdersProductsAddProcessor. В нем в методе process выполняется поиск товара через метод findExistingObject() github.com/Fi1osof/ShopModxBox/blob/17791a616ccb43245dfdac5f6defb81a2c90b815/core/components/billing/processors/mgr/orders/products/add.class.php#L37 и в зависимости от результата выполняется тот или иной конечный процессор.
Вот наша задача здесь — это изменить принцип поиска товара в корзине. То есть здесь выполняется поиск по ключу order_id-product_id github.com/Fi1osof/ShopModxBox/blob/17791a616ccb43245dfdac5f6defb81a2c90b815/core/components/billing/processors/mgr/orders/products/add.class.php#L94 а нам надо сделать поиск по ключу order_id-product_id-size-color (или order_id-product_id-size, как это конкретно в моем примере). Вот для этого нам надо переопределить add-процессор и перенаправлять запросы на него.
3. Добавляем свой add-процессор.
Создаем свой add-процессор в вашей папке процессоров (у меня это site/web/basket/orders/products/add в неймспейсе modxsite), и в нем переопределяем метод поиска записи товара в заказе: gist.github.com/Fi1osof/642525c6ed5de4b38698#file-gistfile1-php-L28 Собственно здесь все. Если запрос на добавление товара будет отправляться на этот процессор, то товар будет искаться с учетом заданных параметров. Только не отправляйте поиск объекта дальше в родительский процессор, а то он получит первый же попавшийся товар с этим id, только без учета дополнительных параметров.
4. Переопределяем action-процессор.
Вот теперь надо сделать главное — это перенаправить запросы с клиента на этот новый add-процессор. В целом, это относительно простая задача. У нас есть в баскете общий action-процессор: github.com/Fi1osof/ShopModxBox/blob/master/core/components/basket/processors/basket/web/public/action.class.php
Вот такой у меня переопределяющий action-процессор: gist.github.com/Fi1osof/86d19bd9e5299756de55#file-gistfile1-php-L15
Запросы на него попадают двумя способами: 1. Ajax — через коннектор. github.com/Fi1osof/ShopModxBox/blob/master/assets/components/basket/connectors/connector.php#L22 2. Не Ajax — через плагин. github.com/Fi1osof/ShopModxBox/blob/master/core/components/basket/elements/plugins/basket.plugin.php#L14 То есть надо подправить путь на свой action-процессор в коннекторе (настройка будет добавлена позже), а в плагине в параметрах плагина изменить параметры basket_processor и basket_namespace (именно настройки плагина в админке, а не исходный код плагина).
Ну, в общих чертах все. Процессор вывода товаров корзины получит все записи товаров с их данными: github.com/Fi1osof/ShopModxBox/blob/17791a616ccb43245dfdac5f6defb81a2c90b815/core/components/basket/processors/basket/mgr/orders/products/getdata.class.php#L69
Останется только одна небольшая задача: в админке в модуле управления заказами не будет колонки вывода размена и цен, поэтому либо ориентироваться на данные из писем, либо править JS-ы этого модуля. github.com/Fi1osof/ShopModxBox/blob/17791a616ccb43245dfdac5f6defb81a2c90b815/manager/components/shopmodxgroupedit/js/widgets/grid.js
Вот моя ревизия на слингах: gist.github.com/Fi1osof/380d7b0587c61738b967/revisions В целом там совсем не много.
Вот и все. Более удобный функционал для подобных задачах появится в самых ближайших версиях движка.
базу вроде подправил (orderproducts.map.inc.php, Billing.mysql.schema.xml все отображают) (кстати, там два каталога: billing и Billing — это так и надо?), но по getCollection не выдает size и color
c процессорами вроде все понятно
Billing.mysql.schema.xml вообще не играет здесь никакой роли. Он только может использоваться для генерации классов компонента, но после этого он вообще не нужен.
кстати, там два каталога: billing и Billing — это так и надо?)
Я уже где-то писал — Billing — это рудимент. Это просто у меня после CMPgenerator-а остается. А нужен именно с маленькой буквой. И если сомневаешься — смотри в источниках файлов или в пространствах имен. ?
А нужный мап-файл ты так и не подправил (он указан на скриншоте). Смотри результат:
<?php $o = $modx->newObject('OrderProduct'); print '<pre>'; print_r($o->toArray());
Коля, привет! Все сделал, товары добавляются. Но есть еще несколько вопросов: 1. мини-корзина обновляется только при полной перезагрузке странички. что-то я не доделал? 2. Появилась идея в корзине менять не только количество, но и цвета и размеры. что нужно сделать, чтобы эти изменения сохранялись, а также при изменении любого параметра происходила запись в базу (примерно как при изменении цены)? че-то я запутался в процессорах :)
1. мини-корзина обновляется только при полной перезагрузке странички. что-то я не доделал?
Скорее всего ты классы не правильно прописал в верстке. Напомни мне в скайл адрес сайта.
2. Появилась идея в корзине менять не только количество, но и цвета и размеры. что нужно сделать, чтобы эти изменения сохранялись, а также при изменении любого параметра происходила запись в базу (примерно как при изменении цены)? че-то я запутался в процессорах :)
Вот с этим не советую заморачиваться. Пусть удаляют и добавляют верные товары. А иначе тебе придется проверять в своем процессоре при обновлении уже имеющуюся запись с такими параметрами в БД, и обновлять там кол-во, а текущую запись удалять. Это будет слишком накладно сейчас по расходам в калориях.
А иначе тебе придется проверять в своем процессоре при обновлении уже имеющуюся запись с такими параметрами в БД
Да, я про это тоже подумал… после того, как заложил :) Согласен. Уберу. Хотя прикольно было бы в плане юзабилити.
По первому вопросу: у тебя совершенно не соблюдены атрибуты HTML-тегов, поэтому скрипт просто не срабатывает. Вот посмотри как в исходном шаблоне: github.com/Fi1osof/ShopModxBox/blob/17791a616ccb43245dfdac5f6defb81a2c90b815/core/components/modxsite/templates/default/shop/basket/entity/index.tpl#L17
Обрати внимание на все, включая data-smodx-basket=«minibasket», data-smodx-data=«cost», class=«num» и т.п.
Прикольно, но не сейчас. Я подумаю на счет этого в новой версии.
Николай, добрый день. JS я подправил (кстати, там уже все идет из коробки, просто закомментировано :)), все заработало, но не могу разобраться с одной проблемкой: в таблице поля color и size выводятся, но у меня там хранятся коды, а названия — в других таблицах (я при старте формирую из них массивы)
$c=$modx->getCollection('shopSize'); $sz=array(); foreach($c as $i){ $sz[$i->get('id')]=$i->get('name'); } $modx->setPlaceholder('shopSize',$sz); $c=$modx->getCollection('shopColor'); $cl=array(); foreach($c as $i){ $cl[$i->get('id')]=$i->get('name'); } $modx->setPlaceholder('shopColor',$cl);
И теперь мне нужно эти названия подставить вместо кодов. Я вижу два способа сделать это: 1) получить название по коду через ajax (я попробовал использовать Ext.Ajax.request, но в результате у меня все развалилось); 2) подправить процессор, который формирует данные для этой таблицы, чтобы вместо кодов он выдавал названия (я не смог разобраться, какой процессор это делает) Не подскажешь, как лучше сделать? Может, есть какой-то более правильный путь?
Саша, привет!
У тебя есть процессор, который получает данные товаров. Как правило это web/catalog/products/getdata. Вот тебе там и надо в метод setSelection() добавить дополнительные колонки. Или в методе afterIteration() уже в конечном массиве данных добавить элементы. Ты скорее всего добавил в исходный TV сразу набор значений, к примеру X==1||XL==2 и т.п. Я же обычно делаю это на документах (там специально заведен контекст spravochniki). Вот если у тебя это было бы сделано на документах, то тебе бы только оставалось в setSelection() приджоинить таблицу документов по значениям-ключам TV-шек и все, получил бы названия размеров, цветов и т.п. Но у тебя скорее всего готовый набор значений. Значит тебе надо сделать так: я специально для таких случаев вот написал сниппет на скорую руку:
<?php $elements = array(); if($id AND $doc = $modx->getObject('modTemplateVar', $id)){ if($els = $doc->elements){ $els = explode('||', $els); foreach($els as $el){ $a = explode('==', $el); if(isset($a[1])){ $el_value = $a[1]; } else{ $el_value = $a[0]; } $title = $a[0]; $elements[$el_value] = $title; } } } return isset($elements[$value]) ? $elements[$value] : null;
Пример вызова: [[getListValue?id=`10`&value=`[[*color]]` ]]
Параметры: id — id TV-параметра. value = значение TV-параметра.
Это для тех TV-шек, где данные четко перечислены в самом TV-параметре, к примеру Выберите цвет==0||Черный==1||Красный||Белый==3
Коля, привет. спасибо за ответ.
Но у тебя скорее всего готовый набор значений.
Нет, у меня две таблички с полями (id,name) и их можно джойнить. весь вопрос в том, какой процессор готовит данные для вывода содержимого заказа в менеджере (управление заказами) ? от и есть web/catalog/products/getdata?
от и есть web/catalog/products/getdata?
Ну да, если ты ничего не менял, то это он. Но ты посмотри это там, где у тебя идет вызов процессора и все.
И все-таки я не совсем понял. У меня там нет вызова процессора, эта табличка выводится в админке, в менеджере заказов. Ты же писал в топике:
Останется только одна небольшая задача: в админке в модуле управления заказами не будет колонки вывода размена и цен, поэтому либо ориентироваться на данные из писем, либо править JS-ы этого модуля.
JS я подправил, но выводится только код.
Смотри процессор, который используется при получении данных.
Да, все хочу и все забываю задать вопрос. Я изминил таблицу, core\components\billing\model\billing\mysql\orderproduct.map.inc.php и формы покупки. А вот с переопределением процессоров чет путаюсь и в первый и во-второй раз. Вместо переопределения я чуть дописал свой параметр к методу getObject из core\components\billing\processors\mgr\orders\products\add.class.php
protected function getObject(){ $object = null; if( $order_id = $this->getProperty('order_id', null) AND $product_id = $this->getProperty('product_id', null) AND $myVar = $this->getProperty('myVar', 'null) ){ $object = $this->modx->getObject('OrderProduct', array( 'order_id' => $order_id, 'product_id'=> $product_id, 'warehouse' => $myVar, )); } return $object; }
Ну, скрипты CMP тоже подправил, естественно. Я понимаю, что должен более точно описать, что делал, но переносил ночью и точно не помню ) Этот более короткий способ, чем описан выше. И вроде так работает. Я хотел узнать, я этим не накосячил сильно, так же можно делать? Никаких глюков не заметил и работало так неск.месяцев.
Просто я не менял ничего в процессорах, кроме core\components\billing\processors\mgr\orders\products\add.class.php
AND $myVar = $this->getProperty('myVar', 'null)
С этим только проблемка может быть. Если не был передан myVar, то объект не будет получен. Это обязывает все твои товары иметь свойство myVar. Но если это так, то проблем никаких не должно быть.
Ок, спасибо. Да он там везде в форме подставлен, так что не должно быть. Ну, вообще-то я там замутил, что если myVar-а нет, то смотреть соответствующий тв, и если там значит пусто или два варианта, то подставлять дефолт, а если один — то ставить его. Но дело ночью было и что-то не полетело. Забил ))
Ну, работает, и славно.
Добрый день подскажите, а для вывода Групповой редактор значения твшки достаточно отредактировать /manager/components/shopmodxgroupedit/js/widgets/grid.js. Почему то кастомные поля выводит а tv нет.
Все работает и товар падает в корзину, но не выводит значения tv в Групповом редакторе, совсем пусто там ) Причем пробовал выводить не tv поле (introtext) — все отлично. Делаю все аналогично — gist.github.com/Fi1osof/380d7b0587c61738b967/revisions
Или все таки нужно редактировать еще процессоры shopmodxgroupedit?
Да именно — все разобрался)
Должно быть: 1. В ExtJS описание колонок (fields), чтобы возпринимал передаваемые с сервера данные. 2. Там же описание колонок для грида (чтобы понимать что выводить из записей). 3. Процессор с сервера должен отдавать нужные вам данные. Тогда все ОК будет.
2. Там же описание колонок для грида
Columns или ColumnsModel (он же cm).
Спасибо Николай, с этим порядок уже )
Николай подскажите еще такую штуку раньше не делал, алгоритм действий хотя бы, мне необходимо чтобы при смене размера менялись и цены, тоесть попадали в заказ и далее. Добавлю в MIGX Tv еще одну колонку, (у меня там уже есть — артикул, цвет, размер). Вот с ценой проблемиус, куда копать подскажите
надо просто переписать процессоры, чтобы не sm_price исполььзовали, а эту колонку с ценой. А в sm_price прописать базовое значение — для сортировки и фильтрации
А базово в каких это процессорах не подскажите?
на сервере при добавлении товара в корзину его цена берется из базы, а не из запроса. Товар в корзине/заказе идентифицируется по первичному ключу (order_id,product_id,,...) т.е. достаточно переписать процессоры getdata для товаров, да на JS [+ajax] дописать функционал показа нужной цены на страничке. Да, еще при оформлении заказа нудно по ключу получить цену. Как-то так. :)
Ок спасибо сейчас попробую, я что-то перемудрил помоему
[modxsite]web/catalog/products/getdata Ну и tpl надо будет тоже подправить, которые с ценами работают.
Включи поиск. Это все уже подробно описывалось. Саша уже замахался ссылки постить, я тоже.
Да все тут вроде и обсуждается на этой странице ) Спасибо, если что простите за повторы. Скоро разберусь буду сам постить тем кому не понятно )
Нет все таки не могу понять я ) как можно MIGx развернуть в web/catalog/products/getdata получаю только последнее значение
public function afterIteration(array $list){ $list = parent::afterIteration($list); foreach($list as & $l){ if(!empty($l['tvs']['options']['value']) AND $options = json_decode($l['tvs']['options']['value'], true)) { $l['options'] = array(); foreach($options as $item){ $l['options'][] = $item; } } if(!empty($l['tvs']['options']['value'])){ $l['sm_price'] = $item['price']; } } return $list; }
Я так делаю (функция afterIteration)
if ($views=$l['tvs']['options']['value']){ $views=json_decode($views,1); $options=[]; foreach($views as $r){ $vs=json_decode($r['views'],1); $o=[ 'option'=>$r['option'], 'price'=>$r['price']?$r['price']:$l['sm_price'], 'views'=>[], ]; foreach($vs as $v){ $o['views'][]=$images_base_url . $v['img']; } $options[]=$o; } $l['options']=$options; // unset($l['tvs']['options']); }
Спасибо, но мозг закипел еще сильнее, наверное завтра разберу теперь )
Данные в переменной MIGX хранятся в JSON, поэтому сперва распакуем их
$vs=json_decode($r['views'],1);
и после этого формируем данные как угодно
ну у меня данные MIGX в таком виде
[{"MIGX_id":"1","art":"m","size":"91\/47 \u0441\u043c","price":"1900"},{"MIGX_id":"2","art":"x","size":"121\/63 \u0441\u043c","price":"2300"},{"MIGX_id":"3","art":"xl","size":"153\/80 \u0441\u043c","price":"2900"}]
Собственно второй раз не нужно как у вас для views.
Второй момент
'price'=>$r['price']?$r['price']:$l['sm_price'],
немного не понял смысл этого выражения
Третий момент
public function afterIteration(array $list){ $list = parent::afterIteration($list); foreach($list as & $l){ if($list=json_decode($l['tvs']['options']['value'],1)){ $options=[]; foreach($list as $r){ $o=[ 'art'=>$r['art'], 'price'=>$r['price']?$r['price']:$l['sm_price'], 'size'=>$r['size'], ]; $options[]=$o; } $l['options']=$options; } } return $list; }
вывел у себя вот так, на выходе получил только массив MIGX, а остальное куда пропало. Туплю чего то
Да с мигой разобрался, получил массив, но вот цена все равно мне не ясно как? у меня же в getdata их три для каждого товара
Help. Как переопределить эти цены? Помогите + 500 на развитие проекта
Может кто лично объяснить на примерах за вознаграждение?
Помогите + 500 на развитие проекта
+ 500 на развитие — это люди просто сбрасывают молча и все. К слову, не часто делают последнее время. Но это и не страшно. Лично объяснить? — 2000 рублей часовая консультация. Достаточно, чтобы разобрать все эти моменты.
Николай да час там нечего объяснять я думаю это много по времени ) хотя вам виднее конечно. Если сможете буду рад
2000 через форму отправляйте и на n.lanets@modxclub.ru пишите, время согласуем на ближайшие дни.
Хорошо Николай, в ближайшие дни тогда, просто мне нужно это сейчас добить )
Я так в принципе все разобрал сам, но будут еще вопросы по движку, который хотелось понять раз и навсегда. Сейчас если не сложно могли бы помочь понять такую штуку
Как при оформлении заказа по ключу получить цену. Это в процессоре processors/mgr/orders/products/create.class.php я правильно понял? Необходимо переопределить его функцию setPrices()
Переопределил подобно описанию Александра в посте modxclub.ru/topics/izmenyaemaya-czena-na-shopmodxbox-1259.html
И теперь бы понять как по ключу получить цену, у меня по три для каждого товара, в массиве options
сам товар получаешь по product_id, потом раскладываешь MIGX options в массив и по остальным параметрам, переданным в запросе, подбираешь цену.
я так понимаю не спроста вот в getdata
'price'=>$r['price']?$r['price']:$l['sm_price'],
Пример бы, уже сбился столку
да, утром закрутился, не ответил. Это позволяет задать базовую цену, а в MIGX указывать только цены, отличные от нее. Простая дань лени (или забота о менеджерах :)) т.е. если цена не зависит от опций, то достаточно указать sm_price (базовую)
кодга добавляешь новый товар к заказу, с сайта приходят product_id, quantity и несколько параметров. по product_id получаешь этот товар, берешь поле options и в цикле ищешь в нем запись, в которой параметры совпадают. например, после json_decode имеем для товара $options=[ [color=red,size=1,price=100], [color=blue,size=2,price=200], [color=blue,size=4,price=400], ] в запросе передано color=blue, size=4 Ищем запись, в которой color и size совпадают, и берем цену из этой записи.
Извиняюсь, но времени нет более подробные примеры писать.
Спасибо и на этом уже логика понятна, но не ясно как получить товар по product_id, буду думать
$product = $this->modx->getObject('ShopmodxProduct', (int)$this->getProperty('product_id')) так?
Внимательно изучи процессор core\components\billing\processors\mgr\orders\products\create.class.php — там все есть.
Или можно в форму кроме product_id передавать еще и resource_id — тогда проблем вообще не будет.
Огромное спасибо, человечище.
а как бы протестить это дело в консоли, или никак
легко. Воспользуйся поиском по сайту — тут где-то скрипт лежит вызова процессора через консоль. Я только в консоли все и проверяю
Спасибо Николай правильно ли я получаю options?
$product = $this->modx->getObject('ShopmodxProduct', (int)$this->getProperty('product_id')); $options = $product->get('options');
Почему то не возвращает
protected function getPrice($product){ $prod = $this->modx->getObject('ShopmodxProduct', (int)$this->getProperty('product_id')); $id = $prod->get('resource_id'); $resource = $modx->getObject('modResource',$id); $options = $resource->getTVValue('options'); $options = $resource->getTVValue(15); $op = json_decode($options, 1); $art = $this->getProperty('art'); $size = $this->getProperty('size'); foreach($op as $key=>$option){ if(in_array($art,$option) && in_array($size,$option)){ $opt[]=$option; } } foreach($opt as $k ){ $product = $k['price']; } return $product; }
Посмотрите где может быть ошибка пожалуйста
Неправильно. Почему? Не скажу. Не надо тыкать пальцем в небо. Изучите нормально xPDO, если в это лезете. Вот в помощь ilyaut.ru/xpdo/
Разобрался Николай ) Все работает. Огромное вам спасибо. Как вам приемлимо будет в какой день меня подтаскивать немного надо все же в этом деле. В выходные наверное? С ошибками комменты может стереть )
Пишите на n.lanets@modxclub.ru, согласуем. Удалять ничего не надо. Кому-нибудь пригодится.
Ок. Еще раз спасибо за функционал. Реально крутой движок. На мой взгляд в чем-то Битрикс нервно курит в сторонке )
Подскажите а в каком процессоре подменять $object.image в зависимости от цвета попадающего в корзину и в заказ, или может как то иначе нужно, запутался…
если нужна картинка в заказ, то я бы так делал: при добавлении в заказ (orderproduct) нужно просто сохранять id или название цвета. А при выводе (getdata) просто по этому id подбирать нужную картинку и прописывать ее в image
При добавлении в заказ у меня сохраняется цвет в в базу orderproduct. А при выводе не могу понять в каком процессоре подбирать
Получается в процессоре getdata Получения данных корзины?
Да, basket/mgr/orders/products/getdata
Спасибо в корзину временно добавил через сниппет ). Если сделать через процессор то в заказ тоже автоматически попадет? или там тоже надо все равно в другом процессоре подбирать. Мне нужно совсем переопределить переменную $object.image, чтобы везде была такая логика. Изначально где инклюдится $object.image?
[modxsite]web/resources/getdata Но этого мало. этот процессор не учитывает, какая опция выбрана при помещении в корзину. переопределять надо именно [basket]basket/mgr/orders/products/getdata
Да спасибо Александр, как раз ловлю переменную )
Все нашел, а как записать то нужное значение?
// Получаем фото товаров foreach($list as & $l){ $color = json_decode($l['tvs']['color']['value'],1); foreach($color as $r){ if (str_replace(" ","",mb_strtolower(strip_tags($r['color']))) == $l['color']) { $imgh = json_decode($r['renderimage'], 1); } }; $l['image'] = $imgh[0]['image']; } return $list; } public function outputArray(array $array, $count = false){
спасибо за помощь в моем случае это выглядело так

Добавить комментарий