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


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

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

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

Best Answer ExtraBash , 25.05.2016 - 23:04

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

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

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

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

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


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

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


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

#21 koteyka

koteyka

    Фрилансер

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

Опубликовано 09.11.2014 - 00:25

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

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

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



#22 ExtraBash

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

Опубликовано 09.11.2014 - 00:39

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

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

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

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



#23 ExtraBash

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

Опубликовано 09.11.2014 - 01:08

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

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

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

 

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);
		}
	});
}
});

 

 

Вот, готово.

Не понял вопроса со старой ценой, какой старой ценой? Цена в базе хранится одна.
Думаю этого достаточно, если еще наворотить чего - опять все усложнится.



#24 koteyka

koteyka

    Фрилансер

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

Опубликовано 09.11.2014 - 01:35

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



#25 koteyka

koteyka

    Фрилансер

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

Опубликовано 09.11.2014 - 01:37

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



#26 ExtraBash

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

Опубликовано 09.11.2014 - 01:40

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

С компейр завтра подумаю, поиск работает.



#27 Kors

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

Опубликовано 09.11.2014 - 08:41

Мне кажется, есть еще несколько мест, где рассматриваемая доработка даст неверные результаты:

1. Если на сайте установлен какой-то фильтр с участием цены (на форуме есть несколько разных доработок), то фильтр по цене будет работать неправильно.

2. Сортировка по цене на странице товаров.

3. Вывод в Яндекс маркет.

 

Кто-то проверял эти места?



#28 koteyka

koteyka

    Фрилансер

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

Опубликовано 09.11.2014 - 11:43

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

Сортировка нормально идет.



#29 Kors

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

Опубликовано 09.11.2014 - 13:40

Думаю, на стандартный фильтр цены доработка не повлияет.

 

Конечно, не влияет, если в стандартном фильтре цены не задействованы.

 

Сортировка нормально идет.

 

В стандартной сортировке по цене в api/Products формируется в запросе
order by (SELECT -pv.price FROM __variants ...) DESC

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



#30 koteyka

koteyka

    Фрилансер

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

Опубликовано 09.11.2014 - 14:02

Если у Вас нормально, то Вас можно поздравить.

А обычно в такой ситуации у Вас сортируется НЕ нормально, например, порядок

Да, действительно. Просто, как я писал выше, у меня уже было сделано нечто подобное, только более топорный вариант, поэтому у меня с сортировкой всё нормально.



#31 ExtraBash

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

Опубликовано 09.11.2014 - 16:24

Да, действительно. Просто, как я писал выше, у меня уже было сделано нечто подобное, только более топорный вариант, поэтому у меня с сортировкой всё нормально.

Я все придумал, вечером напишу.
Тот кто не приступил к реализации, не приступайте.

Нужно хранить в базе 4 цены, вот и вся проблема, в основных переменных будут хранится расчетные цены.

В других, новых - реальные. Вот и всё. 
 



#32 ExtraBash

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

Опубликовано 10.11.2014 - 02:41

Ребята, готово, работает, пока не все места допилил, завтра Доделаю и будет инструкция.



#33 koteyka

koteyka

    Фрилансер

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

Опубликовано 10.11.2014 - 10:22

ЖДЕМ :) Старое нужно будет убирать или там просто дописать придется?



#34 ExtraBash

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

Опубликовано 10.11.2014 - 13:18

ЖДЕМ :) Старое нужно будет убирать или там просто дописать придется?

Придется многое переделать.



#35 ExtraBash

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

Опубликовано 11.11.2014 - 01:51

Итак вот оно, ребята, новое решение. Третье, обратите внимание!

 

Нашли несколько несовершенств, связанных с использованием сортировок и иных местах,
где товар должен учитываться в новой валюте, а все еще спрашивается с базы напрямую в старой.
На ум пришло новое очень простое решение - хранить в переменной цены именно пересчитанную, 
а в админке вводить валютную.
 
----------------------------------------------------------------------------------------------------
Если кому нужна установка, тк. несколько человек уже обращались,
пишите в скайп - abashyrov, цена ориентировочно - 1000р.
Или могу вам дать доступ на готовые файлы от версии 2.3.6. - 500р.
Или делаете по инструкции, должно все получиться - Бесплатно.
----------------------------------------------------------------------------------------------------
 
Для тех, кто не знает - нужно сделать, чтобы каждый товар мог быть введен в любой валюте,
чтобы менять только курс. Повторю, что поставки из разных источников и 1 валюта
для магазина становится не вариантом, товары будут вводиться в разных валютах.
 
Поехали:
 
1. Добавим в таблицу с вариантами товаров соответствующее поле.
Таблица `s_variants` - новая колонка валюты - `currency`,
а так-же две новые колонки для хранения исходной величины цены без пересчета в валюту.
ALTER TABLE  `s_variants` ADD `currency` TEXT, 
ADD `base_compare_price` FLOAT( 14, 2 ) AFTER  `compare_price`,
ADD  `base_price` FLOAT( 14, 2 ) AFTER  `price`

 

 

