Наумов Алексей

Наумов Алексей

С нами с 31 марта 2013; Место в рейтинге пользователей: #13
Наумов Алексей
04 марта 2014, 10:26
2
0
Ох…
1. Система-Настройки системы: ключ ms2_price_snippet, указываем значение modifyPrice
2. Делаем сниппет modifyPrice:
ну у меня тут несколько другая ситуация, цены на товары вбиты в поля price — в евро, в old_price — в долларах.
<?php
$priceEURO = $product->get('price');
$priceUSD = $product->get('old_price');

$rateEURO = $modx->getOption('rate_euro');
$rateUSD = $modx->getOption('rate_usd');

if($priceEURO > 0){
  return $priceEURO * $rateEURO;
}
if($priceUSD > 0){
  return $priceUSD * $rateUSD;
}
return 0;
3. Создаем ресурс, публикуем его, скрываем из меню, добавляем ему в контент:

[[!updateRates]]
и этот ресурс на хостинге вешаем по его url на кронтаб раз в сутки.

4. Создаем сниппет updateRates:

require_once($modx->getOption('assets_path').'components/cbrf/ExchangeRatesCBRF.class.php');
$rates = new ExchangeRatesCBRF();

$usd = $rates->GetRate("USD");
$euro = $rates->GetRate("EUR");

$setting = $modx->getObject('modSystemSetting', 'rate_euro');
$setting->set('value', $euro);
$setting->save();

$setting = $modx->getObject('modSystemSetting', 'rate_usd');
$setting->set('value', $usd);
$setting->save();

// обновляем колонку price_rur
$sql1 = "UPDATE ".$modx->getTableName('msProductData')." SET `price_rur` = ".str_replace(',','.',$euro)." * `price` WHERE `price` > 0";
$sql2 = "UPDATE ".$modx->getTableName('msProductData')." SET `price_rur` = ".str_replace(',','.',$usd)." * `old_price` WHERE `old_price` > 0";

$q = $modx->prepare($sql1);
$q->execute();
$q = $modx->prepare($sql2);
$q->execute();

//$cacheRefreshOptions =  array( 'system_settings' => array() );
//$modx->cacheManager->refresh($cacheRefreshOptions);
$modx->cacheManager->refresh();

echo 'Курс USD: '.$usd;
echo '<br />';
echo 'Курс EURO: '.$euro;
Я в этом сниппете еще кеш чищу в конце всего сайта, мне так нужно.

5. Создаем файл components/cbrf/ExchangeRatesCBRF.class.php:

<?php
class ExchangeRatesCBRF
{
	var $rates;
	function __construct($date = null)
	//В PHP версии ниже 5 это метод объекта следует переименовать в ExchangeRatesCBRF
	{
		$client = new SoapClient("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL"); 
		if (!isset($date)) $date = date("Y-m-d"); 
		$curs = $client->GetCursOnDate(array("On_date" => $date));
		$this->rates = new SimpleXMLElement($curs->GetCursOnDateResult->any);
	}

	function GetRate ($code)
	{
	//Этот метод получает в качестве параметра цифровой или буквенный код валюты и возвращает ее курс
		$code1 = (int)$code;
		if ($code1!=0) 
		{
			$result = $this->rates->xpath('ValuteData/ValuteCursOnDate/Vcode[.='.$code.']/parent::*');
		}
		else
		{
			$result = $this->rates->xpath('ValuteData/ValuteCursOnDate/VchCode[.="'.$code.'"]/parent::*');
		}
		if (!$result)
		{
			return false; 
		}
		else 
		{
			$vc = (float)$result[0]->Vcurs;
			$vn = (int)$result[0]->Vnom;
			return ($vc/$vn);
		}

	}
}
6. Создаем 2 системные настройки:
rate_euro
rate_usd

7. Открываем первый раз ресурс с шага 3 и проверяем, что он сработал и в настройках курсы обновились.

Это мое решение с одного из сайтов, успешно работающее.
Наумов Алексей
03 марта 2014, 16:33
0
1. Создаете сниппет, в котором получаете курс валют на сегодня и сохраняете его в системные настройки MODx.
2. Этот сниппет вызываете по crontab раз в сутки, ведь курс меняется раз в сутки
3. Выводите цену с учетом этого курса. В miniShop2 есть специальная настройка в параметрах, позволяющая указать свой сниппет для обработки товара (точно не помню, но она есть, посмотрите). В этом сниппете цену и считаете с учетом курса.
Наумов Алексей
20 декабря 2013, 10:08
0
Может я логику не очень хорошо описал, попробую еще раз:
minishop2-combo-options полностью устраивает и делает то, что надо.

