Fi1osof 15 октября 2016 2 0
Вот на решение этой задачки я убил сегодня три часа… Настраивал сегодня экспорт-импорт большого каталога с помощью modImporter-а. На формирование Эксель-файла импортеру чуть-чуть не хватало 30-ти секунд. Ну я не стал заморачиваться с оптимизацией, а просто решил поднять тайм-лимиты серверу. У меня связка nginx+php-fpm, прописал где надо конфиги (точнее в паппет-скрипт настройки сервера) и такой думаю всё, сейчас попрет. Но не тут-то было… Запрос по прежнему отваливался на 30 сек. Я уже конфиги и так, и эдак перекрутил, вроде все нормально, но все равно нет результата. Я начал грешить уже на MODX, может он что устанавливает (ведь есть у него системная настройка upload_maxsize для контроля веса загружаемых файлов, почему не иметь ему настройку на max_execution_time?). Но нет, перепроверил, все ОК с этим, ничего он не устанавливает. И тут я заподозрил неладное с самими Ajax-запросами… Вот здесь-то целый рассадник, как оказалось… Думаю, я только часть нашел. Судя по тому, какой там беспорядок, ограничений этих куча где прописано…

Во-первых, Ext.Ajax.timeout. По-умолчанию задано 30000 (в мсек). То есть Ext.Ajax.request() (как и MODx.Ajax.request()) отвалится через 30 секунд. Хотите, чтобы не отваливался — Пропишите Ext.Ajax.timeout = 0;

Во-вторых, Ext.Updater. Он используется у нас в компоненте Console, в котором так же запросы отваливались через 30 секунд (позже выпущу обновленную версию, если кому срочно — вот ревизия). У него тоже timeout прописан, только уже в секундах (по умолчанию 30 задано). Что примечательно, не смотря на то, что этот апдейтер запросы шлет через Ext.Ajax (в котором, напомню, прописан дефолтный лимит в 30 сек), зачем-то разрабам Экста захотелось в него тоже прописать эту настройку. joxi.ru/Q2KndEBs9YN8lm

В-третьих, Ext.form.BasicForm тоже имеет параметр timeout! (тоже в секундах). Этот объект формы используется в MODx.Window и Ext.form.FormPanel (и в итоге у нас в modImporter). Вот прежде чем отправлять запрос через form.getForm().submit(), надо этому объекту формы лимит тоже сбросить.

Короче, не получается в JS в одном месте лимит задать и радоваться. Для нескольких разных приложений может понадобиться сбросить лимиты в разных местах.

P.S. обновленный modImporter-1.6.3 без тайм-лимитов тоже выложил.
Fi1osof 11 апреля 2016 3 3
Материал для экспертов.

Вообще с этой задачей бился не один год, и вот только сегодня победил…
Задача: средствами xPDO в запрос добавить подзапрос, то есть еще один select. Пример такого запроса:
SELECT modResource.* 
    FROM 
        `modx_site_content` AS `modResource` 
        inner join 
            (select * from modx_users) `t1` 
            ON modResource.createdby = t1.id


Вообще, если у кого-то есть свои варианты решения данной задачи, напишите в комментариях, было бы интересно глянуть.
Fi1osof 26 марта 2016 5 5
Расширения кругозора пост. Просто для демонстрации того, что можно делать с помощью xPDO, без задействования процессоров.

Задача стоит такая: есть каталог с вложенностью Каталог-Раздел-Товар. У большинства товаров в ТВ-поле указан производитель. Надо пройтись по всем товарам во всех разделах, создать в родительском разделе документ-производитель и «переместиться» в него. Конечно же на каждой итерации надо проверять есть ли уже такой родитель-производитель или нет. Если есть, то просто в него «перемещаться». Предлагаю внимательно изучить представленный код.
Fi1osof 21 марта 2016 0 0
Совсем коротка заметка, но может много кому пригодиться.

Возникла задача импортировать каталог со стороннего ресурса, и там используется авторизация. Простой запрос по УРЛу типа protocol://user:pass@host/path/ не прошел. Вот решил заюзать для этого родной MODX-овый cURL-клиент. Оказалось все очень просто:


