Купчинский Михаил

Купчинский Михаил

С нами с 19 января 2013; Место в рейтинге пользователей: #518

MODX-Дайджест #1 (25 февраля – 11 марта 2019)

Свежая подборка новостей о MODX. В выпуске: иконки для типов содержимого, рефакторинг 3 ветки от Джейсона, работа над новой документацией, благодарности автору на modx.pro и видео выступлений со всех минских MODX-мероприятий.

Приятного чтения!

Іван Клімчук
13 марта 2019, 03:40
modx.pro
4
1 673
+32

SMSC.ru хук

Всем привет, хотела запостить в modstore, но там уже есть похожие платные дополнения.
Хук для FormIt, который отправляет SMS.
Нужно добавить _smschook_ в _hooks_ вызова сниппета (перед mail). В системных настройках Formit указать ключи:

  • Логин — [[++smschook_login]]
  • Пароль — [[++smschook_password]]
  • Телефоны — [[++smschook_phones]] в формате КОД СТРАНЫ + НОМЕР ТЕЛЕФОНА (без +), можно указать несколько через запятую
  • smschook_tpl — чанк по аналогии чанка для писем
  • smschook_phones — сюда можно передать телефоны
Пример вызова:
{'!AjaxForm' | snippet : [
     'form' => 'tpl.AjaxForm.example',
    'emailTpl' => 'contactEmailTpl',
    'hooks' => 'smschook,email',
    'emailFrom' => $_modx->config.emailsender,
    'emailFromName' => $_modx->config.site_name,
    'emailSubject' => 'Сообщение с сайта' ~ $_modx->config.site_name,
    'emailTo' => $_modx->config.emailsender,
    'validate' => 'name:equired',
     'smschook_tpl' => 'smscTpl',
]}
yani
13 февраля 2019, 21:46
modx.pro
23
1 773
+26

Как вывести ссылку на оплату на странице успешного заказа?

Здравствуйте. Хочу немного переделать логику оформления заказа. Мне нужно чтобы при выборе онлайн-оплаты не происходил редирект на платежный сервис сразу, а сначала был переход на страницу Спасибо за заказ. И уже на этой странице я бы выводил пользователю линк для оплаты.

Я так понимаю, что нужно расширить класс msOrderHandler для того, чтобы убрать редирект. Но вот каким образом в чанке tpl.msGetOrder вывести ссылку на оплату? Подскажете?

Решение:
Для того, чтобы при выборе любого способа оплаты не было редиректа на платёжную систему необходимо расширить класс заказа . Код нового класса:
<?php

if (!class_exists('msOrderInterface')) {
    require_once MODX_CORE_PATH . 'components/minishop2/model/minishop2/msorderhandler.class.php';
}


class appOrderHandler extends msOrderHandler implements msOrderInterface
{

    /** @var modX $modx */
    public $modx;
    /** @var miniShop2 $ms2 */
    public $ms2;

    /** @var array $config */
    public $config;
    /** @var array $order */
    protected $order;


    function __construct(miniShop2 & $ms2, array $config = [])
    {
        parent::__construct($ms2, $config);

        //$this->modx->log(1, print_r('__construct', 1));
    }


