Борис

Борис

С нами с 15 марта 2016; Место в рейтинге пользователей: #1021
Максим
07 октября 2015, 13:52
8
+2
Может быть кому-то пригодится простенький сниппет для вызова mFilter2, который дописывает в параметр filters имена назначенных для категории опций — эти опции выводятся в фильтре чекбоксами:
<?php
$catid = $modx->resource->id;
$q = $modx->newQuery('msCategoryOption');
$q->select(array(
    'msCategoryOption.category_id',
    'msCategoryOption.option_id',
    'mso.key'
    ));
$q->where(array(
    'msCategoryOption.category_id' => $catid
    )
    );
$q->leftJoin('msOption','mso','msCategoryOption.option_id = mso.id');
$q->prepare();
$q->stmt->execute();
$options = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
$_options = array();
foreach ($options as $option) {
    $_options[] = 'msoption|'.$option['key'];
}
$_options = implode(',',$_options);
$scriptProperties['filters'] = implode(',',array($scriptProperties['filters'],$_options));
return $modx->runSnippet('mFilter2',$scriptProperties);
Василий Наумкин
07 августа 2015, 05:24
4
+3
В pdoResources задача решается несколько иначе:
[[!pdoResources?
	&includeTVs=`manuf,diag,color`
	&where=`{
		"manuf":"Sony",
		"diag:IN":[65,85],
		"color:IN":["black","gray"]
	}`
]]
В принципе, там есть и &tvFilters, но только как временная замена при миграции c getResources. Пользоваться этим параметром я никому не советую — &where гораздо гибче, лучше и удобнее.

Вот здесь кратко написано, а вот здесь значительно подробнее.
Андрей
21 марта 2015, 16:31
8
+1
Ну вот как-то так набросал на скорую руку. -)

Создал плагин, повесил на событие OnDocFormSave.

<?php
if ($modx->event->name == 'OnDocFormSave') {

	$parentIds = $modx->getParentIds($id, 4, array('context' => 'web'));   // Получаем id всех родителей ресурса
	$res = $modx->getObject('modResource',$id);
	$curAlias = $res->get('alias');   // Алиас текущего ресурса

	$cnt = count($parentIds);  // Количество родителей

	if($cnt > 2) { 

		$aliases = array();   // Массив для всех найденных алиасов

		foreach($parentIds as $v) {
			if($v == 22 || $v == 0) continue;  // Если родитель - контейнер Shop(22) или главный родитель (0) - пропускаем.

			$obj = $modx->getObject('modResource', $v);
			$alias = $obj->get('alias');
			$aliases[] = $alias;
		}

		$resource->set('uri', implode('/',array_reverse($aliases)) . '/' . $curAlias);

	} else {
		$resource->set('uri', $curAlias);
	}

	$resource->set('uri_override', true);
        $resource->save();

}
Можно еще добавить условие, чтобы урл, таким образом, формировался только для новых ресурсов. Мне пока не нужно.

if ($mode == 'new') {
    // код выше
}
Наумов Алексей
22 марта 2014, 08:54
4
0
Привет. Вот смотри:
1. В системной настройке ms2_order_handler_class указываем myOrderHandler
2. Создаем файл core/components/minishop2/custom/order/myOrderHandler.class.php
3. В него код:
<?
class myOrderHandler extends msOrderHandler{	
	public function submit($data = array()) {
		if(empty($data['email'])){
			$data['email'] = uniqid('user_').'@MYSITE.ru';
		}
		return parent::submit($data);
	}
}
Это один из вариантов. Мы просто при отправке заказа, если пользователь не указал почту, генерируем случайный email.

Можешь посмотреть исходный msOrderHandler и переопределить в нем другой метод, например, где идет проверка email.
Stan
04 марта 2014, 22:48
1
0
Эх, тильду я сослепу просмотрел.

Ошибка была в
<?php
$course = $modx->getConfig('rate_usd');
return $price * $course;
Должно быть так
<?php
$course = $modx->getOption('rate_usd');
return $price * $course;
Искренне благодарю за потраченное время. Всё работает.
Большое человеческое спасибо!
Наумов Алексей
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 и проверяем, что он сработал и в настройках курсы обновились.

Это мое решение с одного из сайтов, успешно работающее.