Олег Захаров

Олег Захаров

С нами с 14 октября 2017; Место в рейтинге пользователей: #134
Денис
22 марта 2018, 13:08
4
+2
Можно например вот так сделать:

{* Выборка ID категорий с разбивкой *}
{var $cats = ('pdoResources' | snippet : ['parents' => 0, 'limit' => 0, 'returnIds' => 1, 'where' => '{"class_key":"msCategory"}'] | split : ',')}

{* Если категории есть - перебираем их *}
{if $cats ?}
	{foreach $cats as $cat}
		{* Выводим заголовок категории *}
		<h2>{'pdoField' | snippet : ['id' => $cat]}</h2>
		{* Выборка товаров *}
		{'msProducts' | snippet : [
			'parents' => $cat,
			'tpl' => '@INLINE Товар: {$pagrtitle}<br />'
		] ?: 'Товаров нет'}
	{/foreach}
{/if}
Максим Кузнецов
22 февраля 2018, 22:12
1
+1
При желании — можно, но зачем?

Особенность fenom-a такова (помимо преимуществ шаблонизации), что он отрабатывает только 1 раз, тогда как родной парсер MODX-a может пробегаться по шаблонам до 10 раз.

Совмещая родные теги и теги MODX-a, вы лишь создаете дополнительную нагрузку.

UPD: советую особенно внимательно посмотреть раздел синтаксиса из ссылки выше, это позволит закрыть многие вопросы.
Виталий Серый
14 февраля 2018, 21:10
1
+1
Можно поизвращаться при желании. Но лучше прислушаться к Максиму и реализовать через js, готовых велосипедов, наверное, полно.
{set $page_key = 'num'}
{set $page = $.get.$page_key?:1}
{set $limit = 3}
{if ($page is numeric) && (($page + 0) is not decimal)}
    {set $total = $rows | length}
    {set $pages = ($total - ($total % $limit)) / $limit}
    {set $pages = ($total % $limit) ? ($pages + 1) : $pages}
    {set $page = $page > $pages ? 1 : $page}
    {set $offset = $limit * ($page - 1)}
    {set $idx = 0}
    {foreach $rows as $val}
        {*<p>{$idx} - {$offset} - {$offset + $limit}</p>*}
        {set $idx = $idx + 1}
        {if $idx <= $offset || $idx > ($offset + $limit)}
            {continue}
        {/if}
        <div>{$idx} - {$val}</div>
    {/foreach}
    {macro link($curr_page, $dir='<', $total, $page_key,$tpl)}
        {set $classes = ['btn btn-light']}
        {set $page = ($dir == '>') ? ($curr_page + 1) : ($curr_page - 1)}
        {if (($curr_page >= $total) && ($dir == '>')) || (($curr_page <= 1) && ($dir != '>'))}
            {set $classes[] = 'disabled'}
            {set $disabled = 1}
        {/if}
        {if $disabled}
            <span class="{$classes | join:' '}">{$tpl}</span>
        {else}
            <a href="?{$page_key}={$page}" class="{$classes | join:' '}">{$tpl}</a>
        {/if}
    {/macro}
    {if $pages >= 2}
        <div class="pagination">
            {macro.link curr_page=$page total=$pages page_key=$page_key tpl='<<'}
            {foreach 1..$pages as $num}
                {set $classes = ['btn btn-light']}
                {if $num@first}{set $classes[] = 'first'}{/if}
                {if $num@last}{set $classes[] = 'last'}{/if}
                {if $num == $page}{set $classes[] = 'active'}{/if}
                <a href="?{$page_key}={$num}" class="{$classes | join:' '}">{$num}</a>
            {/foreach}
            {macro.link curr_page=$page dir='>' total=$pages page_key=$page_key tpl='>>'}
        </div>
    {/if}
{/if}
Олег Захаров
04 февраля 2018, 02:53
1
0
Привет!
На сайте хотим сделать 3 варианта оплаты — за 1 урок, за конкретный месяц (в нем несколько уроков) и за годовой доступ ко всем урокам. 9 учебных месяцев в курсе. Как лучше логику отстроить.
Пока сообразил проверку через вложенные
{If} {else} {/if}
.
Подскажите как вывести форму оплаты за годовой доступ?
Пока сообразил так:
...
{set $parrentmounth = $_modx->resource.parent}
{set $parrentmounthObject = $modx->getObject('modResource',$parrentmounth)}
{set $parrentyear = $parrentmounthObject ->get('parent')}
{set $accessyear = ''|pasraccess:0:$parrentyear}
{if !$accessyear}
	Вы можете оплатить курс за год по цене 
	<p class="bg-danger"> Оплатить доступ</p>
	{getContentId($parrentyear, 10, $cache)|pasraccess:('pas.content'|snippet:['resource'=>$parrentyear])}
{else}
	Год оплачен {$parrentyear}
{/if}
{set $accessmounth = $parrentmounth|pasraccess:0:$parrentmounth}
{if !$accessmounth}
	<pre class="alert alert-info">  
	Нет оплаты к курсу [[!pdoField? &id=`[[*id]]` &field=`pagetitle` &top=`2`]] 
	</pre>
	<!--  как вывести форму оплаты за месяц? -->
	{getContentId($parrentmounth, 10, $cache)|pasraccess:('pas.content'|snippet:['resource'=>$parrentmounth])}
{else}
	<!-- для тестирования вывожу номера ресурсов -->
	У вас активная подписка ко всем урокам месяца ({$parrentmounth}) "[[!pdoField? &id=`[[*id]]` 		&field=`pagetitle` &top=`1` ]]" курса ({$parrentyear}) [[!pdoField? &id=`[[*id]]` &field=`pagetitle` &top=`2` ]]
{/if}
<!--смотрим доступ к уроку -->
{set $access = $_modx->resource.id|pasraccess:0}
<!--Если вообще никакого доступа нет то выводим форму оплаты за урок-->
{if !$access and !$accessmounth and !$accessyear}
	<p class="bg-danger"> Оплатить доступ</p>
	{$_modx->resource.content|pasraccess:('pas.content'|snippet:['resource'=>''])}
{else}
	<div id="lessonvideo" data-video-1080="тут полезный платный контент"></div>
{/if}
то есть вывод формы оплаты сделал так:
{getContentId($parrentyear, 10, $cache)|pasraccess:('pas.content'|snippet:['resource'=>$parrentyear])}
что значит параметр 10 сам не понял, взял из документации расширения, вроде сработало. Где лежит код функции getContentId?
Прикол в том что в 1 уроке все норм работает, а в следующих (входящем в месяц 1) не работает.
Контент и тарифы зада на годовой курс (он корневой ресурс), на месяцы (они включают в себя уроки) и на сами уроки.
Алексей Шумаев
02 февраля 2018, 13:58
2
0
Ваш вопрос слишком объёмный, т.к. ответ на него будет порождать несколько новых вопросов…
Можно делать примерно так:

