R2m0x94 (Vasily)

R2m0x94 (Vasily)

С нами с 07 мая 2018; Место в рейтинге пользователей: #396
Andrei D.
15 декабря 2016, 19:04
1
0
Немного переделал сниппет Bob Ray'а под себя, попробуйте:

<?php
/* IsMember Snippet */
$groups = $modx->getOption('groups', $scriptProperties);
$groups_array = explode(',', $groups);

if ($modx->user->isMember($groups_array)) {
    if (preg_match('/^@INLINE/',$yesChunk)) {
        return substr($yesChunk, 7);
    } else {
        return $modx->getChunk($yesChunk);
    }
} else {
    if (preg_match('/^@INLINE/',$noChunk)) {
        return substr($noChunk, 7);
    } else {
        return $modx->getChunk($noChunk);
    }
}
Вызывать можно inline или чанками

[[!IsMember? 
&groups=`Users`
&yesChunk=`@INLINE <h2>Вы в группе А</h2>`
&noChunk=`@INLINE <div class="button>Вступить в группу А</div>`
]]
[[!IsMember? 
&groups=`Group_B,Group_C`
&yesChunk=`visible_chunk_for_groups_B_C`
]]
Роман Садоян
19 октября 2016, 21:15
4
0
Ага, понял, в общем вот такой код у меня работает:

switch ($modx->event->name) {

  case 'msOnSubmitOrder':
    $orderData = $order->get();
    $status = $order->ms2->cart->status();
// Здесь я получаю минимальную стоимость из системной настройки
    $mincost = $modx->getOption('ms2_payment_rsb_mincost');
    if(!$mincost){
      $mincost = 3000;
    }
    if($status['total_cost'] < $mincost)
    {
      $message = "Минимальная сумма для подачи заявки равна: ".$mincost;
      $data = array('success' => false, 'message' => $message);
      return $modx->event->output($message);
    }
}
Сейчас уже не вспомню зачем я записываю в $data такой массив.
Но minishop подхватывает это уведомление и выводит ошибку, при этом форма не отправляется.
Сергей Самусев
27 сентября 2016, 16:29
4
0
Решение:
[[!pdoResources?
	&class=`msVendor`
	&tpl=`tpl.msProducts.brands.row`
	&sortby=`name`
	&sortdir=`ASC`
]]
В чанке можно вывести:
[[+id]]
[[+name]]
[[+resource]]
[[+country]]
[[+logo]]
[[+address]]
[[+phone]]
[[+fax]]
[[+email]]
[[+description]]
but1head
20 сентября 2016, 00:32
2
0
Примерно так
правда у меня еще куча своих функций и контроллеров под жирные проекты, да и раскидано это по разным файлам.

<?php
define('MODX_API_MODE', true);
require $_SERVER["DOCUMENT_ROOT"].'/index.php';
$modx->getService('error','error.modError');

$functions = new _modx($modx);
$functions->sendMail('mail@site.ru', 'subject', 'message');

class _modx {
	public $modx;
	function __construct(modX &$modx){
        $this->modx =& $modx;
		$this->pdoFetch = $this->modx->getService('pdofetch','pdoFetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', array());
	}

	function sendMail($email, $subject, $body = ''){
		$mail = $this->modx->getService('mail', 'mail.modPHPMailer');
	    $mail->setHTML(true);
	    $mail->address('to', trim($email));
	    $mail->set(modMail::MAIL_SUBJECT, trim($subject));
	    $mail->set(modMail::MAIL_BODY, $body);
	    $mail->set(modMail::MAIL_FROM, $this->modx->getOption('emailsender'));
	    $mail->set(modMail::MAIL_FROM_NAME, $this->modx->getOption('site_name'));
	    if (!$mail->send()) {
	        $modx->log(modX::LOG_LEVEL_ERROR,
	            'An error occurred while trying to send the email: ' . $mail->mailer->ErrorInfo
	        );
	    }
	    $mail->reset();
	}
}

А вот контроллер под ajax запросы
<?php
if(!is_ajax() && !$_POST['action']) die('Request error');
$action = strip_tags($_POST['action']);
require_once($_SERVER["DOCUMENT_ROOT"].'/***/api.php');
require_once($_SERVER["DOCUMENT_ROOT"].'/***/functions.php');


switch($action){

}



function is_ajax() {
	return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
}
Марат Марабар
16 июня 2016, 16:42
2
+1
Держи рабочий код

$array = array(
 array(
  'title' => 'Ресурс 1',
  'alias' => 'res1',
  'idc' => '1'
 ),
 array(
  'title' => 'Ресурс 2',
  'alias' => 'res2',
  'idc' => '2'
 ),
);

