Jump to content

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


Go to solution Solved by ExtraBash,

Recommended Posts

Еще поправка в пункте 2.4.2. забыл про пересчет цены расчетной при изменении обычной.


Добавил:

$('input.price').focusout(function() {
    recount_Price( $(this).parents('li').find('select.products_currency'));
});
Link to post
Share on other sites
  • Replies 141
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

ExtraBash, подскажите, пожалуйста.

Вроде все шаг за шагом делал правильно,.. но где-то ошибка. По ссылке http://ge.tt/16977u42?c скрин админки для продуктов и для продукта,.. я так понимаю, что ошибка в файле продукт.тпл,... я его загрузил тоже,.. 

 

Не подскажите,.. что где я пропустил?...

 

Заранее большое спасибо за помощь!

Link to post
Share on other sites

ExtraBash, подскажите, пожалуйста.

Вроде все шаг за шагом делал правильно,.. но где-то ошибка. По ссылке http://ge.tt/16977u42?c скрин админки для продуктов и для продукта,.. я так понимаю, что ошибка в файле продукт.тпл,... я его загрузил тоже,.. 

 

Не подскажите,.. что где я пропустил?...

 

Заранее большое спасибо за помощь!

Починили.

 

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

Если кому нужна установка, тк. несколько человек уже обращались,

пишите в скайп - abashyrov, цена ориентировочно - 1000р.

Или могу вам дать доступ на готовые файлы от версии 2.3.6. - 500р.

Или делаете по инструкции, должно все получиться - Бесплатно.

----------------------------------------------------------------------------------------------------
Link to post
Share on other sites

Ребята, в ходе эксплуатации товарищ Zetwin нашел недоработку - при сохранении курса валюты наши пересчитанные валюты не пересчитывались, странно, что так долго никто не замечал, и я сам не подумал. Так что спасибо.

В файле api/Money.php обновим функцию update_currency

public function update_currency($id, $currency)
{	
	$query = $this->db->placehold('UPDATE __currencies
					SET ?%
					WHERE id in (?@)',
				$currency, (array)$id);
	if(!$this->db->query($query))
		return false;
	
	$counter = $currency->rate_to/$currency->rate_from;
	
	$query = $this->db->placehold("UPDATE __variants SET `price`=`base_price`*? , `compare_price`=`base_compare_price`*? WHERE currency=?", $counter, $counter, $currency->id);
	if(!$this->db->query($query))
		return false;

	$this->init_currencies();
	return $id;
}
Link to post
Share on other sites

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

Не только замечал, но и намекал:

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

Странно, что так долго разработчик не реагировал...
Link to post
Share on other sites

Не только замечал, но и намекал:Странно, что так долго разработчик не реагировал...

 

Ну ничосе, ниже за тем комментарием следовала просьба уточнить

что имелось в виду за твоей расплывчатой формулировкой.

Чего как я могу заметить - не последовало.

 

Ты вообще можешь объяснить зачем ты оставляешь все эти странные комментарии,

странные формулировкой, странные смыслом?

 

Инструкция как пользоваться комментариями:

 

 Думаешь свою мысль;
 Решаешь написать комментарий;
   
 Проверяешь наполнен ли смыслом будущий текст;
 Если неполнен
   пишешь;
 иначе
   Думаешь свою мысль и не пишешь)));

Заранее спасибо)))
Link to post
Share on other sites

Ну ничосе, ниже за тем комментарием следовала просьба уточнить

что имелось в виду за твоей расплывчатой формулировкой.

Чего как я могу заметить - не последовало.

За той просьбой следовала просьба установить демо, чтобы на нем все показать живьем (и, конечно, немного сомневался, так как полностью не устанавливал).

Что, как легко видеть, Вы сделать не пожелали.

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

Инструкция как пользоваться комментариями:

 

 

 Думаешь свою мысль;
 Решаешь написать комментарий;
   
 Проверяешь наполнен ли смыслом будущий текст;
 Если неполнен
   пишешь;
 иначе
   Думаешь свою мысль и не пишешь)));

Заранее спасибо)))

 

 

Инструкция, конечно, очень сильная. Я из нее узнал много нового. Раньше я по простоте считал, что пользоваться комментариями можно в основном одним способом - их читать.
Link to post
Share on other sites

Дается мне ты лютый какой-то тип)))
Мне кажется, что ты слишком уж мудришь на бесплатном дополнении.

