<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"  href="/xslt/final.xslt"?><html>
  <head>
    <title>8.3 ExtJS: GridPanel — табличка с редактированием полей</title>
    <meta name="css" content="/doc/ext/ext_examples.css"/>
    <meta name="js" content="/js/EXT4/ext-all.js;/doc/ext/620.js"/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="id" content="55"/>
    <link rel="stylesheet" type="text/css" href="/doc/ext/ext_examples.css"/>
    <link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml"/>
  </head>
  <body>
    <div class="main">
      <div class="wrap">
        <div class="L">
          <h1><a href="/">..</a> / 8.3 ExtJS: GridPanel — табличка с редактированием полей</h1>
          <ol class="tags big">
            <li>
              <a href="/ExtJS-4">ExtJS-4</a>
            </li>
          </ol>
          <div class="myContent"><p>
  Как правило, в богатых приложениях таблицы используются не
  столько для отображения, сколько для управления данными -
  удаления, добавления, редактирования записей
</p>
<p>
  В качестве основы здесь как и всюду я взял пример с официального
  сайта, только немного сократил. Сейчас я попробую внести
  возможность редактирования данных на базе примера из предыдущей
  части, где выводился телефонный справочник. Код практически весь
  сохраняется, модификация не очень большая. Что меняется?
</p>
<h2>
   1. Вводится модель
</h2>
<p>
  Первое и самое главное - вводится <strong>Модель</strong>. Модель
  (подробности будут отдельно) - это компонент, введенный только в
  четвертой версии ExtJS. По существу это объект определяющий
  записи - набор полей с описанием, <strong>валидаторы</strong>,
  <strong>прокси</strong> для чтения-записи данных. А так же
  <strong>ассоциации</strong> позволяющие связывать разнорожные
  модели (например модель товара с моделью поставщика).
</p>
<pre class="brush: js">
Ext.define('Phones', {
    extend: 'Ext.data.Model',
    fields: ['id','city', 'code'],         // список полей
    validations: [{   // валидаторы
        type: 'length',
        field: 'city', // поле город должно быть непустым
        min: 1
     }]
});
</pre>
<h2>
   2. Изменения в хранилище/прокси
</h2>
<p>
  Соответственно меняется и хранилище. Если в предыдущих примерах
  поля указывались при описании хранилища, здесь вместо описания
  полей идкт указание модели. Появились и другие изменения:
</p>
<pre class="brush: js">
    var store = Ext.create('Ext.data.Store', {
        autoLoad: true,
        autoSync: true, // указание на автосохранения в хранилище
                        // при каждом изменении одно записи
        model: 'Phones',// указание модели созданной выше
        proxy: {        // описание прокси
                type: 'rest',   // способ взаимодействия с сервером
        url:'630.php',  // адрес серверноего обработчика
            reader: {
                type: 'json',
                root: 'data'
            },
            writer: {
                type: 'json',
                root: 'data'
            },
        }
    });
</pre>
<p>
  А теперь подробнее разберу что осталось за комментариями.
</p>
<p>
  <strong>- rest</strong> - такой хитрый способ взаимодействия с
  сервером по http-протоколу. Он касается только серверной части.
  Останавливаться на этом не буду, подробности реализации на php
  можно найти по ссылкам приведенным в конце статьи. Я бы предпочел
  иметь обычный GET/POST, но как настроить в ExtJS4 прокси на
  отправку данных по-другому в этом примере я не нашел. Сделать по
  аналогии с предыдущим примером у меня не получилось.
</p>
<p>
  <strong>- reader</strong> <strong>и</strong>
  <strong>writer</strong> - читалка и писалка. И то и другое -
  объекты для обмена данными с сервера.<br/>
  type: 'json' - тип данных при обмене с сервером.<br/>
  root: 'data' - объект в json в котором передаются записи
  (кроме собственно данных передается признак успешного завершения
  success, и всякая прочая балда опционально)<br/>
  Чтобы было понятно, приведу пример json-данных которыми
  происходит обмен с сервером:
</p>
<pre class="brush: js">
  {'success':'true', // - признак нормального завершения
    'message':'бла-бла',
     …………….. // что-то еще
    'data':[{'id':1,city:'Бабруйск',code:'12-413'}…] // данные. 
  }

