Перейти к содержимому


Фото
* * * * * 4 голосов

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

Дополнение Мод Валюта Невероятно круто Бесплатно

Best Answer ExtraBash , 25.05.2016 - 22:04

https://drive.google...TzQ&usp=sharing

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

Можете пользоваться, условная лицензия - 500р, если вам нужно чтобы я поставил 1000р.
Кому сильно нужно пользуйтесь, как сами облегчите себе жизнь и заработаете на магазине - скинете бабуль.

Скайп - abashyrov
Телефон и киви +79372046907
Сбер на том-же телефоне)

Всем спасибо за интерес.


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

Перейти к посту


  • Чтобы отвечать, сперва войдите на форум
141 ответов в теме

#1 ExtraBash

ExtraBash
  • Пользователь
  • 109 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Самара

Опубликовано 03.11.2014 - 20:38

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

Возникла тут новая задача, суть в том, что поставки магазина ведутся из разных источников,
некоторые в рублях некоторые в евро, некоторые в долларах.
В нашей стабильной стране пришлось бы менять такие цены хоть каждый день.
Неудобно, особенно учитывая, что в каталоге более 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. Так как мы хотим сделать выбор валюты нужно вывести варианты. Я сделал вывод вариантов выпадающим списком в админке товара. Для этого в первую очередь нужно вызвать список валют

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

 

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="Старая цена &mdash; {$variant->compare_price} {$currency->sign}"{/if} />{$currency->sign}

Новый: 

{if $variant->compare_price>0}title="Старая цена &mdash; {$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}&nbsp;{$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 Киви.



#2 koteyka

koteyka

    Фрилансер

  • Пользователь
  • 1 172 сообщений
  • Программирование
  • Версия CMS:2.x
  • Откуда:Днепропетровск

Опубликовано 03.11.2014 - 20:50

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



#3 ExtraBash

ExtraBash
  • Пользователь
  • 109 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Самара

Опубликовано 03.11.2014 - 20:56

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


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



#4 cernos

cernos
  • Фрилансер
  • 357 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Донецк

Опубликовано 03.11.2014 - 21:05

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

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

14ea5c14bb59.jpg

3796a70c5190.jpg


#5 ExtraBash

ExtraBash
  • Пользователь
  • 109 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Самара

Опубликовано 03.11.2014 - 22:12

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

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

 

 

...

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



#6 Kors

Kors
  • Фрилансер
  • 3 012 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 04.11.2014 - 09:24

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

http://forum.simplac...ка-вида-валюты/

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

 

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

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

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



#7 ExtraBash

ExtraBash
  • Пользователь
  • 109 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Самара

Опубликовано 04.11.2014 - 11:44

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

http://forum.simplac...ка-вида-валюты/

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

 

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

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

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

Привет. Информер карты работает от суммы по карте, которая считается в api/cart.php
И да, я не вот лучший разработчик. Про конверты согласен. 
Чуть выше человек предложил вообще куда более эффективный метод.



#8 drakulitkas

drakulitkas
  • Пользователь
  • 212 сообщений
  • Дизайн, Верстка
  • Версия CMS:2.x

Опубликовано 04.11.2014 - 17:56

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



#9 ExtraBash

ExtraBash
  • Пользователь
  • 109 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Самара

Опубликовано 04.11.2014 - 18:12

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

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



#10 ExtraBash

ExtraBash
  • Пользователь
  • 109 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Самара

Опубликовано 07.11.2014 - 11:34

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



#11 ExtraBash

ExtraBash
  • Пользователь
  • 109 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Самара

Опубликовано 07.11.2014 - 16:18

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


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

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


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

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

ALTER TABLE `s_variants` ADD `currency` TEXT

 

 

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

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

BLmGvvqfeZRYrl.jpg


 

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 переделаем ввод цены на ввод базовой цены,

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

b8eb881a35.jpg

{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="Старая цена &mdash; {$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 Киви.



#12 koteyka

koteyka

    Фрилансер

  • Пользователь
  • 1 172 сообщений
  • Программирование
  • Версия CMS:2.x
  • Откуда:Днепропетровск

Опубликовано 07.11.2014 - 16:25

Супер. Дай Бог Вам здоровья и процветания.



#13 yodaexolon

yodaexolon
  • Пользователь
  • 144 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:Kharkiv, Ukraine

Опубликовано 07.11.2014 - 20:10

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

<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>


#14 ExtraBash

ExtraBash
  • Пользователь
  • 109 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Самара

Опубликовано 07.11.2014 - 21:23

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

 

<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>


#15 yodaexolon

yodaexolon
  • Пользователь
  • 144 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:Kharkiv, Ukraine

Опубликовано 07.11.2014 - 21:25

То же и я сделал )

СПАСИБО ЗА ДОРАБОТКУ !!!



#16 Kors

Kors
  • Фрилансер
  • 3 012 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 08.11.2014 - 08:10

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



#17 ExtraBash

ExtraBash
  • Пользователь
  • 109 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Самара

Опубликовано 08.11.2014 - 11:07

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

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



#18 koteyka

koteyka

    Фрилансер

  • Пользователь
  • 1 172 сообщений
  • Программирование
  • Версия CMS:2.x
  • Откуда:Днепропетровск

Опубликовано 08.11.2014 - 21:53

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



#19 ExtraBash

ExtraBash
  • Пользователь
  • 109 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Самара

Опубликовано 08.11.2014 - 23:13

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

Готово.

 


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

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

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

 

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

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



#20 koteyka

koteyka

    Фрилансер

  • Пользователь
  • 1 172 сообщений
  • Программирование
  • Версия CMS:2.x
  • Откуда:Днепропетровск

Опубликовано 08.11.2014 - 23:24

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







Также с меткой «Дополнение, Мод, Валюта, Невероятно круто, Бесплатно»

0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых