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

Ввод цен вариантов в любой удобной валюте(поставки в евро-долларах)


Перейти к решению Решено ExtraBash,

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

Привет ребята.

Возникла тут новая задача, суть в том, что поставки магазина ведутся из разных источников,
некоторые в рублях некоторые в евро, некоторые в долларах.
В нашей стабильной стране пришлось бы менять такие цены хоть каждый день.
Неудобно, особенно учитывая, что в каталоге более 2000 товаров.

Итого нужно сделать, чтобы каждый товар мог быть введен в любой валюте,
чтобы менять только курс. Повторю, что поставки из разных источников и 1 валюта
для магазина становится не вариантом, товары будут вводиться в разных валютах.

 

Обратите внимание кто пользуется!
Лишним действием в файле Money.php было сделать аргумент функции обязательным, лучше на всякий случай вернуть нулл по умолчанию. public function convert($price, $currency_id = null, $format = true); Тоже и для функции public function convert2($price, $currency_id = null, $format = true); Спасибо Kors

 

Второе важное - скоро будет вторая, более простая версия, как советовал товарищ cernos.

 

Третье - добавлен импорт и экспорт



1. Добавим в таблицу с вариантами товаров соответствующее поле.

Таблица `s_variants` - новая колонка валюты - currency

ALTER TABLE `s_variants` ADD `currency` TEXT

 

2. Так как мы хотим сделать выбор валюты нужно вывести варианты. Я сделал вывод вариантов выпадающим списком в админке товара. Для этого в первую очередь нужно вызвать список валют

в соответствующий шаблон админки.

 

2.1. Научимся брать из базы нужные нам новые данные, 

для этого в файле /api/Variants.php поправим 2 функции, которые ломятся в базу - get_variants($filter = array()) и get_variant($id), добавим в оба запроса переменную currency - v.currency as currency

