Павел Гвоздь

Павел Гвоздь

С нами с 31 мая 2015; Место в рейтинге пользователей: #2
Василий Наумкин
26 ноября 2018, 07:29
6
+4
У меня все письма перед отправкой проходят через 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);
    }
Марат Марабар
23 июля 2018, 19:04
1
+2
Вместо картинки лучше бы код запостил из блока Ext.applyIf
По идее должно как-то так быть
autoHeight: false,
height: 400
Володя
02 июля 2018, 12:03
2
+4
$c = $modx->newQuery("modUser");
$alias = $modx->getTableName("modUser");
$c->setClassAlias($alias);
$c->where(array(
    "{$alias}.active" => 0,
    "{$alias}.createdon:<"  => strtotime('-365 day')
    
));
$c->query['command']= "DELETE {$alias}";
$c->prepare();
$c->stmt->execute();
Pashkevich Aleksandr
07 августа 2017, 23:01
1
+3
Здравствуйте.
Касаемо эластика, да его можно использовать, только сейчас он стал прожорлив и ему нужно минимум 32гб оперативки, ну для 5млн товаров возможно и 64гб нужно.
Но если у Вас будет такая машина и всё ограничится примерно 5млн, то имеет смысл сделать одну таблицу в которую прописать все параметры, при этом задать тип ENUM для параметров цвет, размер и т.п.
У нас на одном проекте поиск по 20млн товаров с прописанными ключами работал меньше чем за секунду. Правда не было необходимости строить фильтры на лету, возможно имеет смысл кэшировать фильтры до обновления товаров. Там сервер был вот с такими характеристиками, если я правильно помню: image.prntscr.com/image/mdWNvaXmRFCKQNoPjWQXcg.png
Хотя эластик это сразу готовая система поиска для сайта, так же благодаря Terms из эластика будут фильтры готовы прям из запроса.
Владимир
09 февраля 2017, 17:57
2
+1
Странно что не пишет ни кто об использовании пользовательских заголовков которые можно указать в типах содержимого.
Создал новый тип содержимого (contenttype) с пустым расширением файла (без .html) и указал
Cache-Control: max-age=3600, must-revalidate
на вкладке

и кеширование в браузере можно выставить нужное.
Василий Наумкин
06 сентября 2016, 10:40
3
+1
Ну тогда rewrite должен решить все твои проблемы.
location ~* ^/en/assets/images/ {
    rewrite	^/en/assets/images/(.*)    /assets/images/$1 permanent;
}

Кстати, можно сделать еще круче — без редиректа, а просто подставляя нужную директорию, вот так:
location ~* ^/en/assets/images/(.*) {
    alias /полный_путь_к_файлам_от_корня_сервера/assets/images/$1;
}
Fi1osof
07 января 2016, 11:57
20
+12
Если ключ не хотите светить, то однозначно запрос надо слать с вашего сервера на донора. В MODX есть готовый CURL-клиент. Вот код для примера:
$client = $modx->getService('rest.modRestCurlClient');
$result = $client->request('https://ya.ru', '/', 'POST', $params = array('foo'  => 'foo'));
print $result;
Можете с этим кодом к консоли поиграться.
Василий Наумкин
12 августа 2015, 09:22
4
0
Вот 2 правила для Nginx: первое пропускает превьюшки, а второе запрещает открывать в галерее всё кроме них
location ~* ^/assets/images/products/\d+/\d+x\d+/ {
	access_log		off;
	expires			10d;
	break;
}

location ~* ^/assets/images/products/\d+/ {
	deny			all;
}
Наверное, можно и как-то красивее написать, но я не придумал.

Теперь никто не откроет полноразмерные картинки, и ты можешь отдавать их через PHP покупателям.
Василий Наумкин
21 июля 2015, 12:42
4
+3
<?php
if ($modx->event->name != 'OnDocFormPrerender' || $resource instanceof Ticket || $resource instanceof TicketsSection) {
    return;
}

if ($Tickets = $modx->getService('Tickets')) {
    $modx->controller->addLexiconTopic('tickets:default');
    
    $Tickets->loadManagerFiles($modx->controller, array(
        'config' => true,
		'utils' => true,
		'css' => true,
		'comments' => true,
    ));
    
    $insert = '
		tabs.add({
			title: _("comments"),
			items: [{
				xtype: "tickets-panel-comments",
				hidden: false,
				record: ' . $modx->toJSON($resource->toArray()) . ',
				parents: ' . $resource->id . ',
			}]
		});
	';
	if ($modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
		$modx->controller->addHtml('
		<script type="text/javascript">
			Ext.onReady(function() {
				window.setTimeout(function() {
					var tabs = Ext.getCmp("modx-resource-tabs");
					if (tabs) {
						' . $insert . '
					}
				}, 10);
			});
		</script>', true);
	}
	else {
		$modx->controller->addHtml('
		<script type="text/javascript">
			Ext.ComponentMgr.onAvailable("modx-resource-tabs", function() {
				var tabs = this;
				tabs.on("beforerender", function() {
					' . $insert . '
				});
			});
		</script>', true);
	}
}
Может и включу потом, да. Но пока это твой эксклюзив =)
Ганин Роман
24 апреля 2015, 22:57
11
+2
Начало разработки — за пределами 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.