Антон Левиц

Антон Левиц

С нами с 13 ноября 2014; Место в рейтинге пользователей: #318
Дмитрий
31 марта 2017, 23:29
4
+4
1. Вводная статья о том, что такое Fenom и зачем оно надо
2. Статья о том, как работать с файловыми элементами
Серьезно, после освоения этого инструмента делать сайты на MODX стало еще проще. И код стал куда красивее. Идиотские однообразные простыни шаблонов с одним отличием сменились на шаблоны с наследованием, все чанки и собственноручно написанные сниппеты/модификаторы хранятся в файлах, их можно использовать с Git, а это вообще просто потрясающе! Теперь никаких утерянных чанков, все всегда можно откатить и радоваться жизни. Прелесть. Если до сих пор никогда не использовали Fenom — потратьте пару дней и познайте дзен реально крутой разработки.
Виталий
22 декабря 2016, 09:41
2
+1
Спасибо, Евгений!

тоже думал в этом направлении

Павел подсказал такое решение:
[[!pdoPage?
		&element=`msProducts`
		 &select=`["ROUND(((old_price - price) / old_price) * 100) as price_percentage"]`
		&sortby=`price_percentage`
		&sortdir=`DESC`
	]]
Иван Бочкарев
20 октября 2016, 06:12
1
0
[[!msVendor? &vendor=`{$product.vendor}` &returnOption=`name`]]
Антон
02 октября 2016, 03:02
2
+2
Пересборка тумбов.
Просто создать любой qwerty.php файл в корне сайта и запустить из браузера.
<?php
define('MODX_API_MODE', true);
require 'index.php';		// Если файл лежит не в корне - здесь нужно указать верный путь
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');

if (!isset($parents)) {$parents = 0;}		// Можно указать список категорий для поиска товаров
if (!isset($resources)) {$resources = '';}	// Можно указать конкретный список товаров

$pdo = $modx->getService('pdoFetch');
$condition = array('parents' => $parents);
$files = $pdo->getCollection('msProduct',
	array(
		'msProduct.class_key' => 'msProduct',
	),
	array(
		'class' => 'msProduct',
		'parents' => $parents,
		'resources' => $resources,
		'innerJoin' => array(
			'msProductFile' => array(
				'alias' => 'msProductFile',
				'on' => array(
					'msProduct.id = msProductFile.product_id',
					'msProductFile.parent' => 0,
					'msProductFile.type' => 'image',
				)
			)
		),
		'select' => array(
			'msProductFile' => 'all'
		),
		'sortby' => 'msProduct.id'
	)
);

echo '<pre>';
echo $pdo->getTime();
foreach ($files as $row) {
	$file = $modx->newObject('msProductFile');	
	$file->fromArray($row, '', true, true);
	
	$children = $file->getMany('Children');
	foreach ($children as $child) {
		$child->remove();
	}
	$file->generateThumbnails();
	
	// Обновляем thumb и image товара
	if ($product = $file->getOne('Product')) {
		$product->updateProductImage();
	}
}

echo microtime(true) - $modx->startTime;
Володя
05 августа 2016, 22:35
21
+5
можно добавить так
создать плагин на pdoToolsOnFenomInit, в нем добавить модификатор detector
<?php
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
    if (!$fenom = $modx->getOption('fenom', $scriptProperties)) {
        return;
    }
    if (!$MobileDetect = $modx->getService('mobiledetect', 'MobileDetect', MODX_CORE_PATH . 'components/mobiledetect/')) {
	    return;
    }
    
    $key = $MobileDetect->config['force_browser_variable'];
    $device = !empty($_GET) && array_key_exists($key, $_GET)
		? $modx->stripTags($_GET[$key])
		: '';
	if (empty($device)) {
	    $device = $MobileDetect->getSettings();
    }
    if (empty($device)) {
        $detector = $MobileDetect->getDetector();
        $device = ($detector->isMobile() ? ($detector->isTablet() ? 'tablet' : 'mobile') : 'standard');
        $MobileDetect->saveSettings($device);
    }

    $fenom->addModifier("detector", function ($value) use ($device) {
        return $value == $device;
    });

    break;
}

