Громов Антон

Громов Антон

С нами с 20 июня 2015; Место в рейтинге пользователей: #421
Николай Савин
12 декабря 2022, 15:46
2
+3
Вам нужно создать плагин на событие msOnGetProductPrice

Пример кода такой
/** @var modX $modx */
/** @var msProduct $product */
if ($modx->event->name == 'msOnGetProductPrice') {
    $userGroups = $modx->user->getUserGroups();
    $sale_group = 4;
    //  $sale_price - цена со скидкой.  Придумайте откуда ее взять.  Отдельное поле или процент от общей цены
    $sale_price = 100;

    if (in_array($id_group, $userGroups)) {
        $modx->event->returnedValues['price'] = $sale_price
    }
}

Здесь по коду проверяем в каких группах состоит клиент. Если среди них есть скидочная группа — то подменяем price на нужное вам число
Андрей
13 июля 2021, 19:43
2
+3
Можно написать плагин, который зарегает кастомный css, в котором прописать нужные стили.

<?php
$eventName = $modx->event->name;
switch($eventName) {
    case 'OnDocFormRender':
        $modx->regClientCSS('/../assets/css/custom.css');
        break;
}

В css где tv53 это id твшки например так:
#tv53 .x-form-item {
	display: inline-block;
	max-width: 60px;
}
И получить необходимое:

Ну или написать свой тип ТВ — Custom Template Variables и выводить как угодно =)
Станислав
28 декабря 2020, 13:39
1
0
Вот еще один способ, только через коллбэки
<script>
        $(document).ready(function() {
            miniShop2.Callbacks.add('Order.getcost.response.success', 'Order_submit_response_success', function(responce) {
                var cost = responce.data['cost'],
                    min_price = {'ms2_order_min_price' | config};
                if (cost < min_price) {
                    miniShop2.Callbacks.add('Order.submit.before', 'Order_submit_before', function() {
                        miniShop2.Message.error('Недостаточная сумма заказа, заказ отправляется от ' + min_price + ' руб.!');
                        $('#error_message').text('Недостаточная сумма заказа, заказ отправляется от ' + min_price + ' руб.!');
                        return false;
                    });
                }
            });
        });
    </script>
Иван Бочкарев
08 декабря 2020, 09:05
2
+1
Вариант, когда нужно предоставить возможность указать минимальную сумму для клиента в ClientConfig:

<?php
$cart_status = $order->ms2->cart->status();
$order_status = $order->get();
$min_price_order = $modx->getOption('min_price_order');

if ($modx->event->name == 'msOnSubmitOrder'){
    if ($cart_status['total_cost'] < $min_price_order && $order_status['delivery'] == 2) {
        $modx->event->output('Минимальная сумма заказа для выбранного способа доставки ' . $min_price_order . ' рублей!');
    } 
}
Баха Волков
15 августа 2020, 11:18
2
+4
@Руслан Алеев В главном шаблоне которую будут расширять в начале пишешь:

{set $resource = $_modx->resource}
{set $resource.headline = $resource.longtitle ?: $resource.pagetitle}

{set $config = $_modx->config}

и вуаля

{$resource.id}
{$resource.pagetitle}
{$resource.headline}
{$resource.content ?: $resource.introtext ?: $resource.description}

{$config.site_name}
{$config.site_url}

Лично меня раздражает то, что синтаксис сильно вариативный, типа
Не понимаю, в чем вариативность и в чем сложность вообще?

В твоем примере:
{$id} // Это переменная
{$_modx->resource.tv_param} // Доступ к элементу массива, которая является свойством объекта $_modx
{$_modx->lexicon('lexicon')} // Вызов метода объекта $_modx, которой нужно передать ключ лексикона в качестве параметра

