Воеводский Михаил

Воеводский Михаил

Был в сети 30 марта 2026, 14:44
Заказы не принимаю
Василий Наумкин
Василий Наумкин
У меня все письма перед отправкой проходят через 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) Банальный рейтинг. На сколько я помню рейтинг от 30 и выше дает право писать на главную. Мне не охота писать вещи в вопросы, которые сгенерируют еще больше вопросов.
2) Тема фронта ОЧЕНЬ обширная и еще не решил с чего начать: с генераторов yoeman и modExtra на них прокачанной несколько тупо чтобы привлечь внимание, или все же начать с действительно с тех тем, которые доставляют неимоверный фан.
3) Меня все мучает делемма. В реальности сейчас лучше всего работают сайт с
<body>/*тут возможен максимум счетчик*/</body>
Внутрь body начинает все асинхронно подгружаться и получается красиво и очень быстро… Хотя кому я это говорю :-) Все это тебе известно, т.к. достаточно вспомнить, что ты автор office с его контроллерами у которых принцип тот же. Тем не менее назревает проблема в том, что получается то, что у нас всего один шаблон и туча чанков, а это несколько выходит за рамки обычного алгоритма написания сайтов на MODX… Но и другой вопрос, что тут нужна база JS какая-то, а с этим туговато я смотрю у многих. Собственно по большей степени из-за этого сейчас и думаю на счет того, что сделать отправной точкой не банальной, но полезной.

P.S. Кстати, хоть у вас тут редактирование комментариев работает мне не одного оповещения не пришло про ответы. Извините за тормоза.
Andrei D.
Andrei D.
На самом деле это реализуется за несколько часов
Вот примерная простейшая архитектура без излишеств:

1. Своя кастомная таблица с полями [key][name][unit][max_manual][max_mech][max_mats], в которую можно все наименования работ с экселя закинуть
2. Сверху формы добавления:
<input class="search-input" type="text" name="task_key" placeholder="Номенклатура"/>
<input class="search-input" type="text" name="task_name" placeholder="Наименование"/>
3. Сразу под поиском:
<div class="search-items"></div>
<ul class="added-items"></ul>
4. Создать страницу с пустым шаблоном для ajax запросов, например, website.com/app, в которую поместить сниппет обработки запросов, в самом сниппете на $action повесить case «search» «select» «create»
5. Добавить скрипт, который на onchange .search-input ловит $(this).attr('name') + $(this).val() и с action «search» направляет всё на /app «search» и возвращает найденные строки, джойнит их и оборачивает, например, в
<button class="selector-item" type="button" val="id_работы" style="width:100%;display:block">наименование работы</button>
6. На клик по .selector-item направить $(this).val() на сниппет с case «select», возвращать отдельную работу, например, так:
<li class="item" data-item="id_работы">
<span>* Наименование *</span><span>* Номенклатура *</span>
<span class="small">MAX ручной труд: *стоимость* / механический труд: *стоимость* / материалы: *стоимость*</span>
<input type="text" placeholder="Фактическая стоимость" value="* в сниппете сложить общую стоимость *"/>
<button type="button"><i class="fa fa-remove"></i></button>
</li>
далее брать стоимость работы по умолчанию и складывать со значением .total-sum
7. Повесить скрипт на на onchange стоимости для каждой добавленной работы и пересчитывать со значением .total-sum
8. После списка добавленных работ:
<div class="form">
<h3>Общая стоимость: <input type="hidden" class="total-sum" value="0"/><span class="total-sum">0</span></h3>
<h4>Данные заказчика</h4>
<label>ФИО заказчика</label><input type="text" name="order-name" placeholder="ФИО заказчика"/>
<label>Телефон</label><input type="text" name="order-phone" placeholder="Телефон"/>
адрес объекта и т.д.
<button type="button" class="create-order">Сохранить</button>
</div>
9. По кнопке .create-order скрипт джойнит добавленные значения из .added-items, и вместе с данными формы отправляет на /app «create»
10. Для «create» нужно создать вторую кастомную таблицу заказов с полями [order_id][works][customer_name][customer_phone][...][date_added], где «works» это список работ в json формате с idx ключом для возможности редактирования данных в будущем

Далее подперчить скриптами, сделать страницу вывода заказов и вроде всё ок

