Modx импорт из html

[MODX] Импорт и экспорт в MiniShop2. Реализация 1

Для того чтобы сделать экспорт (выгрузку) используем пакет catalogfill.

//разбивка по столбцам при импорте и экспорте (content|tv|category) $cf_config['content_row'] = array( array('RES_category',array(13,'category')),//3 - ID шаблона категории array('RES_subcategory',array(13,'category')),//3 - ID шаблона подкатегории array('RES_pagetitle',array('pagetitle','content')), array('RES_introtext',array('introtext','content')), array('RES_content',array('content','content')), array('RES_uri',array('uri','content')), array('RES_alias',array('alias','content')), // Товар TV array('TV_articul', array(16, 'tv')), // id Дополнительного поля array('TV_available', array(32, 'tv')), array('TV_id_similar', array(18, 'tv')), array('TV_main_img', array(14, 'tv')), array('TV_mark', array(19, 'tv')), array('TV_other_img', array(17, 'tv')), array('TV_price', array(15, 'tv')), array('TV_price_1', array(35, 'tv')), array('TV_price_10', array(22, 'tv')), array('TV_price_100', array(24, 'tv')), array('TV_price_5', array(21, 'tv')), array('TV_price_50', array(23, 'tv')), array('TV_price_500', array(25, 'tv')), array('TV_specification', array(34, 'tv')), array('TV_desc', array(30, 'tv')), array('TV_key', array(29, 'tv')), array('TV_tit', array(28, 'tv')), array('HitsPage',array(31,'tv')) ); //значения по умолчанию при импорте или проверка при экспорте $cf_config['imp_content_default'] = array( 'content' => array( 'published' => 1, 'template' => array(4) //'createdon' => strtotime("now") ), 'tv' => array( //7 => 0 ) ); //первая строка - названия полей $cf_config['include_captions'] = true; //число товаров импортируемых за один раз (загрузка по группам). 0 - не ограничивать. $cf_config['batch_import'] = 300; //разбивать по категориям $cf_config['include_categories'] = true; //удалять дочерние категории при очистке и обновлении каталога $cf_config['delete_subcategories'] = true; //по какому полю проверять соответствие товара при обновлении. false - не проверять (очистка категории при обновлении). $cf_config['imp_chk_field'] = 'pagetitle'; //проверять соответствие товара при обновлении по значению TV. Указать ID TV. false - не проверять (очистка категории при обновлении). $cf_config['imp_chk_tvid_val'] = false; //Добавлять товары, которые не найдены при обновлении по TV (imp_chk_tvid_val) или полю (imp_chk_field) $cf_config['imp_if_not_exist'] = true; //удалять HTML-теги при экспорте $cf_config['exp_strip_tags'] = false; //автоматически генерировать псевдоним (alias) при импорте //false - выключено; true - генерировать с переводом в транслит; 'notranslit' - генерировать без перевода в транслит. $cf_config['imp_autoalias'] = true; //Изменить значения поля для всех вложенных товаров до начала импорта. //Например можно отменить публикацию для всех товаров и публиковать только те, которые есть в новом прайс-листе. //первый массив - какие поля и на какие значения менять, второй массив - условия которые нужно проверять (можно сделать пустым) $cf_config['imp_before_change'] = false;//'[,<>]';//'[,]';//false - для отмены //удалить файл после экспорта (скачивания) $cf_config['exp_delete_file'] = false; //кодировка CSV-файла при экспорте $cf_config['exp_csv_charset'] = 'UTF-8';//'windows-1251' //Импортировать (обновлять) пустые значения $cf_config['imp_empty'] = true; //Имя файла процессора, который использовать для импорта. Если пусто, используется стандартный процессор "import". $cf_config['imp_custom_processor'] = ''; //путь (xpath) в XML структуре до товаров $cf_config['imp_xml_itemsparent_path'] = '';//'/catalog/shop/offers' //Структура XML файла для импорта $cf_config['imp_xml_structure'] = ''; //тестирование конфигурации (без записи в БД) $cf_config['imp_testmode'] = false; //функция для фильтрации значений при ИМПОРТЕ function filter_import($value_arr) < $output_arr = $value_arr; /* if(isset($output_arr['content']['pagetitle'])) $output_arr['content']['pagetitle'] = mb_strtoupper($output_arr['content']['pagetitle'], 'UTF-8'); */ return $output_arr; >//функция для фильтрации значений при ЭКСПОРТЕ function filter_export($value_arr,$doc_id=0) < $output_arr = $value_arr; //var_dump($value_arr,$output_arr); //exit; /* if(isset($output_arr['price'])) $output_arr[1] = floatval($output_arr[1]) - 200; */ return $output_arr; >