2. Так как мы хотим сделать выбор валюты нужно вывести варианты. Я сделал вывод вариантов выпадающим списком в админках товара и товаров. Для этого в первую очередь нужно вызвать список валют в соответствующие шаблоны админки.
Новое - добавил пересчитанную скидочную цену, все цены - реальные input, которые запишутся в базу,
переложил пересчет цены при изменении валюты в jquery, не только при перезагрузке изменится сумма.
Продукт:
Ra2Xvvaf1kjBrg.jpg
Продукты:
jnAyRRLhYdqErZ.jpg
 
 
2.1. В файле /api/Variants.php поправим запросы в базу:
get_variants
$query = $this->db->placehold("SELECT v.id, v.product_id , v.price, v.base_price as base_price, NULLIF(v.compare_price, 0) as compare_price, NULLIF(v.base_compare_price, 0) as base_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, v.base_price as base_price, NULLIF(v.compare_price, 0) as compare_price, NULLIF(v.base_compare_price, 0) as base_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. Правка шаблона админки одного товара

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_main_currency">Старая В {$currency->sign}</li>
	<li class="variant_amount">Кол-во</li>
</ul>

Затем новая часть для конкретного варианта:

<li class="variant_price"><input name="variants[base_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[base_compare_price][]" type="text"   value="{if $variant->base_compare_price}{$variant->base_compare_price|escape}{else}{$variant->compare_price|escape}{/if}" /></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} mnozhitel="{$c->rate_to/$c->rate_from}" value="{$c->id}">{$c->code}  ({$c->rate_to/$c->rate_from})</option>
		{/foreach}
	</select>
</li>
<li class="variant_main_currency"><div class="op_cover"></div><input name="variants[price][]" type="text"   value="{if $variant->currency}{if $variant->base_price}{$variant->base_price*$currencies[$variant->currency]->rate_to/$currencies[$variant->currency]->rate_from|escape}{else}{$variant->price*$currencies[$variant->currency]->rate_to/$currencies[$variant->currency]->rate_from|escape}{/if}{else}{$variant->price}{/if}" /></li>
<li class="variant_main_currency_discount"><div class="op_cover"></div><input name="variants[compare_price][]" type="text"   value="{if $variant->currency}{if $variant->base_compare_price}{$variant->base_compare_price*$currencies[$variant->currency]->rate_to/$currencies[$variant->currency]->rate_from|escape}{else}{$variant->compare_price*$currencies[$variant->currency]->rate_to/$currencies[$variant->currency]->rate_from|escape}{/if}{else}{$variant->compare_price}{/if}" /></li>

 

2.3.2. В том-же файле добавим jquery код - наверху страницы, часть кода, 
отвечающая за события вниз функции после загрузки, функцию отдельно к функциям:
//Пересчет цен товара и скидочных цен
$('.variant_currency > select').change(function(){
	recount_Price( this );
});
$('.variant_price > input, .variant_discount > input').focusout(function(){
	recount_Price($(this).parents('ul').find('.variant_currency > select'));
});

Чуть ниже, после закрытия функции, где лежат остальные функции:

//Пересчет цен товара и скидочных цен
function recount_Price(selected_curr){
    var mnozhitel = $("option:selected", selected_curr).attr('mnozhitel');
    var ul = $(selected_curr).parents('ul');
    var Counted_price = 
    parseFloat($(ul).find('.variant_price > input').val()) * parseFloat(mnozhitel);
    $(ul).find('.variant_main_currency > input').val(Counted_price);
    Counted_price = parseFloat($(ul).find('.variant_discount > input').val()) * parseFloat(mnozhitel);
    $(ul).find('.variant_main_currency_discount > input').val(Counted_price);
};

 

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

.variant_currency {
width: 111px;
}
.variant_currency > select {
padding: 4px;
height: 27px;
}
li.variant_main_currency, .variant_main_currency_discount {
width: 93px;
text-align: left;
margin-right: 19px;
}
li.variant_main_currency input, .variant_main_currency_discount input {
    width: 87px;
    background-color: rgb(223, 223, 223);
    border: 2px solid lightgrey;
}
.op_cover {
    position: absolute;
    width: 93px;
    height: 27px;
}
#variants_block li.variant_download {
    width: 50px;
}

 

 