foreach($array as $v){
    $response = $modx->runProcessor('resource/create', array(
    	'template' => 1,
    	'isfolder' => 0,
    	'published' => 0,
    	'pagetitle' => $v['title'],
    	'alias' => $v['alias'],
    	'parent' => 2,
    ));
    
    if ($response->isError()) {
    	return $modx->error->failure($response->getMessage());
    }
    $modx->cacheManager->clearCache();
    
    $newId = $response->response['object']['id'];
    
    $page = $modx->getObject('modResource', $newId);
    $page->setTVValue(1, $v['idc']);
    $page->save();
}
Проверено.
В $v['idc'] затесалась кириллица.
Константин Ильин
08 декабря 2015, 01:08
2
0
Да бы не заниматься двойной работой по заполнению словаря, сделал такой выход:
[[!GetNameFilter]]
$query = $modx->query("SELECT * FROM modx_tt_ms2_options WHERE `key`= '".$filter."'");
$item = $query->fetch(PDO::FETCH_ASSOC);
return $item['caption'];
в чанке tpl.mFilter2.filter.outer заменил вот так:
<h4>[[+table:is=`msoption`:then=`[[!GetNameFilter? &filter=`[[+filter]]`]]`:else=`[[%mse2_filter_[[+table]]_[[+filter]]]]`]] </h4>
Константин Ильин
19 ноября 2015, 14:44
1
0
Разобрался

т.к. [[+price]] предоставляется в виде «22 380,79», а в &where надо передавать либо int либо float

написал вот такой сниппет:
[[!getPrice? &price=`[[+price]]`]]

$price = str_replace(",",".", $price);
$price = str_replace(" ","", $price);
if(!empty($addsum)){
    $price += $addsum;
}
return $price;

теперь так:
&where=`{"Data.price:>=": [[!getPrice? &price=`[[+price]]`]]," AND:Data.price:<=": [[!getPrice? &price=`[[+price]]` &addsum=`1000`]]}`
Максим
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);
Максим Кузнецов
10 января 2015, 09:34
4
+2
С вашего позволения, приведу сюда пример реализации большинства пунктов (не отрицаю востребованнось решения данных задач сразу из коробки, т.к. работы для реализации этих пунктов нужно сделать прилично):

Страницы пользователей с нормальными урл

1. Создаем страницу «профиль пользователя» (не путаем с личным кабинетом), выставляем ему псевдоним, допустим users, к которой будут обращаться в виде site.ru/users?profile=имя

2. Ставим дополнение pdoTools

3. Создаем сниппет user.Profile и добавляем его в шаблон вывода
<?php
	$count = $modx->getCount('modUser', array('username' => $_GET[profile]));
	if($count <= 0){
		echo'	<h2>
				<a>Ошибка</a>
			</h2>
			<div>
				Пользователя не существует.
			</div>';
	}
	else {
		$params = array();
		$params['users'] = $_GET[profile];
		$params['showBlocked'] = '1';
		$params['tpl'] = 'user.Profile';
		$params['prepareSnippet'] = 'user.Profile.Prepare';
		
		$result = $modx->runSnippet('pdoUsers', $params);
		
		if (!empty($result)) {
			return $result;
		}
		else {
			return '<h2>
					<a>Ошибка</a>
				</h2>
				<div>
					Что-то сломалось.. Сейчас починим.
				</div>';
		}

	}
— насколько я помню, сразу вызвать pdoUsers с параметром конкретного пользователя нежелательно, т.к. если пользователя не существует, он выдает по-умолчанию весь список пользователей. Возможно, сейчас что-то поменялось или это можно обойти — не проверял.

Для данного сниппета также можно дописывать условия, если пользователь не активирован и тд и тп. При помощи параметров tpl и prepareSnippet кастомизируем до нужного уровня.

4. Дописываем в .htaccess
RewriteRule ^users/([^/]+)$ /users?profile=$1 [L]
— чтобы ссылка приняла вид site.ru/users/Имя_пользователя

Возможность добавлять поля в профиль пользователя

При регистрации: дополнение login
Для редактирования пользователем (личный кабинет) — дополнение office

Возможность указывать шаблон для оформления страницы пользователя

1. Добавляем дополнительное поле в личный кабинет пользователя (шаблон отображения)
2. В шаблоне отображения профиля пользователя дописываем классы, завязанные на полученном значении (class=«userInfo-[[+tpl.style]]»)
2.А. Если необходимо менять структуру шаблона в зависимости от выбранного пользователя значением, то в сниппете в первой части дописываем до

$params = array();
получение extended-поля по id пользователя с вытекающими условиями if, внутри которых будет разный параметр $params['tpl']

Добавить «из коробки» дату регистрации и дату последней активности

Дату регистрации — сниппет логин и 1 доп. поле.
С датой последней активности сложнее, т.к. в таблицах Modx'a, насколько я помню, есть только поле последней авторизации. Возможно, нужно завязывать на сессии +временной промежуток.

Возможность сделать станицу пользователя общедоступной для просмотра

Аналогично пункту 2.А. в разделе «шаблона отображения»
Василий Наумкин
11 декабря 2013, 16:58
1
0
Думаю, можно добавить обработку modX::placeholders в getChunk. Там уже есть работа с % и ~, пусть будет и ++.

Состряпал тест:
$pdo = $modx->getService('pdoFetch');
$time = microtime(true);
for ($i = 1; $i <= 1000; $i++) {
	$res = $pdo->getChunk('@INLINE [[++site_name]]', array(), false);
}
echo microtime(true) - $time;

Со старой передачей в парсер выходит 0.25 сек, с новой — 0.026. Надеюсь, глюков это не прибавит.