Здравствуйте, коллеги. Делаю импорт товаров в Битрикс из самописной 1С. По команде /bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=testoff.xml файл на сервере не перезаписывается. Как с эти бороться?
Речь пойдёт о новом сконвертированном магазине и новой форме просмотра/редактирования заказа в нём.
Суть задачи в том, что фотографии товаров хранятся не в привычных свойствах битрикса, а в собственном CDN. Получается, что нам нужно как-то вмешаться в рендер таблицы товаров в форме заказа и подменить «Нет фото» на полученные фотографии из CDN.
Тех. поддержка битрикса развела руками, сказав, что задача, с помощью механизмов продукта, нерешаема. Но мы, конечно, не сдадимся и найдём решение проблемы
Недавно была задача по crm, где приходилось получать всё, что только можно. Вдохновение пришлось черпать в коде модуля, так как документации мало. Публикую, что вызвало трудности и основное время на поиск. Остальное (пользовательские свойства и простые поля, которые входят в основные таблицы сущностей) не описываю.
Получить телефоны, email'ы Контакта
/**
* Получить телефон, факс, email рабочий или личный Контакта
* @return object CDBResult
*/
$rs = CCrmFieldMulti::GetList(
array(),
array('ELEMENT_ID' => $CONTACT_ID)
);
Получить контакты Компании
/**
* Получить контакты Компании
* @return array
*/
$contactIDs = \Bitrix\Crm\Binding\ContactCompanyTable::getCompanyContactIDs($COMPANY_ID);
Получить организации, адреса, банки Компании
/**
* Получение организации Компании
* @return object CDBResult
*/
$requisite = new \Bitrix\Crm\EntityRequisite();
$dbRequisite = $requisite->getList(array('filter' => array('ENTITY_ID' => $COMPANY_ID)));
$arRequisite = $dbRequisite->Fetch();
/**
* Получить банк(и) Компании
* @return object DB\Result
*/
$bank = new \Bitrix\Crm\EntityBankDetail();
$dbRes = $bank->getList(array(
'filter' => array('ENTITY_ID' => $arRequisite['ID'])
));
/**
* Получить адрес(а) Компании
* @return object DB\Result
*/
$address = new \Bitrix\Crm\EntityAddress();
$dbRes = $address->getList(array(
'filter' => array(
'ENTITY_ID' => $arRequisite['ID'],
'ANCHOR_ID' => $COMPANY_ID
)
));
Конечно, более детальное рассмотрения поведения некоторых методов, оставляет больше вопросов, чем ответом, но это работает и данный материал создаёт хорошую отправную точку для решения большинства задач и дальнейшего самостоятельного исследования вопроса.
Всем добрый день! Не могу нигде найти решение. У меня на странице 20 объявлений и стандартная CRM форма, какждое объявление вызывает стандартную форму, как мне сделать чтобы при клике на объявление, в форму в дополнительное поле, например комментарий передавалось название объявления. Что то типа onlick у ссылки, или у ссылки прописать например data-filed="" и при вызове формы передавать в поле комментарий данные из data-filed=""
На данный момент в битрикс окружении нет инструментов для полноценного сжатия html вывода (удаления лишних строк и пробелов). С данной задачей отлично справляется nginx, но в поставке битрикс окружения модулей nginx для оптимизации пока нет. Надеюсь в дальнейшем появятся.
Пока что убираем лишние пробелы и строки из html вывода следующим кодом, добавить в init.php
// Удаляем лишние пробелы перед выводом
AddEventHandler("main", "OnEndBufferContent", "ChangeMyContent");
function ChangeMyContent(&$content)
{
$content = sanitize_output($content);
}
function sanitize_output($buffer)
{
return preg_replace('~>\s*\n\s*<~', '><', $buffer);
}
P.S. В режиме правки отключаем сжатие html для админа
function ChangeMyContent(&$content)
{
global $USER;
if(!$USER->IsAdmin()) {
$content = sanitize_output($content);
}
}
Задача довольно экзотическая. Мне захотелось с помощью функции AddEventHandler передать дополнительный параметр в обработчик. В RegisterModuleDependences такой параметр есть, называется TO_METHOD_ARG. А в AddEventHandler нет.
У себя я решил задачу кошерно через несколько классов с наследованием.
Но поделюсь другим забавным решением через имена функций. К моему удивлению, всё работает и даже $arFields в обработчике можно менять.
Я хотел, чтобы обработчик у меня был один, а получал разные параметры.
Обратите внимание: функция OnBeforeUserUpdateHandler получает на входе лишний параметр $HANDLER_ID. Это благодаря магии.
AddEventHandler(
"main", "OnBeforeUserUpdate", Array('CMyClass', "id22__OnBeforeUserUpdateHandler"));
AddEventHandler(
"main", "OnBeforeUserUpdate", Array('CMyClass', "id33__OnBeforeUserUpdateHandler"));
class CMyClass
{
public static function OnBeforeUserUpdateHandler( $HANDLER_ID, &$arFields )
{
if ( strlen($arFields[ "ADMIN_NOTES" ]) > 0 )
{
$arFields[ "ADMIN_NOTES" ] .= "\n";
}
$arFields[ "ADMIN_NOTES" ] .=
"Обработчик события OnBeforeUserUpdateHandler, номер ".$HANDLER_ID;
}
// магия
public static function __callStatic( $name, $arguments)
{
// parse
//id22__OnBeforeUserUpdateHandler
$id = 0;
$pos = strpos($name, '__');
if ( $pos >= 2 )
{
$id = substr( $name, 2, $pos-2 ); // 22
$id = intval( $id );
if ( $id > 0 )
{
$real_func_name = substr( $name, $pos + 2 ); // OnBeforeUserUpdateHandler
$args = array_merge( array($id), $arguments );
$result = call_user_func_array( array( get_called_class(), $real_func_name), $args );
return $result;
}
}
// выдать Fatal Error если функция не соответствует шаблону
if (!$id)
{
trigger_error("Function not found ".get_called_class()."::".$name, E_USER_ERROR);
}
}
}
Друзья, как передать значение из $arFields в $arParams или $arResult ? В админке меняю значение свойств статьи, сохраняю в $arFields. Теперь хочу вывести в компоненте News:detail. Как можно передать значение?
Мы тут уже сознались, что держали в загашнике новый шаблон для Bxready (как для , так и для )
Сегодня на включили этот шаблон
называется он "С фиксированным левым меню"
Существует в двух видах: Светлый и темный
Есть небольшое изменение на демо-сайте при использовании данных шаблонов кнопка вызова настроек демо-мастера уходит вправо
На сл. неделе выпустим этот шаблон уже в бету. Плюс скоро аналогичный шаблон появится и в решении А пока вы можете попробовать текущую версию нового шаблона, возможно будут и предложения по его улучшению
Привет коллеги. Кто-то сталкивался со странным поведением своих AJAX-запросов к компоненту, при которых некоторые запросы отрабатываются менее чем за 100мс, а другие в 3-4 дольше, хотя в первом случаи отправлено в 10-20-30 раз больше данных чем во втором и при этом в компоненте с этими данными ничего не делается, не пишется в инфоблоки, не читается, нет циклов и обработок. Для теста просто идет проверка на HTTP_X_REQUESTED_WITH, чтобы убедиться, что это AJAX, а потом сразу return;
Информация будет полезна тем, кто хочет добавить свое дополнительное поле в форму «Добавить задачу» коробочной версии «1С-Битрикс24».
Задача, которая стояла: 1. Добавить дополнительное поле типа Список в форму «Добавить задачу» в коробочной версии «1С-Битрикс24». Поле обязательно к заполнению. 2. При выборе значения из списка необходимо, чтобы другое поле из формы «Добавить задачу» становилось обязательным для заполнения.
Решение пункта 1: 1.1. Переходим Панель администрирования -> Настройки -> Пользовательские поля 1.2. Нажимаем Добавить, выбираем Тип данных (тестировал только для Список)
1.3. Вся суть решения - Указать в поле Объект значение TASKS_TASK
1.4. Заполнить остальные поля. 1.5. Сохранить. 1.6. Перейти на страницу формы «Добавить задачу», посмотреть результат.
Решение пункта 2: 2.1 Создать событие в файле init.php AddEventHandler("tasks", "OnBeforeTaskAdd", Array("HosterKZ", "OnBeforeTaskAddHandler")); 2.2 Вывести в файл log.txt значения полей $arFields
function OnBeforeTaskAddHandler(&$arFields) { log_array($arFields); }
2.3 Дописать обработку обязательных полей с помощью $APPLICATION->ThrowException();
function OnBeforeTaskAddHandler(&$arFields) { //log_array($arFields); global $APPLICATION; if($arFields["UF_TASK_TYPE"]=="XY") { if(empty($arFields["SE_PROJECT"]["ID"])) { $APPLICATION->ThrowException("Не введено значение обязательного поля Проект."); return false; } } }
P.S. Не претендую на оригинальность и 100% правильность решения, но ничего полезного на эту тему в интернете я не нашел. Кроме этой статьи
Вопрос наложения водяного знака давно не вопрос. И на лету его тоже нет проблем наложить.
Проблема появилась при необходимости масштабирования водяного знака, чтобы он при любом финальном размере фото товара занимал всю доступную ширину уменьшенного фото.
"Студия тиражных web-решений "ROMZA" () и "Студия "Чипса" () заключили альянс и объединили свои компетенции для создания лучших тиражных решений под брендом "Енисайт"! В настоящий момент уже выпущено первое совместное типовое решение корпоративного сайта — и идёт разработка дизайна нового решения — UNova!
Рассказывает руководитель студии Чипса — Максим Кыштымов:
Разработку дизайна для нового решения мы делали по подходу, который принципиально отличается от применённого при разработке нашего предыдущего решения . Мы решили использовать наш классический подход к проектированию и дизайну сайта, который мы применяем при работе с нашим заказчиками (индивидуальная разработка).
Какие цели мы преследуем, создавая шаблон корпоративного сайта UNova по новому подходу
Дать возможность покупателям UNova получить дизайнерский сайт по цене шаблонного;
Использовать на сайте графический контент практически любого качества (что это значит — ниже);
Дать вам возможность делать внутренние текстовые страницы более индивидуальными и интересными для посетителей;
Представить более гибкие возможности по изменению внешнего вида сайта без программирования.
Какие шаги мы прошли
1. Проведение и . Мы провели опрос среди партнеров и клиентов студии ROMZA, услышали их требования и «хотелки», учли их при проектировании и дизайне страниц.
2. Провели этап анализа Используя наш подход к индивидуальной разработке сайтов, разработали карту бренда, рассмотрели пользовательские сценарии, определили стилистику будущего сайта. Что это нам дало: - возможности немного отойти от стандартных страниц, которые используются во всех шаблонах корпоративных сайтов; - добавить ряд новых блоков, которые являются уникальными и используются только в шаблоне UNova; - использовать новые приёмы оформления на страницах.
В процессе проведения этапа анализа, мы постарались мыслить максимально широко и учесть ЦА трех больших сегментов бизнеса: - производство, строительство; - бизнес, для которого максимально важен графический контент, чтобы показать интерьер (спортивные залы, школы танцев, выставки, музеи, гостиницы, хостелы); - развлекательная сфера (клубы, бары, рестораны, детский центры, и т.д.)
Первая версия UNova учитывает первую ЦА. Остальные будут учтены в следующих версиях (добавлены специальны для этих ЦА блоки, цветовые схемы, компоновка элементов, и т.д.).
3. Разработали прототипы Сначала мы разработали прототипы страниц, не используя цвета и графику. Это позволило протестировать удобство и структур страниц без отвлечения на дизайн.
4. Разработали дизайн Как всегда, уделили большое внимание дизайну. Отточили все отступы, выравнивание элементов, размеры, шрифты, и. т.д. Использовали передовой сервис для совместного проектирования и дизайна FIgma, который позволяет благодаря использованию компонентов ускорить процесс изменений в элементах сайта.
5. Motion-дизайн (в процессе) Особое внимание будет уделено проектированию микровзаимодействий с элементами сайта. Это позволит сделать посещения сайта максимально интересным и интерактивным для посетителей.
ИТОГИ. Что вам даст использование шаблона корпоративного сайта UNova:
Отстройку от конкурентов благодаря детально проработанному дизайну страниц (включая внутренние страницы);
Вовлечение посетителя во взаимодействие с сайтом благодаря проектированию микорвзаимодействий с элементами сайта, motion-дизайну;
Возможность использовать графический контент практически низкого качества (в разумных пределах) благодаря возможности тонировки картинок вашим фирменным цветом (это скроет недостатки пересеченных, темных, блеклых снимков;
Использование нового элемента — «Тарифы»;
Использование всей ширины экрана для широкоформатного монитора (масштабирование контентой части сайта);
Увеличение времени посещения сайта благодаря автоматической динамической подгрузке страниц сайта при пролистывании в самый низ страницы;
Уникальную гибкую систему настраивания внешнего вида блоков (в следующих версиях);
И ещё многое другое (Анонс всех функций шаблона будет позже».
Сейчас нам нужна ваша обратная связь!
Чтоб сделать проект максимально качественно, мы решили собрать у вас обратную связь относительно дизайна шаблона UNova.
Вот тут вы можете посмотреть несколько вариантов стартовой страницы и всех остальных страниц сайта:
Для навигации вы можете использовать стрелки влево/вправо, либо переходить прямо по ссылкам на дизайне (доступно только из темной версии стартовой страницы с боковым меню).
Вы можете оставлять свои комментарии прямо в сервисе Invision. Для этого включите режим комментирования, нажимайте в любом месте картинки и оставляйте свой комментарий, скриншот:
Столкнулся с проблемой. Задача: скопировать инфоблок с сайта, где установлен модуль "Торговый каталог" на сайт, где такого модуля нет. Первый заход: Создал файл экспорта в XML формате Скопировал на другой сервер файл и папку с картинками Делаю импорт и получаю ошибку:
Отсутствует модуль "Торговый каталог". Импорт торговых предложений и цен невозможен.
Чуть покопавшись получил нужный результат следующей заменой в XML:
1. Удалил блок с описанием цен 2. Тэг "Пакет преложений" заменил на "Каталог" 3. Тэг "Предложения" заменил на "Товары" 4. Тэг "Предложение" для всех элементов заменил на "Товар"
Добрый вечер, коллеги. Меня зовут Игорь Цупко, я технический директор агентства Notamedia. И скоро я буду делать тестовые прогоны своих докладов в формате вебинара
Доклады будут проходить через youtube, для получения ссылки нужно подписаться. Добра вам!
На написание сей статьи меня подтолкнуло неведение некоторых специалистов решения проблемы кеширования статики в браузере клиента. Исходя из чего, делаю вывод, что краткое изложение проблемы не будет лишним и поможет разобраться в вопросе человеку любого уровня, в том числе и менеджерам проектов, так как на практике вижу, что проблема актуальна для всех.
На самом деле всё куда проще и что касается правильно подключенных css и js-файлов через API-битрикса, то тут всё работает с коробки, только это знают не все. Для любого подключаемого файла проблема решается добавлением аргумента ?1487583138267920:
Наверняка, многие из вас видели его при просмотре кода страницы. В этом и есть вся фишка. Имя файла тоже, но путь к файлу браузеры считают новым. Этот код меняется каждый раз после изменения файла и его размера, браузеры видят новый путь и загружают файл повторно.
Тот же самый финт можно выполнить и прямо в коде css файла, но делать это придётся уже вручную или если вы используете какие-нибудь препроцессоры css, то версию файла можно вынести в переменную и не лазить по коду каждый раз:
А всё что касается публичной части сайта, то процесс легко автоматизировать с помощью утилиты, которая использует сама система, при подключении файлов:
Сабж. Но вот так вот глупый вопрос превратился в прикольный для начинающих программистов на собеседованиях.
Многие, правда, приходят в себя, но сначала сразу ассоциируют input только с <input type='submit'> т.е. только с частным случаем думая только про кнопки и их сценарий.
Волнение, блин
Сегодня задаю его уже в четвертый раз пока три один в мою пользу
Периодически, рисуя менюшку, сталкиваюсь с не очень удобной кастомизацией дефолтных шаблонов. Решил написать свой, универсальный:
<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<?
if (!empty($arResult))
{
// Шаблон для списка первого уровня
$arStrMenu[1] =
'<ul class="left-menu">#ITEMS#</ul>';
// Шаблон для пунктов первого уровня
$arStrItems[1] =
'<li class="#PARENT# #DISABLED#">'.
'<a href="#LINK#" class="#SELECTED#">'.
'#TEXT#'.
'</a>'.
'#MENU#'.
'</li>
';
// Шаблон для разделителя первого уровня
// В качестве разделителя выступает пункт меню без ссылки
$arStrSeparator[1] =
'<li class="#PARENT# #DISABLED#"><h2>#TEXT#</h2></li>';
// То же для второго уовня
$arStrMenu[2] =
'<ul class="submenu">#ITEMS#</ul>';
$arStrSeparator[2] =
'<li class="#SELECTED# #PARENT# #DISABLED#"><h2>#TEXT#</h2></li>';
$arStrItems[2] =
'<li class="#SELECTED# #PARENT# #DISABLED#">'.
'<a href="#LINK#" >'.
'#TEXT#'.
'</a>'.
'#MENU#'.
'</li>
';
$arParent[1] = "#1";
foreach ($arResult as $key => $arItem)
{
// если пункт имеет подпункты, сохраним уникальный ID пункта и уровень вложенности
if($arItem["IS_PARENT"]) $arParent[$arItem["DEPTH_LEVEL"]+1] = $key."#".($arItem["DEPTH_LEVEL"]+1);
$arReplace = array(
"#SELECTED#" => $arItem["SELECTED"] ? "active" : "", // класс для выбранного пункта
"#PARENT#" => $arItem["IS_PARENT"] ? "treeview" : "", // класс для пункта с подпунктами
"#DISABLED#" => $arItem["PERMISSION"] <= "D" ? "disabled" : "", // класс для недоступного пункта
"#ICO#" => $arItem["PARAMS"]["ico"], // берем название иконки из параметров пункта
"#TEXT#" => $arItem["TEXT"],
"#LINK#" => $arItem["LINK"],
"#MENU#" => $arItem["IS_PARENT"] ? "#MENU".$key."#" : "", // вставляем код, заменяемый подпунктами
);
$template = $arItem["LINK"] ? "arStrItems" : "arStrSeparator"; // если нет ссылки - считаем пункт разделителем
// создаем небольшой массив, где пункты склеены в строки по шаблону, ключ - ID#DEPTH_LEVEL
$items[$arParent[$arItem["DEPTH_LEVEL"]]] .=
str_replace(
array_keys($arReplace),
$arReplace,
${$template}[$arItem["DEPTH_LEVEL"]]
);
}
$strMenu = "#MENU#"; // первый уровень
foreach($items as $key => $item)
{
$strBranch = ""; // обнуляем ветку
list($id, $dl) = explode("#", $key); // Разбираем ключ
// если уровень вложенности больше количества шаблонов, используем последний шаблон
$dl = count($arStrMenu) < $dl ? count($arStrMenu) : $dl;
// заполняем меню пунктами, для каждого уровня - свой шаблон
$strBranch .= str_replace("#ITEMS#", $item, $arStrMenu[$dl]);
// если есть код подменю, вставим вместо него подпункты
$strMenu = str_replace("#MENU".$id."#", $strBranch, $strMenu);
}
echo $strMenu; // та-даам
}
Влженность - не ограничена, можно использовать разделители. Код прокомментировал. Ругайте, вдруг где накосячил.
Правильный <link rel="next" href="">, <link rel="prev" href=""> в head.
Изучил различные решения данного вопроса, к сожалению component_epilog не дает устанавливать данные в компоненте постраничной навигации, поэтому решено внедрить данное в компоненты разделов каталогов, новостей.
Конечно, в маркетплейсе битрикса и так достаточно различных слайдеров, каруселей и прочих свистелок и прибамбасов, даже бесплатных. Тема весьма избитая. Однако, чего на мой взгляд не хватало, так это удобного инструмента для размещения галерей с помощью визуального редактора или же напрямую из кода. Данный модуль основан на наработках, используемых на множестве сайтов, в т.ч. сайтах СМИ и используемых ими для публикации галерей в новостных статьях.
Итак, для размещения галерей с помощью визуального редактора, используйте иконку и выберите нужную галерею из инфоблока и шаблон во всплывающем окне (как создать инфоблок, об этом подробно ). Если теперь переключиться в режим исходного кода, то вы увидите макрос наподобие
##G23#thumbnail#
В котором 23 - это ID раздела инфоблока (галереи являются разделами инфоблока, изображения - элементами), а thumbnail - это не что иное как название шаблона встроенного компонента (grain:gallery.section). В данный момент всего таких шаблонов - 5, демонстрация их работы . Кстати, каждый шаблон имеет свой блок настроек на странице настроек модуля, а для удобства и унификации я сделал так, что шаблоны подойдут также к стандартному компоненту "bitrix:news.list".
Что дальше?
Итак, вы разместили галерею, скажем, в детальном тексте новости. Что же делать дальше чтобы галереи начали отображаться на сайте? Если вы используете настройки по умолчанию, то ответ - ничего. При настройках по умолчанию, все макросы ##Gid_галереи#название_шаблона# в публичной части сайта при завершении буферизации страницы заменяются на результат работы компонента. Но если вас это по каким-то причинам не устраивает, вы можете отключить глобальную замену и производить замену макросов самостоятельно, а как это сделать вы можете посмотреть на странице .
Что еще?
Как обычно, я постарался сделать так, чтобы модуль было максимально легко кастомизировать. Css и Js код всех шаблонов содержится в двух файлах в папке /bitrix/js/grain.gallery/, однако чтобы этот код можно было менять, достаточно скопировать эти файлы в папку grain.gallery внутри вашего шаблона сайта (подробнее об этом ). Поэтому, чтобы внести большинство правок, касающихся визуальной составляющей, вам не придется даже копировать шаблоны компонентов. Сам код сделан максимально коротким и понятным.
Сколько?
Стоимость модуля 1500 р., разрешены партнерские скидки.
Добро ночи! Сегодня обновлял клиенту BitrixEnv с 5 на 7 версию. И в очередной раз вылезла пресловутая и давно известная на форуме проблема с пакетом ansible, который теперь стал конфликтовать с пакетом bx-ansible из новой версии репозитория. Выкидывает целую кучу "страшных" ошибок, а решается проблема 3 строчками в консоли:
Доброй ночи. Удалила окончание кода в Битрексе, из за этого сайт не функционирует, как это можно восстановить если нет резервных копий и истории? или что нужно дописать? Помогите пожалуйста.