[xParser] 1.6.3 События плагинов для кастомной логики и код ответа сервера

Пакет приобрёл 3 события плагинов и научился запоминать код ответа сервера при обращении к УРЛ.
Это круто по ряду причин:
- Можно внедрить свою логику в процесс парсинга,
- Можно совершать кастомные действия на сайте, в зависимости от получаемых данных при парсинге,
- К примеру, если сервер отдал 301/302 редирект или 404 ошибку при обращении к УРЛу подзадания, то мы можем отключить этот ресурс с публикации вовсе.
- Всё ограничивается вашей
степенью извращённостифантазией!
Список событий плагинов
xParserOnBeforeTaskParse
После получения данных страницы и разбора её на список статей для парсинга. Перед обработкой списка полей.
Параметры:
- xParser $xp — экземпляр основного класса компонента,
- xpParser $parser — экземпляр класса парсера,
- array $task — массив задания,
- array $items — массив со списком необработанных статей,
- array $fields — массив со списком полей для обработки статей и получения необходимых данных.
xParserOnTaskItemParse
После обработки списка полей. Перед получением данных из подзадания, если таковое есть.
Параметры:
- xParser $xp — экземпляр основного класса компонента,
- xpParser $parser — экземпляр класса парсера,
- array $task — массив задания,
- string $item — строка с необработанным кодом статьи,
- array $row — массив с обработанными полями статьи.
xParserOnBeforeTaskActions
После формирования списка статей с данными из подзаданий. Перед добавлением ресурсов.
Пожалуй, самое интересное событие, т.к. позволяет менять данные у статей либо вообще остановить задание парсинга, ничего при этом не добавив.
Параметры:
- xParser $xp — экземпляр основного класса компонента,
- xpParser $parser — экземпляр класса парсера,
- array $task — массив задания,
- array $rows — массив со списком обработанных статей.
Пара примеров
- Остановим парсер, ничего при этом не добавив.
switch ($modx->event->name) { case 'xParserOnBeforeTaskActions': $modx->event->output('Не хочу это парсить!'); break; }
- Отключим публикацию ресурса, если код ответа сервера был 301, 302, 404.
$sp = &$scriptProperties; switch ($modx->event->name) { case 'xParserOnBeforeTaskActions': foreach ($sp['rows'] as &$row) { $resource = &$row['Resource']; // Если код ответа 301, 302, 404 if (in_array($row['Request']['http_code'], array(301, 302, 404))) { $resource['published'] = 0; // присвоим ресурсу published = 0 } } unset($resource, $row); $modx->event->returnedValues = $sp; // передаём измененённые значения обратно break; }
Комментарии: 24
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
ну и соответсвенно в распарсенных полях полный бардак с кодировкой русских букв
Только если я ставлю windows-1251 ещё больше кракозябр появляется на месте русских букв (в 2-3 раза). Попробовал декодер лебедева, он мне написал что это CP-1251->UTF-8, и декодировал правильно.
Все таки через плагин никак не поиграться с кодировкой?
И почему не пишете в ТП Модстор? Там можно было бы скинуть доступы, я бы посмотрел в чем дело.
1. добавим модификатор феном iconv:
2. в «Редакторе поля задания» в строке «Поле в источнике» используем fenom для преобразования кодировки распарсенного поля при записи его в поле modResource, в примере поле modReource.pagetitle:
3. Всё. При этом не очень удобно просматривать поля в «Списке данных источника» – потому как они отображаются кракозябрами.
PS: видимо у меня сайт для парсинга попался какой-то уникальный, потому как настройка «Кодировка страницы» в окошке «Редактировать HTML задание» не решала вопрос – все русские буквы всё равно были не читаемы.
PSS: похоже события плагинов xparser'а не работают на процессор mgr/field/test при проверке полей, только при создании ресурса.
и в настройках поля ставил галочку «Поле должно быть обязательно заполнено», думая, что если поле пустое из-за того что $stock = 0, то парсер просто пропустит этот элемент и пойдет дальше. Но нет :-(
делаю на тестовом, подробной инструкции нет, та что есть не работает
tuk33vlОтличное обновление, как раз вовремя.
Нам нужно на этапе парсинга, когда все данные с 2 заданий (основное и подзадание) собраны, применить некие изменения по нашей логике.
Вся логика работает, а вот как передать эти измененные даные далее — не пойму.
Взяли из примера вашего такую команду, но она не сработала у нас
Плагин пишем на событие xParserOnBeforeTaskActions
tuk33vlЭто как мы поняли вообще останавливает задание, а нужно пропустить текущий и перейти к следующему ресурсу, по условию.
tuk33vltuk33vlP.S. У данного компонента есть Техподдержка в Modstore, там я могу помочь с таким небольшим куском кода.
tuk33vltuk33vlДа и мы просим вас не решить задачу целиком, а лишь помочь в ее решении, ведь вы наверняка видите в чем проблема, просто вы не хотите помогать — так скажите это прямо, а не завуалированно про покупки и прочие вещи.
Я сам решу, как мне это говорить, прямо или криво. Не надо указывать мне, что делать и как это делать.
И видимо мои слова «я не вызывался писать код за вас» это завуалировано, ок…
Я уже написал в чём проблема:
P.S. Попробуйте работать с записями в цикле… И это $row['Resource'] = []; не есть «вырезать».
tuk33vlПодскажите что означают эти 2 строки, ведь unset делается в любом случае…
Не надо гнать на сообщество, общайтесь с автором в специально придуманном для этого месте.
tuk33vlА это место для чего придумано? Чтобы здесь помощь получить или восхвалять затянувшиеся на 10 лет работы по MODX 3?