Для тех кто только зашел поглядеть чего изменилось - добавился пункт 2.5.

Link to post
Share on other sites

Здравствуйте. После того как отредактировал Money.php, после изменения валюты, стало вылазить следующее сообщение:


Warning: Division by zero in B:\home\localhost\www\TEST\api\Money.php on line 107

Warning: Placeholder substitution error. Diagnostics: "UPDATE s_variants SET `price`=`base_price`*? , `compare_price`=`base_compare_price`*? WHERE currency=UNKNOWN_PLACEHOLDER_2" in B:\home\localhost\www\TEST\api\Database.php on line 132

Warning: Query was empty [] in B:\home\localhost\www\TEST\api\Database.php on line 105

Warning: Division by zero in B:\home\localhost\www\TEST\api\Money.php on line 107

Warning: Placeholder substitution error. Diagnostics: "UPDATE s_variants SET `price`=`base_price`*? , `compare_price`=`base_compare_price`*? WHERE currency=UNKNOWN_PLACEHOLDER_2" in B:\home\localhost\www\TEST\api\Database.php on line 132

Warning: Query was empty [] in B:\home\localhost\www\TEST\api\Database.php on line 105

Как это исправить? Подскажите пожалуйста.


 

Link to post
Share on other sites

Здравствуйте. После того как отредактировал Money.php, после изменения валюты, стало вылазить следующее сообщение:


Warning: Division by zero in B:\home\localhost\www\TEST\api\Money.php on line 107

Warning: Placeholder substitution error. Diagnostics: "UPDATE s_variants SET `price`=`base_price`*? , `compare_price`=`base_compare_price`*? WHERE currency=UNKNOWN_PLACEHOLDER_2" in B:\home\localhost\www\TEST\api\Database.php on line 132

Warning: Query was empty [] in B:\home\localhost\www\TEST\api\Database.php on line 105

Warning: Division by zero in B:\home\localhost\www\TEST\api\Money.php on line 107

Warning: Placeholder substitution error. Diagnostics: "UPDATE s_variants SET `price`=`base_price`*? , `compare_price`=`base_compare_price`*? WHERE currency=UNKNOWN_PLACEHOLDER_2" in B:\home\localhost\www\TEST\api\Database.php on line 132

Warning: Query was empty [] in B:\home\localhost\www\TEST\api\Database.php on line 105

Как это исправить? Подскажите пожалуйста.

Не знаю, нужно посмотреть подробно. До этого все остальные шаги провернув, у вас все работало?

Пишите в скайп - Abashyrov

Поглядим.

Link to post
Share on other sites

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

Link to post
Share on other sites

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

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

 

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

Link to post
Share on other sites

Не знаю, нужно посмотреть подробно. До этого все остальные шаги провернув, у вас все работало?

Пишите в скайп - Abashyrov

Поглядим.

 

Да, все работало, да и сейчас работает, просто в админке (на вкладке изменения валюты) вылазят ошибки.

Link to post
Share on other sites

Спасибо за решение протестировал все рабоате гуд и выгрузку в яндекс маркет тоже просмотрел все ок есть маленький нюанс наверное просто забыли добавить изменения для нового варианта товара

 

в файле simpla/design/html/product.tpl в блоке <ul id=new_variant ...> заменить вывод цен на

 

<li class="variant_price"><input name="variants[base_price][]" type="text" value="" /></li>
                        <li class="variant_discount">  <input name="variants[base_compare_price][]" type="text"   value="" /></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="" /></li>
                        <li class="variant_main_currency_discount"><div class="op_cover"></div><input name="variants[compare_price][]" type="text"   value="" /></li>

Еще раз спасибо за решение)

Link to post
Share on other sites

В соответствии с Вашими пожеланиями помогаю следующими подсказками.

 

 


Ребята, в ходе эксплуатации товарищ Zetwin нашел недоработку - при сохранении курса валюты наши пересчитанные валюты не пересчитывались, странно, что так долго никто не замечал, и я сам не подумал. Так что спасибо.

В файле api/Money.php обновим функцию update_currency

public function update_currency($id, $currency)
{	
	$query = $this->db->placehold('UPDATE __currencies
					SET ?%
					WHERE id in (?@)',
				$currency, (array)$id);
	if(!$this->db->query($query))
		return false;
	
	$counter = $currency->rate_to/$currency->rate_from;
	
	$query = $this->db->placehold("UPDATE __variants SET `price`=`base_price`*? , `compare_price`=`base_compare_price`*? WHERE currency=?", $counter, $counter, $currency->id);
	if(!$this->db->query($query))
		return false;

	$this->init_currencies();
	return $id;
}

 

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

 

