<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"  href="/xslt/final.xslt"?><html>
  <head>
    <title>8.1 ExtJS: GridPanel — типа таблички с данными</title>
    <meta name="css" content="/doc/ext/ext_examples.css"/>
    <meta name="js" content="/js/EXT4/ext-all.js;/doc/ext/600.js"/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="id" content="53"/>
    <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.1 ExtJS: GridPanel — типа таблички с данными</h1>
          <ol class="tags big">
            <li>
              <a href="/ExtJS-4">ExtJS-4</a>
            </li>
          </ol>
          <div class="myContent"><p>
  Табличка GridPanel очень навороченный компонент и прежде чем
  начать с ней работать необходимо определить терминологию и заодно
  определиться с тем что и откуда в ней берется.
</p>
<ol>
  <li>
    <strong>Store</strong> (хранилище) - мега-объект Ext.data.Store
    для хранения, чтения, записи (write), выборки данных
    организованных в виде двухмерного массива (массива
    записей).<br/>
    Storage предоставляет интерфейс для манипуляции данными другим
    комонентам ExtJS, таким как таблички, графики, диаграмы, вякого
    рода селекты и т.п. Интрефейс для всех визуальных компонент
    единый, хотя чтение-запись-выборка данных может осуществляться
    из статических массивов, XML, JSON.<br/>
    Данные для Storage могут быть полученыв как из локальных
    источников (например смассив или HTML-табличка), так и из
    удаленных (в смысле с сервера). Соответственно Storage, который
    обеспечивает данными много разных компонент, позволяет этим
    компонентам абстрагироваться от того, где реально эти данные
    хранятся.
  </li>
  <li>
    <strong>Record</strong> (запись) - объект Ext.data.Record,
    соответствующий одной записи в таблице данных. Он отвечает за
    непосредственное чтение и запись данных, и состоит из целого
    ряда методов, которые читают-пишут данные из массивов,
    JSON-объектов и т.п. и т.п.<br/>
    Для организации чтения и записи также существует целый ряд
    proxy-методов. Например наиболее щироко распростанен AjaxProxy,
    который используется непосредственно для загрузки и выгрузки
    данных на сервер через AJAX/REST-запросы, для последующей
    записи в хранилище.
  </li>
  <li>
    <strong>Grid</strong> (табличка) - объект Ext.grid.GridPanel,
    который позволяет визуально отображать и манипулировать данными
    их хранилища (Store)
  </li>
  <li>
    <strong>Column</strong> (колонка) - объект Ext.grid.column,
    который отвечает за отображение и поведение колонок в таблице
  </li>
</ol>
<h2>
   1. Самая простая GridPanel
</h2>
<p>
  Даже самая простая табличка в ExtJS - мощный инструмент,
  позволяющий сортировать записи и колонки, выводить нужные колонки
  и прятать ненужные.
</p>
<p>
   1.1 Определяю данные в виде двухмерного массива. Каждая строка
  массива - одна запись (record) Данные взяты из <u class="external" title="dev.sencha.com/deploy/ext-4.0.2a/examples/grid/group-header-grid.html">
  примера с официального сайта</u>. Наверное это изменение
  котировок акций.
</p>
<pre class="brush: js">
    // статические данные - массив, по которому строится табличка GridPanel
    // !! кроме статики есть еще и динамика, но об этом позже
    var myData = [
        ['Microsoft Corporation',25.84,-0.14,-0.564,'1980-05-06'],
        ['Pfizer Inc',27.96,0.466,1.475,'1980-05-06'],
        ['The Coca-Cola Company',45.7,0.267,0.578,'1980-05-06']
    ];

</pre>
<p>
   1.2 Определяю индексы полей в каждой записи. В этом примере для
  краткости будут выводится только первые два поля - название
  компании и цена:
</p>
<pre class="brush: js">
    // определяются индексы полей для MyData.
    // по этим даным будет сконфигурирован объект Ext.data.Record
    var fields = [
           {name: 'company'},
           {name: 'price',
           type: 'float'}  // тип данных
        ];

