Перейти к содержанию
Официальный форум поддержки Simpla

Цена закупки товара в списке заказов


Рекомендуемые сообщения

Добрый день форумчане! 

Есть цель передать цену закупки к каждому товару на странице списка заказов (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 без дублей, ровно согласно количеству товара. Может кто подскажет правильное или более изящное решение?

Ссылка на сообщение
Поделиться на другие сайты

В общем после 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;

Та-да!

Если кому пригодится то супер. 

Знатоков хотел спросить почему не объектный массив не читается смарти ну и может-ли есть более простой способ решить данную задачу.

Ссылка на сообщение
Поделиться на другие сайты

Обычно такое делается проще. Образцов в Simpla много. Смотрите, например, стандартный OrderAdmin.php, строки 145-180. 

Ссылка на сообщение
Поделиться на другие сайты
6 часов назад, phukortsin сказал:

Обычно такое делается проще. Образцов в Simpla много. Смотрите, например, стандартный OrderAdmin.php, строки 145-180. 

Оттуда и брал основу, но при простом добавлении данных к вариантс через форич к каждому товару в заказе добавлялось два варианта цен, так как форич был в форич. Не понял как всё это объединить, о чем и написал в начале. Если подскажите иной вариант, для саморазвития и других возможных расширений, буду признателен.

Изменено пользователем Asilis
Ссылка на сообщение
Поделиться на другие сайты

выполнить запрос к базе:

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

Изменено пользователем alexivchenko
Ссылка на сообщение
Поделиться на другие сайты
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}

 

Ссылка на сообщение
Поделиться на другие сайты
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}

 

Да, это тот самый вариант который проще я искал, но не нашел и пошёл дОлгой дорогой... )))

Лаконично, грамотно, эффективно. Спасибо!

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...