Единый прайс-лист для услуг в 1С-Битрикс через отдельный инфоблок
Если сайт содержит десятки или сотни услуг, рано или поздно возникает проблема с обновлением цен. Стоимость одной и той же услуги может выводиться в списке услуг, на детальной странице, на главной странице, в блоке рекомендаций и других местах. В результате изменение одной цены превращается в поиск всех страниц, где она используется.
Гораздо удобнее хранить стоимость услуг в отдельном инфоблоке и просто связывать каждую услугу с соответствующей записью прайс-листа. Тогда изменение цены происходит только в одном месте, а обновленные данные автоматически появляются на всем сайте.
Структура инфоблоков
Структура инфоблоков
Для реализации понадобится всего два инфоблока:
- Услуги — основной инфоблок сайта.
- Прайс-лист — отдельный инфоблок, в котором будут храниться все цены.
В инфоблоке Прайс-лист создаем множественное свойство PRICE. Каждое значение свойства — отдельная стоимость услуги. В описании каждого значения можно хранить пояснение, например: «Первичный прием», «Повторный прием», «Онлайн-консультация» и т.д.
В инфоблоке Услуги создаем свойство типа «Привязка к элементу», которое будет ссылаться на инфоблок «Прайс-лист». Назовем его PRICE_ITEM.
Теперь при редактировании услуги менеджеру достаточно выбрать нужный элемент из списка. Не нужно помнить ID элементов или вводить их вручную, а вероятность ошибки практически сводится к нулю.
Инфоблок "Услуги"
Удаление зуба
│
▼
PRICE_ITEM
│
▼
Инфоблок "Прайс-лист"
• 3 500 руб. — Простое удаление
• 5 000 руб. — Сложное удаление
• 8 000 руб. — Удаление зуба мудрости
В результате одна запись прайс-листа может использоваться сразу в нескольких услугах или даже на нескольких сайтах при использовании многосайтовости.
Вывод минимальной цены в списке услуг
На странице списка услуг обычно достаточно показать минимальную стоимость. Получаем элемент прайс-листа по привязке и выводим минимальное значение из свойства PRICE.
<?php
if (!empty($arItem["DISPLAY_PROPERTIES"]["PRICE_ITEM"]["VALUE"])) {
$arFilter = [
"IBLOCK_ID" => ID_ИНФОБЛОКА_ПРАЙСА,
"ID" => $arItem["DISPLAY_PROPERTIES"]["PRICE_ITEM"]["VALUE"]
];
$arSelect = ["ID"];
$rsResult = CIBlockElement::GetList([], $arFilter, false, false, $arSelect);
if ($ob = $rsResult->GetNextElement()) {
$props = $ob->GetProperties();
echo number_format(
min($props["PRICE"]["VALUE"]),
0,
'',
' '
) . ' руб.';
}
}
?>
Такой вариант отлично подходит для карточек услуг, каталога, главной страницы и любых других списков.
Вывод полного прайс-листа на детальной странице
На детальной странице обычно требуется показать все варианты стоимости вместе с их описанием.
<?php
if (!empty($arResult["DISPLAY_PROPERTIES"]["PRICE_ITEM"]["VALUE"])) {
$arFilter = [
"IBLOCK_ID" => ID_ИНФОБЛОКА_ПРАЙСА,
"ID" => $arResult["DISPLAY_PROPERTIES"]["PRICE_ITEM"]["VALUE"]
];
$arSelect = ["ID"];
$rsResult = CIBlockElement::GetList([], $arFilter, false, false, $arSelect);
if ($ob = $rsResult->GetNextElement()) {
$props = $ob->GetProperties();
foreach ($props["PRICE"]["VALUE"] as $key => $price) {
?>
<div class="price-row">
<div class="price">
<?=$price?> руб.
</div>
<div class="description">
<?=$props["PRICE"]["DESCRIPTION"][$key]?>
</div>
</div>
<?php
}
}
}
?>
Преимущества такого подхода
- все цены хранятся в одном месте;
- любое изменение автоматически отображается на всем сайте;
- исключаются расхождения между страницами;
- можно хранить несколько цен для одной услуги;
- удобно импортировать прайс из Excel, CRM или 1С;
- один прайс можно использовать сразу для нескольких услуг;
- менеджерам не нужно искать и изменять стоимость на десятках страниц.
Такой способ хранения цен отлично подходит для медицинских центров, стоматологий, автосервисов, салонов красоты, юридических компаний и любых других сайтов услуг, где прайс регулярно обновляется.
Конечно, это не единственный вариант реализации, но на практике подобная схема значительно упрощает сопровождение проекта. Достаточно изменить один элемент инфоблока «Прайс-лист», и новые цены автоматически появятся во всех местах сайта.
Комментарии
Будем рады вашему мнению и вопросам по статье.