В этом топике рассказываю как можно работать с компонентами javascript фреймворка ExtJS и php Zend Framework на примере редактирования некоторого контента в таблице БД.
Для редактирования списка элементов контента будем использовать компонент ExtJS GridPanel, для отдельного экземпляра — FormPanel.
Обзор расчитан на людей, которые знают основы роботы с указанными фреймворками, я не буду останавливаться на некоторых подробностях, как, например, создание соединения с БД, написание загрузчика.
Для разработки использовал ExtJS 3.0, Zend Framework 1.8.1.
Для начала создаем таблицу в БД.
В данном примере это будет лента новостей, в таблице предусмотренны поля — заголовок, дата, короткий и полный текст.
Создание интерфейса для работы с данными с помощью библиотеки Zend Framework.
Создаем новую html страницу. Подключаем все что нужно, css, ExtJS.
Комментарии к коду:
Создание записи с определением нужных полей. Названия и форматы должны соответствовать полям в таблице БД (1-5). Указываем url контроллера, который будет загружать данные (/grid/grid/). В result будут находиться записи таблицы. А для возможности навигации по страницах в totalCount необходимо указать общее колличество записей. Для постраничной навигации в библиотеках ExtJS предусмотренн компонент Ext.PagingToolbar (16-22). Укажем, что на странице будет выводиться 10 записей.
Рендер для даты — отобразим ее в более удобном для просмотра формате (23-25).
В тулбар нужно добавить кнопки для добавления, редактирования и удаления контента (48-61).
Добавил еще обработчик для двойного клика на запись в таблице. Неудобно выделять контент, а потом нажимать на кнопку для его редактирования (64).
Выводится таблица в окне (65-73). И наконец, загружаем данные в таблицу (74).
В результате должно получиться примерно такое.

