Практически в решении любой задачи, мне необходимо какие-либо данные передать из одной странички в другую. Не судите строго, я совсем недавно изучил первый уровень html + css + js. А что касается php и битрикса, так там чисто путанный опыт. Что бы было более наглядно возьмем такой пример.
Менеджер заполняет сделку в crm.
Необходимо что бы менеджер мог выставить скидку/надбавку к товарам.
Имеем:
А) Список товаров с привязкой, разумеется к ИБ. Там же хранится и изначальная цена товара.
Б) Пользовательское свойство Скидка\Надбавка.
Теперь немного про собственный путанный опыт...
1. Первым делом я иду в компонент, вызываемый на данной страничке, а именно crm.deal.edit\component.php Забираясь в код прописываю вывод переменной $arResult. Узнаю что значение общей суммы товаров хранятся в:
Код |
---|
а) $arResult['FIELDS']['tab_1']['4']['value'];
б) $arResult['ELEMENT']['OPPORTUNITY'];
в) $arResult['ELEMENT']['OPPORTUNITY_ACCOUNT']. |
2. После этого мне необходимо что бы учитывалась скидка. Скидку я так же нашел через $arResult, путь получился: $arResult['ELEMENT']['UF_CRM_1410169646'].
3. Немного подергав код я понял, что общая сумма передается переменной, а конкретнее значением в [value]
Код |
---|
$opportunityFld = array(
'id' => 'OPPORTUNITY',
'name' => GetMessage('CRM_FIELD_OPPORTUNITY'),
'params' => array('size' => 21, 'sale_order_marker' => 'Y'),
'value' => (isset($arResult['ELEMENT']['OPPORTUNITY'] ? $arResult['ELEMENT']['OPPORTUNITY'] : '') |
4.. Это значение должно считаться вместе со скидкой, соответственно в [value] вставил следующее:
Код |
---|
'value' => ((isset($arResult['ELEMENT']['OPPORTUNITY'] ? $arResult['ELEMENT']['OPPORTUNITY'] : '') + ((isset($arResult['ELEMENT']['OPPORTUNITY'] ? $arResult['ELEMENT']['OPPORTUNITY'] : '') * ((isset($arResult['ELEMENT']['UF_CRM_1410169646'] ? $arResult['ELEMENT']['UF_CRM_1410169646'] : '') * 0.01))) |
5. Теперь я решил это значение передать во все поля, которые отражали общую стоимость, в надежде что она будет отражаться с ее учетом. Прописал следующие строки:
Код |
---|
$arResult['ELEMENT']['OPPORTUNITY'] = $opportunityFld['value'];
$arResult['ELEMENT']['~OPPORTUNITY'] = $opportunityFld['value'];
$arResult['ELEMENT']['OPPORTUNITY_ACCOUNT'] = $opportunityFld['value'];
$arResult['ELEMENT']['~OPPORTUNITY_ACCOUNT'] = $opportunityFld['value']; |
Как я был рад, когда все необходимые мне значения в $arResult стали действительно такими какими я и хотел, все считается, здорово! Но к сожалению когда я спустился в конец кода, после которого шли поля, заполняемые менеджером, я увидел ужасные строчки... Цена, так же как и общая сумма по прежнему остались неизменными, без учета скидки. Моему разочарованию не было предела. Выкрив пару сигарет, решил не сдаваться...
Дошло до того что я полез в консоль браузера. Поковыряв консоль я понял, что сумма моя отражается в классе : crm-product-field-text. Немного подумав, где в битриксе такое может использоваться, было принято решение пробежаться по всему битриксу в поисках этой фразы. Мне повезло и он нашел всего-лишь 8 файлов. Поковырявшись немного в каждом, я узнал что мне нужен никто иной как шаблон компонента crm.product_row.list\templates\.default\template.php.
Как здорово было найти шаблон компонента, о котором нигде не было упоминания, по крайней мере в коде я ничего подобного не нашел. Ну да ладно, у нас есть новый шаблон, а значит появляются новые надежды!
Здесь я дернул первую строчку, которую счел нужной и действительно, поставив туда цифру, она меняется в общей сумме!
Точнее за место %.2f', $row['PRICE'] ;) прописал циферку.
Код |
---|
<tr id="<?=$rowID?>"<?=$rowClass !== '' ? ' class="'.htmlspecialcharsbx($rowClass).'"' : ''?>>
<td>
<?if(!$readOnly):?>
<span class="crm-view-table-column-delete"></span>
<?endif;?>
</td>
<td class="crm-product-column-name">
<?
if ($row['PRODUCT_NAME'] == "OrderDelivery"
echo htmlspecialcharsbx(GetMessage("CRM_PRODUCT_ROW_DELIVERY");
elseif ($row['PRODUCT_NAME'] == "OrderDiscount"
echo htmlspecialcharsbx(GetMessage("CRM_PRODUCT_ROW_DISCOUNT");
else
echo htmlspecialcharsbx($row['PRODUCT_NAME']
?>
</td>
<td class="crm-product-column-qty">
<span class="crm-product-field crm-product-field-input">
<span class="crm-product-field-text"><?= sprintf('%d', $row['QUANTITY'] ?></span>
</span>
</td>
<td class="crm-product-column-price">
<span class="crm-product-field crm-product-field-input">
<span class="crm-product-field-text"><?= sprintf('%.2f', $row['PRICE'] ?></span>
</span>
</td>
<td class="crm-view-table-column-edit">
<?if(!$readOnly):?>
<span class="crm-product-action-edit"></span>
<?endif;?>
</td>
</tr> |
Ну все осталось дело за малым, передать туда то самое значение, с учетом скидки!
Смотрим что у нас имеется в этом компоненте. Снова вывожу $arResult
Нахожу пару интересных мне значений, а именно:
1. $arResult[PRODUCT_ROWS][0], где указан ID сделки, ID продукта...а так же
[PRICE] => 800
[PRICE_ACCOUNT] => 800.00.
$arResult[SUM_TOTAL] => 800
Чем отличается [PRICE] от [PRICE_ACCOUNT] мне не особо понятно, ну а [SUM_TOTAL] - разумеется общая сумма.
Но я не нахожу здесь своей переменной, в которой менеджер указывает скидку и не знаю каким образом можно ее перекинуть из компонента crm.deal.edit в crm.product_row.list\templates\.default\template.php. В моем случае скидка будет применяться ко всем товарам сразу.