1. Что будет при изменении курсов и нажатии на кнопку Применить? Модифицированная Вами функция вызовется 6 раз. Первые 3 раза выполнятся правильно запросы по изменению цен.
Четвертый-шестой вызовы имеют вид (в simpla/CurrencyAdmin.php)
$this->money->update_currency($currencies_ids[$i], array('position'=>$currency_id));
То есть внутри измененной функции значения $currency->rate_to, $currency->rate_from будут неопределенными, и возникнет деление на 0.
2. Что будет, если попробовать установить или снять копейки? Ошибок явно не выйдет, но изменений не будет, причины примерно такие же.
3. Также не будет работать активация/деактивация валюты.
4. При добавлении валюты - аналогичные ошибки с делением на 0.
5. При удалении валюты - аналогичные ошибки с делением на 0.
6. При изменении порядка валют и сохранении - аналогичные ошибки с делением на 0.

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

 

Вообще надо заметить, что прием Ваш в принципе неверный, функция обновления из api для такого не предназначена.

 

Конечно, можно добавить условия типа if(isset($currency->rate_to)), но это стиль плохой, идет вразрез с общей идеологией Simpla и представляет собой, как говорят, костыль. Если у Вас один сайт без особых доработок, то такое вполне допустимо. Но прежде чем публично тиражировать такое, я бы семь раз подумал...

Link to post
Share on other sites

Спасибо за решение протестировал все рабоате гуд и выгрузку в яндекс маркет тоже просмотрел все ок есть маленький нюанс наверное просто забыли добавить изменения для нового варианта товара

 

в файле simpla/design/html/product.tpl в блоке <ul id=new_variant ...> заменить вывод цен на

 

<li class="variant_price"><input name="variants[base_price][]" type="text" value="" /></li>
                        <li class="variant_discount">  <input name="variants[base_compare_price][]" type="text"   value="" /></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="" /></li>
                        <li class="variant_main_currency_discount"><div class="op_cover"></div><input name="variants[compare_price][]" type="text"   value="" /></li>

Еще раз спасибо за решение)

Да, спасибо, добавлю.

Link to post
Share on other sites

В соответствии с Вашими пожеланиями помогаю следующими подсказками.

 

 

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

 

1. Что будет при изменении курсов и нажатии на кнопку Применить? Модифицированная Вами функция вызовется 6 раз. Первые 3 раза выполнятся правильно запросы по изменению цен.

Четвертый-шестой вызовы имеют вид (в simpla/CurrencyAdmin.php)

$this->money->update_currency($currencies_ids[$i], array('position'=>$currency_id));

То есть внутри измененной функции значения $currency->rate_to, $currency->rate_from будут неопределенными, и возникнет деление на 0.

2. Что будет, если попробовать установить или снять копейки? Ошибок явно не выйдет, но изменений не будет, причины примерно такие же.

3. Также не будет работать активация/деактивация валюты.

4. При добавлении валюты - аналогичные ошибки с делением на 0.

5. При удалении валюты - аналогичные ошибки с делением на 0.

6. При изменении порядка валют и сохранении - аналогичные ошибки с делением на 0.

 

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

 

Вообще надо заметить, что прием Ваш в принципе неверный, функция обновления из api для такого не предназначена.

 

Конечно, можно добавить условия типа if(isset($currency->rate_to)), но это стиль плохой, идет вразрез с общей идеологией Simpla и представляет собой, как говорят, костыль. Если у Вас один сайт без особых доработок, то такое вполне допустимо. Но прежде чем публично тиражировать такое, я бы семь раз подумал...

Вот, нормально ответил, спасибо.

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

На 3 сайтах 1 единственное изменение цифры валюты проходило нормально.

Link to post
Share on other sites

На 3 сайтах 1 единственное изменение цифры валюты проходило нормально.

Для того серьезные разработчики должны непременно делать демо. Это не только забота о пользователе, это зачастую свой собственный интерес - экономия на РАЗНОСТОРОННЕМ тестировании и диагностике ошибок.

Хостингов бесплатных, слава богу, хватает...

Link to post
Share on other sites

Ребята, есть менее кривое решение проблемы обновления расчетных цен на сайте.
Функцию 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;

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

