Евгений Шеронов

Евгений Шеронов

С нами с 20 мая 2015; Место в рейтинге пользователей: #30
Илья Уткин
12 июля 2016, 10:19
2
+1
Видео-уроков нет. А что значит «привязать к тв-полям»? ТВ-поля использовать вряд ли получится, но интерфейс можно переделать, отредактировав JS-файлы. Вот пара советов:
Николай Загумённов
08 июня 2016, 23:50
4
+2
Спасибо Паше за помощь. Открыл для себя Ext.ComponentMgr.onAvailable.

Вот такой плагин получился и не надо создавать никаких comments2.grid.js.
<?php
switch ($modx->event->name) {
    case 'OnBeforeManagerPageInit':
        
        if ($action['namespace'] == 'tickets' && $action['controller'] == 'index') {
            $modx->controller->addHtml("<script type='text/javascript'>
                Ext.ComponentMgr.onAvailable('tickets-home-tabs', function() {
                    // Тут можно переопределять все что угодно
                });
            </script>");
        }
        break;
}
Николай Савин
10 апреля 2016, 11:10
4
+3
Я для себя решаю задачу примерно так.
1. Организации — это Пользователи. Для их самостоятельной регистрации и последующей правки карточки организации нужно использовать office.
2. Для хранения информации, стандартных полей таблицы пользователей не хватает обычно, поэтому я расширяю таблицу и добавляю любое нужное мне количество полей вот так
3. Для вывода и каталогизации пользователей-организаций используется pdoUsers
4. Для фильтрации пользователей по различным параметрам проще всего использовать mfilter2. Примерную методику я описывал здесь
5. Также вывод делается с помощью методики
6. Ну а объявления — это конечно tickets.

Таким образом можно обойтись без дублирования страниц
Константин
04 марта 2016, 15:30
7
+1
Недавно делал на сайте вот так:

Вызов сниппета через AjaxForm
[[!AjaxForm?
	&snippet=`QuickOrder`
	&form=`order.form`
]]

И вот сам сниппет QuickOrder
<?php
$errors = array();

if ( empty( trim( $_POST['total'] ) ) OR !is_numeric( trim( $_POST['total'] ) ) ) {
    $errors['total'] = 'Вы не заполнили кол-во человек';
}

if ( empty( trim( $_POST['phone'] ) ) ) {
    $errors['phone'] = 'Вы не заполнили телефон';
}

if ( !empty( $errors ) ) {
    return $AjaxForm->error( 'В форме содержатся ошибки!', $errors );
} else {
    $miniShop2 = $modx->getService( 'minishop2','miniShop2', MODX_CORE_PATH . 'components/minishop2/model/minishop2/', $scriptProperties );

    if ( !( $miniShop2 instanceof miniShop2 ) ) {
        return $AjaxForm->error( 'Ошибка скрипта!' );
    }
    
    $miniShop2->initialize($modx->context->key, $scriptProperties);
    
    $miniShop2->order->add( 'receiver', trim( $_POST['receiver'] )  );
    $miniShop2->order->add( 'email', trim( $_POST['email'] ) );
    $miniShop2->order->add( 'delivery', 1 ); // id метода доставки
    $miniShop2->order->add( 'payment', 1 ); // id метода оплаты
    
    $miniShop2->cart->add($_POST['id'], $modx->getOption('count', $_POST, 1), $modx->getOption('options', $_POST, array()));
    
    return $AjaxForm->success( 'Форма успешно отправлена. Сейчас вы перейдете на страницу оплаты.' );
}

JS Callback для отправки формы:
$( document ).on('af_complete', function( event, response ) {
    if( response.success ) {
        response.form[0].submit();
    }
})
Василий Наумкин
01 марта 2016, 09:46
3
+1
$modx->log(1, print_r(array_keys($scriptProperties),1));
Алексей Шумаев
01 марта 2016, 02:03
2
+1
Итак, временное решение — может кому пригодиться.

1. Запуск (Fenom)
{$_modx->runSnippet('mSearchForm', [
	'pageId' => 5,
	'element' => 'pdoResources',
	'limit' => 15,
	'tpl' => 'tpl.mSearch2.ac',
	'class' => 'modResource'
])}

2. Результат работы mSearchForm в tpl.mSearch2.ac отдаётся сниппету prepareSearchResult:
<?php
$out = '';

$tpls = array (
	'msCategory'  => 'tpl.mSearch2Category.ac',
	'modDocument' => 'tpl.mSearch2Document.ac',
	'msProduct'  => 'tpl.mSearch2Product.ac'
	);

if(isset($class_key) && isset($id)) {
	
	$pdo = $modx->getService('pdoTools');
	$tpl = $tpls[$class_key];
	
	$placeholders['pagetitle'] = $pagetitle;
	$placeholders['description'] = $description;
	
	if($class_key == 'msProduct') {
		$product = $modx->getObject('msProduct', $id);
		$placeholders['price'] = $product->get('price');
		$thumb = $product->get('thumb');
		if(empty($thumb)) {
			$placeholders['thumb'] = '/assets/templates/img/no-photo.png';
		}
		else {
			$placeholders['thumb'] = $product->get('thumb');
		}
	}
	
	$out = $pdo->getChunk($tpl, $placeholders);
}
return $out;

3. Пример куска чанка для продукта (с использованием Fenom):
<div class="img-wrapp">
		<img src="{$thumb}" alt="{$pagetitle}">
	</div>
	<div class="search-body">
		<span class="item-name">{$pagetitle}</span>
		{if $decription?}
			<span class="item-descript">{$description}</span>
		{/if}
	</div>
	<div class="item-price">{$price}<small> руб.</small></div>
Максим Кузнецов
29 февраля 2016, 13:46
4
+2
Для fenom:
{set $canonical_url = $_modx->makeUrl($_modx->resource.id, '', '', 'full')}

<link rel="canonical" href="{$canonical_url}" />
<meta property="og:url" content="{$canonical_url}" />


Тегами modx:
<link rel="canonical" href="[[~[[*id]]? &scheme=`full`]]" />
<meta property="og:url" content="[[~[[*id]]? &scheme=`full`]]" />

Или, например, вот так (не помню для чего, но как-то возникла проблема с предыдущим вариантом, которая решилась нижеописанным примером):
[[++site_url]][[*id:isnot=`[[++site_start]]`:then=`[[~[[*id]]]]`]]
Воеводский Михаил
21 февраля 2016, 19:27
1
+1
/* Меняю значение опции на полученное */
            $o = $modx->newObject('msProductOption', array(
                'product_id' => $r->id,
                'key' => 'options_length',
                'value' => trim($_POST['options_length'])
            ));
            $o->save();
Не надо так делать. Достаточно проверить существование опции у товара, а выставлять значение опции самому товару. Как минимум, такой механизм я понял из чтения исходников MS 2.2 (с опциями мне еще не приходилось работать).

<?php
$optionKey = 'options_length';
$optionKeys = $r->getOptionKeys();
if (!in_array($optionKey, $optionKeys) and $option = $modx->getObject('msOption', array('key' => $optionKey))) {
    $productOption = $modx->newObject('msProductOption');
    $productOption->addOne($option, 'Option');
    $productOption->addOne($r, 'Product');
}
$r->set($optionKey, trim($_POST[$optionKey]));
$r->save();
Евгений Шеронов
15 февраля 2016, 22:44
2
0
Вызов на той странице, где хотите всё это видеть:
[[pdoResources?
      &parents=`0`
      &where=`{"class_key":"msCategory"}`
      &tpl=`tpl.category.list`
]]

И уже в чанке tpl.category.list:
[[msProducts?
        &parents=`[[+id]]`
  ]]

P.S. Подобное решение точно было здесь
Василий Наумкин
15 февраля 2016, 21:57
2
+1
[[!msProducts?
	&parents=`0`
	&innerJoin=`{
		"OrderProduct": {"class":"msOrderProduct", "on":"msProduct.id = OrderProduct.product_id"},
		"Order": {"class":"msOrder", "on":"Order.id = OrderProduct.order_id"}
	}`
	&where=`{
		"Order.user_id": [[!+modx.user.id]],
		"Order.status:>": 1
	}`
	&groupby=`msProduct.id`
	&showLog=`1`
]]
Выводим только те товары, которые были оформлены в заказе текущего юзера и статус у заказа «Оплачен» или выше. Можно еще указывать разные условия в &where.