Виталий Греков

Виталий Греков

С нами с 29 мая 2013; Место в рейтинге пользователей: #390
Ганин Роман
24 апреля 2015, 22:57
11
+2
Начало разработки — за пределами MODX. Вёрстка (БЭМ) шаблонов, чанков и страниц в Sublime Text 3 с использованием Gulp-задач для автокомпиляции с использованием пре- и постпроцессоров (ускоряют разработку в 4-5 раз), зависимости: bower, для UI-тестов адаптивности: BrowserSync. Минификация стилей и скриптов на клиенте (прекратите вешать эту задачу на MinifyX/сервер!). Кодстайл: CSScomb и JSCS + JSLint. В дальнейшем можно настроить автоматическую выгрузку по SFTP скомпилированных файлов прямо на сервер. Шаблонизация на клиенте легко настраивается с помощью gulp-rigger, gulp-file-include или gulp-include-source. За счет вотчеров скорость просто реактивная. Особенно удобно, если монитора два и больше — в одном мониторе код проекта, в остальных — мгновенный результат (страница обновляется быстрее, чем я успеваю перевести взгляд с одного монитора на другой или переключиться на новый раб. стол).
Инициализация сервера: ansible, установка MODX: Gitify, импорт настроек: Teleport. Импорт уже подготовленных чанков, tpl-ек занимает минуты, нет необходимости заниматься «клавадрочерством» с Ctrl+Tab (переключиться на фронтенд-вкладку), Ctrl/Cmd+R (обновить страницу), чтобы просмотреть результат — всё уже оттестированно на этапе вёрстки. Остаётся только настроить магию сниппетов и оформить Custom Forms. Дальше — оверлокинг с XDebug, debugParser, BloodLine и Chrome DevTools.
Василий Наумкин
13 апреля 2015, 19:34
1
+1
Замени в конце
return $contents . $input;
на
$modx->setPlaceholder('page.contents', $contents);
$modx->setPlaceholder('page.text', $input);

И используй новые плейсхолдеры где хочешь:
[[!+page.contents]] и [[!+page.text]]
Василий Наумкин
12 апреля 2015, 06:19
1
+2
Женя, давай ты сам поразбираешься, как следует, а потом уже будешь задавать вопросы?

iris-noir.de — вот весь сайт на ms2Gallery.
Василий Наумкин
11 апреля 2015, 05:14
2
+3
Это и сейчас можно, нужно просто вызывать сниппет TicketsComments со своим произвольным &thread.

По умолчанию он равен, грубо говоря, "resource-[[*id]]", поэтому и получется одна ветка для ресурса.

Таким образом можно комментировать и картинки галереи, и профили пользователей и что угодно.
Василий Наумкин
03 апреля 2015, 04:28
2
0
Видимо, речь об этом сниппете.

Тогда нужно его совсем чуть-чуть переделать:
<?php
// Получаем готовый текст
$text = trim($input);
if (empty($text)) {
	return;
}

// Стандартные чанки, можно переопределить
if (empty($tpl)) {$tpl = '@INLINE <li>[[+value]]</li>';}
if (empty($tplOuter)) {$tplOuter = '@INLINE <ul>[[+rows]]</ul>';}

// Подключаем pdoTools для работы с инлайновыми чанками
$pdo = $modx->getService('pdoTools');

// Разбиваем текст по символу переноса строки
$rows = '';
$tmp = array_map('trim', explode("\n", $text));
foreach ($tmp as $value) {
	if (empty($value)) {continue;}
	$rows .= $pdo->getChunk($tpl, array('value' => $value));
}

// Если есть, что выводить - выводим
if (!empty($rows)) {
	return $pdo->getChunk($tplOuter, array('rows' => $rows));
}

И можно вызывать в чанке оформления галереи:
[[+add:getAddList]]

Здесь сам сниппет ничего получать не должен, потому что, в отличии от ТВ, у картинок нет имён и они не так привязаны к ресурсам. Поэтому, работаем только с уже переданным текстом.
Андрей
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') {
    // код выше
}
Wassi Wassinen
10 марта 2015, 18:02
1
0
Я название плейсхолдера взял из этого массива :)

Array
(
    [class] => msVendor
    [id] => 4
    [name] => CasaPorte
    [resource] => 1896
    [country] => Россия
    [logo] => assets/images/logo/Doors/kasaporte-100.png
    [address] => 
    [phone] => 1896
    [fax] => 1
    [email] => 
    [description] => 
    [properties] => 
    [idx] => 1
    [link] => 
)


Почему-то зациклился на link и не понял, что нужно использовать плейсхолдер resource. Спасибо!
Василий Наумкин
03 марта 2015, 20:03
1
0
Не нашел как добавлять разрешения пользователям?

Плохо искал — bobsguides.com/revolution-permissions.html. Где-то в рунете есть и перевод.
Василий Наумкин
25 февраля 2015, 17:12
1
+1
Не нужно никаких плейсхолдеров, просто сделай tpl1 и tpl2 и выдавай их в зависимости от того, находится ли товар в корзине.

<?php
// Параметры
$idd = $modx->getOption('idd', $scriptProperties, $modx->resource->id);
$tplIn = $modx->getOption('tplIn', $scriptProperties, '@INLINE Товар в корзине, цена = [[+price]]'); 
$tplOut = $modx->getOption('tplOut', $scriptProperties, '@INLINE Товара в корзине нет'); 
// Классы для работы
$pdo = $modx->getService('pdoTools');
$miniShop2 = $modx->getService('minishop2');
$miniShop2->initialize($modx->context->key, $scriptProperties);
$cart = $miniShop2->cart->get();
// Поехали
$found = false;
foreach($cart as $product) {
	if ($value['id'] == $idd) {
		$found = $product;
		break;
	}

return $found
	? $modx->getChunk($tplIn, $found)
	: $modx->getChunk($tplOut);

Вызывать так:
[[!myButton?&idd=`[[+id]]`]]
Можно указывать и чанки tplIn и tplOut.

На опечатки не проверял, принцип должен быть ясен.
Володя
05 февраля 2015, 19:53
2
+3
<?php
if ($modx->event->name == 'OnBeforeDocFormSave') {

    if($resource->get('class_key') !== 'msProduct') {return;}
    $article = $resource->get('article');
    if(empty($article)) {return;}
    if($count = $modx->getCount('msProductData', array('article' => $article ))) {

        $response = array(
			'success' => false,
			'message' => 'Продукт с таким артикулом уже существует',
			'data' => array(),
		);

		echo $modx->toJSON($response);
		exit;
        
    }

}