$filename = 'test.txt';
$path = MODX_BASE_PATH;
$file = "{$path}{$filename}";
$user = 'user';
$pass = 'xxx';
$url = 'http://some.host';
$url_path = "/export/v2/catalogue/{$filename}";
$client = $modx->getService('rest.modRestCurlClient');
if(
    $result = $client->request($url, "/export/v2/catalogue/{$filename}", 'GET', array(), $params = array(
        modRestClient::OPT_USERPWD => "{$user}:{$pass}",
    ))
    AND file_put_contents($file, $result)
){
    print_r($result); // Debug
}
else{
    
    print "Не удалось скачать файл"
} 
astrodeep 22 января 2016 0 1
Приветствую, не подскажите как вывести условие для определенного id страницы и всех ее дочерних ресурсов. В дополнении if что то не нашел такого-
только опр id

[[If?
   &subject=`[[*id]]`
   &operator=`inarray`
   &operand=`5`
   &then=`блалала`
]]


Заранее благодарю
Tramp1357 27 декабря 2015 1 17
Всем добрый день.
Кто не в курсе, не за горами выпуск Bootstrap 4. Они решили перейти на SASS, в связи с чем встает проблема компиляции.

Я обшарил интернет, вариантов компиляторов немного, и ни одна PHP библиотека из найденных, несмотря на то, что они нормально работают с простыми файлами, не смогла скомпилировать bootstrap.scss
Подобная проблема у меня возникала в свое время и при поиске компилятора для less, способного переварить ядро bootstrap.

В конечном итоге все-решение все-таки нашлось: https://github.com/shlomohass/LibSassPHP

Правда, тут модуль PHP, и не всем получится его использовать (например, на виртуальных хостингах), но зато он легко скомпилировал ядро bootstrap,
и теперь можно спокойно наслаждаться работой с .scss, грамотно изменяя css-правила под себя.

Fi1osof 26 ноября 2015 2 0
Довольно интересная задачка сегодня встала: есть каталог с радиаторами и вентилями (различаются по шаблону). В каталоге есть возможность вывести отдельно радиаторы, отдельно вентили, а можно сразу выводить все товары скопом. Так вот, возникла задача фильтровать радиаторы по отдельным параметрам, при этом иметь возможность выводить сразу и товары, и вентили. При этом у вентилей, понятное дело, даже нет тех параметров, по которым будут фильтроваться радиаторы. Как же сделать выборку так, чтобы учесть условия отдельно для радиаторов, отдельно для вентилей, и при этом иметь общие условия (опубликован, не скрыт в меню, не удален), да еще и не плодить SQL-запросы?
Fi1osof 22 ноября 2015 3 29
В последнее время все чаще стали обращаться клиенты с вопросами по оптимизации сайта по Google PageSpeed Insights. То есть они заходят на этот сервис, вбивают адрес своего сайта и получают примерно такой результат:

Fi1osof 17 ноября 2015 1 0
Продолжая тему SQL-запросов, хочу показать еще один запрос. Задача стоит в том, чтобы подсчитать количество пришедших клиентов по всем заявкам. В нашем случае флаг клиента — это значение idbid > 0. Вот, собственно, такой запрос получился:
SELECT 
    count( * ) , 
    count( `idbid` ) , 
    count( `idbid` >0 ) , 
    count( if( idbid >0, 1, NULL ) ) , 
    sum( `idbid` ) , 
    sum( `idbid` >0 ) , 
    `idbid` >0 , 
    `operatorbid`
FROM `ххххххх`
GROUP BY `operatorbid`
Fi1osof 15 ноября 2015 2 0
В продолжение предыдущего топика про сложные SQL-запросы, хотел бы поделиться свежим опытом.

Сегодня на нашем сайте Клуба я решил сделать одну полезную штуку для себя — на страницах топиков и тегов выводить информацию о сопутствующих услугах.

Справедливости ради сразу замечу, что данная «реклама» выводится только топиках, написанных мною, и не паразитирует на чужих топиках.

В целом все логично: есть какая-то статья, описывающая произвольную проблему, и есть соответствующая этой проблеме услуга. К примеру, проблема «тормозит сайт», услуга «техническая оптимизация сайта». Собственно, все что здесь нужно — это прописать желаемые теги в документах услуг, а при заходе на страницу мы выполняем поиск этих услуг по тегам текущего документа-топика (а теги у нас заполнены во всех топиках). И вот здесь есть ряд тонкостей, о которых я и расскажу ниже.