    /**
     * @param array $data
     *
     * @return array|string
     */
    public function submit($data = [])
    {
        $response = $this->ms2->invokeEvent('msOnSubmitOrder', [
            'data'  => $data,
            'order' => $this,
        ]);
        if (!$response['success']) {
            return $this->error($response['message']);
        }
        if (!empty($response['data']['data'])) {
            $this->set($response['data']['data']);
        }

        $response = $this->getDeliveryRequiresFields();
        if ($this->ms2->config['json_response']) {
            $response = json_decode($response, true);
        }
        if (!$response['success']) {
            return $this->error($response['message']);
        }
        $requires = $response['data']['requires'];

        $errors = [];
        foreach ($requires as $v) {
            if (!empty($v) && empty($this->order[$v])) {
                $errors[] = $v;
            }
        }
        if (!empty($errors)) {
            return $this->error('ms2_order_err_requires', $errors);
        }

        $user_id = $this->ms2->getCustomerId();
        if (empty($user_id) || !is_int($user_id)) {
            return $this->error(is_string($user_id) ? $user_id : 'ms2_err_user_nf');
        }

        $cart_status = $this->ms2->cart->status();
        $delivery_cost = $this->getCost(false, true);
        $cart_cost = $this->getCost(true, true) - $delivery_cost;
        $createdon = date('Y-m-d H:i:s');
        /** @var msOrder $order */
        $order = $this->modx->newObject('msOrder');
        $order->fromArray([
            'user_id'       => $user_id,
            'createdon'     => $createdon,
            'num'           => $this->getNum(),
            'delivery'      => $this->order['delivery'],
            'payment'       => $this->order['payment'],
            'cart_cost'     => $cart_cost,
            'weight'        => $cart_status['total_weight'],
            'delivery_cost' => $delivery_cost,
            'cost'          => $cart_cost + $delivery_cost,
            'status'        => 0,
            'context'       => $this->ms2->config['ctx'],
        ]);

        // Adding address
        /** @var msOrderAddress $address */
        $address = $this->modx->newObject('msOrderAddress');
        $address->fromArray(array_merge($this->order, [
            'user_id'   => $user_id,
            'createdon' => $createdon,
        ]));
        $order->addOne($address);

        // Adding products
        $cart = $this->ms2->cart->get();
        $products = [];
        foreach ($cart as $v) {
            if ($tmp = $this->modx->getObject('msProduct', ['id' => $v['id']])) {
                $name = $tmp->get('pagetitle');
            } else {
                $name = '';
            }
            /** @var msOrderProduct $product */
            $product = $this->modx->newObject('msOrderProduct');
            $product->fromArray(array_merge($v, [
                'product_id' => $v['id'],
                'name'       => $name,
                'cost'       => $v['price'] * $v['count'],
            ]));
            $products[] = $product;
        }
        $order->addMany($products);

        $response = $this->ms2->invokeEvent('msOnBeforeCreateOrder', [
            'msOrder' => $order,
            'order'   => $this,
        ]);
        if (!$response['success']) {
            return $this->error($response['message']);
        }

        if ($order->save()) {
            $response = $this->ms2->invokeEvent('msOnCreateOrder', [
                'msOrder' => $order,
                'order'   => $this,
            ]);
            if (!$response['success']) {
                return $this->error($response['message']);
            }

            $this->ms2->cart->clean();
            $this->clean();
            if (empty($_SESSION['minishop2']['orders'])) {
                $_SESSION['minishop2']['orders'] = [];
            }
            $_SESSION['minishop2']['orders'][] = $order->get('id');

            // Trying to set status "new"
            $response = $this->ms2->changeOrderStatus($order->get('id'), 1);
            if ($response !== true) {
                return $this->error($response, ['msorder' => $order->get('id')]);
            } else {
                if ($this->ms2->config['json_response']) {
                    return $this->success('', ['msorder' => $order->get('id')]);
                } else {
                    $this->modx->sendRedirect(
                        $this->modx->context->makeUrl($this->modx->resource->id, ['msorder' => $response['data']['msorder']])
                    );

                    return $this->success();
                }
            }
        }

        return $this->error();
    }


}
mekirile
17 декабря 2018, 23:26
modx.pro
4
1 554
0

Пару модификаторов для MODX

Модификатор телефонного номера

К примеру нам нужно вывести телефонный номер в формате: +7 (900) 2000 600 и так чтобы он нажимался как ссылка для запуска на устройствах

Но так как плейсхолдер всего один [[++phone]]

Создаем сниппет phone c содержимым
Андрей Степаненко
07 декабря 2018, 09:42
modx.pro
18
3 057
+13

1 плагин - 3 лайвхака

Всем привет, порой работа менеджеров в админке modx — сущий ад. Сегодня поступил заказ с просьбой решить несколько проблем.

Проблема №1:
В tinyMCE все изображения которые вставляются имеют атрибуты width и height, и не имеют нужных классов

Проблема №2:
При загрузки файлов в каталог, где уже есть такое имя, файлы переписывают друг друга, необходимо было сделать добавление префикса для файлов с одинаковым именем

Проблема №3:
Иногда менеджеры грузят неприлично большие изображения, что непосредственно влияет и на скорость загрузки страницы и на общий размер файлов

Что делает плагин:
  1. Транслитерация файлов при загрузке, добавление префикса если файл дублируется
  2. Уменьшает загружаемое изображение до 1200px по ширине
  3. Из поля content достает все img, вырезает у них атрибуты width и height, вместо них подставляет класс img-thumbnail
Под катом — код с комментариями.
Pavel Zarubin
26 ноября 2018, 17:42
modx.pro
38
3 918
+19

pdofield и phpthumbon

Здравствуйте!

Вывожу изображение следующим образом:
<img class="img-fluid" src="[[pdoField? &id=`705` &field=`main-foto`]]">
Помогите, пожалуйста, вывести изображение через phpThumbOn
concept
29 мая 2018, 20:05
modx.pro
1
867
+1

Подгрузка галереи и нужных полей товара в простой ресурс

Добрый день!
Сегодня небольшая заметка о том как можно сделать подгрузку в простой ресурс галереи и каких нибудь полей товаров.
Sergey Leleko
30 апреля 2018, 10:20
modx.pro
7
2 060
+12

Случайные варианты текста

Сниппет для вывода случайного варианта текста
При каждой перезагрузке будет выдает случайный текст по шаблону
Denis Chernavin
26 апреля 2018, 02:03
modx.pro
7
1 590
+6

Изменяем форму заказа minishop2

За год работы с минишопом я понял одну вещь — никто не знает как просто и быстро кастомизировать стандартную форму заказов. Для меня это довольно частая задача, по этому соберу тут несколько приемов которыми сам пользуюсь:


Pavel Zarubin
22 апреля 2018, 02:16
modx.pro
96
7 653
+41

Автоматическая смена источника ms2gallery в зависимости от шаблона

Когда у вас есть зависимость между источником файлов ms2gallery и шаблоном страницы, а желания переключать его вручную — нет.
Максим Кузнецов
05 марта 2018, 20:57
modx.pro
14
1 704
+7