iWatchYouFromAfar

iWatchYouFromAfar

С нами с 29 сентября 2018; Место в рейтинге пользователей: #26
Василий Столейков
04 июня 2015, 16:21
1
0
Ура! Завелось!
Следующий код сработал без проблем:
$modx->addPackage('country', $modx->getOption('core_path').'components/country/model/');
$countries = $modx->getCollection('BazCountry');
echo '<b>Всего стран: '.count($countries).'</b>';

Видимо при генерации схемы нужно было в CMP Generator ещё поставить Build Package на Да (я думал мне достаточно только схемы и это не нужно).

Спасибо большое! Теперь иду изучать дальнейшие методы для работы с этими таблицами через xPDO…
Володя
13 апреля 2014, 11:04
4
+1
Приведу небольшой пример на пакете — Office, может кому пригодится…
Допустим хотим ограничить доступ пользователей по email. Пускать только разрешенные email.
1. создаем свое событие для плагина
<?php
$Event = $modx->newObject('modEvent');
$Event->set('name', 'OnOfficeBeforeLogin');
$Event->set('service',1); 
$Event->set('groupname', 'office');
$Event->save();
проверить создалось ли событие можно так
$test = $modx->getObject('modEvent',array('name'=>'OnOfficeBeforeLogin'));
echo $test->get('groupname');
2. добавляем в action.php
$modx->invokeEvent('OnOfficeBeforeLogin', array(
            '_REQUEST' => $_REQUEST
		));
3. пишем плагин на наше событие
<?php
switch ($modx->event->name) {

	case 'OnOfficeBeforeLogin':
	    if ($_REQUEST['action']='auth/sendlink') {
	    
	    $command = $modx->getOption('office_ms2_command', null, "", true);//системная настройка с email участниками
            $instructor = $modx->getOption('office_ms2_instructor', null, "", true);//системная настройка с email тренерами
        
            $emails = array_merge(explode(',', $command ),explode(',', $instructor ));
  
	    if (!in_array($_REQUEST['email'], $emails)) {
	        //меняем почту на неправильную для выдачи ошибки
            $_REQUEST['email'] = "неправильная";
   
	    }
	    else {
           //если есть доступ то ничего не делаем
           //или делаем чтото еще)))
	    }

	    }
	    break;
}
Виталий Валерьевич
10 февраля 2014, 14:49
4
0
Делается очень просто, опишу алгоритм и набросаю от руки, поднимать наработки долго.

Алгоритм:

  1. Получить реферара
  2. Определить поисковую систему
  3. Получить поисковый запрос или ссылку переход с которой был осуществлен
  4. Записать в cookie или в сессию результат
  5. В нужном месте собрать

Пишем сниппет:

$referer = $_SERVER['HTTP_REFERER'];
setcookie('referer', $referer, mktime(0, 0, 0, 1, 1, 2015));
	
if (stristr($referer, 'yandex.ru')) { 
	$search = 'text='; $crawler = 'Yandex'; 
}
else if (stristr($referer, 'rambler.ru')) { 
	$search = 'words='; $crawler = 'Rambler'; 
}
else if (stristr($referer, 'google.ru')) { 
	$search = 'q='; $crawler = 'Google'; 
}
else if (stristr($referer, 'google.com')) { 
	$search = 'q='; $crawler = 'Google'; 
}
else if (stristr($referer, 'mail.ru')) { 
	$search = 'q='; $crawler = 'Mail.Ru'; 
}
else if (stristr($referer, 'bing.com')) { 
	$search = 'q='; $crawler = 'Bing'; 
}
else if (stristr($referer, 'qip.ru')) { 
	$search = 'query='; $crawler = 'QIP'; 
}
	
if (isset($crawler)) {
	$phrase = urldecode($referer);
	preg_match('/'.$search.'([^&]*)/', $phrase.'&', $phrase2);
	$phrase = $phrase2[1];
}

setcookie('phrase', $phrase, mktime(0, 0, 0, 1, 1, 2015));

Запускаем в шаблоне, перед <!DOCTYPE>, далее если используется Formit, создаем сниппет-hook и записываем в него следующую конструкцию (как пример):

$output = '';

foreach ($_COOKIE as $k => $v) {
	if (0 === strpos($k, 'utm')) $output .=  "$k: $v \n";
}

$hook->setValue('referer', $output);
return true;

Итог: получаем плейсхолдер [[+referer]], который содержит всю необходимую информацию по рефереру. Код от руки, естественно требует доработок, но вроде нигде не ошибся.
Peter Zenin
08 февраля 2014, 20:45
1
0
Может кому пригодится, смотрит все группы текущего юзверя и выводит бОльшую скидку:
<?php
/**
 * User: Petja
 * Date: 07.02.14
 * Time: 22:34
 */

$groups = $modx->getCollection('modUserGroupMember',array('member' => $modx->user->id));

$diss = array();
foreach($groups as $group){
    $gid = $group->get('user_group');
    $t = $modx->getObject('msdUserGroup',$gid);
    $diss[] = (int) $t->get('discount');
}

$dis = max($diss);

return "$dis%";
Василий Наумкин
06 апреля 2013, 06:31
5
0
Выводить на сайте разные цены можно хотя бы условиями в чанке. Использовать можно не только ТВ, но и поле old_price, а также можно добавить свое собственное, расширением свойств товара.

Главная цель — положить товар в корзину с нужной ценой, этого можно добиться написанием плагина на событие корзины msOnBeforeAddToCart.

Плагин должен проверять авторизацию и получать нужную цену, а затем менять её в объекте product (но не сохранять!).

Пример плагина, меняющего нормальный price на old_price, если юзер авторизован:
if ($modx->event->name == 'msOnBeforeAddToCart' && $modx->user->isAuthenticated()) {
	$old_price = $product->get('old_price');
	if (!empty($old_price)) {
		$product->set('price', $old_price);
	}	
}