$query = $this->db->placehold("SELECT v.id, v.product_id , v.price, NULLIF(v.compare_price, 0) as compare_price, v.sku, IFNULL(v.stock, ?) as stock, (v.stock IS NULL) as infinity,v.currency as currency, v.name, v.attachment, v.position
			FROM __variants AS v
			WHERE 
			1
			$product_id_filter          
			$variant_id_filter   
			ORDER BY v.position       
			", $this->settings->max_order_amount);
$query = $this->db->placehold("SELECT v.id, v.product_id , v.price, NULLIF(v.compare_price, 0) as compare_price, v.sku, IFNULL(v.stock, ?) as stock, (v.stock IS NULL) as infinity, v.currency as currency, v.name, v.attachment
			FROM __variants v WHERE id=?
			LIMIT 1", $this->settings->max_order_amount, $id);

 

 

 

2.2. В файлах /simpla/ProductAdmin.php и /simpla/ProductsAdmin.php добавим 

// Все валюты
$currencies = $this->money->get_currencies();
$this->design->assign('currencies', $currencies);

Это даст нам доступ к массиву $currencies в шаблонах редактирования 1 товара и списка товаров.
В массиве располагаются все валюты магазина по их id.

 

 

2.3. В файле /simpla/design/html/product.tpl добавим новый столбец к варианту товара
в div id="variants_block" > ul id="header" добавим

<li class="variant_discount">Старая,</li>	
<li class="variant_currency">Валюта</li>
<li class="variant_amount">Кол-во</li>

Ниже, уже в списке вариантов div id="variants" > ul добавляем соответствующий столбец

<li class="variant_currency">
	<select type="text" name="variants[currency][]">
		{foreach $currencies as $c}
			<option
			{if $variant->currency}
				{if $variant->currency == $c->id}
					selected
				{/if}
			{else}
				{if $currency->id == $c->id}
					selected
				{/if}
			{/if} value="{$c->id}">{$c->code} ({if $c->code != "RUR"}{$c->rate_to}{else}1{/if})</option>
		{/foreach}
	</select>
</li>

 

Добавим стили этой новой шляпы в /simpla/design/css/style.css

.variant_currency {
    width: 145px;
}
.variant_currency > select {
    padding: 4px;
    height: 27px;
}

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

2.4. Выведем валюту в списке товаров /simpla/design/html/products.tpl
Вместо прежнего вывода:

{if $variant->compare_price>0}title="Старая цена — {$variant->compare_price} {$currency->sign}"{/if} />{$currency->sign}

Новый: 

{if $variant->compare_price>0}title="Старая цена — {$variant->compare_price} {if $variant->currency}{$currencies[$variant->currency]->sign}{else}{$currency->sign}{/if} "{/if} />{if $variant->currency}{$currencies[$variant->currency]->sign}{else}{$currency->sign}{/if}  

На этом в админке все готово.

 

 

3. Выведем все на сайт, массив с валютами $currencies на сайт вызывается автоматом,
как только вы включите нужные валюты. 

 

3.1 Для конвертирования функция уже есть, мы ее только малость поправим.
В файле /api/Money.php

Теперь будем передавать в функцию валюту товара,
потом сам расчет малость не такой как нам нужно,

// Умножим на курс валюты
$result = $result*$currency->rate_to/$currency->rate_from; 

Меняем на 

// Умножим на курс валюты
$result = $result*$currency->rate_from/$currency->rate_to;

 

 

3.2. В вашем дизайне в файлах main.tpl, product.tpl, products.tpl все выводы цены

<td>
	{if $v->compare_price > 0}<span class="compare_price">{$v->compare_price|convert}</span>{/if}
	<span class="price">{$v->price|convert} <span class="currency">{$currency->sign|escape}</span></span>
</td>

Меняем на

<td>
	{if $v->compare_price > 0}
		<span class="compare_price">
			{$v->compare_price|convert:$currencies[$v->currency]->id}
		</span>
	{/if}
	<span class="price">
		{$v->price|convert:$currencies[$v->currency]->id} 
		<span class="currency">{$currency->sign|escape}</span>
	</span>
</td>

Таким образом будет выведена пересчитанная из любой валюты
варианта товара а основную включенную валюту цена,
как вы заметили главное изменение по сути - как выводится цена, вызов функции конвертирования.

$v->price|convert:$currencies[$v->currency]->id

Сделали вывод на сайте, но осталась еще корзина и оформленный заказ

3.2. Выведем новым способом цены в корзине и в заказе
Файл cart.tpl, не буду писать сравнения, итак очевидно

{* Цена за единицу *}
<td class="price">
	{($purchase->variant->price)|convert:$purchase->variant->currency} {$currency->sign}
</td>
{* Цена *}
<td class="price">
	{($purchase->variant->price*$purchase->amount)|convert:$purchase->variant->currency} {$currency->sign}
</td> 

 

 

3.3. Пересчет по сути нужен только для именно вариантов товара,
вопрос с полной ценой решается в файле /api/Cart.php

$cart->total_price += $item->variant->price*$item->amount;

Меняем на

$cart->total_price += $this->money->convert2($item->variant->price, $item->variant->currency)*$item->amount;

Да, именно convert2, так как как convert разбивает для красоты числа и считает в итоге неправильно.
Чуть позже добавим её.

Так же полная цена фигурирует в заказе, как на сайте, так и в том, что улетает на почту,

менять будем /api/Orders.php

if(!isset($purchase->price) && !empty($variant))
	$purchase->price = $variant->price;

Меняем на

if(!isset($purchase->price) && !empty($variant))
	$purchase->price = $this->money->convert2($variant->price, $variant->currency);

 

 

3.4. Еще раз идем в файл /api/Money.php
добавляем функцию convert2, копию convert, но без форматирования цены

public function convert2($price, $currency_id = null, $format = true)
{
	if(isset($currency_id))
	{
		if(is_numeric($currency_id))
			$currency = $this->get_currency((integer)$currency_id);
		else
			$currency = $this->get_currency((string)$currency_id);
	}
	elseif(isset($_SESSION['currency_id']))
		$currency = $this->get_currency($_SESSION['currency_id']);
	else
		$currency = current($this->get_currencies(array('enabled'=>1)));
							
	$result = $price;
	
	if(!empty($currency))
	{		
		// Умножим на курс валюты
		$result = $result*$currency->rate_to/$currency->rate_from;
		
		// Точность отображения, знаков после запятой
		$precision = isset($currency->cents)?$currency->cents:2;
	}

	return $result;
}

 

 

4. Импорт - Экспорт

Осталась небольшая часть, как сделать импорт и экспорт сия чуда.
Очень просто.


4.1. Правим /simpla/ajax/export.php - добавляем новую колонку для экспорта в

объявлении массива $columns_names:

	private $columns_names = array(
			'category'=>         'Категория',
			'name'=>             'Товар',
			'price'=>            'Цена',
			'currency'=>         'Валюта',
			'url'=>              'Адрес',
			'visible'=>          'Видим',
			'featured'=>         'Рекомендуемый',
			'brand'=>            'Бренд',
			'variant'=>          'Вариант',
			'compare_price'=>    'Старая цена',
			'sku'=>              'Артикул',
			'stock'=>            'Склад',
			'meta_title'=>       'Заголовок страницы',
			'meta_keywords'=>    'Ключевые слова',
			'meta_description'=> 'Описание страницы',
			'annotation'=>       'Аннотация',
			'body'=>             'Описание',
			'images'=>           'Изображения'
			);

Ниже добавляем аналогично данные в соответствующую переменную:

foreach($variants as $variant)
{
	if(isset($products[$variant->product_id]))
	{
		$v                    = array();
		$v['variant']         = $variant->name;
		$v['price']           = $variant->price;
		$v['currency']        = $variant->currency;
		$v['compare_price']   = $variant->compare_price;
		$v['sku']             = $variant->sku;
		$v['stock']           = $variant->stock;
		if($variant->infinity)
			$v['stock']           = '';
		$products[$variant->product_id]['variants'][] = $v;
	}
}

Всё, экспорт будет работать.

 

4.2. Правим /simpla/ajax/import.php

Аналогично добавляем в массив $columns_names новый столбец

private $columns_names = array(
		'name'=>             array('product', 'name', 'товар', 'название', 'наименование'),
		'url'=>              array('url', 'адрес'),
		'visible'=>          array('visible', 'published', 'видим'),
		'featured'=>         array('featured', 'hit', 'хит', 'рекомендуемый'),
		'category'=>         array('category', 'категория'),
		'brand'=>            array('brand', 'бренд'),
		'variant'=>          array('variant', 'вариант'),
		'price'=>            array('price', 'цена'),
		'currency'=>         array('currency', 'валюта'),
		'compare_price'=>    array('compare price', 'старая цена'),
		'sku'=>              array('sku', 'артикул'),
		'stock'=>            array('stock', 'склад', 'на складе'),
		'meta_title'=>       array('meta title', 'заголовок страницы'),
		'meta_keywords'=>    array('meta keywords', 'ключевые слова'),
		'meta_description'=> array('meta description', 'описание страницы'),
		'annotation'=>       array('annotation', 'аннотация', 'краткое описание'),
		'description'=>      array('description', 'описание'),
		'images'=>           array('images', 'изображения')
		);

Затем добавим обработку переменной После обработки переменной цены:

if(isset($item['price']))205
	$variant['price'] = str_replace(',', '.', trim($item['price']));

//Обработка валюты	
if(isset($item['currency']))
	if($item['currency'] == '')
		$variant['currency'] = null;
	else
		$variant['currency'] = trim($item['currency']);

 

4.3. Добавим себе напоминание о столбце в файле /simpla/design/html/import.tpl

<li><label>Цена</label> цена товара</li>
<li><label>Валюта</label> Id валюты товара</li>

Можно еще на последок добавить столбец в файл /simpla/files/import/example.csv

--------------------------------------------------------------------------------------------------------------

 

 


Все, на этом вроде всё. 
Что не учитывал, не учитывал скидки, даже не задумывался, не нужны были, могут быть трудности.
Вторая штука - думаю стоило бы сделать контроль некий за редактированием валют,
например удалить валюту и все товары с несуществующим айди будут отображаться некорректно,
для этого я у себя просто убрал удаление валют))