2.4. Добавим аналогичный функционал в шаблон для нескольких товаров
2.4.1. Правим /simpla/design/html/products.tpl - внутри div.variants mtyztv гд на новый,
тут выводятся валюты, два окошка input, всё красиво, все дела
<ul>
{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="base_price[{$variant->id}]" 
	value="{if $variant->base_price}{$variant->base_price}{else}{$variant->price}{/if}" 
	{if $variant->base_compare_price>0}title="Старая цена &mdash; {$variant->base_compare_price} {$currency->sign}"{elseif $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}  mnozhitel="{$c->rate_to/$c->rate_from}" value="{$c->id}">{$c->code}  ({$c->rate_to/$c->rate_from})</option>
		{/foreach}
	</select>
	<br/>
	
        <div class="old_wrap">
	<div class="old_price">
	<div class="op_cover"
	{if $variant->compare_price>0}title="Старая цена &mdash; {$variant->compare_price} {$currency->sign}"{elseif $variant->base_compare_price>0}title="Старая цена &mdash; {$variant->base_compare_price} {$currency->sign}"{/if}></div>
	<input  
	type="text" 
	name="price[{$variant->id}]" 
	value="{if $variant->currency}{if $variant->base_price}{$variant->base_price*$currencies[$variant->currency]->rate_to/$currencies[$variant->currency]->rate_from|escape}{else}{$variant->price*$currencies[$variant->currency]->rate_to/$currencies[$variant->currency]->rate_from|escape}{/if}{else}{$variant->price}{/if}"/>	
	</div>
	
	<input class="stock" type="text" name="stock[{$variant->id}]" value="{if $variant->infinity}?{else}{$variant->stock}{/if}" /><span class="v_unit">{$settings->units}</span>
        </div>
</li>
{/foreach}
</ul>

Внутри div#action добавим новый пункт для массового изменения валюты

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

 

2.4.2. В том-же файле /simpla/design/html/products.tpl добавим нужные скрипты внизу:

// Работа с валютами
	$('input.price').focusout(function() {
		recount_Price( $(this).parents('li').find('select.products_currency'));
	});
	
	$('select.products_currency').change(function() {
		recount_Price(this);
	});

	function recount_Price(selected_curr){
		var mnozhitel = $("option:selected", selected_curr).attr('mnozhitel');
		var base_price = $(selected_curr).parents('li').find('input.price').val();
		var price_container = $(selected_curr).parents('li').find('.old_price > input');
		var Counted_price = parseFloat(base_price) * parseFloat(mnozhitel);
		price_container.val(Counted_price);
	};
	
	$('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"))
			{
				$(this).find('li').each(function() {
				    var row_sel = $(this).find('select.products_currency');
					$("option[value=" + sel_opt + "]", row_sel).prop("selected", true);
					row_sel.change();
				});
			}
		});
	}
	});

 

2.4.3. Правим обработку переменных в /simpla/ProductsAdmin.php

// Сохранение цен и наличия
			$prices = $this->request->post('price');
			$base_prices = $this->request->post('base_price');
			$stocks = $this->request->post('stock');
			$v_currencies = $this->request->post('v_currency');
		
			foreach($prices as $id=>$price)
			{
				$base_price = $base_prices[$id];
				$stock = $stocks[$id];
				$v_currency = $v_currencies[$id];
				if($stock == '?' || $stock == '')
					$stock = null;
					
				$this->variants->update_variant($id, array('price'=>$price, 'base_price'=>$base_price,'stock'=>$stock, 'currency'=>$v_currency));
			}

 

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

.old_price > input {
    float: left;
    width: 80px;
    text-align: right;
    background-color: rgb(223, 223, 223);
    border: 2px solid lightgrey;
}
.old_price > .op_cover {
    width: 84px;
    height: 21px;
}
#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;
}
.old_wrap {
     float: right;
    width: 182px;
}

 

 

2.5. Решение проблемы обновления расчетных цен на сайте.

(кто использовал старое - Функцию update_currency в api/Money.php меняем на стандартную)


Будем менять /simpla/CurrencyAdmin.php

 

При обновлении измененной валюты обновим и все варианты с такой-же валютой,

начало и конец заменяемого кода обрамлены неизменными частями кода, обратите внимание, в 2.3.6

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

foreach($this->request->post('currency') as $n=>$va)
	foreach($va as $i=>$v)
		$currencies[$i]->$n = $v;

//////////////////////////////////////////////////////////////

$currencies_ids = array();
foreach($currencies as $currency)
{
	if($currency->id)
	{
		$this->money->update_currency($currency->id, $currency);
		$this->db->query("UPDATE __variants SET price=base_price*? WHERE currency=?"  , $currency->rate_to/$currency->rate_from, $currency->id);
	}
	else
		$currency->id = $this->money->add_currency($currency);
	$currencies_ids[] = $currency->id;
}

//////////////////////////////////////////////////////////////

// Удалить непереданные валюты
$query = $this->db->placehold('DELETE FROM __currencies WHERE id NOT IN(?@)', $currencies_ids);
$this->db->query($query);

 

 

 

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'=>           'Изображения'
			);

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

