Как позволить оплатить с внутреннего счета только при определенной сумме на счете
Надеюсь нижеописанное будет полезно. По крайней мере оно нашло применение в двух проектах.
Итак, в чем же суть? Иногда бывает "полезно" запретить пользователю оплачивать заказ с внутреннего счета, если у него сумма меньше определенной, или, что бывает чаще, если сумма на счете позволяет полностью погасить заказ. Если вам это не надо, то дальше можно не читать.
Я думал как решить эту задачу путем меньшего сопротивления. И, как мне кажется, нашел очень простое и красивое решение.
1. Копируем шаблон компонента оформления заказа (sale.order.full).
2. В папку шаблона кидаем файл .parameters.php такого содержания:
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arTemplateParameters = array(
"SHOW_PFA_IF" => Array(
"NAME" => GetMessage("SHOW_PFA_IF"),
"TYPE" => "LIST",
"VALUES" => array(
"ALWAYS" => GetMessage("SHOW_PFA_ALWAYS"),
"SUFFICIENT" => GetMessage("SHOW_PFA_SUFFICIENT"),
"MORE_OR_EQUAL" => GetMessage("SHOW_PFA_MORE_OR_EQUAL"),
)
),
"MIN_ACCOUNT" => Array(
"NAME" => GetMessage("MIN_ACCOUNT"),
"TYPE" => "STRING",
"DEFAULT" => ""
)
);
?> |
Я очень люблю lang-файлы, многие называют меня параноиком.
Вот значения lang-ключей:
<?
$MESS ['SHOW_PFA_IF'] = "Выводить \"Оплатить со счета\" только если";
$MESS ['SHOW_PFA_ALWAYS'] = "всегда";
$MESS ['SHOW_PFA_SUFFICIENT'] = "сумма на счете достаточна";
$MESS ['SHOW_PFA_MORE_OR_EQUAL'] = "сумма на счете больше либо равна";
$MESS ['MIN_ACCOUNT'] = "Сумма на счете для контроля (пред. опция)";
?> |
3. В нашей папке шаблона есть несколько файлов шагов вида step1.php, step2.php, ...
Идем в step4.php. И там, в самом верху, дописываем:
<?
if ($arResult["PAY_FROM_ACCOUNT"] == "Y")
{
if ($arParams["SHOW_PFA_IF"] == "SUFFICIENT")
{
if ($arResult["POST"]["ORDER_PRICE"] <= intval($arResult["USER_ACCOUNT"]["CURRENT_BUDGET"]))
{
$arResult["PAY_FROM_ACCOUNT"] = "Y";
}
else
{
$arResult["PAY_FROM_ACCOUNT"] = "N";
}
}
if ($arParams["SHOW_PFA_IF"] == "MORE_OR_EQUAL")
{
if (intval($arParams["MIN_ACCOUNT"]) <= intval($arResult["USER_ACCOUNT"]["CURRENT_BUDGET"]))
{
$arResult["PAY_FROM_ACCOUNT"] = "Y";
}
else
{
$arResult["PAY_FROM_ACCOUNT"] = "N";
}
}
}
?>
|
Вот собственно и все. Заходим в настройки компонента в режиме редактирования сайта и видим волшебные настройки:
UPD:Забыл еще главный момент дописать. В вышеозвученном файле step4.php Надо воткнуть еще строчку:
<input type="hidden" name="PAY_CURRENT_ACCOUNT" value="N"> |
Но чтобы до конца быть правильным, надо немного изменить блок, начинающийся с
if ($arResult["PAY_FROM_ACCOUNT"]=="Y") |
Должно получиться примерно следующее:
if ($arResult["PAY_FROM_ACCOUNT"]=="Y";)
{
?>
<input type="hidden" name="PAY_CURRENT_ACCOUNT" value="N">
<input type="checkbox" name="PAY_CURRENT_ACCOUNT" id="PAY_CURRENT_ACCOUNT" value="Y"<?if($arResult["PAY_CURRENT_ACCOUNT"]!="N";) echo " checked";?>> <label for="PAY_CURRENT_ACCOUNT"><b><?echo GetMessage("STOF_PAY_FROM_ACCOUNT";)?></b></label><br />
<?=GetMessage("STOF_ACCOUNT_HINT1";)?> <b><?=$arResult["CURRENT_BUDGET_FORMATED"]?></b> <?echo GetMessage("STOF_ACCOUNT_HINT2";)?>
<br /><br />
<?
}
[COLOR=#009900] else
{
?><input type="hidden" name="PAY_CURRENT_ACCOUNT" value="N"><?
}
[/COLOR] |
Зеленым маркером помечено добавленное.
Назад в раздел