Такие дела.
Надеюсь пригодится, понравится.
Писал поделиться - оставить инструкцию для себя.

Если захотите поделиться боблейром, буду рад +7 937 204-69-07 Киви.

Ссылка на сообщение
Поделиться на другие сайты
  • Ответов 142
  • Дата создания
  • Последний ответ

Лучшие авторы в теме

Лучшие авторы в теме

Изображения в теме

А везде проверял потом цены? Я нечто подобное делал человеку, но потом со временем, то в связанных товарах, то в печатной форме оплат, то в письме пользователю, то еще где-то вылазили нюансы с ценой и пересчетом. Приходилось корректировать код.

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

А везде проверял потом цены? Я нечто подобное делал человеку, но потом со временем, то в связанных товарах, то в печатной форме оплат, то в письме пользователю, то еще где-то вылазили нюансы с ценой и пересчетом. Приходилось корректировать код.

 

Возможно, но пока везде где я смотрел, формы на почте, заказы, корзина, сами товары, всё нормально. 

Не спорю, могут быть места, которые просто пропустил, но на конкретном сайте, для кого делал,

там этого достаточно-все покрывается.

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

Хорошо сделал и молодец что выложил с подробным описанием. Рекомендую проделать немного по другому в файле api/Variants.php создай функцию для пересчета цен и постоянно обращайся к ней в функциях get_variants, get_variant.

Пример моей реализации:

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

Хорошо сделал и молодец что выложил с подробным описанием. Рекомендую проделать немного по другому в файле api/Variants.php создай функцию для пересчета цен и постоянно обращайся к ней в функциях get_variants, get_variant.

Пример моей реализации:

 

 

...

Круто, мне нравится, думаю как в следующий раз буду применять, доработаю так, спасибо.

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

Разработка похожа на

http://forum.simplacms.ru/topic/6426-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%B2%D0%B8%D0%B4%D0%B0-%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D1%8B/

