Плагин для обновления таблицы товаров MODx Revo

#MODx, #MODx Revo, #разработка
Плагин для обновления таблицы товаров MODx Revo

При использовании произвольной таблицы для хранения товаров в MODx Revo рано или поздно возникнет потребность в пакетном изменении цен или добавлении новых товаров (особенно, когда нужно заполнять большое количество инфо-полей у товара). У администратора сайта, ответственного за контент, должен быть удобный инструмент, позволяющий указать файл с данными для обработки или ввести их в текстовое поле. Свой велосипед для чтения данных и оформления интерфейса в админке можно не писать, а взять за основу готовый, проверенный временем плагин ImportX. Дополнение предназначено для обновления и создания ресурсов по данным из файла или текстового поля и имеет необходимый для нас интерфейс, остается только изменить алгоритм обработки данных.

интерфейс бэкэнда для импорта данных

Что понадобится сделать, чтобы подогнать ImportX под свои нужды:

  1. Скачиваем и устанавливаем ImportX.
  2. Находим в дереве файлов скрипт core/components/importx/processors/startimport.php.
  3. Комментируем $processor = 'resource/'.$modx->getOption('importx.processor',null,'create'); - нам не понадобится этот обработчик
  4. Сразу после этого подключаем класс для работы с данными из нашей произвольной таблицы:
    1. $path = MODX_CORE_PATH . 'components/shop/';
    2. $result = $modx->addPackage('shop',$path . 'model/','site_prefix_');
    3. if (! $result) {
    4. return 'failed to add package';
    5. }
    components/shop/ - относительный путь, где лежит класс для работы с таблицей,
    site_prefix_ - префикс в базе данных для всех таблиц текущего экземпляра MODx.
  5. В цикле foreach ($lines as $line) { комментируем строчку $response = $modx->runProcessor($processor,$line); - нам не нужно, чтобы ImportX создал новый документ в дереве ресурсов по введенным данным. И вставляем в этом цикле свою обработку для $line, где $line - массив колонок одной строчки из загруженной для импорта таблицы с данными. Обработка может иметь примерно такой вид:
    1. $item = $modx->getObject('Shop', array('article' => $line['article']));
    2. if ($item == null){
    3.     if (!isset($line['resource_id']) || !isset($line['pagetitle'])){
    4.         $this->modx->importx->log('info', 'Товар с арктикулом '.$line['article'].' не был найден и не может быть добавлен в базу данных, т.к. у него не указан id родительской категории и название товара');
    5.         continue;
    6.     }
    7.     $this->modx->importx->log('info', 'Элемент с арктикулом '.$line['article'].' не был найден и попытается быть создан и добавлен в базу данных');
    8.     $item = $modx->newObject('Shop');
    9.     $item->set('article', $line['article']);
    10.     $item->set('published', 1);
    11. }
    12. foreach($line as $col => $value){
    13.     if ($col == 'article') continue;
    14.     $item->set($col, $value);
    15.     if ($item->save() == false){
    16.         $this->modx->importx->log("error", "Не удалось обновить поле $col у элемента с артикулом ".$line['article']);
    17.     }
    18. }
  6. В файле core/components/importx/processors/prepare/csv.php задаем список полей, которые могут заданы в файле с данными для импорта. Для этого находим комментарий Validate the headers... и задаем в массив $fields нужные нам поля.
  7. В случае входной кодировки, отличной от UTF-8, можно изменить файл core/components/importx/model/importx/importx.class.php, добавив код для конвертации входных данных в нужную кодировку, в методе public function getData после чтения файла:
    if( mb_check_encoding( $data, 'Windows-1251') === TRUE ){
       $data = mb_convert_encoding( $data, 'UTF-8', "Windows-1251" ); 
    }
        

Поделиться в соцсетях:

Статьи по теме