Удивительно, но в 2022 у битрикса всё ещё большие проблемы с такой тривиальной вещью как разграничение типа цены по городам (замените на филиал/склад или иное условие зависящее от какой-то настройки или параметра в админке).
Рассматриваемый пример: есть интернет-магазин на БУС.Бизнес. сайт работает на одном домене на 3 города, в каждом городе свой склад и своя политика цен. Но каталог товаров общий. Смена города для покупателя реализована через Инфоблок "Города" в котором созданы 3 города, и добавлены свойства привязки склада, типа цены, и ID группы пользователей. При выборе или переключении города, выбранная позиция сохраняется в сессионный кэш сервера, а также записывается в глобальную переменную, откуда потом берутся значения для фильтров в параметры компонентов, требующих указание типа цены или склада. Это всё работает, то есть сделать отображение каталога с товарами по выбранному типу цены для города - не сложно.
Проблема возникает при настройке работы корзины. Корзина учитывает все доступные покупателю типы цен и автоматически выбирает наименьший тип цены и далее от него рассчитывает дополнительные скидки, если они есть. Никаких удобных средств повлиять на список цен, учитываемых в корзине - нет. У типа цены нет привязок ни к складу, ни к какому либо иному параметру интернет-магазина. Только к группам пользователей.
Есть обработчик события OnGetOptimalPrice, но он не позволяет просто изменить список входящих параметров (хотя некоторые его используют для этих целей), а требует полностью написать алгоритм вычисления нужной цены. То есть используя его требуется учесть все возможные механизмы скидок, купонов, наценок и прочего и фактически заново написать алгоритм расчёта цены. А значит для нашей задачи он не подходит.
Есть вариант на ходу менять группу пользователя, меняющего города и дать доступ к ценам только пользователям из соответствующей группы. Но тогда мы лишаем возможности анонимных покупателей добавлять товары в корзину, так как для них невозможно записать группу в БД. Кроме того, этот функционал также добавляет ошибку описанную в этом посте, а именно - Ошибка проверки доступного количества товара. Я не успел докопаться до проблемы но в моём случае была 4я цена созданная в магазине при установке БУСа и она не использовалась (значения были пустые) и когда я настроил права доступа по группам, все товары у которых была эта цена пустой, перестали добавляться в корзину выдавая эту ошибку. добавление в корзину вызывалось методом \Bitrix\Catalog\Product\Basket::addProduct
В общем хлебнул я проблем за последние пару дней не мало с этой настройкой. Поэтому создаю тему в надежде что найдутся умные люди кто уже реализовывал данный функционал с наименьшими проблемами и без модификаций ядра и сторонних модулей.
Если вдруг кто-то знает способ как до формирования цены в корзине перехватить и изменить массив передаваемых туда цен - буду очень благодарен. Для разработчиков, на мой взгляд, ничего не стоит добавить обработчик вроде BeforeGetOptimalPrice в котором можно было бы посмотреть приходящие в него параметры и изменить их. В моём случае было бы достаточного пары строчек кода - получить ид типа цены из глобального массива и передать его на вход событию, и всё. Это решило бы множество проблем с которыми сейчас сталкиваются разработчики при настройке такого функционала.
В общем если кто-то может помочь решить задачу - welcome. Когда всё заработает я опишу в подробностях и с примерами как что надо делать для других пытливых умов.
"Ничто не истинно - всё дозволено." Assassin's Creed
Доброго времени суток. Подскажите пожалуйста, у меня одного постоянно возникают конфликтные ситуации с сео-специалистами которые работают с битриксом? Почему команда разработчиков битрикса считает нормальным такое поведение заполнения сео-тегов, когда вы в настройках инфоблока задаёте единый шаблон для разделов и элементов, потом вы руками в каком то верхнем разделе меняете теги на другие, и у вас есть только галочка "применить к этому и ко всем внутренним разделам" что? А если я хочу изменить только этому разделу а его потомков оставить как было? Мне нужно в них руками зайти и проставить копию тех данных которые уже указаны в настройках инфоблока. Зачем это вообще было сделано? Кто отвечал за этот функционал? Кто додумался сделать эту галку и почему не додумался сделать "применить только для этого раздела"?
И неужели я в конце концов единственный кто вынужден объяснять сеошникам с которыми работаю эту "особенность" и "фичу" битрикса? А потом чаще всего писать костыли для обхода этой фичи. Ну вы что, ребят. главная фишка сео - уникальные тексты. никто не хочет вставлять уникальный текст в главный раздел и видеть что он раскопировался на все подразделы. Ну это же косяк. Или нет? Что это? Много лет уже этому функционалу и никто об этом не подумал. Я реально один кто испытывает из-за этого проблемы при работе???
"Ничто не истинно - всё дозволено." Assassin's Creed
Андрей Какичев написал: три года прошло с момента поднятия вопроса, а разработчики так и не впилили дополнительную галочку, чувствую будем мы её ждать так же как и полную документацию по D7.
4й пошёл
"Ничто не истинно - всё дозволено." Assassin's Creed
dr.riddle написал: А как быть со свойствами инфоблоков и привязкой элементов к местоположению? В админпанели карты не работают. Подскажите, как правильно передать api ключ и туда
либо копать ядро битрикса и подменять там ключ, либо пользоваться яндекс-картами
"Ничто не истинно - всё дозволено." Assassin's Creed
Максим Каськов, огромное спасибо за помощь! Только я, пожалуй, для новичков немного расширю и облегчу ответ:
Для того, чтобы иметь возможность подставлять свой ключ через параметр компонента, необходимо при вызове map.google.view добавить ему параметр, например, API_KEY вот так
Код
<?$APPLICATION->IncludeComponent(
"bitrix:map.google.view",
"custom",
Array(
... // Тут все ваши параметры вызова
"API_KEY" => "тут ключ от гугла"
)
);?>
Далее войти в шаблон (в примере это custom), и добавить в массив
Таким образом мы передаём в параметры вызова компонента bitrix:map.google.system (который расположен ниже в этом файле) наш ключ. Необходимо заменить в его вызове путь bitrix на ваш (например, custom) вот так: Было:
Но чтобы это заработало, далее необходимо скопировать компонент /bitrix/components/bitrix/map.google.system в пользовательскую область. то есть в /local/components/custom/map.google.system и в скопированной папке в файле /local/components/custom/map.google.system/component.php заменить строку
Столкнулся с той же проблемой, только копирую инфоблок с другого сайта. делаю XML экспорт, после чего пытаюсь импортировать этот инфоблок на другом сайте. в ответе выдаёт по нулям и ничего не создаёт. Вы не решили эту проблему?
"Ничто не истинно - всё дозволено." Assassin's Creed
Срочно ищем программиста битрикс в офис г.Москва, белая зарплата, интересные задачи, Нужен программист битрикс в команду программистов для доработки интернет-магазина (высоконагруженный проект)
Для этого нужно в вебформе сделать скрытое поле. но в это поле и сразу список адресов можно закинуть и в шаблоне в поле кому вставить значение этого поля. Я так попробовал, но hidden поля у вебформ нигде не выводятся и из шаблона не видны. об этом многие пишут на форуме.
зачем? можно сделать так: <form action='<путь до скрипта распределения используемого шаблона>/use_mail_template.php' method='post'> <select name='use_template'> ... </select> <бла-бла-бла> </form>
а уж в use_mail_template.php прописать что-то вроде: <? if ($_POST['use_template']=='<значение определяющее использование одного почтового шаблона>'){ CEvent::SendImmediate(<тут пишем идентификатор первого шаблона и параметры>) }
if ($_POST['use_template']=='<значение определяющее использование другого почтового шаблона>'){ CEvent::SendImmediate(<тут пишем идентификатор другого шаблона и параметры>) } ?>
Спасибо. очень интересный способ решения проблемы. Я пока реализовал полем text в вебформе. перед отображением делаю его hidden уже в шаблоне, и в зависимости от значения поля select (Тот самый выпадающий список) ставлю в это скрытое поле нужный ид шаблона
"Ничто не истинно - всё дозволено." Assassin's Creed
Максим Каськов написал: Не делал так для вебформы, но как вариант можно попробовать сделать отправку параметров формы через аякс в скрипт, где вызывается компонент вебформы и один из параметров, пришедших через аякс будет содержать id вебформы (будет вытягиваться из селекта). А уже в самих вебформах указывать нужный почтовый шаблон. Может вариант и не лучший, но чем больше неправильных вариантов, тем больше шанс найти правильный:)
Для этого нужно в вебформе сделать скрытое поле. но в это поле и сразу список адресов можно закинуть и в шаблоне в поле кому вставить значение этого поля. Я так попробовал, но hidden поля у вебформ нигде не выводятся и из шаблона не видны. об этом многие пишут на форуме.
"Ничто не истинно - всё дозволено." Assassin's Creed
Здравствуйте. Помогите пожалуйста реализовать такую задачу. В вебформе есть поле select с двумя значениями. к веб-форме привязан 1 почтовый шаблон с набором адресов. Необходимо настроить отправку таким образом, чтобы в зависимости от выбора результата в этом select, письмо приходило либо на один список адресов (указанный сейчас в почтовом шаблоне) либо на ДРУГОЙ список. Допустимо создание копии почтового шаблона с другим списком адресов.
Основная сложность у меня возникает в том, что я не знаю где задать это условие. я могу запустить обработчмк onBeforeResultAdd но что дальше в нём написать, чтобы изменить почтовый шаблон который будет использоваться, вообще не понимаю. это же настройка самой веб формы. это же не хорошо если в обработчике каждый раз будет меняться этот параметр с одного шаблона на другой.
"Ничто не истинно - всё дозволено." Assassin's Creed
Распишу проблему подробнее. В параметрах компонента есть поле PAGE_ELEMENT_COUNT которое отвечает за постраничную навигацию. По этому параметру в компоненте catalog.section идёт выборка элементов в указанном колличестве. При таком подходе всё что можно сделать нормальным способом, это логическую подгрузку элементов. То есть как они идут в списке, так и подгружать. Если в первом разделе 5 элементов, во втором их 2, в третьем 4, и параметр PAGE_ELEMENT_COUNT=3 получаем следующую картину:
Подгружается первый раздел (заголовок) и 3 элемента. при щелчке на кнопку аякса этот раздел дополняется 2 оставшимися элементами, и выводится следующий раздел с названием и первым элементом. При дальнейшем клике на кнопку выводится последний элемент второго раздела и третий раздел с 2 элементами. при последнем клике выводятся 2 оставшихся элемента последнего раздела.
Такой вариант не допустим по многим причинам. Основная из которых - чтобы увидеть, например, 10й раздел (детские игрушки) необходимо будет прощёлкать предыдущие 9, в которых могут быть сотни товаров. Необходимо иметь перед глазами сразу весь список разделов с небольшим колличеством товаров в каждом из них.
Но это мне мешает сделать дебильная нафигация. Единственным вариантом решающим эту проблему может быть вызов в цикле CIBlockElement::GetList что не допустимо с точки зрения нормального кода.
Задать очень большой параметр PAGE_ELEMENT_COUNT - тоже не выход из ситуации.
Нормального решения пока не придумал
"Ничто не истинно - всё дозволено." Assassin's Creed
Здравствуйте. Есть каталог с товарами. В нём имеются вложенные разделы (2 уровня разделов, 3 уровень - элементы).
Есть страница "новинки" где через catalog.section и кастомный фильтр выводится список всех товаров с активным свойством "новинка". Проблема заключается в том, что отображение товаров - таблица. И у каждой группы (раздела) различаются характеристики, которые необходимо указать в этой таблице.
По этой причине в шаблоне в result_modifier.php Я добавил такой код:
Код
// Выборка разделов каталога
$arFilter = Array('IBLOCK_ID'=>$arParams["IBLOCK_ID"], 'GLOBAL_ACTIVE'=>'Y');
$db_list = CIBlockSection::GetList(Array($by=>$order), $arFilter, true);
while($ar_result = $db_list->GetNext())
{
// Если раздел не пустой, добавляем его в массив arresult
if ($ar_result["ELEMENT_CNT"]>0){
$arResult["SECTIONS"][$ar_result["ID"]] = $ar_result;
}
}
// Сортируем элементы по разделам
foreach ($arResult["ITEMS"] as $arItem){
$arResult["SECTIONS"][$arItem["IBLOCK_SECTION_ID"]]["ITEMS"][] = $arItem;
}
Теперь возникает следующая проблема - что если товаров и разделов будет много? Значит нужна постраничная навигация. Но она нужна как в пределах одной таблицы, так и для самих таблиц.
Без аякса не обойтись. В итоге необходимо получить следующий функуиолнал - последняя строка в каждой таблице содержит ссылку "показать ещё" а после 3 отображаемых таблиц есть кнопка "посмотреть другие категории" которая подгружает новые таблицы.
За основу аяксового режима была взята эта статья без использования доп шаблона сайта (рестартбуффер). В итоге что у меня получилось - задаю в параметрах компонента колличество выводимых элементов. например 2. На странице выводятся 2 таблицы в каждой по 1 элементу. Необходимо это изменить, чтобы параметр отвечал за колличество элементов в каждой таблице. То есть например ставим параметр 2. По умолчанию на странице выводятся 3 таблицы. если для них есть 2 и более элемента, в каждой выводим по 2. остальные, если они есть, подгружаются аяксом. если изначально всего лишь 1, то выводим 1 и не выводим кнопку подгрузки. если после подгрузки осталось 0, тоже убираем кнопку.
Сейчас при щелчке на подгрузку, выводятся все элементы последовательно. не хотят фильтроваться по разделам (таблицам).
Надеюсь понятно написал. Есть у кого нибудь решение данной задачи или ссылки на полезные статьи?
Всем заранее спасибо.
"Ничто не истинно - всё дозволено." Assassin's Creed
S Lee написал: для footer.php аналогично создайте и подключайте второй файл с контактамиS Lee написал:
Цитата
Дальше менять контакты можно будет через визредактор.
Очень интересное "решение" учитывая, что автор попросил "редактирование" данных в одном месте. А что, если на 20 страницах сайта выводятся один и тот же адрес, телефон, название компании, и картинка с логотипом, но все они с разной вёрсткой? Самый простой и очевидный вариант - записать в включаемую область только непосредственно сами значения. Но это всё равно не прокатит. Потому как например номер телефона может быть записан как +7<span>(123)</span>4567890 или в адресе аналогично спан будет присутствовать. В общем лажа все эти включаемые области. Пошёл писать тикет и идею заодно как решить эту проблему.
"Ничто не истинно - всё дозволено." Assassin's Creed
Во-первых тут речь о компоненте меню, или о визуальном оформлении "как меню"? шаблон template.php к чему относится? к какому компоненту?
Цитата
Разработать компонент: «Список вакансий»
Вот это по описанию задачи вообще ни к чему. Я объясню сумбурно. если не понятно - спрашивай подробнее.
Необходимо использовать компонент news.list В шаблоне которого создать файл result_modifier.php в котором запросом getlist сделать запрос разделов и собрать их по порядку например в $arResult["SECTIONS"][ИД_РАЗДЕЛА] после чего перебрать в цикле foreach все элементы (items) и по признаку SECTION_ID (ид раздела) назначить каждый элемент в созданный массив с привязкой к разделам ($arResult["SECTIONS"]["SECTION_ID"]["ITEMS"][] = $arItem;) После чего в template.php вызвать сначала foreach ($arResult["SECTIONS"] as $oneSection){...} внутри сначала вывести всё что нужно по разделу а ниже повторно foreach ($oneSection["ITEMS"] as $oneItem){...}
Надеюсь всё понятно. P.S. Мой код копипэйстом лучше не ставить. писал на скорость, могут быть ошибки. Подытожим. В result_modifier.php необходимо сформировать готовый массив с правильным расположением элементов. Должен быть массив разделов с ключами по иду разделов. внутри каждого массива раздела должен быть массив его элементов. В шаблоне выводишь в первом foreach свой собранный массив разделов, внутри цикла инфу по этому разделу, а ниже второй foreach с перечислением элементов. Готово
"Ничто не истинно - всё дозволено." Assassin's Creed
для каждого лэндинга новый ИБ это маразм. вопросом ЗАЧЕМ так не задавались? 1лэндинг = 1 раздел, как уже написали выше. для раздела можно и свойства создать, и не плодить кучу ненужных ИБ.
"Ничто не истинно - всё дозволено." Assassin's Creed
Может быть я не прав но это вроде бы задача не битрикса а какой нибудь яндекс метрики или аналогичных аналитических сервисов. может гугл аналитикс. это должны SEOшники знать точно.
"Ничто не истинно - всё дозволено." Assassin's Creed
Не знаю почему, но как то сам вспомнил такую особенность, что в header.php необходимо ставить
Код
<h1><?$APPLICATION->ShowTitle(false);?></h1>
false должен очищать значение от html тегов, но почему то заодно срабатывает и назначение параметров через SetPageProperty из кешированного шаблона. Скорее всего связано с тем, что при установленном false, результат возвращается с помощью CMain::GetTitle
"Ничто не истинно - всё дозволено." Assassin's Creed
Здравствуйте. В шаблоне сайта в header.php задано:
Код
<h1><?$APPLICATION->ShowTitle();?></h1>
На странице mysite.ru/news/index.php у меня идёт вызов компонента bitrix.news и я хочу чтобы при выводе детальных новостей, заголовок в хедере менялся на имя новости. В коде добавил
Но это работает только с отключённым кешированием компонента. Размещение в component_epilog.php ничем не помогает. Галочка Устанавливать заголовок страницы в настройках компонента устанавливает в качестве заголовка имя инфоблока и на странице со списком (что правильно) и на страницах детального просмотра (что не правильно).
Цитата
Выставлять название и свойства страниц в ШАБЛОНЕ компонента нельзя. То есть можно, но работать будет только пока не включено кеширование компонент.
Что, неужели всё действительно так плохо? хочу название новостей в заголовок = отключать кеширование. Не хочу отключать кеширование = отказаться от автоматического вывода заголовка в шаблоне сайта и выводить H1 тегом вручную на каждой странице сайта ???
"Ничто не истинно - всё дозволено." Assassin's Creed
backerov написал: Подскажите пожалуйста, галочку поставил в пункте - Показывать ссылку "Все": - но, что то никак не пойму где должна появится
Это параметр постраничной навигации! И оно не будет отображаться так как вам нужно. По указанной вами ссылке открывается один из корневых разделов. если вам необходимо сделать кнопку именно в списке разделов, то зайдите в шаблон, файл section.php - и в нужном вам месте вставьте кнопку с передачей например параметра в url, а ниже по коду сделайте If($_GET...) проверку получения этого параметра. если он найден, выводите компонент bitrix:catalog.section иначе, оставляете тот код что там был (sections.list кажется)
получилось весьма сумбурно, но надеюсь разберётесь
"Ничто не истинно - всё дозволено." Assassin's Creed
Нужно использовать одно из имеющихся событий При копировании элемента идёт обычное создание нового элемента. плюс копируются поля выбранного элемента. событие позволит обнулить необходимые поля
"Ничто не истинно - всё дозволено." Assassin's Creed
Класс CBitrixComponentTemplate является оболочкой шаблона компонента. Для каждого подключаемого шаблона компонента создаётся свой экземпляр класса CBitrixComponentTemplate, который живет от момента инициализации шаблона в коде компонента до конца подключения компонента.
Владислав Закиров написал: Не могли бы подсказать какой именно код нужно вставить в шаблон
в шаблоне вывода элементов у вас есть конструкция вида
Код
<?foreach as $arResult["ITEMS"] $arItem){...}?>
на месте многоточия происходит вывод элементов каталога. можно добавить параметр $key при инициализации цикла и использовать его в цикле для вывода IDов.