Так как я переносил еще и картинки, и имел доступ к обоим серверам, то я просто скопировал их с одного сайта на другой через FTP клиент. Для этого я использовал вот этот нехитрый метод

Читайте также:  Регулярное выражение php все html теги

Далее делаем импорт — загрузку полученных данных в магазин. Для этого я уже не использовал это дополнение, так как хотел четко контролировать что куда помещать.

В системе нового сайта создаем сниппет с поэтическим названием import_x

set_time_limit(0); // . Отредактировать $parent_id = 2722; $template_id = 3; $csv_file = "exp_10_03_18__12_53_40.csv"; // Получаем список УЖЕ импортированных нами ресурсов $q = $modx->newQuery('modResource'); $q->select(array('pagetitle')); $q->where(array( 'template' => $template_id, 'parent' => $parent_id )); $q->limit(0); $q->prepare(); $q->stmt->execute(); $res = $q->stmt->fetchAll(PDO::FETCH_ASSOC); $alredy_imp = array(); foreach($res as $v) < $alredy_imp[] = $v['pagetitle']; >// Обрабатываем файл CSV $csv_file_open = fopen($csv_file, 'r'); // Формируем удобочитаемый массив с данными из CSV: $arr_keys = array(); $prod_array = array(); while ( ($data = fgetcsv($csv_file_open, 0, ";") ) !== FALSE ) < if($data[2] == "RES_pagetitle")< // Таким странным образом определяем что это первая строка CSV файла $arr_keys = $data; >else < $temp_array = array(); foreach($data as $k =>$v) < $temp_array[$arr_keys[$k]] = $v; >$prod_array[] = $temp_array; > > //print_r($prod_array); //die; $count = 0; $hadErrors = false; foreach($prod_array as $v) < //print_r($v); $data = array(); $data['class_key'] = 'msProduct'; $data['pagetitle'] = $v['RES_pagetitle']; // Проеверяем, не добавлен ли этот ресурс уже в систему (просто оп имени) if(in_array($v['RES_pagetitle'], $alredy_imp))< continue; >// Добавляем только 15 рексурсов $count++; if($count > 15) < break; >// Формируем соответствие полей - тут все индивидуально и надо править. if(in_array($v['RES_pagetitle'], $names))< $data['published'] = 0; >else < $data['published'] = 1; >$data['parent'] = $parent_id; $data['template'] = $template_id; $data['show_in_tree'] = '1'; $data['content'] = $v['RES_content']; $data['description'] = $v['RES_category']." - ".$v['RES_subcategory']; //Данные if(!empty($v['TV_price'])) if(!empty($v['TV_price_1'])) if(!empty($v['TV_price_10'])) if(!empty($v['TV_price_100'])) if(!empty($v['TV_price_5'])) if(!empty($v['TV_price_50'])) if(!empty($v['TV_price_500'])) if(!empty($v['TV_mark'])) < $TV_mark = explode("||", $v['TV_mark']); foreach($TV_mark as $v1)< switch($v1)< case 2: $data['new'] = 1; break; case 3: $data['popular'] = 1; break; >> > /* *** Эта область из другого импорта, но примеры значения полей могут быть полезны: if($v['page_tags'] === 'хит' || $v['yml_param_recomend'] === "есть") < $data['popular'] = 1; >if($v['page_tags'] === 'распродажа') < $data['favorite'] = 1; >if($v['page_tags'] === 'новинка') < $data['new'] = 1; >$data['vendor'] = $v['local_manuf_id']; //стандартные опции товара if(!empty($v['yml_param_color'])) < $data['color'] = $v['yml_param_color']; >$data['size'] = ''; $data['tags'] = ''; свои опции созданные в настройках MiniShop2 if(!empty($v['yml_param_less70'])) < $data['options-cups'] = "до 70"; >if(!empty($v['yml_param_more70'])) < $data['options-cups'] = "от 70"; >if(!empty($v['yml_param_capuchinator'])) < $data['options-capuchinator'] = $v['yml_param_capuchinator']; >if((int)$v['exist_topvar'] === 0) < $data['options-exist'] = "Нет в наличии"; >*/ //TV if(!empty($v['TV_specification'])) // 3 в "tv3" это id TV if(!empty($v['TV_key'])) if(!empty($v['TV_desc'])) // Формирование массива с фотографиями $product_images = array(); if(!empty($v['TV_main_img'])) < $imgName = $v['TV_main_img']; if(strpos($imgName,"items/") === false)< $imgName = "items/".$imgName; >$product_images[] = "userimg/".$imgName; > if(!empty($v['TV_other_img'])) < $TV_other_img = json_decode($v['TV_other_img'], true); foreach($TV_other_img as $k =>$v) < $imgName = $v['images']; if(strpos($imgName,"items/") === false)< $imgName = "items/".$imgName; >$product_images[] = "userimg/".$imgName; > > //print_r($data); //print_r($product_images); //continue; // Запуск создания ресурса $response = $modx->runProcessor('resource/create', $data); ///////////////////////////////////////// if ($response->isError()) < $hadErrors = true; echo __LINE__."\r\n"; echo "
".print_r($response->getResponse(), true)."