p.s. про единицу измерения не понял
p.s.s. можно вообще без добавления $action case «select» и просто объединить html из пунктов 5 и 6 в каждом результате, а уже стилями ненужное скрывать. Тогда при добавлении просто клонировать объект и подставлять в .added-items, где скрыта кнопка добавления…
Fi1osof
Fi1osof
Если ключ не хотите светить, то однозначно запрос надо слать с вашего сервера на донора. В MODX есть готовый CURL-клиент. Вот код для примера:
$client = $modx->getService('rest.modRestCurlClient');
$result = $client->request('https://ya.ru', '/', 'POST', $params = array('foo'  => 'foo'));
print $result;
Можете с этим кодом к консоли поиграться.
Fi1osof
Fi1osof
Теперь я забегу немного вперёд и скажу...

На это было сказано выше.
3. Плата за дополнения дает право на поддержку автора дополнения. Если не оплатил дополнение (получил в составе сборки) — то и поддержки нет. Нужна поддержка? — оплати дополнение и в путь...

P.S. Я выше предложил единственный и верный вариант, когда все будут довольны и покупатель будет с техподдержкой...
Даже я стараюсь избегать утверждений на счет единственно важных и верных вариантов. Не понимаю, на основе чего можно утверждать, что ваш вариант единственный правильный. Зато можно усмотреть в ваших комментариях просто нежелание того, чтобы на свет еще появились какие-то сборки. Судя по количеству скачиваний вашей платной сборки, рынок пока не велик и профиты далеки от желаемых, а появление еще одного игрока может сказаться падением и без того низких показателей. Конечно все может и не так, но вероятность есть.

Я же вижу все это по-другому. Если есть интерес к каким-то компонентам, надо изучать возможные пути их использования. Человек хотя бы пришел и задал вопрос на счет этого, а не сразу выкатил свое решение, а там хоть трава не расти. При правильном подходе может быть популяризация компонентов и технологий, а это в любом случае положительно. У меня сборка ShopModxBox вообще бесплатно распространяется, и ничего. А если следовать вашему единственно верному варианту, то скорее всего будет так, как
написали ниже:
Пиши свои. =)
К чему это приведет?
1. Увеличению издержек, а значит и увеличению стоимости продукта для конечного клиента.
2. Появление новых аналогов уже готовых продуктов. А это, во-первых, не факт, что качественней будет. Во-вторых, снижение доходов их разработчиков, которые уже меньше калорий будут тратить на их развитие.
В итоге будет 100500 аналогов среднего качества, вместо качественных специализированных популярных решений.

В общем, лично я считаю, что вопрос поднят правильный, и его надо внимательно изучать. И как мне видится, самое лучшее что здесь можно сделать — это в modstore.pro добавить партнерку. Вот тогда больше шанс, что интересы всех будут учтены и все будут довольны. Автор сборки сможет по своей партнерке распространять чужие платные компоненты со скидкой. Авторы компонентов будут получать отчисления автоматически. Клиенты смогут обратиться за поддержкой, так как в тикетной системе будет информация о продаже компонента.
Ганин Роман
Ганин Роман
Начало разработки — за пределами MODX. Вёрстка (БЭМ) шаблонов, чанков и страниц в Sublime Text 3 с использованием Gulp-задач для автокомпиляции с использованием пре- и постпроцессоров (ускоряют разработку в 4-5 раз), зависимости: bower, для UI-тестов адаптивности: BrowserSync. Минификация стилей и скриптов на клиенте (прекратите вешать эту задачу на MinifyX/сервер!). Кодстайл: CSScomb и JSCS + JSLint. В дальнейшем можно настроить автоматическую выгрузку по SFTP скомпилированных файлов прямо на сервер. Шаблонизация на клиенте легко настраивается с помощью gulp-rigger, gulp-file-include или gulp-include-source. За счет вотчеров скорость просто реактивная. Особенно удобно, если монитора два и больше — в одном мониторе код проекта, в остальных — мгновенный результат (страница обновляется быстрее, чем я успеваю перевести взгляд с одного монитора на другой или переключиться на новый раб. стол).
Инициализация сервера: ansible, установка MODX: Gitify, импорт настроек: Teleport. Импорт уже подготовленных чанков, tpl-ек занимает минуты, нет необходимости заниматься «клавадрочерством» с Ctrl+Tab (переключиться на фронтенд-вкладку), Ctrl/Cmd+R (обновить страницу), чтобы просмотреть результат — всё уже оттестированно на этапе вёрстки. Остаётся только настроить магию сниппетов и оформить Custom Forms. Дальше — оверлокинг с XDebug, debugParser, BloodLine и Chrome DevTools.