Иногда все гениальное просто. Почему до сих пор этот момент не поправили не знаю, но решение по сути, в одну строчку.
1. Кастомизируем компонент () который проводит операцию по переносу товара в корзину.
Обычно это карточка товара
bitrix/components/bitrix/catalog.element/component.php
и/или список элементов
bitrix/components/bitrix/catalog.section/component.php
Помните, что если вы не кастомизируете компонент, то после обновления ваши правки могут быть удалены(!)
2. Найдите кусок кода который отвечает за проверку соответствия тех параметров что в настройках, и тех что пришли из формы, при нажатии на "купить":
3. Добавьте перед ним строку
Она подменяет список требуемых свойств на те что пришли из формы после нажатия на "Купить"
Теперь если какое-то свойство у товара не заполнено, например "Цвет" имеет выбор, а "Размер" для данного товара не указан, то это не помешает пользователю выбрать только цвет и купить с ним.
Естественно есть проблема безопасности, так как список свойств берется не из настроек компонента а из формы, т.е. потенциально со стороны клиента. Но этого можно избежать если немного повозиться со строчкой в п.3. В $arParams["PRODUCT_PROPERTIES"] находится максимально разрешенный набор свойств для товара, а в нем надо оставить только те из них что есть в $_POST[$arParams["PRODUCT_PROPS_VARIABLE"]]. Тогда решение будет немного длиннее, но абсолютно безопасным для вашего сайта.
4. Маленький тюнинг шаблона что бы не выводить select-ом свойства у которых только одно значение
Находим в шаблоне (карточки товара или списка элементов раздела)
и меняем на
Последнее можно записать аккуратнее, но как всегда сроки горят, так что мысль ясна, а дальше записывайте в своем стиле.
Собственно все.
1. Кастомизируем компонент () который проводит операцию по переносу товара в корзину.
Обычно это карточка товара
bitrix/components/bitrix/catalog.element/component.php
и/или список элементов
bitrix/components/bitrix/catalog.section/component.php
Помните, что если вы не кастомизируете компонент, то после обновления ваши правки могут быть удалены(!)
2. Найдите кусок кода который отвечает за проверку соответствия тех параметров что в настройках, и тех что пришли из формы, при нажатии на "купить":
| Код |
|---|
if(count($arParams["PRODUCT_PROPERTIES"]))
{
if(is_array($_POST[$arParams["PRODUCT_PROPS_VARIABLE"]]))
{
$product_properties = CIBlockPriceTools::CheckProductProperties(
$arParams["IBLOCK_ID"],
$productID,
$arParams["PRODUCT_PROPERTIES"],
$_POST[$arParams["PRODUCT_PROPS_VARIABLE"]]
);
if(!is_array($product_properties))
$strError = GetMessage("CATALOG_ERROR2BASKET").".";
}
else
{
$strError = GetMessage("CATALOG_ERROR2BASKET").".";
}
} |
3. Добавьте перед ним строку
| Код |
|---|
$arParams["PRODUCT_PROPERTIES"] = array_keys($_POST[$arParams["PRODUCT_PROPS_VARIABLE"]]); |
Она подменяет список требуемых свойств на те что пришли из формы после нажатия на "Купить"
Теперь если какое-то свойство у товара не заполнено, например "Цвет" имеет выбор, а "Размер" для данного товара не указан, то это не помешает пользователю выбрать только цвет и купить с ним.
Естественно есть проблема безопасности, так как список свойств берется не из настроек компонента а из формы, т.е. потенциально со стороны клиента. Но этого можно избежать если немного повозиться со строчкой в п.3. В $arParams["PRODUCT_PROPERTIES"] находится максимально разрешенный набор свойств для товара, а в нем надо оставить только те из них что есть в $_POST[$arParams["PRODUCT_PROPS_VARIABLE"]]. Тогда решение будет немного длиннее, но абсолютно безопасным для вашего сайта.
4. Маленький тюнинг шаблона что бы не выводить select-ом свойства у которых только одно значение
Находим в шаблоне (карточки товара или списка элементов раздела)
| Код |
|---|
<select name="<?echo $arParams["PRODUCT_PROPS_VARIABLE"]?>[<?echo $pid?>]"> <?foreach($product_property["VALUES"] as $k => $v):?> <option value="<?echo $k?>" <?if($k == $product_property["SELECTED"]) echo '"selected"'?>> <?echo $v?> </option> <?endforeach;?> </select> |
и меняем на
| Код |
|---|
<? if (count($product_property["VALUES"]) > 1) { ?>
<select name="<?echo $arParams["PRODUCT_PROPS_VARIABLE"]?>[<?echo $pid?>]">
<?foreach($product_property["VALUES"] as $k => $v):?>
<option value="<?echo $k?>" <?if($k == $product_property["SELECTED"]) echo '"selected"'?>>
<?echo $v?>
</option>
<?endforeach;?>
</select>
<? } else { ?>
<?foreach($product_property["VALUES"] as $k => $v):?>
<?echo $v; $gv = $k;?>
<?endforeach;?>
<input type=hidden name="<?echo $arParams["PRODUCT_PROPS_VARIABLE"]?>[<?echo $pid?>]" value="<?=$gv;?>">
<? } ?> |
Последнее можно записать аккуратнее, но как всегда сроки горят, так что мысль ясна, а дальше записывайте в своем стиле.
Собственно все.
)))