Andrei D.

Andrei D.

Был в сети 06 декабря 2022, 13:09
Заказы не принимаю
самое простое это расширить таблицу ms2_payments на одну ячейку lang/culture и потом уже в чанке подставлять

плагин на OnMODXInit
<?php
switch ($modx->event->name) {
    case "OnMODXInit":
        $map = array(
            'msPayment' => array(
                'fields' => array(
                    'lang' => '',
                ),
                'fieldMeta' => array(
                    'lang' => array(
                        'dbtype' => 'varchar',
                        'precision' => '10',
                        'phptype' => 'string',
                        'collation' => 'utf8_general_ci',
                        'null' => false,
                    ),
                ),
            ),
        );
        foreach ($map as $class => $data) {
            $modx->loadClass($class);
            foreach ($data as $tmp => $fields) {
                if ($tmp == 'fields') {
                    foreach ($fields as $field => $value) {
                        foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                            if (isset($data[$key][$field])) {
                                $modx->map[$class][$key][$field] = $data[$key][$field];
                            }
                        }
                    }
                } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                    foreach ($fields as $alias => $relation) {
                        if (!isset($modx->map[$class][$tmp][$alias])) {
                            $modx->map[$class][$tmp][$alias] = $relation;
                        }
                    }
                }
            }
        }
        break;
}

в чанк msOrder
{set $culture = $_modx->config.cultureKey}

{foreach $payments as $payment}
{if $culture == $payment.lang?}
тут чекбокс 
{/if}
{/foreach}
Подобный компонент вижу так:

Есть объекты для бронирования: ресурсы, тикеты, кастомная таблица и тд
node.js отдельно и работает со своей бд, где только строки бронировки (проверка на дату, пользователя и тд), либо с кастомной таблицей в modx самих бронировок
Если брать miniShop2:
Пользователь выбирает объект для бронирования, node проверяет доступность, если все хорошо, то дается возможность оплатить. На события msOnCreateOrder и msOnChangeOrderStatus для статуса «оплачено» node сохраняет бронировку у себя

UPD. желательно, чтобы функции проверки для отправки в node можно было задать на странице в менеджере
Т.е. по типу field -> value -> comparison
И в самом node.js установить уже методы сравнения

UPD2. но это уже получается не просто букинг компонент, а универсальный modx-node.js коннектор)
Немного переделал сниппет 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`
]]
оу… нашел решение:
1. захардкодить $paymentUrl в paypal.class.php в папке core/components/minishop2/custom/payment
$paymentUrl = 'http://сайт.com/assets/components/minishop2/payment/paypal.php';
2. в assets/components/minishop2/payment/paypal.php добавить перед $success id страниц отмены
if ($context == 'web') {
    $makeId = '277';
} elseif ($context == 'ru') {
    $makeId = '278';
}
3. заменить на
if ($id = $modx->getOption('ms2_payment_paypal_cancel_id', null, 0)) {
$cancel = $modx->makeUrl($makeId, $context, $params, 'full');
}