Преходим к php и создаем контроллер, который будет взаимодействовать с клиентской частью.
Создадим модель, в нее я добавил один метод, который возвращает общее количество записей в таблице (не нашел в фреймворке стандартной функции, которая это делает).
Метод для контроллера Grid, который будет загружать даные в таблицу.
В методе находим общее колличество записей и выбираем страницу. При постраничной навигации также в качестве параметров будут передаваться значения start и limit. Формируем массив с общим количеством элементов и данными и конвертируем его в формат JSON. Можно использовать хелпер, а можна обычной функцией, без обертки.
Во второй части будет рассмотренно создание формы для редактирования данных, написание контроллера для редактирования и как данные удаляются.
Для редактирования списка элементов контента будем использовать компонент ExtJS GridPanel, для отдельного экземпляра — FormPanel.
Обзор расчитан на людей, которые знают основы роботы с указанными фреймворками, я не буду останавливаться на некоторых подробностях, как, например, создание соединения с БД, написание загрузчика.
Для разработки использовал ExtJS 3.0, Zend Framework 1.8.1.
БД
Для начала создаем таблицу в БД.
- CREATE TABLE `articles` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `title` varchar(255),
- `shorttext` text,
- `createdate` datetime,
- `text` text,
- PRIMARY KEY (`id`)
- );
В данном примере это будет лента новостей, в таблице предусмотренны поля — заголовок, дата, короткий и полный текст.
GridPanel
Создание интерфейса для работы с данными с помощью библиотеки Zend Framework.
Создаем новую html страницу. Подключаем все что нужно, css, ExtJS.
- var record = Ext.data.Record.create([
- {name: 'id', type: 'int'},
- {name: 'title'},
- {name: 'createdate', type: 'date', dateFormat: 'Y-m-d h:i:s'},
- ]);
- var ds = new Ext.data.Store({
- remoteSort: false,
- proxy: new Ext.data.HttpProxy({
- url: '/grid/grid/'
- }),
- reader: new Ext.data.JsonReader({
- root: 'result',
- totalProperty: 'totalCount'
- }, record)
- });
- paddingBar = new Ext.PagingToolbar({
- pageSize: 10,
- store: ds,
- displayInfo: true,
- displayMsg: 'Displaying topics {0} - {1} of {2}',
- emptyMsg: "No topics to display"
- });
- var renderDate = function(value, p, record){
- return value.format("j/n/Y H:i:s");
- };
- var grid = new Ext.grid.GridPanel({
- store: ds,
- trackMouseOver:false,
- loadMask: true,
- columns:[{
- id: 'id',
- header: "Id",
- dataIndex: 'id',
- width: 40,
- sortable: true
- },{
- header: "Title",
- dataIndex: 'title',
- width: 300,
- sortable: true
- },{
- header: "Createdate",
- dataIndex: 'createdate',
- width: 200,
- renderer: renderDate,
- sortable: true
- }],
- tbar: [
- new Ext.Button({
- text: 'New',
- handler: addRecord
- }),
- new Ext.Button({
- text: 'Edit',
- handler: editRecord
- }),
- new Ext.Button({
- text: 'Delete',
- handler: deleteRecords
- }),
- ],
- bbar: paddingBar
- });
- grid.on("rowdblclick", editRecord);
- var window = new Ext.Window({
- id: 'example-window',
- title : "Grid Example",
- layout: 'fit',
- width : 800,
- height : 400,
- items: [ grid ]
- });
- window.show();
- grid.getStore().load();
Комментарии к коду:
Создание записи с определением нужных полей. Названия и форматы должны соответствовать полям в таблице БД (1-5). Указываем url контроллера, который будет загружать данные (/grid/grid/). В result будут находиться записи таблицы. А для возможности навигации по страницах в totalCount необходимо указать общее колличество записей. Для постраничной навигации в библиотеках ExtJS предусмотренн компонент Ext.PagingToolbar (16-22). Укажем, что на странице будет выводиться 10 записей.
Рендер для даты — отобразим ее в более удобном для просмотра формате (23-25).
В тулбар нужно добавить кнопки для добавления, редактирования и удаления контента (48-61).
Добавил еще обработчик для двойного клика на запись в таблице. Неудобно выделять контент, а потом нажимать на кнопку для его редактирования (64).
Выводится таблица в окне (65-73). И наконец, загружаем данные в таблицу (74).
В результате должно получиться примерно такое.

GridController
Преходим к php и создаем контроллер, который будет взаимодействовать с клиентской частью.
- class GridController extends Zend_Controller_Action
- {
- ...
- }
Создадим модель, в нее я добавил один метод, который возвращает общее количество записей в таблице (не нашел в фреймворке стандартной функции, которая это делает).
- class Grid extends Zend_Db_Table_Abstract
- {
- public function getCountRows()
- {
- $select = $this->select()->from(array('p' => $this->_name),array('c' => 'COUNT(*)'));
- $stmt = $select->query();
- $result = $stmt->fetchAll();
- return $result[0][0];
- }
- }
Метод для контроллера Grid, который будет загружать даные в таблицу.
- public function gridAction()
- {
- $this->_helper->viewRenderer->setNoRender();
- require_once 'Grid.php';
- $grid = new Grid(array('name' => 'articles'));
- $totalCount = $grid->getCountRows();
- $where = null;
- $order = "id";
- $limit = $this->getRequest()->getParam('limit', 5);
- $start = $this->getRequest()->getParam('start', 0);
- $rows = $grid->fetchAll($where, $order, $limit, $start);
- $data = array(
- 'totalCount' => $totalCount,
- 'result' => $rows->toArray()
- );
- echo json_encode($data);
- }
В методе находим общее колличество записей и выбираем страницу. При постраничной навигации также в качестве параметров будут передаваться значения start и limit. Формируем массив с общим количеством элементов и данными и конвертируем его в формат JSON. Можно использовать хелпер, а можна обычной функцией, без обертки.
Во второй части будет рассмотренно создание формы для редактирования данных, написание контроллера для редактирования и как данные удаляются.