</pre>
<h2>
   3. Вводится плагин для редактирования строк
</h2>
<p>
  Вообще-то есть два способа редактирования - один редактирования
  отдельного поля записи (ячейки таблицы) другой - всей записи
  целиком. Я использую последний способ. Для того чтобы подключить
  этот плагин необходимо его проинициализировать:
</p>
<pre class="brush: js">
  var Editing = Ext.create('Ext.grid.plugin.RowEditing');
</pre>
<h3>
  Инициализация таблицы:
</h3>
<p>
  Дальше следует инициализация самой таблицы с дополнительными
  компонентами:
</p>
<pre class="brush: js">
    var grid = Ext.create('Ext.grid.Panel', {
        plugins: [Editing], // указали плагин для редактирования
        store: store,
        … // всякие общие вещи - размер, id, title
        columns: [{             // описание колонок
            text: 'id',
            dataIndex: 'id' // привязка к индексу модели
        }, {
            text: 'City',
            dataIndex: 'city',
            field: {               //!! теперь это не текст.
                xtype: 'textfield' //!! теперь это input
            }
        }, {
            header: 'Code',
            dataIndex: 'code',
            field: {               //!! теперь это не текст.
                xtype: 'textfield'  //!! теперь это input
            }
        }],
        bbar: new Ext.PagingToolbar({   // bbar - нижний тулбар с листалкой
                store: store,               // указано хранилище
                displayInfo: true,          // вывести инфо обо общем числе записей
                displayMsg: 'Показано  {0} - {1} из {2}' // формат инфо
            }),
        tbar: [  // верхний тулбар с кнопками удаления и вставки
              {
                text: 'Ins',
                handler: function(){
                    // при вставке создается пустая запись в  в хранилище.
                    store.insert(0, new Phones());
                    // переход к редактированию новой строки
                    Editing.startEdit(0, 0);
                }
            },
              {
                itemId: 'delete', // id кнопки, потом пригодится
                text: 'Del',
                handler: function(){
                    // определяем какая строка выделена
                    var selection = grid.getView().getSelectionModel().getSelection()[0];
                    // удаление строки из хранилища
                    if (selection) {store.remove(selection);}
                }
            }
          ]
    });

</pre>
<p>
  В результате получается следующее:
</p>
<div id="ex1"/>
<h2>
  Далее
</h2>
<ol>
  <li>
    <a href="/56.htm">GridPanel - таблички. Часть 3 Редактирование
    полей (продолжение)</a>
  </li>
  <li>
    <a href="/57.htm">Form. Часть 1 - простые компооненты</a>
  </li>
  <li>
    <a href="/58.htm">Form. Часть 2 - составные компоненты</a>
  </li>
  <li>
    <a href="/59.htm">Form. Часть 3 - Submit</a>
  </li>
  <li>
    <a href="/60.htm">Деревья в ExtJS. Часть 1. Инициализация</a>
  </li>
</ol></div>
          <ol class="tags big">
            <li class="date">2011-12-04</li>
            <li>
              <a href="/ExtJS-4">ExtJS-4</a>
            </li>
          </ol>
          <ol class="see">
            <li>
              <a href="#"><span>habrahabr.ru/blogs/php/46032/</span> - <b>RESTful PHP — 5 простых советов</b></a>
            </li>
            <li>
              <a href="#"><span>freehabr.ru/blog/extjs/705.html</span> - <b>ExtJS4 The Data Package  (перевод официальной документации)</b></a>
            </li>
            <li>
              <a href="#"><span>www.softcoder.ru/blog/rest-php</span> - <b>Подход REST в PHP</b></a>
            </li>
            <li>
              <a href="#"><span>www.sencha.com/learn/the-grid-component/</span> - <b>sencha.com: Learn  The Grid Component</b></a>
            </li>
            <li>
              <a href="#"><span>net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/</span> - <b>Working with RESTful Services in CodeIgniter</b></a>
            </li>
          </ol>
          <ul class="comment"/>
        </div>
      </div>
      <div class="R">
        <a href="/" title="&#x41D;&#x430; &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x443;&#x44E;"/>
      </div>
    </div>
    <div id="li"/>
  </body>
</html>

