Asilis Posted October 29, 2021 Report Share Posted October 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 без дублей, ровно согласно количеству товара. Может кто подскажет правильное или более изящное решение? Quote Link to post Share on other sites
Asilis Posted November 1, 2021 Author Report Share Posted November 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; Та-да! Если кому пригодится то супер. Знатоков хотел спросить почему не объектный массив не читается смарти ну и может-ли есть более простой способ решить данную задачу. Quote Link to post Share on other sites
phukortsin Posted November 2, 2021 Report Share Posted November 2, 2021 Обычно такое делается проще. Образцов в Simpla много. Смотрите, например, стандартный OrderAdmin.php, строки 145-180. Quote Link to post Share on other sites
Asilis Posted November 2, 2021 Author Report Share Posted November 2, 2021 (edited) 6 часов назад, phukortsin сказал: Обычно такое делается проще. Образцов в Simpla много. Смотрите, например, стандартный OrderAdmin.php, строки 145-180. Оттуда и брал основу, но при простом добавлении данных к вариантс через форич к каждому товару в заказе добавлялось два варианта цен, так как форич был в форич. Не понял как всё это объединить, о чем и написал в начале. Если подскажите иной вариант, для саморазвития и других возможных расширений, буду признателен. Edited November 2, 2021 by Asilis Quote Link to post Share on other sites
sergeevizh Posted November 2, 2021 Report Share Posted November 2, 2021 (edited) выполнить запрос к базе: 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 Edited November 2, 2021 by alexivchenko Quote Link to post Share on other sites
phukortsin Posted November 2, 2021 Report Share Posted November 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} Quote Link to post Share on other sites
Asilis Posted November 2, 2021 Author Report Share Posted November 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} Да, это тот самый вариант который проще я искал, но не нашел и пошёл дОлгой дорогой... ))) Лаконично, грамотно, эффективно. Спасибо! Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.