Там автор лихо взялся, но быстро забросил проект, после того как трезво оценил сложность и масштаб работ.

 

Способ далек от совершенства, многое нерационально. Например:

1. В  3.1 второй параметр функции делается обязательным непонятно зачем. Ведь после такого надо везде в шаблонах менять вызов convert, добавляя второй параметр. А шаблоны у всех разные - мороки-то сколько каждому отдельному пользователю...  Если же ограничиться стандартным шаблоном, то тут не все шаблоны указаны, где надо менять, например, есть важный шаблон cart_informer.tpl

2. Непонятно, для чего придумана функция convert2. Если автор посмотрел бы внимательно на свое детище, то обнаружил бы, что у функции 3 параметра, причем третий параметр $format вообще не используется.  Если же сравнить convert2 со стандартной функцией convert, то легко увидеть, что в стандартной функции это параметр как раз отвечает за форматирование.  Если текущее форматирование чем-то не устраивает, то проще было бы его изменить управлением третьего параметра, или даже стандартными настройками валют.  А так - выходит изобретение велосипеда...

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

Разработка похожа на

http://forum.simplacms.ru/topic/6426-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%B2%D0%B8%D0%B4%D0%B0-%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D1%8B/

Там автор лихо взялся, но быстро забросил проект, после того как трезво оценил сложность и масштаб работ.

 

Способ далек от совершенства, многое нерационально. Например:

1. В  3.1 второй параметр функции делается обязательным непонятно зачем. Ведь после такого надо везде в шаблонах менять вызов convert, добавляя второй параметр. А шаблоны у всех разные - мороки-то сколько каждому отдельному пользователю...  Если же ограничиться стандартным шаблоном, то тут не все шаблоны указаны, где надо менять, например, есть важный шаблон cart_informer.tpl

2. Непонятно, для чего придумана функция convert2. Если автор посмотрел бы внимательно на свое детище, то обнаружил бы, что у функции 3 параметра, причем третий параметр $format вообще не используется.  Если же сравнить convert2 со стандартной функцией convert, то легко увидеть, что в стандартной функции это параметр как раз отвечает за форматирование.  Если текущее форматирование чем-то не устраивает, то проще было бы его изменить управлением третьего параметра, или даже стандартными настройками валют.  А так - выходит изобретение велосипеда...

Привет. Информер карты работает от суммы по карте, которая считается в api/cart.php

И да, я не вот лучший разработчик. Про конверты согласен. 

Чуть выше человек предложил вообще куда более эффективный метод.

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

Заказывал подобный функционал у Корса, только еще и с установкой наценки (в %) на закупочную цену, больше месяца назад

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

Заказывал подобный функционал у Корса, только еще и с установкой наценки (в %) на закупочную цену, больше месяца назад

Ну и чего? Чот я не особо понял к чему это сказано было.

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

Ребята, были внесены некоторые правки в нынешнюю версию и добавлен импорт и экспорт.
Глядеть в теле первого сообщения.

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

Ребята, вот для тех, кто не успел использовать первое решение - новое, навеянное товарищем cernos.
Более эффективное, ближе так сказать к источнику. Извиняюсь, если код не самый оптимальный.


Для тех, кто не знает - нужно сделать, чтобы каждый товар мог быть введен в любой валюте,

чтобы менять только курс. Повторю, что поставки из разных источников и 1 валюта
для магазина становится не вариантом, товары будут вводиться в разных валютах.
 


1. Добавим в таблицу с вариантами товаров соответствующее поле.

Таблица `s_variants` - новая колонка валюты - currency

ALTER TABLE `s_variants` ADD `currency` TEXT

 

 

2. Так как мы хотим сделать выбор валюты нужно вывести варианты. Я сделал вывод вариантов выпадающим списком в админке товара. Для этого в первую очередь нужно вызвать список валют

в соответствующий шаблон админки.
Новое - пересчитанная цена добавляется иным образом и отмечается в админке тоже.


 

2.1. Основа всех действий теперь лежит в /api/Variants.php

2.1.1. Сначала получим данные добавив v.currency as currency в оба запроса get_variants 