и теперь в любом месте можно делать так
{if 'mobile'|detector}
mobile
{/if}

{if 'tablet'|detector}
tablet
{/if}

{if 'standard'|detector}
standard
{/if}
Максим Кузнецов
05 августа 2016, 17:14
1
+2
<?php
	if ($modx->event->name == 'OnUserActivate') {
		if ($user) {
			$profile = $user->getOne('Profile');

			//Пример получения полей
			$user_id = $user->get('id');
			$fullname = $profile->get('fullname');
		}
	}
Павел Романов
10 июля 2016, 14:07
1
+1
Добрый день.
Например, так:
[[!+modx.user.id:is=`0`:then=`Контент для анонимов`:else=`Контент для залогиненных`]]
Евгений Webinmd
17 мая 2016, 11:58
2
+1
я делал скрытое поле, которое заполнялось при нажатии на кнопку через скрипты.
Кнопка в чанке товара
<button data-title="[[+pagetitle]]">Быстрый заказ</button>
Поле в форме
<input type="hidden" name="product-title" >
Скрипт на jquery
$('button').on('click', function(){
	$('input[name="product-title"]').val($(this).data('title'));
});
Василий Наумкин
04 января 2015, 13:16
4
0
1. Обнови mSearch2 и pdoTools до последних версий
2. Вызови mFilter2
[[!mFilter2?
	&parents=`0`
	&limit=`5`
	&element=`pdoResources`
	&ajaxMode=`button`
	&ajaxElemWrapper=`#mse2_mfilter`
	&ajaxElemRows=`#mse2_results`
	&ajaxElemPagination=`#mse2_pagination`
	&ajaxElemLink=`#mse2_pagination a`
	&ajaxElemMore=`#mse2_mfilter .btn-more`
]]
3. Допиши javascript для скрытия кнопки на странице, когда больше нечего показывать:
$(document).on('mse2_load', function(e, response) {
	var data = response.data;
	var total = data.total;
	var limit = mse2Config['limit'] || mse2Config['start_limit'];
	var page = pdoHash.get()['page'] || 1;
	
	var more = $('#mse2_mfilter .btn-more');
	if (page * limit >= total) {
		more.hide();
	}
	else if (more.is(':hidden')) {
		more.show();
	}
	//setMore();
});
4. По желанию можно добавить функцию setMore, которая будет писать сколько загрузится результатов на кнопке:
function setMore() {
	var btn = $('#mse2_mfilter .btn-more');
	var total = $(mSearch2.options['total']).text();
	var page = pdoHash.get()['page'] || 1;
	var limit = mse2Config['limit'] || mse2Config['start_limit'];
	
	var remains = total - (page * limit);
	if (remains > limit) {
		remains = limit;
	}
	
	var results = 'результатов';
	number = Math.abs(remains);
	number %= 100;
	if (number >= 5 && number <= 20) {
		results = 'результатов';
	}
	number %= 10;
	if (number == 1) {
		results = 'результат';
	}
	if (number >= 2 && number <= 4) {
		results = 'результата';
	}
	
	btn.text('Еще ' + remains + ' ' + results);
}

Вызов этой функции нужно раскомментировать в конце первой функции и добавить при загрузке страницы:
$(document).ready(function() {
	window.setTimeout(function() {
		setMore();
	}, 500);
});

Вот так у меня на тесте всё работает, даже пагинация кнопками. Вот вся тестовая страница.
Наумов Алексей
17 ноября 2014, 10:17
1
+3
Ну вот сейчас вы сказали: что нужны вывести «Вы экономите:..», это уже нормальный вопрос.

Простой сниппет [[!youSave? &price=`[[+price]]` &old_price=`[[+old_price]]`]]:
$price = empty($price) ? 0 : $price;
$old_price = empty($old_price) ? 0 : $old_price;

if($old_price > 0){
  return 'Вы экномите: '.($old_price - $price);
} 
return '';
как то так, не проверял только)