I. Сначала читаем про расширение товаров, добавляем новое поле для оптовой цены, например optPrice.
II.
1. Читаем заметку
2. Создаём плагин, в нём проверяем пользователя. Примерно так:
case 'pdoToolsOnFenomInit':
    $fenom->addAccessorSmart("site", "data", Fenom::ACCESSOR_PROPERTY);
            
    # определить принадлежность к группе оптовых
    $optGroupe = 2; # ваша группа оптовых
    $ws = 0; # пока это обычный юзер
    $user = $modx->user;
    $usergroups = $user->getUserGroups();
    if ($user->get('id') && in_array($optGroupe, $usergroups)) {
        $ws = 1; # а теперь - оптовик
    }
            
    $fenom->data = [
       'ws' => $ws
    ];       
break;
Теперь ВЕЗДЕ у вас есть переменная $.site.ws.
Fenom:
{if $.site.ws == 1}
	{$optPrice}
{else}
	{$price}
{/if}
III. В том же плагине на событие msOnBeforeAddToCart добавляем изменение цены для оптовиков, если оптовик.

Вроде всё. Но нюансов может быть множество )
Олег Захаров
24 января 2018, 13:21
1
0
ТП говорит что у них и так стоит HTTP хотя в личном кабинете вижу CMS!
ТП Яндекса нашли у себя ошибку — обещали исправить и переподключить.
Сегодня позвонил в очередной раз — специалист Яндекс.Кассы попался толковый — сразу на лету что-то там на стороне Яндекс.Кассы подшаманил и тестовый платеж прошел. Но не отработала фискализация — у меня в личном кабинете у них подключена онлайн-касса OrangeData — пришло сообщение что чек не удалось отправить, в личном кабинете платеж со значком что не фискализирован. Задал вопрос в техподдержку Яндекс.Кассы, пока жду ответа.
В письме:
Платёж прошёл успешно, но мы не смогли отправить данные для чека вашей онлайн-кассе.
Номер транзакции: 2000....57
shopId: shopId хххххх
Идентификатор запроса к онлайн-кассе: 2000...57_5....7
...
Где может быть ошибка:
- Вы передаёте данные для чека в неправильном формате.
  Проверьте по инструкции:
