В одном из проектов изредка возникают жалобы менеджеров по поводу неполных комментариев к заказам. Некоторые пользователи ограничиваются указанием просьбы перезвонить в комментариях к заказу, а некоторые оставляют большое описание желаемого алгоритма покупки. В частности покупатели указывают желаемое время получения заказа, альтернативные контактные данные и различные вопросы.
Рассмотрев поле "Комментарии покупателя" повнимательнее, выяснили, что в базе данных под это поле отведён тип VARCHAR(250), поэтому весь текст, который превышает этот лимит попросту игнорируется СУБД.

После создания заказа вызывается событие OnOrderAdd, в обработчик которого передаются параметры $ID и $arFields. Оценив эти параметры, выяснили, что в $arFields по ключу "USER_DESCRIPTION" содержится полный текст пользовательского комментария к заказу, соотвественно можно использовать это событие для реализации задуманного.
Начали искать способ хранения пользовательских комментариев "вне заказа". Оказалось, что свойства заказа также имеют ограничения на уровне СУБД.

Следующим вариантом хранения был выбран модуль Веб-формы. Для этого создаётся веб-форма с двумя полями: `order` (Integer) и `comments` (text). Так как модуль веб-форм работает в расширенном режиме, пришлось создать ещё статус "По умолчанию".



Теперь остаётся используя обработчик события OnOrderAdd, при каждом заказе (при заполненных комментариях к этому заказу) сохранять результат в веб-форму.
В результате получаем сохранённые в веб-формах ID заказа и комментарии покупателей. Условие можно усложнить, добавить ограничение и пр. В дальнейшем, в том числе и программно, по ID заказа мы можем получить полный комментарий покупателя.
В частности, если кастомизировать файл с пользовательской формой просмотра заказа и найдя по ID заказа один из результатов веб-форм, можно вывести полный комментарий прямо в эту форму.
Метод CCustomSaleHandlers::getAdditionalOrderFields() сначала ищет соотвествующий заказу результат веб-формы (CFormResult::GetList), а затем получает значения полей этого результата.
Рассмотрев поле "Комментарии покупателя" повнимательнее, выяснили, что в базе данных под это поле отведён тип VARCHAR(250), поэтому весь текст, который превышает этот лимит попросту игнорируется СУБД.

После создания заказа вызывается событие OnOrderAdd, в обработчик которого передаются параметры $ID и $arFields. Оценив эти параметры, выяснили, что в $arFields по ключу "USER_DESCRIPTION" содержится полный текст пользовательского комментария к заказу, соотвественно можно использовать это событие для реализации задуманного.
Начали искать способ хранения пользовательских комментариев "вне заказа". Оказалось, что свойства заказа также имеют ограничения на уровне СУБД.

Следующим вариантом хранения был выбран модуль Веб-формы. Для этого создаётся веб-форма с двумя полями: `order` (Integer) и `comments` (text). Так как модуль веб-форм работает в расширенном режиме, пришлось создать ещё статус "По умолчанию".



Теперь остаётся используя обработчик события OnOrderAdd, при каждом заказе (при заполненных комментариях к этому заказу) сохранять результат в веб-форму.
AddEventHandler("sale", "OnOrderAdd", array("CCustomSaleHandlers", "checkOrderProperties")); class CCustomSaleHandlers { ... const ORDER_SUPPLEMENT_FORM_ID = 3; //ID веб-формы с дополнениями к заказу const ORDER_SUPPLEMENT_FORM_STATUS_DEFAULT = 4; const ORDER_SUPPLEMENT_FORM_FIELD_ORDER_ID = "order"; const ORDER_SUPPLEMENT_FORM_FIELD_COMMENTS = "comments"; ... public static function checkOrderProperties($ID, $arFields) { $sEvents = ""; $sEvents .= "\n" . date("Y-m-d H:i:s") . "\t" . __LINE__ . "\n" . "ID: " . $ID; if (isset($arFields["PERSON_TYPE_ID"]) && isset($arFields["USER_DESCRIPTION"]) && (strlen($arFields["USER_DESCRIPTION"]) > 0)) { if (CModule::IncludeModule("form")) { $arValues = array ( "status_SIMPLE_FORM_" . self::ORDER_SUPPLEMENT_FORM_ID => self::ORDER_SUPPLEMENT_FORM_STATUS_DEFAULT, ); if ($iResultID = CFormResult::Add(self::ORDER_SUPPLEMENT_FORM_ID, $arValues, "N")) { CFormResult::SetField($iResultID, self::ORDER_SUPPLEMENT_FORM_FIELD_ORDER_ID, $ID); CFormResult::SetField($iResultID, self::ORDER_SUPPLEMENT_FORM_FIELD_COMMENTS, $arFields["USER_DESCRIPTION"]); $sEvents .= "\n" . "Дополнительные поля заказа #" . $ID . " сохранены: #" . $iResultID; } else { $sEvents .= "\n" . "Ошибка сохранения дополнительных полей заказа #" . $ID; } } } if ((strlen($sEvents) > 0) && self::DO_LOG) AddMessage2Log("\n" . __CLASS__ . "\t" . __METHOD__ . "\n" . $sEvents); return true; } ... } |
В результате получаем сохранённые в веб-формах ID заказа и комментарии покупателей. Условие можно усложнить, добавить ограничение и пр. В дальнейшем, в том числе и программно, по ID заказа мы можем получить полный комментарий покупателя.
В частности, если кастомизировать файл с пользовательской формой просмотра заказа и найдя по ID заказа один из результатов веб-форм, можно вывести полный комментарий прямо в эту форму.
... if (class_exists("CCustomSaleHandlers")) { $arrFields = CCustomSaleHandlers::getAdditionalOrderFields($ID); if (isset($arrFields["comments"]) && (strlen($arrFields["comments"]) > 0) && ($arrFields["comments"] != $arOrder["USER_DESCRIPTION"])) { $arOrder["USER_DESCRIPTION"] = "OLD: " . $arOrder["USER_DESCRIPTION"] . "\n" . "NEW: " . $arrFields["comments"]; } } ... |