[spoiler]
Компонент bitrix:iblock.element.webform позволяет создавать и править элементы инфоблока в публичной части. С его помощью можно настроить список задаваемых свойств, как стандартных, так и пользовательских, а также указать их обязательность. Для редактирования пользовательских свойств используются классы BXCustomTypePublicEdit, которые создаются новым фабричным методом CreatePublicEditor класса BXCustomType.
При разработке компонента bitrix:iblock.element.webform и API публичного редактирования мы акцентировали внимание на следующих аспектах:
- Сократить размер кода, необходимого для отрисовки редакторов свойств и сбора введенных данных - тем самым упростить код шаблона компонента
- Унифицировать работу с публичными редакторами для любого пользовательского типа данных - тем самым позволить безболезненно создавать новые пользовательские типы данных
- Разрешить написание и повторное использование собственных редакторов
Для этого мы отошли от классического для ASP.NET Web Forms подхода c использованием Control'ов и написали интерфейс с методами для отрисовки редакторов в HTML, валидации значений, пришедших через POST и сохранения значений в коллекцию пользовательских свойств или в элемент инфоблока. в результате публичный редактор легко выводится в теле ASPX/ASCX шаблона, быстро работает и не создает громоздких идентификаторов (как это любят делать элементы управления Web Forms) и не оставляет отпечатка во ViewState.
Структура классов для публичного редактирования выглядит следующим образом:
В компоненте bitrix:iblock.element.webform стандартные свойства элемента инфоблока объединены одним общим интерфейсом BXIBlockElementFieldPublicEditor. В результате код шаблона компонента по умолчанию (без различных "вкусностей") выглядит очень компактно и читаемо:
#008000;"><% #0600FF;">foreach #000000;">(#FF0000;">string error #0600FF;">in Component.#0000FF;">SummaryErrors#000000;">) #000000;">{ #008000;">%><span #FF0000;">class#008000;">=#666666;">"errortext"#008000;">><%= error #008000;">%></span#008000;">><br #008000;">/><% #000000;">} #008000;">%> #008000;"><table width#008000;">=#666666;">"100%" cellpadding#008000;">=#666666;">"2" cellspacing#008000;">=#666666;">"2" border#008000;">=#666666;">"0"#008000;">> #008000;"><% #0600FF;">foreach #000000;">(#FF0000;">string fieldID #0600FF;">in Component.#0000FF;">EditFields#000000;">) #000000;">{ #0600FF;">if #000000;">(#008000;">!Component.#0000FF;">ElementFields.#0000FF;">ContainsKey#000000;">(fieldID#000000;">)#000000;">) continue; IBlockElementWebFormComponent.#0000FF;">ElementField field #008000;">= Component.#0000FF;">ElementFields#000000;">[fieldID#000000;">]; #008000;">%> #008000;"><tr#008000;">> #008000;"><td align#008000;">=#666666;">"right" width#008000;">=#666666;">"30%" valign#008000;">=#666666;">"top"#008000;">> #008000;"><% #0600FF;">if #000000;">(field.#0000FF;">Required#000000;">) #000000;">{ #008000;">%><span style#008000;">=#666666;">"color:red;"#008000;">>*</span#008000;">><% #000000;">} #008000;">%> #008000;"><%= field.#0000FF;">Title#008000;">%>: #008000;"></td#008000;">> #008000;"><td valign#008000;">=#666666;">"top"#008000;">><%= field.#0000FF;">Render#000000;">(#000000;">)#008000;">%> #008000;"><% #0600FF;">if #000000;">(field.#0000FF;">ValidateErrors #008000;">!= #0600FF;">null#000000;">) #000000;">{ #008000;">%><span style#008000;">=#666666;">"color:red;"#008000;">>*</span#008000;">><% #000000;">} #008000;">%> #008000;"></td#008000;">> #008000;"></tr#008000;">> #008000;"><% #000000;">} #008000;">%> #008000;"></table#008000;">> #008000;"><br #008000;">/> #008000;"><asp#008000;">:Button runat#008000;">=#666666;">"server" ID#008000;">=#666666;">"SaveButton" Text#008000;">=#666666;">"<%$ Parameters:CreateButtonTitle %>" OnClick#008000;">=#666666;">"SaveWebForm" #008000;">/>
И этот код будет работать при добавлении новых пользовательских типов данных.
Если возникнет необходимость использовать собственный редактор для свойства, его можно предоставит, подписавшись в шаблоне компонента на событие CreateCustomTypePublicEditor или CreateFieldPublicEditor компонента bitrix:iblock.element.webform. Ну и конечно, никто не запрещает использовать редакторы отдельно от компонента.
Некоторые особенности API:
- Т.к. действие записи пользовательского ввода в элемент инфоблока осуществляется посредством механизма Postback, то для защиты от CSRF используютется механизм проверки событий ASP.NET Web Forms, поэтому не рекомендуется его выключать
- Отказ от использования механизма Control'ов не позволяет использовать естественным образом валидаторы для проверки пользовательского ввода на стороне клиента - вероятно в будущем мы предложим решение этого вопроса