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

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

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

[Мультиязычность] Скрипт массовой связки разных языковых версий (в разных контекстах) по URI [Babel]

Надо добавить мультиязычность на сайт через Babel. Для этого была сделана русская версия (в контексте web) и затем сделаны ее копии (en и de).

Далее нужно было связать все версии языков ресурсов между собой.
Fullstack
27 февраля 2021, 23:04
modx.pro
7
723
+9

Отображение превьюшек для svg-картинок в ТВ типа "Изображение"

Сегодня обнаружил, что из коробки тв-шки с картинками не умеют показывать превью после выбора картинки. Всё дело в том, что по-умолчанию все картинки скармливаются phpThumb чтоб сгенерить превью нужного размера. Это логично, но не учитывается вариант с svg — картинка векторная, и пхпТумб не может сгенерить превью.
То, что я сделал — не панацея, и я отдаю себе отчёт почему я это сделал и что это не универсальное решение, но, тем не менее, вероятно кому-то в его ситуации это тоже подойдёт.
Антон
14 февраля 2020, 20:47
modx.pro
2
777
+6

Шпаргалка на все случаи жизни

Полезные ссылки, которые Вам пригодятся в некоторых ситуациях.
Михаил
07 февраля 2020, 21:42
modx.pro
65
1 502
+35

[multiSite] - Мультисайт на MODX

Привет! Компонент реализует собственно мультисайт на modx. Что он делает по факту? В зависимости от города он ищет во всей странице ключи в соответствии вашего паттерна и заменяет их на содержимое конкретно этого города.


Pavel Zarubin
10 декабря 2019, 03:17
modx.pro
12
1 068
+23

Обновление дубликатов страниц (duplicate_updater_modx)

Может кому пригодится, написал скриптец для поиска дублей страниц и обновления последних путем добавление префикса +=1

Инструкция залить duplicate_updater_modx.php в корень сайта и запустить в браузере yousute.ru/duplicate_updater_modx.php
git: github.com/vectorserver/duplicate_updater_modx

Сам код:
<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 25.06.2019
 * Time: 14:19
 */


define('MODX_API_MODE', true);
require 'index.php';

$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_FATAL);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');

$msg = "";

$table_prefix = $modx->config['table_prefix'];

//Ищем двойников
$find_query = $modx->query("SELECT group_concat(`id`) ids, count(id) c FROM `" . $table_prefix . "site_content` GROUP by concat(uri) HAVING c > 1");

$dubles = $find_query->fetchAll(PDO::FETCH_ASSOC);
//Если нашли
if (count($dubles)) {
    foreach ($dubles as $item) {
        //Разбивем ID
        $ids = explode(",", $item['ids']);
        //Сортируем - старые вверх
        sort($ids, SORT_NUMERIC);

        $count = 0;

        foreach ($ids as $doc_id) {
            $count++;
            //ПРопускаем оригинал
            if ($count > 1) {

                //Обновляем ресурс
                $originalRes = $modx->getObject('modResource', $doc_id);
                $generated = $originalRes->cleanAlias($originalRes->get('pagetitle')) . "-" . $count;
                $originalRes->set('alias', $generated);
                $originalRes->save();
                //В лог
                $msg .= $originalRes->get('id') . " | " . $originalRes->get('pagetitle') . " - обновлен.\n";
            }

        }
        //Сброрс кеша
        $modx->cacheManager->refresh();
    }

} else {
    $msg .= "Дублей нет\n";
}

echo "<pre>" . $msg;
vectorserver
25 июня 2019, 12:33
modx.pro
11
844
+7

Удобная фильтрация в mSearch2 на мобильной версии (внешний вид)

Доброго всем!
дам очень нужную инструкцию для изменения внешнего вида фильтров на мобильной версии (в десктопной ничего не измениться) в mSearch2 совместно с minishop2

На выходе нас ожидает меню куда спрячутся все фильтра, а сбоку, поверх всего будет закреплена кнопка управляющая этим меню (открыть, закрыть). Работает как в bootstrap 3 так и в bootstrap 4. Внешний вид фильтров настраиваете на свой вкус и цвет.

Впринцыпе данный пример можно использовать где угодно, возможно спрячете меню блога, ну там уже на свое усмотрение. Работает через jquery
Сергей
19 апреля 2019, 18:55
modx.pro
26
1 602
+5

Всплывающее окно после добавления товара в корзину

Всем привет!

Хотел обратиться за помощью по miniShop2.
Как вывести хотя бы
alert()
после того как товар успешно добавляется в корзину?

Нашел в интернате вот эту функцию
miniShop2.Callbacks.Cart.add.response.success = function() {}
Вешаю ее на странице карточки товара. Но в консоль выводится это:
Uncaught ReferenceError: miniShop2 is not defined

Делаю для себя интернет магазин.

Буду благодарен за любую помощь :)
Абдулсалам
19 марта 2019, 06:56
modx.pro
1
682
0

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

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

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

Иван Климчук
13 марта 2019, 03:40
modx.pro
4
1 296
+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
21
1 312
+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 090
0