Но многие товары переносятся с каталогов и там возможные значения 'этого поля даны строкой с разделителем (запятые или слеш), их много и руками по одному вставлять неудобно. Нужно импортировать их в это поле из строки…

или вариант 2:
если мы в плагине на OnDocFormSave меняем поле textfield, то после сохранения оно в админке обновляется, а вот minishop2-combo-options не обновляется, подозреваю, что просто это не дописано =) MODx в ответе на POST запрос после сохранения документа новое значение поля присылает, а minishop2-combo-options на это не реагирует.
Наумов Алексей
20 августа 2013, 11:33
0
Я в целом согласен, что товар — это конечный элемент. Но уже на втором сайте получается так, что minishop используется не для магазина, а как структурированный каталог всевозможных элементов с удобной админкой. И вот получается так, что хорошо бы сделать вложенные ресурсы у товара :) Буду пробовать. Спасибо.
Наумов Алексей
08 августа 2013, 15:59
0
Ну в общем у Безумкина было имя сайта. Письма на новом хостинге не шли.

Я посмотрел QuickEmail, а там — email отправителя. Поменял в коде тикест. О-па и письма пошли.
Наумов Алексей
08 августа 2013, 15:16
0
По уведомлениям посмотрите: modx.pro/help/1609/
Наумов Алексей
25 июля 2013, 16:52
0
Василий, ты делаешь тикетс под безумкин ру, и он отвечает твоим требованиям. А я использую тикетс на совсем других сайтах, и он не отвечает моим требованиям. Мне всегда приходилось менять чанки/скрипты/стили. Ну и с каждой новой версии всегда приходилось смотреть, что нового. Поэтому если я вижу, что вышла новая версия, то обновляюсь только тогда, когда есть 2-3 часика свободного времени в запасе =)
Наумов Алексей
25 июля 2013, 15:52
0
Я 2 или 3 сайта делал с комментариями тикетс, и хочу сказать, что после каждого обновления были проблемы на уровне полной несовместимости, т.к. компонент усиленно развивается, а я в любом случае его чуть модифицировал под свои сайты (скрипты, стили).
Наумов Алексей
25 июля 2013, 09:56
0
Я совсем недавно добавлял поле.

Скачиваешь исходники, смотришь все места, где фигурируют уже имеющиеся поля и по аналогии добавляешь свое.

В целом занимает 10 минут.
Наумов Алексей
04 июля 2013, 14:41
0
Спасибо!

В целом я уже решил вопрос. Я отнаследовался от msOrderHandler, скопировал в мой класс метод submit, убрал в нем из обязательных полей email, и перенес модернизированную функцию getCustomerId в него же.

НУ а магазины бывают разные, товары специфические. У меня например 1 пользователь с вероятностью 99,99% совершит только 1 покупку.
Наумов Алексей
20 июня 2013, 09:20
0
Нет, я больше ничего не делал в этом направлении!
Наумов Алексей
13 июня 2013, 09:54
0
Да там есть проблемы с сайтом, много наворотил всего по неопытности сначала. Потом более-менее разгреб, но помогло не сильно… Надо все хорошенько переписывать там, а времени нет пока.
Наумов Алексей
12 июня 2013, 22:39
0
fishspace.ru/places/to/venevskij/platnik-vorotnya/ — 380 на текущий момент, это с начала мая примерно. Боюсь представить, что будет к концу года :)

И на моем не очень шустром ноуте уже притормаживает браузер, для этого сайта было бы идеально скрывать старые комментарии с группировкой по годам например.
Наумов Алексей
12 июня 2013, 22:35
0
Да, интересная реализация! Мне бы подошла, я бы правда предпочел по годам группировать.
Наумов Алексей
12 июня 2013, 19:47
0
Начинает весьма прилично тормозить рендер страницы с 300+ комментариями. Если прибавить что к некоторым комментариям добавлены картники.

Вообще самый адекватный вариант наверное все же постраничный, как описано выше.