«; $id = false; >else< $id = $response->response[‘object’][‘id’]; //id товара echo $id.»
\r\n»; > if(count($product_images) && $id) < // Если все Окей - добавляем картинки foreach($product_images as $img)< $imgPath = MODX_BASE_PATH.$img; // Проверям - существует ли файл if(!is_file($imgPath)) < echo "файл ".$img." не найден"; continue; >// Особая магия загрузки картинок по API в галерею MiniShop2 $gallery = array( ‘id’ => $id, ‘name’ => basename($imgPath), ‘file’ => $imgPath ); $upload = $modx->runProcessor(‘gallery/upload’, $gallery, array( ‘processors_path’ => MODX_CORE_PATH.’components/minishop2/processors/mgr/’ )); if ($upload->isError()) < $hadErrors = true; echo __LINE__."\r\n"; echo $imgPath."\r\n"; echo "

«.print_r($upload->getResponse(), true).»

«; > > > > if(!$hadErrors)< echo "«; // Так как операция рексурсоемкая, делаем автоматизацию на JS — если нет ошибок, перезагружаем страницу >

Источник

Инструменты

Меню «Инструменты» включает в себя пункты для импорта страниц на сайт MODX и для работы с соответствующими наборами свойств.

Импорт ресурсов

Возможна ситуация, когда у вас есть ряд файлов, которые нужно импортировать на сайт MODX как статические ресурсы или как документы. Когда их у вас не очень много, вы можете легко перенести их содержимое на сайт MODX. Однако, если их много, возможно вы захотите импортировать их, используя этот инструмент (или «Импорт HTML», описанный ниже).

На этой панели вы можете указать директорию, содержащую файлы, которые вы хотите импортировать и родительский каталог, в котором вы хотите, чтобы они появились. Для указания родителя кликните один раз в поле родителя и кликните на нужном родителе в дереве ниже формы. Если вы не выберите родителя, ресурсы будут помещены в корневой каталог.

В поле пути укажите полный путь (не URL). Не забудьте указать конечный слеш в конце пути.

Для импорта статических ресурсов в поле modResource введите modStaticResourse. MODX создаст статические ресурсы для каждого файла, имеющего указанный в соответствующем поле путь. Имя файла (без расширения) будет помещено в поля pagetitle и alias.

Для импорта файлов на сайт MODX в качестве документов, укажите modDocument в поле modResource. MODX создаст для каждого файла новый документ и поместит содержимое файла в поле ресурса content. Для файлов (X)HTML будет импортирована только часть, заключенная в теги . Имя файла (без расширения) будет помещено в поля pagetitle и alias.

