<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"  href="/xslt/final.xslt"?><html>
  <head>
    <title>8.2 ExtJS: GridPanel  загрузка данных из Ajax</title>
    <meta name="css" content="/doc/ext/ext_examples.css"/>
    <meta name="js" content="/js/EXT4/ext-all.js;/doc/ext/610.js"/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="id" content="54"/>
    <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.2 ExtJS: GridPanel  загрузка данных из Ajax</h1>
          <ol class="tags big">
            <li>
              <a href="/ExtJS-4">ExtJS-4</a>
            </li>
          </ol>
          <div class="myContent"><p>
  Пример из <a title="GridPanel. &#x427;&#x430;&#x441;&#x442;&#x44C; 1" href="/53.htm">первой
  части</a> малоинтересен, потому что в больших приложениях, для
  которых рассчитан ExtJS данные выбираются из удаленных
  источников. В этой части разберу пример выборки таблицы по
  Ajax-запросу. Громоздить что-то в виде полноценного приложения с
  SQL не буду, а соберу маленький php-имитатор большой базы данных.
  А по ходу рассмотрения примеров буду его модифицировать, добавляя
  отсутствующие функции.
</p>
<h2>
  1
</h2>
<p>
  Создаем хранилище для чтения данных с сервера по Ajax-запросу
</p>
<pre class="brush: js">
    var store = Ext.create('Ext.data.JsonStore', {     // определение хранилища для удаленного источника данных
        fields: ['city', 'code'],   // поля записей. каждая запись содержит - название городва и телефон
        pageSize:7,                 // количество считываемх зАраз записей
        proxy: {                    // описание proxy-объекта, кторый будет запрашивать сервер
            type: 'ajax',           // тип прокси = Ajax
            url: '610.php',         // адрес удаленного источника данных
            reader: {
                type: 'json',       // тип данных - json, хотя есть и другие варианты
                root: 'phones'      // здесь свойство JSON объекта в котором передается сам массив данных
            }
        }
    });
    store.load(); //  и немедленно загружаем данные
</pre>
<h2>
  2
</h2>
<p>
  Создаем тестовое серверное приложение, которое будет отдавать
  данные в формате JSON. Для примера взята база данных телефонных
  кодов городов.<br/>
  При запросе к серверу через GET задаются три параметра:<br/>
   - limit: число записей на странице;<br/>
   - page: номер страницы; (поймем когда будем рассматривать
  листалку)<br/>
   - start: номер первой записи<br/>
  На выходе требуется получить следующий JSON-код:
</p>
<pre class="brush: js">
      { «success»: true, /* признак того что чение завершилось успешно */
        «total»:100,     /* общее количество записей на сервере для листалки  */
        «pnones»: /* вот это и есть непонятый root из конфигурации reader.  */
        [
          {city:'Агинское',code:'391-42'},
          {city:'Алейск',code:'38553'},
          {city:'Алтайский',code:'38537'}
          ………………………….
        ]
      }

</pre>
<p>
  <em>!!! хотя в примерах почти нигде нет, без него листалка в ext4
  не заработала. Было найдено в <u class="external" title="www.sencha.com/learn/the-grid-component/#%21/api/Ext.data.Store">
  здесь</u> и <u class="external" title="ext/ext4/docs/index.html#/api/Ext.data.ResultSet-cfg-success">
  здесь</u></em>
</p>
<p>
  Код php-приложения не буду комментировать. Итак все должно быть
  ясно. Это все же не GoldFusion, который зачем-то засунули в
  примеры в книжке «Learning Ext JS»
</p>
<pre class="brush: php">
$a=array('city'=&gt;
    array('city'=&gt;'Агинское','code'=&gt;'391-42'),…));
$res=array_slice($a, $_GET['limit']*($_GET['page']-1),$_GET['limit']);
echo json_encode(array('sucess'=&gt;true,'total'=&gt;count($a),'phones'=&gt;$res));

</pre>
<h2>
  4
</h2>
<p>
  Тут я добрался до инициализации таблички с листалкой.
</p>
<pre class="brush: php">
    var grid = Ext.create('Ext.grid.Panel', {
        store: store,               // определили хранилище
        title: 'Array Grid',        // Заголовок
        columns:[
                    {text: 'Город',    dataIndex: 'city'},
                    {text: 'Код',      dataIndex: 'code'}
                ],
        bbar: new Ext.PagingToolbar({   // bbar - нижний тулбар с листалкой
            store: store,               // указано хранилище
            displayInfo: true,          // вывести инфо обо общем числе записей
            displayMsg: 'Показано  {0} - {1} из {2}' // формат инфо
        })
    });
</pre>
<p>
  За пределами рассмотрения остался вопрос о всяких форматах и
  темплейтах. ЕБЖ, разберу
</p>
<p>
  Ну и собственно код вывода таблички в окно. Там все совпадает с
  предыдущим примером, но я его все же приведу
</p>
<pre class="brush: php">
var win1 = Ext.create('widget.window', {
        title: 'Пример',
        closeAction: 'hide',
        width: 600,
        height: 350,
        items: [grid]
    });

</pre>
<p>
  <button onclick="win1.show()">Показать Ajax - табличку</button>
</p>
<h5>
  5
</h5>
<p>
  За кадром осталось очень много - работа с XML, динамика,
  редактируемые таблички и т.п. К этому я обязательно вернусь позже
</p>
<h2>
  UPD
</h2>
<p>
   Не захотела работать в примере с MVC. Использован вариант см.
  ниже. Какая-то фича ExtJS 4. Х.З. как правильно?
</p>
<pre>
dockedItems: [{   // bbar - нижний тулбар с листалкой
               dock: 'bottom',
                xtype:'pagingtoolbar',
                store:store,               // указано хранилище
                displayInfo: true,          // вывести инфо обо общем числе записей
                displayMsg: 'Показано  {0} - {1} из {2}' // формат инфо
        }]
</pre>
<h2>
  Далее
</h2>
<ol>
  <li>
    <a href="/55.htm">GridPanel - таблички. Часть 3 Редактирование
    полей</a>
  </li>
  <li>
    <a href="/56.htm">GridPanel - таблички. Часть 4 Редактирование
    полей (продолжение)</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>www.sencha.com/learn/the-grid-component/</span> - <b>sencha.com: Learn the Grid Component.</b></a>
            </li>
            <li>
              <a href="#"><span>aboutfrontend.com/extjs/extjs-grid-filter/comment-page-1/</span> - <b>ExtJs Grid filter</b></a>
            </li>
            <li>
              <a href="#"><span>www.sencha.com/learn/grid-faq/</span> - <b>sencha.com: Grid FAQ (2,3 ver)</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>