$query = $this->db->placehold("SELECT v.id, v.product_id , v.price, NULLIF(v.compare_price, 0) as compare_price, v.sku, IFNULL(v.stock, ?) as stock, (v.stock IS NULL) as infinity, v.currency as currency, v.name, v.attachment, v.position
			FROM __variants AS v
			WHERE 
			1
			$product_id_filter          
			$variant_id_filter   
			ORDER BY v.position       
			", $this->settings->max_order_amount);

и get_variant

$query = $this->db->placehold("SELECT v.id, v.product_id , v.price, NULLIF(v.compare_price, 0) as compare_price, v.sku, IFNULL(v.stock, ?) as stock, (v.stock IS NULL) as infinity, v.currency as currency, v.name, v.attachment
					FROM __variants v WHERE id=?
					LIMIT 1", $this->settings->max_order_amount, $id);

 

2.1.2. Ниже функции get_variant добавим две функции для пересчета цен одна для массива вариантов другая для варианта: 

public function re_currency($vars) 
	{
		$curs = $this->money->get_currencies();
		if ($curs && $vars)
			foreach ($vars as $v) 
				if ($v->currency) {
					// Умножим на курс валюты
					$v->base_price = $v->price;
					$v->price = $v->price*$curs[$v->currency]->rate_to/$curs[$v->currency]->rate_from;
				}
		return $vars;
	}

public function re_currency_small($var) 
	{
		$curs = $this->money->get_currencies();
		if ($curs && $var->currency)
		{
			// Умножим на курс валюты
			$var->base_price = $var->price;
			$var->price = $var->price*$curs[$var->currency]->rate_to/$curs[$var->currency]->rate_from;
		}
		return $var;
	}

Вернемся и применим их,

в функции get_variants было:

$this->db->query($query);	
return $this->db->results();

стало в get_variants:

$this->db->query($query);	
$re_variants = $this->db->results();
$this->re_currency($re_variants);
return $re_variants;

в функции get_variant было:

$this->db->query($query);	
$variant = $this->db->result();
return $variant;

стало в get_variant:

$this->db->query($query);	
$variant = $this->db->result();
$this->re_currency_small($variant);
return $variant;

Это по сути дало нам функционал запроса нужных переменных и пересчета их сразу.
Цена заменяется пересчитанной от валюты ценой.
Базовая циферная цена запоминается в новой переменной $var->base_price;

 

2.2. В файлах /simpla/ProductAdmin.php и /simpla/ProductsAdmin.php добавим:

// Все валюты
$currencies = $this->money->get_currencies();
$this->design->assign('currencies', $currencies); 

Это даст нам доступ к массиву $currencies в шаблонах редактирования 1 товара и списка товаров.
В массиве располагаются все валюты магазина по их id.

2.3.1. В файле /simpla/design/html/product.tpl добавим новый столбец к варианту товара
в div id="variants_block" > ul id="header" добавим:

<ul id="header">
	<li class="variant_move"></li>
	<li class="variant_name">Название варианта</li>	
	<li class="variant_sku">Артикул</li>	
	<li class="variant_price">Цена в валюте</li>	
	<li class="variant_discount">Старая</li>	
	<li class="variant_currency">Валюта</li>
	<li class="variant_main_currency">В {$currency->sign}</li>
	<li class="variant_amount">Кол-во</li>
</ul>

Ниже, уже в списке вариантов div id="variants" > ul вносим изменения - в input цены выводим base_price,

это важно, чтобы не перезаписать цену для пересчета - пересчитанной, ну и соответственно добавим выпадающий список и для наглядности расчетную цену: 

<li class="variant_price">     <input name="variants[price][]"         type="text"   value="{if $variant->base_price}{$variant->base_price|escape}{else}{$variant->price|escape}{/if}" /></li>
<li class="variant_discount">  <input name="variants[compare_price][]" type="text"   value="{$variant->compare_price|escape}" /></li>
<li class="variant_currency">
	<select type="text" name="variants[currency][]">
		{foreach $currencies as $c}
			<option
			{if $variant->currency}
				{if $variant->currency == $c->id}
					selected
				{/if}
			{else}
				{if $currency->id == $c->id}
					selected
				{/if}
			{/if} value="{$c->id}">{$c->code} ({if $c->code != "RUR"}{$c->rate_to}{else}1{/if})</option>
		{/foreach}
	</select>
</li>
<li class="variant_main_currency like_input">{$variant->price|escape}</li>

Добавим стили в /simpla/design/css/style.css:

.variant_currency {
    width: 125px;
}
.variant_currency > select {
    padding: 4px;
    height: 27px;
}
li.variant_main_currency {
    width: 72px;
    text-align: left;
    margin-right: 30px;
}
li.variant_main_currency.like_input {
    margin-top: 0px;
    border: 1px solid gray;
    padding: 5px;
    height: 15px !important;
    background: rgb(214, 214, 214);
}

 

2.3.2. В файле /simpla/design/html/products.tpl переделаем ввод цены на ввод базовой цены,

и сделаем окошко выбора валюты:

{foreach $product->variants as $variant}
<li {if !$variant@first}class="variant" style="display:none;"{/if}>

	<i title="{$variant->name|escape}">{$variant->name|escape|truncate:30:'…':true:true}</i>
	
	<input class="price {if $variant->compare_price>0}compare_price{/if}" type="text" 
	name="price[{$variant->id}]" value="{if $variant->base_price}{$variant->base_price}{else}{$variant->price}{/if}" {if $variant->compare_price>0}title="Старая цена — {$variant->compare_price} {$currency->sign}"{/if} />
	
	<select class="products_currency" type="text" name="v_currency[{$variant->id}]">
		{foreach $currencies as $c}
			<option
			{if $variant->currency}
				{if $variant->currency == $c->id}
					selected
				{/if}
			{else}
				{if $currency->id == $c->id}
					selected
				{/if}
			{/if} value="{$c->id}">{$c->code} ({if $c->code != "RUR"}{$c->rate_to}{else}1{/if})</option>
		{/foreach}
	</select>
	<br/>
	
	<span class="old_price">
		{if $variant->base_price && $variant->base_price != $variant->price}
			{$variant->price}
			{$currency->sign}  
		{/if}
	</span>
	
	<input class="stock" type="text" name="stock[{$variant->id}]" value="{if $variant->infinity}?{else}{$variant->stock}{/if}" /><span class="v_unit">{$settings->units}</span>
	
</li>
{/foreach}

В файле /simpla/ProductsAdmin.php добавим код, чтобы брал данные из продуктсов:

// Сохранение цен и наличия
$prices = $this->request->post('price');
$stocks = $this->request->post('stock');
$v_currencies = $this->request->post('v_currency');

foreach($prices as $id=>$price)
{
	$stock = $stocks[$id];
	$v_currency = $v_currencies[$id];
	if($stock == '?' || $stock == '')
		$stock = null;
		
	$this->variants->update_variant($id, array('price'=>$price, 'stock'=>$stock, 'currency'=>$v_currency));
}

И добавим стили в /simpla/design/css/style.css:

span.old_price {
    float: left;
    width: 84px;
    margin-top: 4px;
}
#list .variants ul .stock {
    float: left;
    margin-left: 6px;
}
select.products_currency {
    height: 22px;
    padding: 2px;
    margin-bottom: 5px;
}
span.v_unit {
    float: left;
    margin-top: 3px;
}

2.3.3. Изменение валюты в /simpla/design/html/products.tpl сразу у всех отмеченных галочкой товаров

Добавим новый пункт в выборе действий с выделенными товарами, новый класс этому селекту

для упрощения навигации скрипта и общую выпадалку для изменения валюты:

<select class="action_sel" name="action">
	<option value="enable">Сделать видимыми</option>
	<option value="disable">Сделать невидимыми</option>
	<option value="set_featured">Сделать рекомендуемым</option>
	<option value="unset_featured">Отменить рекомендуемый</option>
	<option value="duplicate">Создать дубликат</option>
	{if $pages_count>1}
	<option value="move_to_page">Переместить на страницу</option>
	{/if}
	{if $categories|count>1}
	<option value="move_to_category">Переместить в категорию</option>
	{/if}
	{if $brands|count>0}
	<option value="move_to_brand">Указать бренд</option>
	{/if}
	<option value="delete">Удалить</option>
	<option value="change_currency">Изменить валюту</option>
</select>

<select disabled class="currencies_sel" name="currencies" style="display: none;">
	<option disabled selected value="0">Не менять</option>
	{foreach $currencies as $c}
		<option value="{$c->id}">{$c->code} ({if $c->code != "RUR"}{$c->rate_to}{else}1{/if})</option>
	{/foreach}
</select>

Добавьте внизу файла, в скрипт под выполнение после загрузки страницы:

$('select.action_sel').change(function (){
if ($("option:selected", this).val() == "change_currency")
	{
		$("select.currencies_sel").fadeIn();
		$("select.currencies_sel").prop( "disabled", false );
	}
else 
	{
		$("select.currencies_sel").fadeOut();
		$("select.currencies_sel").prop( "disabled", true );
	}
});

$('select.currencies_sel').change(function () {
if ($("option:selected", this).val() != "0")
{
	var sel_opt = ( "'" + $("option:selected", this).val() + "'" ) ;
	$( '.row' ).each(function() {
		if ($(this).find('input[type="checkbox"]').prop("checked"))
		{
			var row_sel = $(this).find('select.products_currency');
			$("option[value=" + sel_opt + "]", row_sel).prop("selected", true);
		}
	});
}
});

 

 

 

3. Импорт - Экспорт

Осталась небольшая часть, как сделать импорт и экспорт сия чуда.
Очень просто.

 

3.1. Правим /simpla/ajax/export.php - добавляем новую колонку для экспорта в

объявлении массива $columns_names:

private $columns_names = array(
			'category'=>         'Категория',
			'name'=>             'Товар',
			'price'=>            'Цена',
			'currency'=>         'Валюта',
			'url'=>              'Адрес',
			'visible'=>          'Видим',
			'featured'=>         'Рекомендуемый',
			'brand'=>            'Бренд',
			'variant'=>          'Вариант',
			'compare_price'=>    'Старая цена',
			'sku'=>              'Артикул',
			'stock'=>            'Склад',
			'meta_title'=>       'Заголовок страницы',
			'meta_keywords'=>    'Ключевые слова',
			'meta_description'=> 'Описание страницы',
			'annotation'=>       'Аннотация',
			'body'=>             'Описание',
			'images'=>           'Изображения'
			);

Ниже добавляем аналогично данные в соответствующую переменную, обратите внимание на цену:

foreach($variants as $variant)
{
	if(isset($products[$variant->product_id]))
	{
		$v                    = array();
		$v['variant']         = $variant->name;
		if $variant->base_price {
			$v['price']       = $variant->base_price;
			}
		else {
			$v['price']       = $variant->price;
		}	
		$v['currency']        = $variant->currency;
		$v['compare_price']   = $variant->compare_price;
		$v['sku']             = $variant->sku;
		$v['stock']           = $variant->stock;
		if($variant->infinity)
			$v['stock']           = '';
		$products[$variant->product_id]['variants'][] = $v;
	}
}

             

 

3.2. Правим /simpla/ajax/import.php - колонки:

// Соответствие полей в базе и имён колонок в файле
private $columns_names = array(
		'name'=>             array('product', 'name', 'товар', 'название', 'наименование'),
		'url'=>              array('url', 'адрес'),
		'visible'=>          array('visible', 'published', 'видим'),
		'featured'=>         array('featured', 'hit', 'хит', 'рекомендуемый'),
		'category'=>         array('category', 'категория'),
		'brand'=>            array('brand', 'бренд'),
		'variant'=>          array('variant', 'вариант'),
		'price'=>            array('price', 'цена'),
		'currency'=>         array('currency', 'валюта'),
		'compare_price'=>    array('compare price', 'старая цена'),
		'sku'=>              array('sku', 'артикул'),
		'stock'=>            array('stock', 'склад', 'на складе'),
		'meta_title'=>       array('meta title', 'заголовок страницы'),
		'meta_keywords'=>    array('meta keywords', 'ключевые слова'),
		'meta_description'=> array('meta description', 'описание страницы'),
		'annotation'=>       array('annotation', 'аннотация', 'краткое описание'),
		'description'=>      array('description', 'описание'),
		'images'=>           array('images', 'изображения')
		);

И как обрабатывается переменная:

if(isset($item['price']))
	$variant['price'] = str_replace(',', '.', trim($item['price']));
	
if(isset($item['currency']))
	if($item['currency'] == '')
		$variant['currency'] = null;
	else
		$variant['currency'] = trim($item['currency']);

Можно еще на последок добавить столбец в файл /simpla/files/import/example.csv

--------- ?--------- ?--------- ?--------- ?--------- ?--------- ?--------- ?--------- ?--------- ?--------- ?---------

 

Всё, всё должно работать. За идею переделки спасибо cernos

Долго писал, если чего пропустил, потом поправлю.

 

Если захотите поделиться боблейром, буду рад +7 937 204-69-07 Киви.

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

Здравствуйте, у меня из-за этого куска кода пустой экран, удаляю все работает

<li class="variant_main_currency like_input">{$variant->price|escape}</li>
 
							{if $variant->currency == $c->id}
								selected
							{/if}
						{else}
							{if $currency->id == $c->id}
								selected
							{/if}
						{/if} value="{$c->id}">{$c->code} ({if $c->code != "RUR"}{$c->rate_to}{else}1{/if})</option>
					{/foreach}
				</select>
			</li>
Ссылка на сообщение
Поделиться на другие сайты

Привет, я там чот криво скопировал, исправил, поглядите еще раз.

 

<li class="variant_price">     <input name="variants[price][]"         type="text"   value="{if $variant->base_price}{$variant->base_price|escape}{else}{$variant->price|escape}{/if}" /></li>
<li class="variant_discount">  <input name="variants[compare_price][]" type="text"   value="{$variant->compare_price|escape}" /></li>
<li class="variant_currency">
	<select type="text" name="variants[currency][]">
		{foreach $currencies as $c}
			<option
			{if $variant->currency}
				{if $variant->currency == $c->id}
					selected
				{/if}
			{else}
				{if $currency->id == $c->id}
					selected
				{/if}
			{/if} value="{$c->id}">{$c->code} ({if $c->code != "RUR"}{$c->rate_to}{else}1{/if})</option>
		{/foreach}
	</select>
</li>
<li class="variant_main_currency like_input">{$variant->price|escape}</li>
Ссылка на сообщение
Поделиться на другие сайты

Мне кажется, что если в админке изменить основную валюту, то цены сильно перепутаются. Кто-то пробовал?

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

Мне кажется, что если в админке изменить основную валюту, то цены сильно перепутаются. Кто-то пробовал?

Да, следить за перетрубациями айди валют нужно ручками. Они не изменят айди в вариантах. 

И еще их лучше не удалять валюты.

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

Неплохо бы добавить групповое изменение валюты отмеченных товаров. Так же не удобно, что старую цену нужно в валюте сайта указывать, а не в валюте варианта. У меня нечто похожее, но более топорно было реализовано, изменил на Ваше решение, теперь 350 товаров со скидкой нужно вручную менять старую цену на основную валюту.

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

Неплохо бы добавить групповое изменение валюты отмеченных товаров.

Так же не удобно, что старую цену нужно в валюте сайта указывать, а не в валюте варианта.

Готово.

 

 

 2.3.3. Изменение валюты в /simpla/design/html/products.tpl сразу у всех отмеченных галочкой товаров

Добавьте внизу файла, в скрипт под выполнение после загрузки страницы:

тут было криво, решение дальше...

 

Добавлено в инструкцию.

Меняете у одного отмеченного галочкой - меняются все.

Я не подумал сделать отдельное окошко, если что я думаю сами справитесь.

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

В селект выбора действий еще нужно внести - Изменить валюту на      И добавить селект с валютой.

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

Простите. Вы реализовали по другому. Выбором в одном из товаров.

Сразу не заметил.

Со старой ценой будете что-то делать или так и оставите?

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

Простите. Вы реализовали по другому. Выбором в одном из товаров.

Сразу не заметил.

Со старой ценой будете что-то делать или так и оставите?

Балин, точно, он применит и другие действия из того селекта при сохранении, плохо.

Допилим.

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

Простите. Вы реализовали по другому. Выбором в одном из товаров.

Сразу не заметил.

Со старой ценой будете что-то делать или так и оставите?

 

2.3.3. Изменение валюты в /simpla/design/html/products.tpl сразу у всех отмеченных галочкой товаров

Добавим новый пункт в выборе действий с выделенными товарами, новый класс этому селекту

для упрощения навигации скрипта и общую выпадалку для изменения валюты:

<span id="select">
<select class="action_sel" name="action">
	<option value="enable">Сделать видимыми</option>
	<option value="disable">Сделать невидимыми</option>
	<option value="set_featured">Сделать рекомендуемым</option>
	<option value="unset_featured">Отменить рекомендуемый</option>
	<option value="duplicate">Создать дубликат</option>
	{if $pages_count>1}
	<option value="move_to_page">Переместить на страницу</option>
	{/if}
	{if $categories|count>1}
	<option value="move_to_category">Переместить в категорию</option>
	{/if}
	{if $brands|count>0}
	<option value="move_to_brand">Указать бренд</option>
	{/if}
	<option value="delete">Удалить</option>
	<option value="change_currency">Изменить валюту</option>
</select>

<select disabled class="currencies_sel" name="currencies" style="display: none;">
	<option disabled selected value="0">Не менять</option>
	{foreach $currencies as $c}
		<option value="{$c->id}">{$c->code} ({if $c->code != "RUR"}{$c->rate_to}{else}1{/if})</option>
	{/foreach}
</select>

Добавьте внизу файла, в скрипт под выполнение после загрузки страницы:

$('select.action_sel').change(function (){
if ($("option:selected", this).val() == "change_currency")
	{
		$("select.currencies_sel").fadeIn();
		$("select.currencies_sel").prop( "disabled", false );
	}
else 
	{
		$("select.currencies_sel").fadeOut();
		$("select.currencies_sel").prop( "disabled", true );
	}
});

$('select.currencies_sel').change(function () {
if ($("option:selected", this).val() != "0")
{
	var sel_opt = ( "'" + $("option:selected", this).val() + "'" ) ;
	$( '.row' ).each(function() {
		if ($(this).find('input[type="checkbox"]').prop("checked"))
		{
			var row_sel = $(this).find('select.products_currency');
			$("option[value=" + sel_opt + "]", row_sel).prop("selected", true);
		}
	});
}
});

 

 

Вот, готово.

 

Не понял вопроса со старой ценой, какой старой ценой? Цена в базе хранится одна.

Думаю этого достаточно, если еще наворотить чего - опять все усложнится.

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

compare которая. Если скидку товару делать, указываем старую цену. Вот ее в валюте не указать сейчас. Нужно пересчитывать в валюту сайта.

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

И еще, проверьте у себя, может это я что-то набокопорил, но перестал работать поиск в админке, после внесения этих изменений. Работает ли у Вас.

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

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

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

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

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

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

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

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

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

Загрузка...

×
×
  • Создать...