Для ограничения импорта файлами с определенными расширениями укажите список расширений, разделенный запятыми (без точек) в поле для ввода расширений (например, htm, html).

В поле корневого HTML-элемента вы можете указать ту часть файла, которую нужно импортировать. Для (X)HTML файлов вы вероятно укажете раздел , но также возможно указать и или . Если у вас имеется текстовый файл, из которого вы хотели бы импортировать часть контента, просто отредактируйте файл в текстовом редакторе и заключите часть, которая вам нужна в теги .

Для импорта ресурсов кликните на кнопке «Импорт ресурсов» в правом верхнем углу. Если вы обновите дерево ресурсов, то вы увидите ваши импортированные ресурсы.

Импорт HTML

Если у вас есть несколько файлов с одним и тем же расширением в отдельной директории и вам нужно импортировать только некоторые из них, панель управления обеспечивает легкий способ как это сделать. Просто скопируйте файлы в каталог core/import (вначале убедитесь, что этот каталог пуст). Затем установите поля корневого HTML-элемента и родительский элемент, как это указано в предыдущем разделе и кликните кнопку «Импорт HTML» справа вверху. Файлы будут импортированы как документы также, как и в предыдущем разделе, но будут импортированы только файлы из каталога core/import.

Наборы параметров

Более подробно, что такое параметры и наборы параметров и как они используются, мы рассмотрим в отдельном разделе далее. Наборы параметров, прикрепляемые к сниппетам, работают по аналогии с параметрами, передаваемыми в теге сниппета (хотя любые параметры, передаваемые в теге сниппета, переопределяют любые прикрепленные параметры).

Для сниппетов вы можете создавать и редактировать наборы параметров на вкладке «Параметры» при редактировании сниппета. MODX Revolution, тем не менее, также позволяет вам создавать наборы параметров, которые могут быть прикреплены к чанкам и другим элементам.

Поскольку эти наборы параметров не прикреплены ни к какому конкретному элементу, этот вариант создания и редактирования наборов параметров служит дополнительным способом прикрепления их к элементам.

Сниппеты имеют параметры по умолчанию, которые на постоянной основе прикреплены к отдельному сниппету и сохраняются с кодом сниппета. Эти параметры не могут редактироваться в данном пункте меню.

Обычно параметры по умолчанию для компонент сторонних разработчиков не должны редактироваться , поскольку они могут быть переопределены, когда обновляется версия компоненты. Вместо этого вы должны использовать для того, чтобы переопределить значения по умолчанию или параметры сниппета в теге, или создать набор параметров.

При создании набора параметров для сниппета лучше испольовать вкладку «Параметры» для данного сниппета, чем создавать их в этом разделе меню.

Если вы перешли по вкладке «Параметры» и далее по кнопке «Новый набор параметров», появится диалоговое окно , в котором вы можете указать имя, категорию и описание набора параметров. Для того, чтобы сохранить эти данные, кликните на кнопке «Сохранить» в выпадающем окне.

Для работы с данным набором параметров вы можете или кликнуть в дереве или использовать диалоговое окно «Создать параметр».

Вы можете использовать кнопки «Импорт параметров» и «Экспорт параметров» для сохранения или загрузки набора параметров, который хранится как текстовый файл. Это может быть удобным, если вы хотите перенести набор параметров с одного сайта на другой.

Для того, чтобы элемент использовал набор параметров, вы должны сделать две вещи. Во-первых, вам нужно прикрепить набор параметров к элементу. Выполняйте это путем клика правой кнопкой мыши на имени набора параметров в дереве и выбора пункта «Связать с элементом». Выберите тип элемента и имя элемента в выпадающих списках и нажмите кнопку «Сохранить». Во-вторых, вам нужно указать MODX какой набор параметров использовать с элементом путем указания названия набора параметров в теге элемента со знаком @. Для чанка это будет выглядеть следующим образом :

Не оставляйте пробелов между именем элемента, знаком @ и именем набора параметров.

Источник

Оцените статью