$products = array();
foreach($this->products->get_products($filter) as $p)
	$products[$p->id] = $p;

if(!empty($products))
{
	// Товары 
	$products_ids = array_keys($products);
	foreach($products as &$product)
	{
		$product->variants = array();
	}

	$variants = $this->variants->get_variants(array('product_id'=>$products_ids));

	foreach($variants as &$variant)
	{
		$products[$variant->product_id]->variants[] = $variant;
	}
}

$currencies_ids = array();
foreach($currencies as $currency)
{
	if($currency->id)
	{
		$this->money->update_currency($currency->id, $currency);
		$counter = $currency->rate_to/$currency->rate_from;
		foreach($products as &$p)
		{
			foreach($p->variants as &$v)
			{
				if($v->currency == $currency->id)
				{
					$v->price = $v->base_price * $counter;
					$v->compare_price = $v->base_compare_price * $counter;
					$this->variants->update_variant($v->id, array('price'=>$v->price, 'compare_price'=>$v->compare_price));
				}
			}
		}	
	}
	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);
Link to post
Share on other sites

Очень странный скрипт. 

1. Сначала  скрипт получает список товаров (products). При этом используется в качестве фильтра  параметр $filter, который вообще НЕ определен. Значит, извлекаются все товары. Уже плохо, но это еще полбеды.

2. Потом из базы извлекаются все варианты и прописываются  к массиву товаров.

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

 

Теоретически оно правильно.  А сам скрипт - это классический пример того, как НЕЛЬЗЯ писать скрипты.

 

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

Во-вторых, предлагаемая обработка выполняется ДО стандартного пересчета цен. Значит, если она прервется, то стандартная обработка сделана не будет ВООБЩЕ. Это означает, что неверные цены будут не только у товаров, но и в уже сделанных заказах, в ценах доставки и еще некоторых позициях. Практически во всех ценах будет полное безобразие.  Для активно работающего магазина - просто катастрофа!

 

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

Link to post
Share on other sites

1. Сначала  скрипт получает список товаров (products). При этом используется в качестве фильтра  параметр $filter, который вообще НЕ определен. Значит, извлекаются все товары. Уже плохо, но это еще полбеды.

 

2. Потом из базы извлекаются все варианты и прописываются  к массиву товаров.

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

 

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

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

Да изменение запускается так-же как и во всей остальной симпле.
Согласен, можно вынести пробег по массивам товаров и вариантов наружу и бегать по ним 1 раз.

 

Теоретически оно правильно.  А сам скрипт - это классический пример того, как НЕЛЬЗЯ писать скрипты.

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

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

Отмечу, что даже данным неэффективным методом 10 000 товаров нормально без задержек перетряхиваются.

Link to post
Share on other sites

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

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

Link to post
Share on other sites

Но да, можно залезть и напрямую в таблицу вариантов, ничего не запрашивая.

Не только МОЖНО, но и НУЖНО.

 

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

Link to post
Share on other sites

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

Если его использовать и он полностью отработает до конца, то цены все равно будут неверными.

Потому как  сначала произойдет установка правильных цен по предлагаемому скрипту, а потом  (при изменении основной валюты) - стандартный пересчет, который испортит цены.

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

 

Проверил, при изменении основной валюты всё нормально, но естественно айди валюты в вариантах не поменяется. Но пересчитывается нормально.

 

В общем спасибо за идею вынести цикл, о мастер художественной аллегории))

Link to post
Share on other sites

В общем спасибо, о мастер проверки!
 
Только сомневаюсь, что Вы проверили как следует, учитывая то, как Вы проверяли в предыдущий раз: чтобы довести до Вас простую мысль, потребовалось несколько постов разъяснений очевидного, а в конце Вы написали весьма туманную фразу
 

На 3 сайтах 1 единственное изменение цифры валюты проходило нормально.

 

А последняя Ваша фраза о проверке

 

Проверил, при изменении основной валюты всё нормально, но естественно айди валюты в вариантах не поменяется. Но пересчитывается нормально.

 

довольно неопределенна и показывает в очередной раз Вашу небрежность в серьезном вопросе...

Никак не могу не напомнить, что серьезные разработчики должны непременно делать демо. Это не только забота о пользователе, это зачастую свой собственный интерес - экономия на РАЗНОСТОРОННЕМ тестировании и диагностике ошибок.

Link to post
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

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

×   Your previous content has been restored.   Clear editor

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

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