</pre>
<p>
  тип данных [int,float,number,string,date] - необязательный
  параметр, но если поле не строковое его надо указывать.
</p>
<p>
  Нужно обратить внимание на
</p>
<p>
   1.3 Определяю колонки таблицы - их заголовки и индексы полей,
  которые будут отображаться в кажой колонке:
</p>
<pre class="brush: js">
    // здесь определяются колонки таблицы (Ext.grid.column) - и их связь с данными, в соответствии с теми индексами,
    // которые указали выше в массиве индексов fields
    var col =  [
            {
                text: 'Company',       // заголовок колонки
                dataIndex: 'company'  // индекс поля из хранилища (fields)
            },{
                text: 'Price',
                dataIndex: 'price'
            }
        ];
</pre>
<p>
   1.4 Определяю хранилище, для данных из массива myData
</p>
<pre class="brush: js">
    // Создание хранилища (Store)
    var store = Ext.create('Ext.data.ArrayStore', {
        fields: fields,  // указали массив индексов полей.
        data: myData     // указали откуда брать данные
    });

</pre>
<p>
   1.5 Создаю сам компонент Ext.grid.Panel, который будет
  отображать табличку с данными
</p>
<pre class="brush: js">
    var grid = Ext.create('Ext.grid.Panel', {
        store: store,               // определили хранилище
        title: 'Array Grid',        // Заголовок
        columns:col                 // указали массив колонок
    });
</pre>
<p>
  Ну и наконец создаю окно, куда встраиваю grid.Panel
</p>
<pre class="brush: js">
var win1 = Ext.create('widget.window', {
        title: 'Пример',
        closeAction: 'hide',
        width: 600,
        height: 350,
        items: [grid]
    });
…………
<br/>&lt;button onclick=«win1.show()»&gt;Показать простую табличку&lt;/button&gt;
</pre>
<p>
  <button onclick="win1.show()">Показать простую табличку</button>
</p>
<h2>
  2 Немного украшательств
</h2>
<p>
  В этом примере выведем все данные в табличке. Для этого
  переопределим конфигурацию колонок:
</p>
<p>
  Код для полей будет следующим (в комментариях не нуждается)
</p>
<pre class="brush: js">
 // определяются индексы полей для MyData:
    var fields = [
           {name: 'company'},
           {name: 'price', type: 'float'},
           {name: 'change', type: 'float'},
           {name: 'pctChange', type: 'float'},
           {name:'lastmod', type:'date'}
        ];
</pre>
<p>
  А вот в колонках (col) я наведу красоту. И подробно разберу для
  каждого элемента
</p>
<h3>
   2.1
</h3>
<pre class="brush: js">
{   text: 'Company',       // заголовок колонки
    dataIndex: 'company',  // индекс поля из хранилища (fields)
    renderer: function(val){    // кастомно отформатировали
          return '&lt;a href=«http://yandex.ru/yandsearch?text=%27+%20val%20+%20%27»&gt;'+val+'&lt;/a&gt;';}
}
</pre>
<p>
  При выводе названия компании я переделал обычную строку в виде
  ссылки на яндекс. Соответственно, renderer - это функция которая
  задает HTML-представление элемента, который прланируется
  отображать в данной колонке.
</p>
<h3>
   2.2
</h3>
<pre class="brush: js">
{ text: 'Price',
  dataIndex: 'price',
  format:'0.00',            // формат вывод числа (три нуля после запятой)
  xtype: 'numbercolumn'      // указание xtype необходимо для форматирования
}
</pre>
<p>
  Прайс выглядит неровно. Я отформатировал стоимость так, чтобы
  всегда были две цифры после запятой<br/>
  И вот тут был геморрой. Если в примерах, на которых указана
  ссылка все работало, в ExtJS 4 все заработало только после
  указания xtype='numbercolumn'. Об этом я скажу подробнее
  ниже.
</p>
<h3>
   2.3
</h3>
<pre class="brush: js">
{ text: 'Change',
    dataIndex: 'change',
    visible:false               // эту колонку просто спрятали
}
</pre>
<p>
  Колонку change я просто спрятал. Но если пощелкать мышкойпо
  заголовку таблицы, можно вывести список отображаемых колонок и
  вывести спрятанную колонку на панель.