if(isset($products[$variant->product_id]))
{
	$v                    = array();
	$v['variant']         = $variant->name;
	$v['price']           = $variant->price;
	$v['currency'] 		  = $variant->currency;
		
	if ($variant->base_price)
		$v['price']           = $variant->base_price;
	else
		$v['price']           = $variant->price;
		
	if ($variant->base_price)
		$v['base_compare_price']           = $variant->base_compare_price;
	else
		$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', 'изображения')
			); 

Ниже заменяем обработки price и compare_price и добавляем обработку валют и цен, что позволит записать сразу во все 4 переменные необходимые данные, сразу пересчитывая из нужной валюты:

// Подготовим вариант товара
if(isset($item['variant']))
	$variant['name'] = trim($item['variant']);
	
if(isset($item['currency']))
	if($item['currency'] == '')
		$variant['currency'] = null;
	else
		{
		$variant['currency'] = str_replace(',', '.', trim($item['currency']));
		$currency = $this->money->get_currency(intval($variant['currency']));
		}

if(isset($item['price']))
	{
	$variant['base_price'] = str_replace(',', '.', trim($item['price']));
	if ($currency)
		$variant['price'] = floatval($variant['base_price'])*$currency->rate_to/$currency->rate_from;
	else 
		$variant['price'] = $variant['base_price'];
	}

if(isset($item['compare_price']))
	{
	$variant['base_compare_price'] = str_replace(',', '.', trim($item['compare_price']));
	if ($currency)
		$variant['compare_price'] = floatval($variant['base_compare_price'])*$currency->rate_to/$currency->rate_from;
	else 
		$variant['compare_price'] = $variant['base_compare_price'];
	}

 

В файле импорта добавляется всего одна колонка - Валюта, все остальное как было.

Цены писать НЕ пересчитанные.

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

    

 

Всё, на этом всё.
У меня все прекрасно работает, если чего - пишите.

Данный код использует максимум стандартного из симплы,
поэтому все сортировки и все дела работают.
Спасибо Kors за найденные несовершенства.

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

Продали клиенту, или порадовались сами - буду рад, если поделитесь бабулями - +7 937 204-69-07 Киви



#36 ExtraBash

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

Опубликовано 11.11.2014 - 02:18

Привет. Тут было сообщение с фалами больше нет.



#37 Kors

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

Опубликовано 11.11.2014 - 08:39

У меня все прекрасно работает, если чего - пишите.

Интересно бы посмотреть демо, как "все прекрасно работает".

поэтому все сортировки и все дела работают.

Интересно бы списочек получить, что входит во "все дела".

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

#38 ExtraBash

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

Опубликовано 11.11.2014 - 12:04

Интересно бы посмотреть демо, как "все прекрасно работает".Интересно бы списочек получить, что входит во "все дела".

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

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

Каких два момента то? 



#39 Kors

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

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

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

Каких два момента то?

 
 

Интересно бы посмотреть демо, как "все прекрасно работает".



#40 ExtraBash

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

Опубликовано 11.11.2014 - 12:20

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

/simpla/design/html/product.tpl:

<li class="variant_main_currency"><div class="op_cover"></div><input name="variants[price][]" type="text"   value="{if $variant->currency}{if $variant->base_price}{$variant->base_price*$currencies[$variant->currency]->rate_to/$currencies[$variant->currency]->rate_from|escape}{else}{$variant->price*$currencies[$variant->currency]->rate_to/$currencies[$variant->currency]->rate_from|escape}{/if}{else}{$variant->price}{/if}" /></li>
<li class="variant_main_currency_discount"><div class="op_cover"></div><input name="variants[compare_price][]" type="text"   value="{if $variant->currency}{if $variant->base_compare_price}{$variant->base_compare_price*$currencies[$variant->currency]->rate_to/$currencies[$variant->currency]->rate_from|escape}{else}{$variant->compare_price*$currencies[$variant->currency]->rate_to/$currencies[$variant->currency]->rate_from|escape}{/if}{else}{$variant->compare_price}{/if}" /></li>

/simpla/design/html/products.tpl:

<div class="old_price">
<div class="op_cover"
{if $variant->compare_price>0}title="Старая цена &mdash; {$variant->compare_price} {$currency->sign}"{elseif $variant->base_compare_price>0}title="Старая цена &mdash; {$variant->base_compare_price} {$currency->sign}"{/if}></div>
<input  
type="text" 
name="price[{$variant->id}]" 
value="{if $variant->currency}{if $variant->base_price}{$variant->base_price*$currencies[$variant->currency]->rate_to/$currencies[$variant->currency]->rate_from|escape}{else}{$variant->price*$currencies[$variant->currency]->rate_to/$currencies[$variant->currency]->rate_from|escape}{/if}{else}{$variant->price}{/if}"/>	
</div>







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

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

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