Asilis Опубликовано 29 октября, 2021 Жалоба Поделиться Опубликовано 29 октября, 2021 Добрый день форумчане! Есть цель передать цену закупки к каждому товару на странице списка заказов (orders) сейчас там формируется список покупок для быстрого просмотра так -> foreach($this->orders->get_orders($filter) as $o) { $orders[$o->id] = $o; $orders[$o->id]->purchases = $this->orders->get_purchases(array('order_id'=>$o->id)); вывод в шаблоне так -> <table class="orders_purchases"> {foreach $order->purchases as $purchase} <tr> <td> {$purchase->product_name} {if $purchase->variant_name}({$purchase->variant_name}){/if} </td> <td>{$purchase->price} </td> <td>{$purchase->amount}{$settings->units}</td> </tr> {/foreach} </table> Подобным образом передал значения закупочной цены по id варианта из покупок так -> $products_ids = array(); foreach($purchases as $purchase) { $products_ids[] = $purchase->product_id; } $orders[$o->id]->variants = $this->variants->get_variants(array('product_id'=>$products_ids)); В шаблоне вывожу следующим образом <table class="orders_purchases"> {foreach $order->purchases as $purchase} <tr> <td> {$purchase->product_name} {if $purchase->variant_name}({$purchase->variant_name}){/if} </td> <td>{$purchase->price} : {foreach $order->variants as $v} {$v->purchase_price} {/foreach} </td> <td>{$purchase->amount}{$settings->units}</td> </tr> {/foreach} </table> Проблема в том, что если товаров несколько, то значений передаются несколько, но при выборе товаров - товары показываются в одном варианте, а вот их закупочные цены показываются в обоих варианта одновременно. Тоесть для каждого (например из 2-х) элемента foreach выводит оба значения для двух товаров каждому товару. Ссылку на изо прилагаю. https://wampi.ru/image/RB25Sba Гуглил, смотрел инструкцию по смарти но так и не смог дойти до правильного решения. Как-то поставить счетчик для каждой итерации и следующая итерация дает следующее значение. Не нашел как. Значения передается в $varinats без дублей, ровно согласно количеству товара. Может кто подскажет правильное или более изящное решение? Цитата Ссылка на сообщение Поделиться на другие сайты
Asilis Опубликовано 1 ноября, 2021 Автор Жалоба Поделиться Опубликовано 1 ноября, 2021 В общем после 4 дней мучений-изучений сам решил задачу. Позволяет расширить функционал и воткнуть любой параметр в любой объект. Решение. в ordersAdmin.php получаем варианты товаров по айди товара из покупок -> foreach($purchases as $purchase) { $products_ids[] = $purchase->product_id; } $variants = $this->variants->get_variants(array('product_id'=>$products_ids)); далее декодируем объектный массив в обычный массив, так как с объектным массивом я не смог совладать и добавить ключ-значение -> $first = json_decode(json_encode($purchases), true); $second = json_decode(json_encode($variants), true); далее добавляем необходимые нам данные в обычный массив (в моем случае я добавил закупочную цену товара из покупок в данный момент)-> foreach($first as $key => $value1) { foreach($second as $value2) { if($value1['product_id'] === $value2['product_id']){ $first[$key]['purchase_price'] = $value2['purchase_price']; } } } далее декодируем обратно в массив объектов -> foreach($first as $key => $value){ $result[] = (object)array_merge((array)$first[$key]); } и наконец отправляем в шаблон orders.tpl $orders[$o->id]->purchases = $result; Та-да! Если кому пригодится то супер. Знатоков хотел спросить почему не объектный массив не читается смарти ну и может-ли есть более простой способ решить данную задачу. Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 2 ноября, 2021 Жалоба Поделиться Опубликовано 2 ноября, 2021 Обычно такое делается проще. Образцов в Simpla много. Смотрите, например, стандартный OrderAdmin.php, строки 145-180. Цитата Ссылка на сообщение Поделиться на другие сайты
Asilis Опубликовано 2 ноября, 2021 Автор Жалоба Поделиться Опубликовано 2 ноября, 2021 (изменено) 6 часов назад, phukortsin сказал: Обычно такое делается проще. Образцов в Simpla много. Смотрите, например, стандартный OrderAdmin.php, строки 145-180. Оттуда и брал основу, но при простом добавлении данных к вариантс через форич к каждому товару в заказе добавлялось два варианта цен, так как форич был в форич. Не понял как всё это объединить, о чем и написал в начале. Если подскажите иной вариант, для саморазвития и других возможных расширений, буду признателен. Изменено 2 ноября, 2021 пользователем Asilis Цитата Ссылка на сообщение Поделиться на другие сайты
alexivchenko Опубликовано 2 ноября, 2021 Жалоба Поделиться Опубликовано 2 ноября, 2021 (изменено) выполнить запрос к базе: ALTER TABLE `s_variants` ADD `purchase_price` DECIMAL(14,2) NULL AFTER `compare_price`; ALTER TABLE `s_purchases` ADD `purchase_price` DECIMAL(14,2) NULL AFTER `price`; api/Variants.php в функции get_variants() и get_variant() добавить v.purchase_price, после v.price, api/Orders.php в функцию add_purchase() после if(!isset($purchase->price) && !empty($variant)) $purchase->price = $variant->price; добавить if(!isset($purchase->purchase_price) && !empty($variant)) $purchase->purchase_price = $variant->purchase_price; Для ввода поля закупки у товара simpla/design/html/product.tpl после <li class="variant_discount">Старая, {$currency->sign}</li> добавить <li class="variant_purchase_price">Закупочная, {$currency->sign}</li> после <li class="variant_discount"> <input name="variants[compare_price][]" type="text" value="{$variant->compare_price|escape}" /></li> добавить <li class="variant_purchase_price"> <input name="variants[purchase_price][]" type="text" value="{$variant->purchase_price|escape}" /></li> и после <li class="variant_discount"><input name="variants[compare_price][]" type="" value="" /></li> добавить <li class="variant_purchase_price"><input name="variants[purchase_price][]" type="" value="" /></li> Для вывода цены закупки на странице заказов simpla/OrdersAdmin.php после // Отображение $orders = array(); foreach($this->orders->get_orders($filter) as $o) $orders[$o->id] = $o; добавить if(!empty($orders)) foreach($this->orders->get_purchases(array('order_id' => array_keys($orders))) as $purchase) $orders[$purchase->order_id]->purchases[] = $purchase; simpla/design/html/orders.tpl перед {if $order->note} <div class="note">{$order->note|escape}</div> {/if} добавить {if $order->purchases} <div class="purchases"> <ul> {foreach $order->purchases as $p} <li> Наименование: {$p->product_name} Вариант: {$p->variant_name} Количество: {$p->amount} {$settings->units} Цена: {$p->price} Закупка: {$p->purchase_price} </li> {/foreach} </ul> </div> {/if} {$p->product_name} - название товара в заказе {$p->variant_name} - название варианта товара в заказе {$p->amount} - кол-во товара в заказе {$p->price} - цена товара в заказе {$p->purchase_price} - закупочная цена товара в заказе Отблагодарить: https://yoomoney.ru/to/41001726440713 Изменено 2 ноября, 2021 пользователем alexivchenko Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 2 ноября, 2021 Жалоба Поделиться Опубликовано 2 ноября, 2021 1 час назад, Asilis сказал: Если подскажите иной вариант, для саморазвития и других возможных расширений, буду признателен. Примерно так: foreach($purchases as $purchase) { $variants_ids[] = $purchase->variant_id; } $temps = $this->variants->get_variants(array('id'=>$variants_ids)); $variants = array(); foreach($temps as $temp) { $variants[$temp->id] = $temp; } foreach($purchases as &$purchase) { $purchase->variant = $variants[$purchase->variant_id]; } После этого в шаблоне можно использовать {foreach $order->purchases as $purchase} ... {$purchase->variant->purchase_price} ... {/foreach} Цитата Ссылка на сообщение Поделиться на другие сайты
Asilis Опубликовано 2 ноября, 2021 Автор Жалоба Поделиться Опубликовано 2 ноября, 2021 25 минут назад, phukortsin сказал: Примерно так: foreach($purchases as $purchase) { $variants_ids[] = $purchase->variant_id; } $temps = $this->variants->get_variants(array('id'=>$variants_ids)); $variants = array(); foreach($temps as $temp) { $variants[$temp->id] = $temp; } foreach($purchases as &$purchase) { $purchase->variant = $variants[$purchase->variant_id]; } После этого в шаблоне можно использовать {foreach $order->purchases as $purchase} ... {$purchase->variant->purchase_price} ... {/foreach} Да, это тот самый вариант который проще я искал, но не нашел и пошёл дОлгой дорогой... ))) Лаконично, грамотно, эффективно. Спасибо! Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.