Во второй части этой серии мы рассмотрели использование Zend AMF и Flash Remoting. В этой заключительной части мы рассмотрим функции неявного подкачки, встроенного редактирования и управления данными в Flash Builder 4.
Несмотря на то, что благодаря Flash Builder 4 легко понять, насколько продуктивнее мы можем быть, остается еще намного больше. Например, при более внимательном рассмотрении объекта, выбранного для службы PHP, вы обнаружите пару интересных методов, которые не отображаются напрямую на обычные операции создания, чтения, обновления и удаления (CRUD). В частности, выделяются два метода: getItemsPaged () и count ().
Видите ли, даже с эффективностью, достигнутой с AMF, наступит время, когда у нас будет слишком много записей, чтобы вернуться за один вызов. Этот переломный момент будет зависеть от вашей инфраструктуры, сложности данных и даже требований к компьютеру конечного пользователя, но это произойдет. Общим решением этого является внедрение механизма пейджинга. Это обычно занимает место кнопок «Далее» и «Предыдущий» в вашем приложении с некоторым индикатором страницы. Это также означает больше времени на разработку. И, откровенно говоря, они громоздки и безобразны.
Полоса прокрутки — это естественный механизм подкачки с кнопкой «вверх» для предыдущей страницы, кнопкой «вниз» для следующей и кнопкой большого пальца для управления страницей.
Два дополнительных метода, найденные в примере объекта, помогают Flash Builder реализовать разбиение на страницы для вас. Метод getItemsPaged () получает начальный индекс, который является первичным ключом в базе данных (или другим уникальным идентификатором), и количество записей, возвращаемых для данной страницы. Метод count () позволяет Flash Builder знать, сколько записей в общей сложности ожидать, что в итоге помогает точнее определить размер полосы прокрутки.
Чтобы настроить пейджинг, мы щелкнем правой кнопкой мыши по методу getItemsPaged () и выберем «Включить пейджинг». Откроется диалоговое окно, в котором мы запросим первичный ключ соответствующих данных. Мастер также спросит вас, есть ли метод «count» и какой метод используется для вашего объекта. Завершив работу мастера, вы можете теперь перетащить метод getItemsPaged () в DataGrid (или связанный элемент управления данными), чтобы получить данные, заполненные включенной подкачкой.
Размер страницы по умолчанию составляет двадцать (20), что будет представлено в DataGrid при запуске приложения. Когда пользователь прокручивает больше двадцати, которые там есть, будут сделаны дополнительные удаленные вызовы (в этом случае), чтобы получить страницу данных, соответствующую положению кнопки большого пальца полосы прокрутки. Бремя масштабирования теперь снято с компьютера конечного пользователя и помещено в вашу инфраструктуру, что гораздо лучше для масштабирования.
Если у вас есть миллионы записей, пользователь теперь может легко прокручивать весь набор данных, предполагая, конечно, что ваша база данных может справиться с нагрузкой.
Пока вы настроили соответствующие обработчики запросов, функции подкачки не являются эксклюзивными для Zend AMF и могут даже использоваться с конечными точками HTTPService.
Обновление данных в форме Master-Detail
To this point all we have done is view data, but what about updating it? Flash Builder has this figured out for you as well.
With the DataGrid selected, and bound to a service call, we can right-click and select the option to «Generate Details Form.» The dialog that appears will ask what data type the form will represent, but the default is a «Master Control» a la a master-detail form. You can also choose to make the form editable (the default) or not, and call a service to get the details if necessary.
При нажатии на кнопку «Далее» вам будет представлен список столбцов в вашем типе данных. Все они выбраны по умолчанию, что означает, что Flash Builder сгенерирует поле формы для каждого из них. Вы можете отменить выбор определенных полей, таких как первичные ключи, чтобы у пользователя не было возможности редактировать их в будущем. Нажав на кнопку «Готово», вы получите полную форму для данных, а в случае связи «мастер-деталь» поля уже заполнены.
Когда вы запустите приложение и нажмете на записи, вы увидите соответствующее обновление формы. Когда вы обновите форму, вы увидите обновление DataGrid. Это стало возможным благодаря новой функции Flex 4 двусторонней привязки. В собственно Flex SDK есть много других основных изменений, которые я даже не затронул, которые заслуживают вашего времени при чтении документации. Хорошо, это здорово и все, но мы все еще не обновляем наши данные, и это была цель, к которой мы стремимся.
Чтобы приложение действительно отправляло данные на сервер для обновления, было бы неплохо предоставить пользователю средство сообщить, когда должно произойти обновление. Добавим кнопку с надписью «Сохранить» в приложение. С этой кнопкой «Сохранить», выбранной в представлении «Дизайн», вы увидите поле обработчика события «При щелчке», открытое в Инспекторе свойств, которое просто ожидает, пока вы его не заполните.
Вы также увидите маленький значок карандаша рядом с полем. Нажатие на карандаш покажет, что Flash Builder может сгенерировать пустой обработчик события или связать событие с вызовом службы. Эта более поздняя опция, опция «Generate Service Call» звучит прямо у нас в тупике, поскольку у нас уже есть метод updateItem () в нашем сервисе. При выборе этого параметра Flash Builder предложит вам выбрать метод для вызова при нажатии кнопки «Сохранить».
Когда вы выбираете метод обновления, в этом случае updateItem () будет переключаться в представление кода и, как ожидается, заполнит имя переменной, содержащей данные. Если вы подумаете об этом, мы проделали всю эту ориентированную на данные разработку, даже не глядя на какой-либо код, так что вы можете быть не уверены в том, какое имя переменной предоставить. Если вы заглянете в раздел «Объявления», о котором я упоминал ранее, вы увидите, что пространство имен «переписи» заменяет переменную «Person» с именем «person». Этот объект «person» является значением, которое мы хотим предоставить вызову службы.
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
import mx.controls.Alert;
protected function dataGrid_creationCompleteHandler(
event:FlexEvent ):void
{
getItemsPagedResult.token = censusService.getItemsPaged();
}
protected function button_clickHandler(event:MouseEvent):void
{
updateItemResult.token = censusService.updateItem( person );
}
]]>
</fx:Script>
<fx:Declarations>
<s:CallResponder id="getItemsPagedResult"/>
<census:CensusService
id="censusService"
destination="CensusService"
endpoint="http://localhost:8888/started/bin-debug/gateway.php"
fault="Alert.show( event.fault.faultString )"
showBusyCursor="true"
source="CensusService"/>
<census:Person id="person"/>
<s:CallResponder id="updateItemResult"/>
</fx:Declarations>
Сохраните ваше приложение и запустите его, и теперь у вас будет подкачка страниц, форма с подробной информацией и возможность сохранять записи, нажав кнопку «Сохранить».
Встроенное редактирование и управление данными
Это все хорошо, но вы, возможно, заметили ранее, когда щелкали по DataGrid, что он уже редактируется встроенным. Возможно, нам следует воспользоваться этой возможностью, верно? Ведь это «богатое» интернет-приложение, о котором мы здесь говорим. А как насчет внесения изменений в несколько записей перед фиксацией новых значений? Скажем, например, были ли зависимости, или, возможно, пользователь был в автономном режиме? Это где функция под названием «управление данными» вступает в игру.
В мире удаленного вызова процедур (RPC) мы обычно тратим драгоценное время на разработку вызовов CRUD-действий. Что еще хуже, так это то, что при работе с асинхронной природой RPC мы также должны тратить время на создание методов-обработчиков для результатов. Наличие всего десяти объектов для работы может привести к 100 различным методам, которые вам придется реализовать. То есть пять вызовов CRUD на объект, плюс пять обработчиков результатов CRUD на объект, умноженное на десять объектов дает вам 100 методов для записи.
Управление данными создает для вас абстракцию вокруг вызовов и обработчиков RPC. Когда этот параметр включен, он также отслеживает изменения данных и позволяет выполнять пакетные обновления. Если вы будете копать достаточно глубоко (читай: за рамками этой статьи), вы даже обнаружите, что почти все абстракции RPC настолько полно, что вам остается только беспокоиться о самой модели данных.
Чтобы получить возможности управления данными, нам нужно только снова обратиться к панели «Данные / службы» и выбрать метод. В этом случае я буду продолжать двигаться вперед с помощью метода getItemsPaged (). Использование этого метода даст мне лучшее из обоих миров — возможность легко пролистывать большие наборы данных и возможность оперативного обновления данных.
Щелкните правой кнопкой мыши по нужному методу и выберите параметр «Включить управление данными». В появившемся диалоговом окне сначала будет предложено выбрать уникальный идентификатор для типа данных. Затем Flash Builder будет ожидать, что вы сообщите ему, какие сервисные методы вы используете для различных действий CRUD. Сервисные абстракции были обновлены, чтобы вы могли включать функции управления данными.
Имейте в виду, что эти методы будут ожидать конкретной подписи. Чтобы лучше управлять сигнатурами, попросите Flash Builder один раз сгенерировать для вас объект-заглушку PHP и либо заполнить его, либо убедиться, что существующие сервисные объекты имеют такой же интерфейс.
Теперь по умолчанию при изменении значений в редактируемой DataGrid вы будете ставить в очередь пакет изменений. Чтобы отправить эти изменения на сервер, сначала нужно, чтобы Flash Builder сгенерировал заглушку обработчика событий, как мы делали это раньше с кнопкой «Сохранить». Однако в этом случае вместо того, чтобы вызывать метод updateItem () для каждого изменения на сервере, мы просто вызываем метод commit () в службе, и он обрабатывает передачу всех изменений на сервер.
Если вы запустите это приложение через проигрыватель отладки, вы даже сможете использовать новую панель «Сетевой монитор» в Flash Builder, чтобы увидеть вызовы, сделанные для каждого из изменений.
Сделав еще один шаг вперед, добавим кнопку «Восстановить» и сгенерируем для нее также обработчик заглушки. Внутри этого обработчика мы можем вызвать метод revertChanges () для сервиса, чтобы откатить любые изменения, сделанные с момента последнего коммита. Чтобы увидеть это в действии, снова запустите приложение и внесите некоторые изменения в данные в DataGrid. На этот раз не нажимайте кнопку «Сохранить», а нажмите кнопку «Восстановить» и посмотрите, как все данные вернутся к своим прежним значениям. Опять же, это только вершина айсберга для управления данными, и есть еще много чего для вас, чтобы исследовать.
protected function button_clickHandler( event:MouseEvent ):void
{
censusService.commit();
}
protected function button1_clickHandler( event:MouseEvent ):void
{
censusService.getDataManager(
censusService.DATA_MANAGER_PERSON ).revertChanges();
}
Подведение итогов
Все, что было сказано и сделано, я подозреваю, что на данный момент у вас есть четкое понимание роста производительности, который Flash Builder 4 приносит разработчикам PHP. Мы начали с взгляда на новый брендинг от Flex Builder до Flash Builder — косметическое, но важное изменение. Изучив то, что раньше использовалось при вызове службы, мы потратили оставшуюся часть времени на изучение новых возможностей разработки, ориентированных на данные, для разработчиков PHP. Эти новые мощные возможности предназначены для работы с большинством конечных точек служб, начиная с XML-RPC и заканчивая Zend AMF, которые могут быть развернуты для вас.
Независимо от базовой службы, если она реализована с небольшой осторожностью, теперь у вас есть простой способ добавить не только пейджинг, но и управление данными. Я бы посоветовал вам изучить код, сгенерированный Flash Builder, чтобы лучше понять его архитектуру и узнать, как можно настроить поведение, расширяя предоставляемые классы. Если вы думаете, что хорошо разбираетесь во всем этом и хотите больше изучить Flex 4, я бы посоветовал взглянуть на новую архитектуру «состояний» в MXML 2009 и / или немного углубиться в архитектуру компонентов. для снятия шкур