Это легко читается программистом
Николай Савин
07 июля 2020, 08:09
1
+1
{'!pdoPage' | snippet : [
            'class' => 'sOneMusicTrack',
            'loadModels' => 'ms2gallery',
            'leftJoin' => [
                "medium" => [
                    "class" => "msProductFile",
                    "alias" => "medium",
                    "on" => "medium.product_id = sOneMusicTrack.docid  AND medium.rank = 0 AND medium.path LIKE '%/medium/%'"
                ],
                "small" => [
                    "class" => "msProductFile",
                    "alias" => "small",
                    "on" => "small.product_id = sOneMusicTrack.docid  AND small.rank = 0 AND small.path LIKE '%/small/%'"
                ],
                "full" => [
                    "class" => "msProductFile",
                    "alias" => "full",
                    "on" => "full.product_id = sOneMusicTrack.docid  AND full.rank = 0 AND full.path LIKE '%/full/%'"
                ],

            ],
            'select' => [
                "medium" => "medium.url as medium",
                "small" => "small.url as small",
                "full" => "full.url as full",
                "sOneMusicTrack" => "*",
            ],
            'where' => [
                'docid' => $docid
            ],
            'limit' => 100,
             'tpl' => 'sOneMusicTrack.json'
        ]}
vectorserver
05 июля 2019, 12:53
5
+6
Я думаю это лешнее, сейчас использую lazyload от www.modpagespeed.com/doc/filter-lazyload-images
Устанавливаем сей модуль www.modpagespeed.com/
В .htaccess прописываем
<IfModule pagespeed_module>
    ModPagespeed on
    ModPagespeedCriticalImagesBeaconEnabled false
    #Ленивая загрузка плюшек
    ModPagespeedEnableFilters lazyload_images
</IfModule>
Вот мой готовый вариант .htaccess
<IfModule pagespeed_module>
    ModPagespeed on

    # lazyload_images , inline_preview_images и inline_images используют маяк для сбора информации
    # о переписанной странице, чтобы оптимизировать процесс перезаписи. Маяк - это POST запрос,
    # отправленный обратно с помощью JavaScript, вставленного на страницу фильтром.
    # Использование этого маяка включено по умолчанию, но его можно отключить с помощью:
    ModPagespeedCriticalImagesBeaconEnabled false
    ##Ленивая загрузка плюшек
    ModPagespeedEnableFilters lazyload_images
    #Запись даннных в local_storage
    ModPagespeedEnableFilters local_storage_cache
    #Закинем все стили в head
    ModPagespeedEnableFilters move_css_to_head
    #Склеим стили по группам и сожмем
    ModPagespeedEnableFilters combine_css
    ModPagespeedEnableFilters rewrite_css
    ModPagespeedEnableFilters rewrite_style_attributes
    #Спрайты в БГ
    ModPagespeedEnableFilters sprite_images
    #Сожмем JS
    ModPagespeedEnableFilters rewrite_javascript
    ModPagespeedUseExperimentalJsMinifier on
    ModPagespeedEnableFilters canonicalize_javascript_libraries

    #Оптимизируем JPEG
    ModPagespeedEnableFilters convert_jpeg_to_progressive
    #Почистим лишние пробелы и комменты
    ModPagespeedEnableFilters collapse_whitespace
    ModPagespeedEnableFilters remove_comments
</IfModule>
Плюсы: не нужны всякие MiniFX, не нужно лазить постоянно по чанкам прописывать атрибуты к картинкам, нет левых JS
Василий Наумкин
25 ноября 2018, 15:53
4
+8
На всякий случай, тестировать можно и без создания дополнительных сниппетов.
[[!msGetOrder?
    &id=`2404`
    &tpl=`tpl.msEmail.new.user`
]]

Вызвать в ресурсе с пустым шаблоном:
Игорь Терентьев
04 октября 2018, 12:28
2
0
Вот так можно присоединить msProductData к pdoMenu и выбрать необходимые поля:

{'pdoMenu' | snippet : [
    'parents' => $_modx->resource.id,
    'select' => [
        'modResource' => '*',
        'Data' => 'price,old_price,article',
    ],
    'leftJoin' => [
        'Data' => [
            'class' => 'msProductData',
            'alias' => 'Data',
            'on' => 'Data.id = modResource.id',
        ],
    ],
]}
g0dzilla
06 июня 2018, 10:55
1
+2
Привязывать по тайтлу не есть корректно, да и зачем, если есть:OnResourceDuplicate
События нет в офф документации, но оно отлично отрабатывает.
<?php
switch ($modx->event->name) {
    case 'OnResourceDuplicate':
        $resource = & $modx->event->params['newResource'];
        $old = & $modx->event->params['oldResource'];
	 /* А тут можем делать что угодно уже с объектами класса modResource */
	$resource->set('createdon', time());
	$resource->save();
        break;

    default:
        break;
}
return;