Алексей Шумаев

Алексей Шумаев

Был в сети Вчера в 09:45
Заказы принимаю
Алексей Шумаев
Алексей Шумаев
Согласен.

Кстати, есть нюанс, о котором я забыл, хотя и собирался реализовать.
Он как раз касается и метрик.

Может возникнуть такая ситуация:
1. создали универсальную форму, которую менеджер пихает по статьям где надо
2. нужна эта же форма, но с другим названием/продающим тестом и метрикой
Сейчас, получается, нужно создавать дубль формы.
Чтобы этого избежать, нужно зашить в строку запуска формы дополнительные параметры, например: название формы или иные пользовательские переменные. Тут же можно передать и событие метрики.
Получится одна форма с вариантивностью метрик и с разными названиями, продающим текстом или т.п.
Я подумаю, как это реализовать удобнее. Отпишусь.
Баха Волков
Баха Волков
По моему совсем не с той стороны зашли, ведь нужен всего лишь функционал загрузки файлов. Вот пример метода в modx.tree.directory.js:

,uploadFiles: function(btn,e) {
        if (!this.uploader) {
            this.uploader = new MODx.util.MultiUploadDialog.Dialog({
                url: MODx.config.connector_url
                ,base_params: {
                    action: 'browser/file/upload'
                    ,wctx: MODx.ctx || ''
                    ,source: this.getSource()
                }
                ,cls: 'ext-ux-uploaddialog-dialog modx-upload-window'
            });
            this.uploader.on('show',this.beforeUpload,this);
            this.uploader.on('uploadsuccess',this.uploadSuccess,this);
            this.uploader.on('uploaderror',this.uploadError,this);
            this.uploader.on('uploadfailed',this.uploadFailed,this);
        }
        this.uploader.base_params.source = this.getSource();
        this.uploader.show(btn);
    }
Нужно создать кнопку которая бы вызывала данный метод и всё. Ну не совсем всё, а остальные методы ошибки, методы которые возвращают id нужного источника и т.д., но это куда лучше чем стилизовать combo
Василий Наумкин
Василий Наумкин
У меня все письма перед отправкой проходят через pelago/emogrifier — так что на расхождений в отображении почти нет.

Грузим свой почтовый класс раньше всех:
$modx->getService('mail', 'extraMail', 'path/to/class');

А в классе extraMail добавляем свою обработку:
<?php
if (!class_exists('modPHPMailer')) {
    /** @noinspection PhpIncludeInspection */
    require MODX_CORE_PATH . 'model/modx/mail/modphpmailer.class.php';
}

class extraMail extends modPHPMailer
{
    /** @var PHPMailer $mailer */
    public $mailer;
    
    /**
     * @param string $key
     * @param mixed $value
     */
    public function set($key, $value)
    {
        if ($key == modMail::MAIL_BODY) {
            $emogrifier = new \Pelago\Emogrifier($value);
            $value = $emogrifier->emogrify();
            $this->set(modMail::MAIL_BODY_TEXT, $this->mailer->html2text(nl2br($value)));
        }
        parent::set($key, $value);
    }
Сергей Шлоков
Сергей Шлоков
1. Создаёте плагин с любым именем и следующим содержанием
<?php
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
        /** @var Fenom $fenom */
        $fenom->addModifier('lcfirst', function ($input) {
           return mb_strtolower(mb_substr($input, 0, 1)) . mb_substr($input, 1);
        });

        break;
}
2. Отмечаете событие «pdoToolsOnFenomInit» на второй вкладке.
3. Сохраняете.
4. Пользуетесь.
Евгений Борисов
Евгений Борисов
Меня всегда выручает пакет github.com/hoaproject/File, если нужно прочитать очень большие файлы.
На его базе этого класса и функции simplexml_load_string легко делается разбор XML файлов любых объемов. Естественно, готовых решений вам никто не даст, т.к. все пишется исключительно под задачу.
Сергей Шлоков
Сергей Шлоков
Отсутствие фильтрации квадратных скобочек реально напрягает…
Ну вот откуда Вы это взяли? Евгений же всё внятно объяснил.

В идеале было бы как-то в одном месте все данные фильтровать по каким-то своим правилам. Типа такой общий шлюз, сначала данные через него проходят, а потом уже в сниппеты и компоненты. Но не знаю возможно ли это.
Без проблем. Плагин на событие OnMODXInit.
Сергей Шлоков
Сергей Шлоков
MODX фильтрует POST, GET, REQUEST, COOKIE в каждом запросе. Но этого, конечно, недостаточно. Фильтруйте сами. Например, так.

А ещё фильтруются эти значения
$targets= array ('PHP_SELF', 'HTTP_USER_AGENT', 'HTTP_REFERER', 'QUERY_STRING');
foreach ($targets as $target) {
    $_SERVER[$target] = isset ($_SERVER[$target]) ? htmlspecialchars($_SERVER[$target], ENT_QUOTES) : null;
}
Іван Клімчук
Іван Клімчук
В разделе Помощь modstore все же понятно написано
Также мы поддерживаем работу дополнений на поддомене dev. Сбрасывать ключ для такого домена не нужно — дополнения просто работают сразу на обоих доменах: site.ru и dev.site.ru.
Касательно моего подхода, у меня код сайта упаковывается в пакет (или несколько пакетов) и ставится через репозиторий. Вся работа локально, потом сборка, отправка в репозиторий, установка на продакшене.