</p>
<h3>
   2.4
</h3>
<pre class="brush: js">
  { text: '% Change',
      dataIndex: 'pctChange',
      width: 165, // ширина колонки
      sortable: false,            // заперт сортировки
      align: 'center',            // выравнивание
  }
</pre>
<p>
  Для колонки pctChange я указал ширину и выравнивание, заодно
  запретил по ней сортировку
</p>
<h3>
   2.5
</h3>
<pre class="brush: js">
            ,{
                text: 'Last Modified',
                xtype: 'datecolumn',
                format: «m-d-Y»,
                dataIndex: 'lastmod'}
            ];
</pre>
<p>
  для колонки lastmod я указал формат вывода даты из YYYY-MM-DD в
  привычный вид ДД-ММ-ГГГГ<br/>
  Здесь тоже столкнулся с тем, что d ExtJS 4 без указания xtype
  форматирование не отрабатывалось.
</p>
<p>
  Итого получилось:
</p>
<pre class="brush: js">
 var col =  [
            {   text: 'Company',       // заголовок колонки
                dataIndex: 'company',  // индекс поля из хранилища (fields)
                width:200,
                renderer: function(val){    // кастомно отформатировали
                      return '&lt;a href=«http://yandex.ru/yandsearch?text=%27+%20val%20+%20%27»&gt;'+val+'&lt;/a&gt;';}
            },{ text: 'Price',
                dataIndex: 'price',
                format:'0.000',             //
                xtype: 'numbercolumn',      //

            },{ text: 'Change',
                dataIndex: 'change',
                visible:false               // эту колонку просто спрятали
            },{ text: '% Change',
                dataIndex: 'pctChange',
                width: 165, // ширина колонки
                sortable: false,            // заперт сортировки
                align: 'center',            // выравнивание
            },{
                text: 'Last Modified',
                xtype: 'datecolumn',
                format: «m-d-Y»,
                dataIndex: 'lastmod'}
            ];

</pre>
<p>
  Код формирования окна с табличкой я опускаю. Он полностью
  идентичен тому что было в предыдущем примере.
</p>
<p>
  <button onclick="win2.show()">Показать красивую табличку</button>
</p>
<h2>
  Далее
</h2>
<ol>
  <li>
    <a href="/54.htm">GridPanel - таблички. Часть 2 Ajax</a>
  </li>
  <li>
    <a href="/55.htm">GridPanel - таблички. Часть 3 Редактирование
    полей</a>
  </li>
  <li>
    <a href="/56.htm">GridPanel - таблички. Часть 3 Редактирование
    полей (продолжение)</a>
  </li>
  <li>
    <a href="/57.htm">Form. Часть 1 - простые компооненты</a>
  </li>
</ol></div>
          <ol class="tags big">
            <li class="date">2011-11-29</li>
            <li>
              <a href="/ExtJS-4">ExtJS-4</a>
            </li>
          </ol>
          <ol class="see">
            <li>
              <a href="#"><span>aboutfrontend.com/extjs/extjs-grid-filter/comment-page-1/#comment-2889</span> - <b>ExtJs Grid filter</b></a>
            </li>
            <li>
              <a href="#"><span>newpg.ru/documentation/extjs/extjs_lessons/lesson5.html</span> - <b>Уроки ExtJS (Хранилища и таблицы). Внимание! Версия 3</b></a>
            </li>
            <li>
              <a href="#"><span>docs.sencha.com/ext-js/4-0/#!/api/Ext.grid.column.Number</span> - <b>Api Ext.grid.column.Number</b></a>
            </li>
            <li>
              <a href="#"><span>www.sencha.com/learn/the-grid-component/</span> - <b>sencha.com: Learn  Ext JS. The Grid Component</b></a>
            </li>
            <li>
              <a href="#"><span>www.sencha.com/learn/grid-faq/</span> - <b>sencha.com: Grid FAQ</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>

