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


Пакет приобрёл 3 события плагинов и научился запоминать код ответа сервера при обращении к УРЛ.
Это круто по ряду причин:
  • Можно внедрить свою логику в процесс парсинга,
  • Можно совершать кастомные действия на сайте, в зависимости от получаемых данных при парсинге,
  • К примеру, если сервер отдал 301/302 редирект или 404 ошибку при обращении к УРЛу подзадания, то мы можем отключить этот ресурс с публикации вовсе.
  • Всё ограничивается вашей степенью извращённости фантазией!

Список событий плагинов


  • xParserOnBeforeTaskParse
    После получения данных страницы и разбора её на список статей для парсинга. Перед обработкой списка полей.
    Параметры:
    1. xParser $xp — экземпляр основного класса компонента,
    2. xpParser $parser — экземпляр класса парсера,
    3. array $task — массив задания,
    4. array $items — массив со списком необработанных статей,
    5. array $fields — массив со списком полей для обработки статей и получения необходимых данных.
     
  • xParserOnTaskItemParse
    После обработки списка полей. Перед получением данных из подзадания, если таковое есть.
    Параметры:
    1. xParser $xp — экземпляр основного класса компонента,
    2. xpParser $parser — экземпляр класса парсера,
    3. array $task — массив задания,
    4. string $item — строка с необработанным кодом статьи,
    5. array $row — массив с обработанными полями статьи.
     
  • xParserOnBeforeTaskActions
    После формирования списка статей с данными из подзаданий. Перед добавлением ресурсов.
    Пожалуй, самое интересное событие, т.к. позволяет менять данные у статей либо вообще остановить задание парсинга, ничего при этом не добавив.
    Параметры:
    1. xParser $xp — экземпляр основного класса компонента,
    2. xpParser $parser — экземпляр класса парсера,
    3. array $task — массив задания,
    4. array $rows — массив со списком обработанных статей.
     

Пара примеров


  1. Остановим парсер, ничего при этом не добавив.
    switch ($modx->event->name) {
        case 'xParserOnBeforeTaskActions':
            $modx->event->output('Не хочу это парсить!');
            break;
    }
     
  2. Отключим публикацию ресурса, если код ответа сервера был 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;
    }
     
P.S. За обновление благодарить Александра Чудинова!
Павел Гвоздь
25 июня 2018, 18:31
1
671
+3
Поблагодарить автора Отправить деньги

Комментарии: 9

Андрей
25 июня 2018, 23:24
+1
Очень круто! Спасибо за обнову!
Алексей
02 октября 2018, 14:08
0
Как используя плагины, преобразовать корректно ответ сервера, имеется заголовок:
HTTP/1.1 200 OK
Content-Type: text/html; charset=windows-1251
ну и соответсвенно в распарсенных полях полный бардак с кодировкой русских букв
    Павел Гвоздь
    02 октября 2018, 16:20
    0
    Вам надо кодировку источника Windows-1251 конвертировать в UTF-8? Есть нативный функционал у xParser:
      Алексей
      03 октября 2018, 09:07
      0
      Всё увидел! всегда была настройка на виду, ведь -).
      Только если я ставлю windows-1251 ещё больше кракозябр появляется на месте русских букв (в 2-3 раза). Попробовал декодер лебедева, он мне написал что это CP-1251->UTF-8, и декодировал правильно.
      Все таки через плагин никак не поиграться с кодировкой?
        Павел Гвоздь
        03 октября 2018, 09:10
        0
        Через плагин можно думаю. Читайте доку.
        И почему не пишете в ТП Модстор? Там можно было бы скинуть доступы, я бы посмотрел в чем дело.
          Алексей
          03 октября 2018, 12:18
          +1
          Через ТП Модстор не получилось связаться, в итоге решил вот так:
          1. добавим модификатор феном iconv:
          $fenom->addModifier('iconv', function ($str,$to_encoding,$from_encoding ) {
                      return mb_convert_encoding($str, $to_encoding, $from_encoding);
                      //return iconv($in_charset, $out_charset, $str);
                  });
          2. в «Редакторе поля задания» в строке «Поле в источнике» используем fenom для преобразования кодировки распарсенного поля при записи его в поле modResource, в примере поле modReource.pagetitle:
          @INLINE {$pagetitle|iconv:'CP1251':'utf-8'}
          3. Всё. При этом не очень удобно просматривать поля в «Списке данных источника» – потому как они отображаются кракозябрами.
          PS: видимо у меня сайт для парсинга попался какой-то уникальный, потому как настройка «Кодировка страницы» в окошке «Редактировать HTML задание» не решала вопрос – все русские буквы всё равно были не читаемы.
          PSS: похоже события плагинов xparser'а не работают на процессор mgr/field/test при проверке полей, только при создании ресурса.
Konstantin
11 февраля 2019, 08:08
0
А как можно пропускать элемент по условию? Ну то есть, если импортируем товары из прайса, и у каждого есть поле stock со значением 0 или 1?.. Пробовал через феном типа
{if $stock == '1'}
    1
{else}
{/if}
и в настройках поля ставил галочку «Поле должно быть обязательно заполнено», думая, что если поле пустое из-за того что $stock = 0, то парсер просто пропустит этот элемент и пойдет дальше. Но нет :-(
    Павел Гвоздь
    11 февраля 2019, 11:57
    +1
    Думаю, примерно так:
    $sp = &$scriptProperties;
    switch ($modx->event->name) {
        case 'xParserOnBeforeTaskActions':
            foreach ($sp['rows'] as &$row) {
                $row['Resource'] = [];
            }
            unset($row);
            $modx->event->returnedValues = ['rows' => $sp['rows']];
            break;
    }
Sergey
29 марта 2019, 18:00
0
Как правильно настроить парсер товаров для miniShop2?
делаю на тестовом, подробной инструкции нет, та что есть не работает
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.