Здравствуйте всем!
Столкнулся с некоторыми проблемами при обмене данными с 1C.
1. Такая же проблема, как у rauschen. При обмене данными с 1C названия уже существующих объектов и разделов приобретают первоначальный вид (как в 1C). Как этого избежать? Пробовал добавлять строку exchange.commerceML.renameFiles = "0" в config.ini, как указано здесь (http://help-dev.umi-cms.ru/part.Config.modules.html) (по умолчанию в файле ее вообще не было), переопределять присвоение названий в /xsl/import/custom/commerceML.xsl, однако это не принесло никаких результатов. Каким образом лучше разграничить процесс полной выгрузки и процесс выгрузки изменений? rauschen, как ты в конечном итоге вышел из данной ситуации? Если через event, выложи, пожалуйста, листинг кода.
Т.к. h1 остается прежним, то на крайний случай, как вариант можно добавить присвоение названия из h1 (что, конечно, не рационально).
2. Мне нужно, чтобы разделам и объектам каталога при полной выгрузке и обмене ставились в соответствие определенные tpl шаблоны, отличные от заданного по умолчанию.
В config.ini указал следующее:
exchange.translator.catalog_item_template = "catalogitem.tpl"
exchange.translator.catalog_rubric_template = "catalogrubric.tpl"
В таком случае и разделам, и объектам каталога по-прежнему ставится в соответствие шаблон по умолчанию (даже для новых добавляемых страниц).
Помимо этого, при каждом обмене в корне сайта создается страница Основной каталог товаров, которая не содержит в себе никаких объектов.
Воспользовался данным решением (http://wiki.umisoft.ru/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86,_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5_%D1%82%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B0%D0%BA_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D1%83%D0%B6%D0%B5_%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D1%8B_%D0%B8%D0%B7_1%D0%A1).
Теперь для всех разделов каталога используется шаблон catalogrubric.tpl (который мне и нужен), однако для объектов каталога по-прежнему применяется шаблон по умолчанию, и также создаются пустые страницы osnovnoi_katalog_tovarov, osnovnoi_katalog_tovarov1, osnovnoi_katalog_tovarov2 и т.д. в корне сайта. Как быть? И возможно ли задать исключения для ряда разделов каталога, для которых применяется другой шаблон, скажем catalogrubric_1.tpl?
Есть еще один альтернативный вариант - переопределить действия при выгрузке изменений таким образом, чтобы шаблоны страниц не менялись вообще (как и в ситуации 1). Тогда, на крайний случай, нужные шаблоны можно переопределить вручную (все равно каждый объект будет редактироваться отдельно). Понимаю, что это не рационально, но все же рассматриваю это, как один из вариантов.
3. Мне нужно применить данный шаблон (http://wiki.umisoft.ru/%D0%95%D0%B4%D0%B8%D0%BD%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D1%82%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0,_%D0%BF%D1%80%D0%B8_%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82%D0%B5_%D0%B8%D0%B7_1%D0%A1) с учетом ситуаций 1 и 2. Отдельно он работает нормально.
Очень надеюсь на вашу помощь!
Alexey
1. Эту задачу можно решить написанием своего варианта экспорта, который будет проверять импортируется ли товар в первый раз (и ему надо прописать имя), либо товар уже существует в системе и его имя менять не надо.
Можно написать код, который при преобразовании cml документа от 1с в umidump xml документ, будет проверять есть ли уже в системе товар и соответсвенно проставлять или нет узел "name" (этот вариант описывал rauschen выше) и можно написать свой обработчик события "exchangeOnUpdateElement".
Пример обработчика который вешаем на событие "exchangeOnUpdateElement"
public function RenameAllItems($e) {
if($e->getMode() == "after") {
$element = $e->getRef('element');
if (!$element instanceof umiHierarchyElement || $element->getMethod() != 'object') return false; // ести объект не страница и не объект каталога, то выходим
/*у типа данных "объект каталога добавил поле "резервное имя" (reserv_name) куда я сохраняю нужное мне имя товара*/
$element_reserv_name=$element->reserv_name;
if(strlen(trim($element_reserv_name))>0)$element->setName($element_reserv_name); //переименовываем имортированный товар обратно к "своему" варианту названия
$element->setTplId(4); //назначаем странице шаблон с id =4 (смотрел id в коде страницы в админке "настройки модуля структура")
$element->commit(); // сохраняем изменения
}
}
2.
Насчет создания пустого раздела
Помимо этого, при каждом обмене в корне сайта создается страница Основной каталог товаров, которая не содержит в себе никаких объектов.
не встречал такого, если вы пользовались модифицированным /xsl/import/custom/commerceML2.xsl то может ошибка в нем.
Насчет назначения шаблона страницам.
Действительно можно отключить назначение шаблона. Для этого просто проследите чтобы в /xsl/import/commerceML2.xsl и /xsl/import/custom/commerceML2.xsl файлах не формировался тег <default-template>. А еще, шаблон можно назначать через event, так же как и в коде выше
Можно поподробнее насчет события "exchangeOnUpdateElement", где применить эту функцию?
в папке /classes/module/exchange
добавляете custom_events.php:
<?php
new umiEventListener('exchangeOnUpdateElement', 'exchange ', 'RenameAllItems');
?>
в __custom.php вкладываем мою функцию
public function RenameAllItems($e) {
if($e->getMode() == "after") {
$element = $e->getRef('element');
if (!$element instanceof umiHierarchyElement || $element->getMethod() != 'object') return false; // ести объект не страница и не объект каталога, то выходим
/*у типа данных "объект каталога добавил поле "резервное имя" (reserv_name) куда я сохраняю нужное мне имя товара*/
$element_reserv_name=$element->reserv_name;
if(strlen(trim($element_reserv_name))>0)$element->setName($element_reserv_name); //переименовываем имортированный товар обратно к "своему" варианту названия
$element->setTplId(4); //назначаем странице шаблон с id =4 (смотрел id в коде страницы в админке "настройки модуля структура")
$element->commit(); // сохраняем изменения
}
}
event подключен
Парни, я сделал через событие, как писал Даниил.
Вот метод, который вызывается по эвенту exchangeOnUpdateElement:
public function setCustomName($e) {
if($e->getMode() == "before") {
$hierarchy = umiHierarchy::getInstance();
$element = $e->getRef('element');
if (!$element instanceof umiHierarchyElement || $element->getMethod() != 'object') return false;
$source_id = $e->getParam('source_id');
$GLOBALS["custom_name"] = $element->getName();
}
if($e->getMode() == "after") {
$hierarchy = umiHierarchy::getInstance();
$element = $e->getRef('element');
if (!$element instanceof umiHierarchyElement || $element->getMethod() != 'object') return false;
$source_id = $e->getParam('source_id');
$element->setName($GLOBALS["custom_name"]);
}
}
Не уверен что хорошо использовать глобальные переменные для этого, но работает исправно и я не стал терять время на поиск другого решения.
А еще есть такой метод:
public function getNewIdRelation($old_id){
//if(!$old_id) return;
$relation = umiImportRelations::getInstance();
$source_id = $relation->getSourceId('commerceML2');
$old_id = htmlspecialchars($old_id);
if($old_id && $source_id){
return $element_id = $relation->getNewIdRelation($source_id, $old_id);
}
}
Он возвращает id элемента каталога или раздела, если такой есть в системе. Методу передаем id товара или раздела из 1С.
Использовать этот метод можно прямо в /xsl/import/custom/commerceML2.xsl Но с этим методом у меня при импорте товаров (3600шт) сервер возвращает ошибку после 1200 импортированных объектов. Не знаю в чем соль - забил.
Если кто разберется, буду признателен за ответный листинг кода :)