UMIhelp

Разработка сайта на UMI.CMS => Настройка системы и модулей => Тема начата: tatfox от 07 Мая 2016, 16:49:05

Название: Синхронизация с 1С не меняя указанные поля
Отправлено: tatfox от 07 Мая 2016, 16:49:05
Доброго времени суток всем!

Синхронизировали сайт с 1С все товары загрузились, но параметр "Шаблон дизайна" указывается только тот который поставлен по умолчанию. Может как то можно указать в 1С шаблон дизайна и указать нужный шаблон?
Название: Re: Синхронизация с 1С не меняя указанные поля
Отправлено: e.ioffe от 07 Мая 2016, 17:30:15
Нужно для всех товаров указать один шаблон, который не равен шаблону по умолчанию?

Я бы добавил обработчик события, и в нем указал нужный шаблон. Для последних версий юми добавляете файл /classes/modules/exchange/ext/events_exchange_template.php

new umiEventListener('exchangeOnAddElement', 'exchange', 'exchangeSetTemplateElement');
new umiEventListener('exchangeOnUpdateElement', 'exchange', 'exchangeSetTemplateElement');


и файл /classes/modules/exchange/ext/common_exchange_template.php

class common_exchange_template extends exchange {
    const template_id_1c = 1;

    public function exchangeSetTemplateElement(iUmiEventPoint $eventPoint) {
        if($eventPoint->getMode() !== 'after') {
            return false;
        }

        $element = &$eventPoint->getRef('element');

        if($element instanceof umiHierarchyElement) {
            $element->setTplId(self::template_id_1c);
        }
    }
}

Если в системе несколько импортов данных (например, есть импорт из CSV), то нужно проверять параметр
$eventPoint->getParam('source_id');

В wiki есть другой вариант, но в нем нужно кастомизировать /xsl/import/custom/commerceML2.xsl , что я не очень люблю делать
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
Название: Re: Синхронизация с 1С не меняя указанные поля
Отправлено: tatfox от 07 Мая 2016, 17:36:35
Нужно для всех товаров указать один шаблон, который не равен шаблону по умолчанию?

Я бы добавил обработчик события, и в нем указал нужный шаблон. Для последних версий юми добавляете файл /classes/modules/exchange/ext/events_exchange_template.php

new umiEventListener('exchangeOnAddElement', 'exchange', 'exchangeSetTemplateElement');
new umiEventListener('exchangeOnUpdateElement', 'exchange', 'exchangeSetTemplateElement');


и файл /classes/modules/exchange/ext/common_exchange_template.php

class common_exchange_template extends exchange {
    const template_id_1c = 1;

    public function exchangeSetTemplateElement(iUmiEventPoint $eventPoint) {
        if($eventPoint->getMode() !== 'after') {
            return false;
        }

        $element = &$eventPoint->getRef('element');

        if($element instanceof umiHierarchyElement) {
            $element->setTplId(self::template_id_1c);
        }
    }
}

Если в системе несколько импортов данных (например, есть импорт из CSV), то нужно проверять параметр
$eventPoint->getParam('source_id');

В wiki есть другой вариант, но в нем нужно кастомизировать /xsl/import/custom/commerceML2.xsl , что я не очень люблю делать
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
Нужно просто добавить эти поля без изменение?
new umiEventListener('exchangeOnAddElement', 'exchange', 'exchangeSetTemplateElement');
new umiEventListener('exchangeOnUpdateElement', 'exchange', 'exchangeSetTemplateElement');
Название: Re: Синхронизация с 1С не меняя указанные поля
Отправлено: e.ioffe от 07 Мая 2016, 18:02:21
В строчке
const template_id_1c = 1;
заменить 1 на id нужного шаблона
Название: Re: Синхронизация с 1С не меняя указанные поля
Отправлено: tatfox от 07 Мая 2016, 18:07:34
Допустим у меня есть список каталогов, список товаров и карточка товара. Тогда мне нужен 3 шаблона, это для каталога, для товаров и карточки товара. А там можно указать только 1 шаблон
Название: Re: Синхронизация с 1С не меняя указанные поля
Отправлено: e.ioffe от 07 Мая 2016, 18:13:33
Вы можете добавить свои условия и проверять $element->getModule() + дополнительные параметры.
Название: Re: Синхронизация с 1С не меняя указанные поля
Отправлено: tatfox от 07 Мая 2016, 18:20:18
Вы можете добавить свои условия и проверять $element->getModule() + дополнительные параметры.
а $element->getModule() это где? Хорошо бы если пример был)
Название: Re: Синхронизация с 1С не меняя указанные поля
Отправлено: aghigay от 08 Мая 2016, 01:38:25
А что, в указанном коде много где есть переменная $element?
Название: Re: Синхронизация с 1С не меняя указанные поля
Отправлено: tatfox от 08 Мая 2016, 22:29:24
Так?
class common_exchange_template extends exchange {
    const template_id_1c = 1;
    const template_id_1c_2 = 2;

    public function exchangeSetTemplateElement(iUmiEventPoint $eventPoint) {
        if($eventPoint->getMode() !== 'after') {
            return false;
        }

        $element = &$eventPoint->getRef('element');

        if($element instanceof umiHierarchyElement) {
            $element->setTplId(self::template_id_1c);
        }
        else{
        $element->setTplId(self::template_id_1c_2);
        }
    }
}
Название: Re: Синхронизация с 1С не меняя указанные поля
Отправлено: aghigay от 09 Мая 2016, 00:35:21
Ну вообще строка
if($element instanceof umiHierarchyElement) {
означает буквально
Если элемент является объектом типа umiHierarchyElement, то ...

Вот мне интересно, вы сами-то думали, что будет если вызвать метод у объекта, у которого этого метода нет?

Обращаю ваше внимание, что наличие помощи на этом сайте, как и на других подобных сайтах, не избавляет вас от необходимости здраво мыслить и знать азы программирования. Учитесь!
Название: Re: Синхронизация с 1С не меняя указанные поля
Отправлено: tatfox от 09 Мая 2016, 11:04:07
Ну вообще строка
if($element instanceof umiHierarchyElement) {
означает буквально
Если элемент является объектом типа umiHierarchyElement, то ...

Вот мне интересно, вы сами-то думали, что будет если вызвать метод у объекта, у которого этого метода нет?

Обращаю ваше внимание, что наличие помощи на этом сайте, как и на других подобных сайтах, не избавляет вас от необходимости здраво мыслить и знать азы программирования. Учитесь!
Спасибо, буду разбираться
Название: Re: Синхронизация с 1С не меняя указанные поля
Отправлено: tatfox от 17 Июня 2016, 09:07:57
Добрый день!  Написал вот такой код, верно или неверно?

class common_exchange_template extends exchange {
    const template_id_1c = 3;
    const template_id_1c_2 = 4;

    public function exchangeSetTemplateElement(iUmiEventPoint $eventPoint) {
        if($eventPoint->getMode() !== 'after') {
            return false;
        }

        $element = &$eventPoint->getRef('element');

        if($element instanceof umiHierarchyElement){
        /*если объект то добавляем шаблон с id 4*/
        /*если не объект то шаблон 3*/
        if($element->getMethod() == 'object'){
        $element->setTplId(self::template_id_1c_2);
        }
        else{
        $element->setTplId(self::template_id_1c);
        }
           
        }
    }
}