При использовании произвольной таблицы для хранения товаров в MODx Revo рано или поздно возникнет потребность в пакетном изменении цен или добавлении новых товаров (особенно, когда нужно заполнять большое количество инфо-полей у товара). У администратора сайта, ответственного за контент, должен быть удобный инструмент, позволяющий указать файл с данными для обработки или ввести их в текстовое поле. Свой велосипед для чтения данных и оформления интерфейса в админке можно не писать, а взять за основу готовый, проверенный временем плагин ImportX. Дополнение предназначено для обновления и создания ресурсов по данным из файла или текстового поля и имеет необходимый для нас интерфейс, остается только изменить алгоритм обработки данных.
Что понадобится сделать, чтобы подогнать ImportX под свои нужды:
- Скачиваем и устанавливаем ImportX.
- Находим в дереве файлов скрипт
core/components/importx/processors/startimport.php
. - Комментируем
$processor = 'resource/'.$modx->getOption('importx.processor',null,'create');
- нам не понадобится этот обработчик - Сразу после этого подключаем класс для работы с данными из нашей произвольной таблицы:
- $path = MODX_CORE_PATH . 'components/shop/';
- $result = $modx->addPackage('shop',$path . 'model/','site_prefix_');
- if (! $result) {
- return 'failed to add package';
- }
components/shop/
- относительный путь, где лежит класс для работы с таблицей,
site_prefix_
- префикс в базе данных для всех таблиц текущего экземпляра MODx. - В цикле
foreach ($lines as $line) {
комментируем строчку$response = $modx->runProcessor($processor,$line);
- нам не нужно, чтобы ImportX создал новый документ в дереве ресурсов по введенным данным. И вставляем в этом цикле свою обработку для $line, где $line - массив колонок одной строчки из загруженной для импорта таблицы с данными. Обработка может иметь примерно такой вид:- $item = $modx->getObject('Shop', array('article' => $line['article']));
- if ($item == null){
- if (!isset($line['resource_id']) || !isset($line['pagetitle'])){
- $this->modx->importx->log('info', 'Товар с арктикулом '.$line['article'].' не был найден и не может быть добавлен в базу данных, т.к. у него не указан id родительской категории и название товара');
- continue;
- }
- $this->modx->importx->log('info', 'Элемент с арктикулом '.$line['article'].' не был найден и попытается быть создан и добавлен в базу данных');
- $item = $modx->newObject('Shop');
- $item->set('article', $line['article']);
- $item->set('published', 1);
- }
- foreach($line as $col => $value){
- if ($col == 'article') continue;
- $item->set($col, $value);
- if ($item->save() == false){
- $this->modx->importx->log("error", "Не удалось обновить поле $col у элемента с артикулом ".$line['article']);
- }
- }
- В файле
core/components/importx/processors/prepare/csv.php
задаем список полей, которые могут заданы в файле с данными для импорта. Для этого находим комментарийValidate the headers...
и задаем в массив $fields нужные нам поля. - В случае входной кодировки, отличной от 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" ); }
Количество просмотров: 3 200