https://github.com/yandex-money/yandex-money-joinup/blob/master/demo/54-fz.md
- Онлайн-касса не подключена к интернету или не включена в розетку.
  Если касса стоит у вас, проверьте, что с ней всё в порядке.
  Если вы арендуете кассу, проверьте её статус в личном кабинете своего сервиса.
Проверил статус кассы в личном кабинете — все норм. Соответственно подозрение на формат передаваемых данных. Можете проверить инструкцию по формату и подсказать — что передает ваш модуль в ym_merchant_receipt? Как посмотреть?
Возможно есть трабла на стороне Яндекс.Кассы — возможно там чтото теряется. Не знаю как проверить и что написать ТП Яндекс.Кассы.
Есть еще документация API OrangeData https://github.com/orangedata-official/API и репозиторий интеграций PHP https://github.com/orangedata-official/PHP-OrangeData-official/
Можете посмотреть и сравнить с тем что требует OrangeData и что передает Ваш модуль в Яндекс.Кассу (возможно каких-то параметров не хватает)?
Думаю что решив эту проблему Вы сильно популизируете ваш модуль :). Готов помочь с тестированием через себя.
Андрей
24 января 2018, 12:15
5
0
Если там ничего мудреного нету, то подключить в них pdoTools и заменить все вызовы чанков через него:

//подключаем в начале сниппета
$pdo = $modx->getSetvice('pdoFetch');

//далее везде в сниппете заменить
$modx->getChunk

// на обработку через pdoTools
$pdo->getChunk

Так же можно сделать простейший поиск через pdoPage

{'!pdoPage' | snippet : [
  'parents' => 0,
  'includeContent' => 1,
  'context' => $_modx->context.key,

  'where' => [
    [
      'context_key' => $_modx->context.key
    ],
    [
      'AND:pagetitle:LIKE' => '%'~ $.get.search | escape ~'%',
      'OR:introtext:LIKE' => '%'~ $.get.search | escape ~'%',
      'OR:content:LIKE' => '%'~ $.get.search | escape ~'%'
    ]
  ] | toJSON,

  'tpl' => ''
]}
Klike
07 января 2018, 16:11
2
+1
{if ''|resource:'isfolder'?}
...
{/if}
Михаил
07 января 2018, 16:11
2
+2
в чанке:
{if $isfolder}
{/if}
в шаблоне
{if $_modx->resource.isfolder}
{/if}
Дмитрий
16 декабря 2017, 17:42
1
0
На самом деле все довольно просто.
1) Любым образом делаете мультиязычность — Localizator, Babel, Lingua.
2) Устанавливаете CurrencyRate
3) Создаете доп.поле (ТВ или поле продукта), где будет хранится цена в другой валюте. Ну, если это подтягивается откуда-то извне. Если нужно просто по факту конвертировать цены из рублей в другую валюту — просто отрабатывает CRCalc. Там можно подстроить, чтобы давал немного выше официального курса, чтобы дешево не продать.
4) Вешаете плагин на событие добавления в корзину, в котором определяете язык магазина и подтягиваете цену.
5) Единственная проблема — с отправкой почты. Но тут можно сделать как в Modstore — отправлять два письма, одно на русском, другое на английском.
У меня так два магазина работают, никто не жаловался :)