Jump to content

Recommended Posts

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

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

Link to post
Share on other sites

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

Та-да!

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

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

Link to post
Share on other sites

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

Link to post
Share on other sites
6 часов назад, phukortsin сказал:

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

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

Edited by Asilis
Link to post
Share on other sites

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

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 by alexivchenko
Link to post
Share on other sites
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}

 

Link to post
Share on other sites
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}

 

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

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...