Регистрация  |  Вход

Html или чистый apex Visualforce. Сравнение подходов на реальном примере.

Спустя некоторое время работы с Salesforce начинаешь понимать что в разработке Visualforce страниц можно выделать два подхода. Чистое использование apex тегов, которые предлагает нам salesforce и традиционное html-javascript программирование с использованием функционала visualforce.



Вообще Salesforce жестко высказывается по этому поводу в пользу чистого apex программирования и даже до недавнего времени всякие javascript frameworks были запрещены для использования на страницах. Но, наверное, мировое сообщество начинает брать вверх и политика salesforce перестает быть столько категоричной.

Насколько я знаю, единственный случай когда стоит учитывать требования Salesforce - это  если вы собираетесь выложить свое приложение в AppExcenge. В этом случае Вам предстоит пройти ряд серьезных проверок вашего кода. И тут солянка из html и apex может послужить поводом для возврата приложения на переделку. В остальных случаях подход к разработке страницы ложится на ваши плечи.

Вот типичный пример различия обоих подходов из нашего приложения Library.

		<!-- html method  -->

<apex:outputPanel layout="block" id="BookTableBox">
<table id="BookTable">
<tr>
<th>Name</th>
<th>ISBN</th>
<th>Date Of Publication</th>
<th>Author</th>
<th></th>
</tr>
<apex:repeat value="{!Books}" var="book">
<tr>
<td>
<apex:outputField value="{!book.Name}"/>
</td>
<td>
<apex:outputField value="{!book.ISBN__c}"/>
</td>
<td>
<apex:outputField value="{!book.Date_Of_Publication__c}"/>
</td>
<td>
<apex:repeat value="{!book.Book_Author__r}" var="author">
<apex:outputField value="{!author.Author__r.Name}"/> <br />
</apex:repeat>
</td>
<td>
<a href="#">Edit</a><br />
<a href="#">Delete</a>
</td>
</tr>
</apex:repeat>
</table>
</apex:outputPanel>

<!-- apex method -->
<apex:dataTable value="{!Books}" var="book" id="BookTable" >
<apex:column >
<apex:facet name="header">Name</apex:facet>
<apex:outputField value="{!book.Name}"/>
</apex:column>
<apex:column >
<apex:facet name="header">ISBN</apex:facet>
<apex:outputField value="{!book.ISBN__c}"/>
</apex:column>
<apex:column >
<apex:facet name="header">Date Of Publication</apex:facet>
<apex:outputField value="{!book.Date_Of_Publication__c}"/>
</apex:column>
<apex:column >
<apex:facet name="header">Authors</apex:facet>
<apex:repeat value="{!book.Book_Author__r}" var="author">
<apex:outputField value="{!author.Author__r.Name}"/> <br />
</apex:repeat>
</apex:column>
<apex:column >
<apex:facet name="header">Action</apex:facet>
<apex:outputLink value="#">Edit</apex:outputLink><br />
<apex:outputLink value="#">Delete</apex:outputLink>
</apex:column>
</apex:dataTable>

Здесь показан код в котором строится одна и та же таблица. В первом случае с использованием html тегов с минимальным использованием необходимых apex тегов для реализации логики visualforce страницы. Во-втором случае та же самая таблица, только с использованием только apex тегов.

Я больше склоняюсь к первому методу, потому что

  • структура html ближе дизайнерам и верстальщикам, которые трудятся вместе с вами. (т.е. такой код проще в поддержке для людей далеких от salesforce)

  • намного проще адаптировать шаблоны страниц из чистого html.

  • намного проще получается использовать javascript, потому что вы сразу видите структуру DOM с которой придется работать, в отличие от apex тегов, которые транслируются в html на этапе рендеринга страницы.

  • соотношение apex и html можно изменять в любую сторону в зависимости от логики и здравого смысла.


Чистый код из apex тегов для Visualforce страницы хотя и является философией Salesforce и перекрывает 110% потребностей разработчиков, но загоняет нас в своего рода рамки самой системы.

Каждый волен выбирать свой подход к разработки, мою позицию вы уже поняли.