<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ExtJSで楽しくRIA業務アプリ開発 &#187; 業務ウェブアプリケーションTips</title>
	<atom:link href="http://extjs.blog.sus4.co.jp/tag/%e6%a5%ad%e5%8b%99%e3%82%a6%e3%82%a7%e3%83%96%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3tips/feed/" rel="self" type="application/rss+xml" />
	<link>http://extjs.blog.sus4.co.jp</link>
	<description>株式会社sus4 開発チーム</description>
	<lastBuildDate>Wed, 01 Sep 2010 02:15:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ExJS入門30　Twitter Search APIを使ったグリッドパネル</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/07/exjs-tutorial30-gridtwitter/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/07/exjs-tutorial30-gridtwitter/#comments</comments>
		<pubDate>Fri, 07 May 2010 02:48:37 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Ext.grid.GridPanel]]></category>
		<category><![CDATA[Ext.TaskMgr]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[GridPanel]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JSONP]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Twitter Search API]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[タスクマネージャー]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[レンダラー]]></category>
		<category><![CDATA[業務ウェブアプリケーションTips]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=600</guid>
		<description><![CDATA[前回はJSONPを使ってYouTubeの情報をグリッドに表示するサンプルを紹介しました。今回も外部APIの利用第2弾ということにして、Twitter APIを使ってTwitterのアップデートをグリッドに読み込んでみます。今回はJSONPを使ったAPIの利用に加えて、グリッドを自動更新するためのExt.TaskMgrクラスを使ったサンプルコードの紹介になります。]]></description>
			<content:encoded><![CDATA[<p>前回はJSONPを使ってYouTubeの情報をグリッドに表示するサンプルを紹介しました。今回も外部APIの利用第2弾ということにして、Twitter APIを使ってTwitterのアップデートをグリッドに読み込んでみます。<br />
<div id="attachment_599" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-07_11-26-38.png" title="Twitter Search APIを利用したグリッド" rel="lightbox[600]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-07_11-26-38-150x150.png" alt="Twitter Search APIを利用したグリッド" title="Twitter Search APIを利用したグリッド" width="150" height="150" class="size-thumbnail wp-image-599" /></a><p class="wp-caption-text">Twitter Search APIを利用したグリッド</p></div><br />
今回はJSONPを使ったAPIの利用に加えて、グリッドを自動更新するためのExt.TaskMgrクラスを使ったサンプルコードの紹介になります。<br />
前回のチュートリアルがお済でない方はこちらからどうぞ<br />
<a href="http://extjs.blog.sus4.co.jp/2010/05/06/extjs-tutorial29-youtube/">ExJS入門29　JSONPを使ってYouTube Data APIをグリッドパネルに読み込む</a></p>
<p>グリッドパネル関連の過去の記事はこちらからです。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/03/extjs-tutorial17-gridbasic/">ExtJSで楽しくRIA業務アプリ開発 ExJS入門17　グリッド・パネル　基本編</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/05/extjs-tutorial18-gridrenderer/">ExtJSで楽しくRIA業務アプリ開発 ExtJS入門18　グリッド　レンダラーを使ってデザインを変える</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/14/extjs-tutorial19-gridpaging/">ExtJS入門19　グリッドにページング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/15/extjs-tutorial20-grid-filter/">ExtJS入門20　グリッドにフィルタリング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/">ExJS入門21　グリッド・セレクション・モデル</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/19/extjs-tutorial-gridclick/">ExJS入門22　グリッドのイベント処理（ダブルクリック、右クリック）</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/20/extjs-tutorial23-gridadd/">ExtJS入門23　グリッドへの項目の追加と削除</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/23/extjs-tutorial24-editorgrid-basic/">ExtJS入門24　エディタブル・グリッドの基本(グリッドパネルをエディタブル・グリッドに変更)</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/26/extjs-tutorial25-editorgridsave/">ExJS入門25　エディタブル・グリッド(Ext.Ajaxを使った編集内容の保存)</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/27/extjs-tutorial26-editorfield/">ExJS入門26　エディタブル・グリッド（色々なエディターを設定する)</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/28/extjs-tutorial27-roweditor/">ExJS入門27　もう一つのエディタブル・グリッド　ux.RowEditorプラグイン</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/30/extjs-tutorial28-checkboxgrid/">ExJS入門28　チェックボックス付きグリッドパネル</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/06/extjs-tutorial29-youtube/">ExJS入門29　JSONPを使ってYouTube Data APIをグリッドパネルに読み込む</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.TaskMgrクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.TaskMgr">http://extdocs.xenophy.com/?class=Ext.TaskMgr</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.data.DataProxyクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.data.DataProxy">http://extdocs.xenophy.com/?class=Ext.data.DataProxy</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.data.ScriptTagProxyクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.data.ScriptTagProxy">http://extdocs.xenophy.com/?class=Ext.data.ScriptTagProxy</a></p>
<p><span id="more-600"></span></p>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
    &lt;title&gt;ExtJS名古屋勉強会　Twitter API&lt;/title&gt;

    &lt;!--Ext JS CSS--&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;../js/ext/resources/css/ext-all.css&quot; type=&quot;text/css&quot; /&gt;
    &lt;!--Ext JS--&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;

    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/ext-all.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;grid-twitter.js&quot;&gt;&lt;/script&gt;
    &lt;style TYPE=&quot;text/css&quot;&gt;
    &lt;!--
        .search {background-image: url(../img/icon/magnifier.png) !important;}
    --&gt;
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div style=&quot;width:500px;margin:0 auto;padding:15px;background-color:#D3E1F1;font-size:small;&quot;&gt;
        &lt;p style=&quot;font-weight:bold;padding:3px;margin-bottom:10px;&quot;&gt;
            Twitter Search APIを利用したグリッド　（30秒毎に自動更新）
        &lt;/p&gt;

        &lt;div id=&quot;grid&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;grid-twitter.js&quot;&gt;grid-twitter.js&lt;/a&gt;&lt;br/&gt;
        Twitter API：&lt;a href=&quot;http://apiwiki.twitter.com/Twitter-Search-API-Method%3A-search&quot; target=&quot;_blank&quot;&gt;Twitter Search API Method: search&lt;/a&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>Java Script:</strong></p>
<pre class="brush: js; ">

Ext.onReady(function(){

    //ストアの設定
    var store = new Ext.data.JsonStore({
        //Twitter Search APIをJSONPで利用
        proxy:new Ext.data.ScriptTagProxy({
            url:&#039;http://search.twitter.com/search.json&#039;
        }),
        baseParams:{
            q:&#039;extjs&#039;
        },
        paramNames:{
            start:&#039;page&#039;,
            limit:&#039;results_per_page&#039;
        },
        autoLoad:true,
        root:&#039;results&#039;,
        idProperty:&#039;id&#039;,
        fields:[
            &#039;profile_image_url&#039;,
            &#039;created_at&#039;,
            &#039;from_user&#039;,
            &#039;metadata&#039;,
            &#039;to_user_id&#039;,
            &#039;text&#039;, //本文
            &#039;id&#039;,
            &#039;from_user_id&#039;,
            &#039;geo&#039;,  //GEOタグ
            &#039;iso_language_code&#039;,
            &#039;source&#039;    //クライアントの種類
        ]
    });

    //各レンダラーの設定
    var imgRenderer = function(value,meta,rec,rIndex,cIndex,store){
        return String.format(&#039;&lt;div&quot;&gt;&lt;img src={0} alt=&quot;{1}&quot;/&gt;&lt;/div&gt;&#039;,
                    value,
                    store.getAt(rIndex).data.from_user
                    );
    };

    var titleRenderer = function(value,meta,rec,rIndex,cIndex,store){
        var data = store.getAt(rIndex).data;
        return String.format(&#039;&lt;div style=&quot;white-space:normal;&quot;&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://twitter.com/{0}&quot;&gt;&lt;b&gt;{0}&lt;/b&gt;&lt;/a&gt;:{1}&lt;/p&gt;&lt;br/&gt;&lt;span style=&quot;color:#CCC&quot;&gt;{2}&lt;/span&gt;&lt;/div&gt;&#039;,
            data.from_user,
            value,
            data.created_at
        );
    };

    var grid = new Ext.grid.GridPanel({
        renderTo:&#039;grid&#039;,
        height:600,
        loadMask:true,
        store:store,
        autoExpandColumn:&#039;title&#039;,
        cm:new Ext.grid.ColumnModel({
            columns:[
                {
                    id:&#039;id&#039;, header:&#039;ID&#039;, dataIndex:&#039;id&#039;, hidden:true
                },
                {
                    id:&#039;img&#039;, header:&#039;img&#039;, dataIndex:&#039;profile_image_url&#039;, renderer:imgRenderer, width:60
                },
                {
                    id:&#039;title&#039;, header:&#039;title&#039;, dataIndex:&#039;text&#039;, renderer:titleRenderer, width:120
                }
            ]
        }),
        tbar:[
            &#039;-&gt;&#039;,
            {
                xtype:&#039;textfield&#039;,
                name:&#039;keyword&#039;,
                itemId:&#039;keyword&#039;
            },
            {
                text:&#039;Search&#039;,
                iconCls:&#039;search&#039;,
                scope:this,
                handler:function(){
                    var tbar = grid.getTopToolbar();
                    var value = tbar.getComponent(&#039;keyword&#039;).getValue();

                    grid.getStore().load({
                        params:{
                            q:value
                        }
                    });
                }
            }
        ]
    });

    //自動アップデート
    var task = {
        run:function(){
            store.reload();
        },
        interval:1000 * 30 //msec * sec
    }

    Ext.TaskMgr.start(task);
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_599" class="wp-caption aligncenter" style="width: 237px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-07_11-26-38.png" title="Twitter Search APIを利用したグリッド" rel="lightbox[600]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-07_11-26-38-227x300.png" alt="Twitter Search APIを利用したグリッド" title="Twitter Search APIを利用したグリッド" width="227" height="300" class="size-medium wp-image-599" /></a><p class="wp-caption-text">Twitter Search APIを利用したグリッド</p></div></p>
<p>JSONPをストアのソースとして読み込む方法は前回紹介したので簡単に済ませますが、JSONの構造としてはYouTube DATA APIよりも簡単でresultという配列の中に対象の検索項目に対する最新のUPDATEが入っています。デフォルトでは&quot;extjs&quot;で検索をかけています。<br />
またTwitter Search APIでは全件数が帰ってこないため、PagingToolbarは上手く動かないようです。&#8217;（ひょっとしたら何か解決方法があるかも知れせん&#8230;）</p>
<pre class="brush: js; ">

    //ストアの設定
    var store = new Ext.data.JsonStore({
        //Twitter Search APIをJSONPで利用
        proxy:new Ext.data.ScriptTagProxy({
            url:&#039;http://search.twitter.com/search.json&#039;
        }),
        baseParams:{
            q:&#039;extjs&#039;
        },
        paramNames:{
            start:&#039;page&#039;,
            limit:&#039;results_per_page&#039;
        },
        autoLoad:true,
        root:&#039;results&#039;,
        idProperty:&#039;id&#039;,
        fields:[
            &#039;profile_image_url&#039;,
            &#039;created_at&#039;,
            &#039;from_user&#039;,
            &#039;metadata&#039;,
            &#039;to_user_id&#039;,
            &#039;text&#039;, //本文
            &#039;id&#039;,
            &#039;from_user_id&#039;,
            &#039;geo&#039;,  //GEOタグ
            &#039;iso_language_code&#039;,
            &#039;source&#039;    //クライアントの種類
        ]
    });
</pre>
<p>Twitter Search APIの利用時の設定は以上のようになります。後はこのストアにあわせてグリッドを作成します。レンダラーも前回と似ていますがデータの構造にあわせて少し変更を加えています。</p>
<pre class="brush: js; ">

  //各レンダラーの設定
    var imgRenderer = function(value,meta,rec,rIndex,cIndex,store){
        return String.format(&#039;&lt;div&quot;&gt;&lt;img src={0} alt=&quot;{1}&quot;/&gt;&lt;/div&gt;&#039;,
                    value,
                    store.getAt(rIndex).data.from_user
                    );
    };

    var titleRenderer = function(value,meta,rec,rIndex,cIndex,store){
        var data = store.getAt(rIndex).data;
        return String.format(&#039;&lt;div style=&quot;white-space:normal;&quot;&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://twitter.com/{0}&quot;&gt;&lt;b&gt;{0}&lt;/b&gt;&lt;/a&gt;:{1}&lt;/p&gt;&lt;br/&gt;&lt;span style=&quot;color:#CCC&quot;&gt;{2}&lt;/span&gt;&lt;/div&gt;&#039;,
            data.from_user,
            value,
            data.created_at
        );
    };

    var grid = new Ext.grid.GridPanel({
        renderTo:&#039;grid&#039;,
        height:600,
        loadMask:true,
        store:store,
        autoExpandColumn:&#039;title&#039;,
        cm:new Ext.grid.ColumnModel({
            columns:[
                {
                    id:&#039;id&#039;, header:&#039;ID&#039;, dataIndex:&#039;id&#039;, hidden:true
                },
                {
                    id:&#039;img&#039;, header:&#039;img&#039;, dataIndex:&#039;profile_image_url&#039;, renderer:imgRenderer, width:60
                },
                {
                    id:&#039;title&#039;, header:&#039;title&#039;, dataIndex:&#039;text&#039;, renderer:titleRenderer, width:120
                }
            ]
        }),
        tbar:[
            &#039;-&gt;&#039;,
            {
                xtype:&#039;textfield&#039;,
                name:&#039;keyword&#039;,
                itemId:&#039;keyword&#039;
            },
            {
                text:&#039;Search&#039;,
                iconCls:&#039;search&#039;,
                scope:this,
                handler:function(){
                    var tbar = grid.getTopToolbar();
                    var value = tbar.getComponent(&#039;keyword&#039;).getValue();

                    grid.getStore().load({
                        params:{
                            q:value
                        }
                    });
                }
            }
        ]
    });
</pre>
<p>つぎに自動アップデートの処理を作成します。ExtJSにはExt.TaskMgrクラスというシングルトンクラスが用意されています。このクラスを利用することで、一定時間ごとに実行する処理を設定できます。実行したい処理をオブジェクトの形で記述してタスクマネージャー(Ext.TaskMgrクラス)に設定します。</p>
<pre class="brush: js; ">

    var task = {
        run:function(){
            store.reload();
        },
        interval:1000 * 30 //msec * sec
    }
    Ext.TaskMgr.start(task);
</pre>
<ul>
<li>run:実行する処理</li>
<li>interval:実行する間隔(ミリ秒で設定)</li>
</ul>
<p>今回のサンプルでは30秒間隔でストアをリロードしています。これでTwitter検索を実行後に30秒ごとにグリッドを更新します。<br />
前回のYouTube Data APIよりもTwitter Search APIの方が簡単でしたね。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F05%2F07%2Fexjs-tutorial30-gridtwitter%2F&amp;linkname=ExJS%E5%85%A5%E9%96%8030%E3%80%80Twitter%20Search%20API%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%83%91%E3%83%8D%E3%83%AB"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/05/07/exjs-tutorial30-gridtwitter/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ExJS入門29　JSONPを使ってYouTube Data APIをグリッドパネルに読み込む</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/06/extjs-tutorial29-youtube/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/06/extjs-tutorial29-youtube/#comments</comments>
		<pubDate>Thu, 06 May 2010 04:44:49 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[DataProxy]]></category>
		<category><![CDATA[Ext.data.DataProxy]]></category>
		<category><![CDATA[Ext.data.ScriptTagProxy]]></category>
		<category><![CDATA[Ext.grid.GridPanel]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[GridPanel]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JSONP]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[PagingToolbar]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[YouTube]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[マッシュアップ]]></category>
		<category><![CDATA[レンダラー]]></category>
		<category><![CDATA[勉強会]]></category>
		<category><![CDATA[業務ウェブアプリケーションTips]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=593</guid>
		<description><![CDATA[今回もグリッドパネルです。今回はJSONPを使ってYouTube Data APIを呼び出して、グリッドに表示するサンプルコードになります。
JSONPを使うことで別ドメインのAPIをJavascriptで呼び出すことができます。Google Data APIはJSONPにも対応しているため、利用が簡単です。]]></description>
			<content:encoded><![CDATA[<p>今回もグリッドパネルです。今回はJSONPを使ってYouTube Data APIを呼び出して、グリッドに表示するサンプルコードになります。<br />
JSONPを使うことで別ドメインのAPIをJavascriptで呼び出すことができます。Google Data APIはJSONPにも対応しているため、利用が簡単です。<br />
<div id="attachment_594" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-06_12-52-41.png" title="JSONPでYouTube Data APIを利用" rel="lightbox[593]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-06_12-52-41-150x150.png" alt="JSONPでYouTube Data APIを利用" title="JSONPでYouTube Data APIを利用" width="150" height="150" class="size-thumbnail wp-image-594" /></a><p class="wp-caption-text">JSONPでYouTube Data APIを利用</p></div></p>
<p>グリッドパネル関連の過去の記事はこちらからです。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/03/extjs-tutorial17-gridbasic/">ExtJSで楽しくRIA業務アプリ開発 ExJS入門17　グリッド・パネル　基本編</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/05/extjs-tutorial18-gridrenderer/">ExtJSで楽しくRIA業務アプリ開発 ExtJS入門18　グリッド　レンダラーを使ってデザインを変える</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/14/extjs-tutorial19-gridpaging/">ExtJS入門19　グリッドにページング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/15/extjs-tutorial20-grid-filter/">ExtJS入門20　グリッドにフィルタリング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/">ExJS入門21　グリッド・セレクション・モデル</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/19/extjs-tutorial-gridclick/">ExJS入門22　グリッドのイベント処理（ダブルクリック、右クリック）</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/20/extjs-tutorial23-gridadd/">ExtJS入門23　グリッドへの項目の追加と削除</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/23/extjs-tutorial24-editorgrid-basic/">ExtJS入門24　エディタブル・グリッドの基本(グリッドパネルをエディタブル・グリッドに変更)</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/26/extjs-tutorial25-editorgridsave/">ExJS入門25　エディタブル・グリッド(Ext.Ajaxを使った編集内容の保存)</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/28/extjs-tutorial27-roweditor/">ExJS入門27　もう一つのエディタブル・グリッド　ux.RowEditorプラグイン</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/30/extjs-tutorial28-checkboxgrid/">ExJS入門28　チェックボックス付きグリッドパネル</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.data.DataProxyクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.data.DataProxy">http://extdocs.xenophy.com/?class=Ext.data.DataProxy</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.data.ScriptTagProxyクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.data.ScriptTagProxy">http://extdocs.xenophy.com/?class=Ext.data.ScriptTagProxy</a></p>
<p><span id="more-593"></span></p>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
    &lt;title&gt;ExtJS名古屋勉強会　Youtube API&lt;/title&gt;

    &lt;!--Ext JS CSS--&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;../js/ext/resources/css/ext-all.css&quot; type=&quot;text/css&quot; /&gt;
    &lt;!--Ext JS--&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;

    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/ext-all.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;grid-youtube.js&quot;&gt;&lt;/script&gt;
    &lt;style TYPE=&quot;text/css&quot;&gt;
    &lt;!--
        .search {background-image: url(../img/icon/magnifier.png) !important;}
    --&gt;
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div style=&quot;width:500px;margin:0 auto;padding:15px;background-color:#D3E1F1;font-size:small;&quot;&gt;
        &lt;p style=&quot;font-weight:bold;padding:3px;margin-bottom:10px;&quot;&gt;
            YouTube DATA APIを利用するグリッド（JSONPとして利用する）
        &lt;/p&gt;

        &lt;div id=&quot;grid&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;grid-click.js&quot;&gt;grid-youtube.js&lt;/a&gt;&lt;br/&gt;
        YouTube Data API：&lt;a href=&quot;http://code.google.com/intl/ja/apis/youtube/overview.html&quot; target=&quot;_blank&quot;&gt;YouTube の API とツール - Google Code&lt;/a&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>Java Script:</strong></p>
<pre class="brush: js; ">

Ext.onReady(function(){
    //各ページ辺りの表示数
    var perPage = 10;

    //ストアの設定
    var store = new Ext.data.JsonStore({
        //クロスドメインになるYouTube Data APIをJSONPとして利用するためScriptTagProxyを使う。
        proxy:new Ext.data.ScriptTagProxy({
            url:&quot;http://gdata.youtube.com/feeds/api/videos&quot;,
        }),
        baseParams:{
            format:1,
            &#039;max-results&#039;:perPage,
            &#039;start-index&#039;:1,
            vq:&#039;extjs&#039;,
            alt:&#039;json-in-script&#039;
        },
        paramNames:{
            start:&#039;start-index&#039;,
            limit:&#039;max-results&#039;,
        },
        autoLoad:true,
        root:&#039;feed.entry&#039;,
        idProperty:&#039;id.$t&#039;,
        totalProperty:&quot;feed.openSearch$totalResults.$t&quot;,
        fields:[&#039;author&#039;,&#039;id&#039;,&#039;title&#039;,&#039;media$group&#039;,&#039;link&#039;,&#039;content&#039;,&#039;published&#039;,&#039;category&#039;,&#039;updated&#039;],
    });

    //各レンダラーの設定
    var imgRenderer = function(value,meta,rec,rIndex,cIndex,store){
        return String.format(&#039;&lt;div&quot;&gt;&lt;img src={0}&gt;{1}&lt;/div&gt;&#039;,
                  store.getAt(rIndex).data.media$group.media$thumbnail[0].url,
                  value.$t);
    };

    var titleRenderer = function(value,meta,rec,rIndex,cIndex,store){
        var data = store.getAt(rIndex).data;
        return String.format(&#039;&lt;div&gt;&lt;p&gt;&lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;by {1}&lt;p&gt;{2}&lt;/p&gt;&lt;/div&gt;&#039;,
            value.$t,
            data.author[0].name.$t,
            data.content.$t.length &gt; 20 ? data.content.$t.substring(0,20) + &#039;...&#039; :data.content.$t

        );
    };

    var grid = new Ext.grid.GridPanel({
        renderTo:&#039;grid&#039;,
        height:600,
        loadMask:true,
        store:store,
        autoExpandColumn:&#039;title&#039;,
        cm:new Ext.grid.ColumnModel({
            columns:[
                {
                    id:&#039;id&#039;, header:&#039;ID&#039;, dataIndex:&#039;id&#039;, hidden:true
                },
                {
                    id:&#039;img&#039;, header:&#039;img&#039;, dataIndex:&#039;title&#039;, renderer:imgRenderer, width:120
                },
                {
                    id:&#039;title&#039;, header:&#039;title&#039;, dataIndex:&#039;title&#039;, renderer:titleRenderer, width:120
                },

                {
                    id:&#039;duration&#039;,
                    header:&#039;Duration&#039;,
                    dataIndex:&#039;media$group&#039;,
                    renderer:function(value){
                        var totalsec = value.yt$duration.seconds;
                        var min = Math.floor(totalsec / 60);
                        var sec = totalsec % 60;
                        return String.format(&#039;{0}:{1}&#039;,
                            String.leftPad(min,2,&#039;0&#039;),
                            String.leftPad(sec,2,&#039;0&#039;));
                    },
                    width:120
                }
            ]
        }),
        tbar:[
            &#039;-&gt;&#039;,
            {
                xtype:&#039;textfield&#039;,
                name:&#039;keyword&#039;,
                itemId:&#039;keyword&#039;
            },
            {
                text:&#039;Search&#039;,
                iconCls:&#039;search&#039;,
                scope:this,
                handler:function(){
                    var tbar = grid.getTopToolbar();
                    var value = tbar.getComponent(&#039;keyword&#039;).getValue();

                    grid.getStore().load({
                        params:{
                            vq:value
                        }
                    });
                }
            }
        ],
        bbar:[
            //YouTube Data APIのリクエストの開始位置が1からであるため、いくつかバグが出ます。
            new Ext.PagingToolbar({
                displayInfo:true,
                pageSize:perPage,
                store:store
            })
        ],
        listeners:{
            //ダブルクリックで別ウィンドウで開く
            rowdblclick:function(grid,rIndex,e){
                var data = grid.getStore().getAt(rIndex).data;
                window.open(data.link[0].href);
            }
        }
    });
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_594" class="wp-caption aligncenter" style="width: 239px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-06_12-52-41.png" title="JSONPでYouTube Data APIを利用" rel="lightbox[593]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-06_12-52-41-229x300.png" alt="JSONPでYouTube Data APIを利用" title="JSONPでYouTube Data APIを利用" width="229" height="300" class="size-medium wp-image-594" /></a><p class="wp-caption-text">JSONPでYouTube Data APIを利用</p></div></p>
<p>今回のキモはJsonStoreになります。これまでのサンプルではurlのコンフィグでAPIのURLを設定していました。しかし別ドメインのAPIを呼び出す場合はurlにコンフィグにフルパスを設定してもXMLHttpRequestオブジェクトのセキュリティ上の制約で正しく動作しません。JavascriptではJSONの代わりにJSONPを使うとことで別ドメインのAPIを利用する仕組みがあります。</p>
<p>JSONPとは &#8211; はてなキーワード <a target="_blank" href="http://d.hatena.ne.jp/keyword/JSONP">http://d.hatena.ne.jp/keyword/JSONP</a></p>
<blockquote><p>
JSON  with paddingの略</p>
<p>Javascriptの非同期通信でよく使われるXMLHttpRequestオブジェクトにはSame-Originポリシーが存在し、クロスドメインアクセスができない。</p>
<p>一方，scriptタグを用いると，ドメインの異なるサーバに置いているスクリプトファイルを読み込むことができる。この仕組みを利用し、scriptタグのsrcに、データを取得できるAPIのURLを指定し，ドメインの異なるサーバからデータを取得する仕組みの総称として、JSOPという言葉が使われる。JSONP用の APIでは、関数名＋取得データをjson形式で表記して引数とした形式(例.callbackFunc({id:1000,name:aaa}))のレスポンスが一般的で、APIから返されるコールバック関数と同じ名前の関数 (callbackFunc(jsonData))をクライアント側で定義しておけば、データを読み込んだ際にそのコールバック関数が実行される。動的にscriptのDOMを生成することで、非同期でデータが取得できるようになる。</p>
<p>ただし、Same-Originポリシーが存在しないため、機密情報を APIに含める際には十分な注意が必要である。
</p></blockquote>
<p>ExtJSでJSONPを利用する場合はExt.data.ScriptTagProxyを使用してJSONPを実行します。<br />
Ext.data.ScriptTagProxyはJsonStoreのproxyとして設定します。proxyはデータをストアに読み込む設定をカスタムで指定できます。ここにはExt.data.DataProxyクラスのオブジェクトを設定します。Ext.data.ScriptTagProxyはExt.data.DataProxyクラスのサブクラスにです。DataProxyクラスはJSONPを呼び出すための専用のクラスです。サンプルコードではurlコンフィグを指定しているだけですが、より複雑なロード方法を設定できます。<br />
Ext.data.ScriptTagProxyで実行されたAPIはデータが実行可能な関数として取得されます。Ext.data.ScriptTagProxyはその関数を実行して、データを展開してストアに読み込んでいます。特に難しい設定をしなくても自動的に読み込んでくれるのためありがたいです。</p>
<p>今回のサンプルコードのJsonStoreの設定はこれまでより少しややこしくなっているのは、YouTube Data APIの仕様に合わせるためです。baseParamsの値は全て必須です。alt:&#8217;json-in-script&#8217;でJSONPで呼び出すことをAPIに伝えています。注意点としてはstart-indexが１からでないといけない点です。そのためPagingToolbarで少し不具合が起きていますが、ひとまずそのままにしておきます。また時間があれば解決方法を紹介します。<br />
またrootでドットシンタックス（.）でrootの階層を一段深いところを指定しているのも、初めて出てきました。</p>
<pre class="brush: js; ">

	//ストアの設定
    var store = new Ext.data.JsonStore({
        //クロスドメインになるYouTube Data APIをJSONPとして利用するためScriptTagProxyを使う。
        proxy:new Ext.data.ScriptTagProxy({
            url:&quot;http://gdata.youtube.com/feeds/api/videos&quot;,
        }),
        baseParams:{
            format:1,
            &#039;max-results&#039;:perPage,
            &#039;start-index&#039;:1,
            vq:&#039;extjs&#039;,
            alt:&#039;json-in-script&#039;
        },
        paramNames:{
            start:&#039;start-index&#039;,
            limit:&#039;max-results&#039;,
        },
        autoLoad:true,
        root:&#039;feed.entry&#039;,
        idProperty:&#039;id.$t&#039;,
        totalProperty:&quot;feed.openSearch$totalResults.$t&quot;,
        fields:[&#039;author&#039;,&#039;id&#039;,&#039;title&#039;,&#039;media$group&#039;,&#039;link&#039;,&#039;content&#039;,&#039;published&#039;,&#039;category&#039;,&#039;updated&#039;],
    });
</pre>
<p>JSONPからデータを読み込んでさえしまえば、これまでのグリッドと同じです。いつものようにColumnモデル等を設定して表示を整えます。YouTube Data APIで取得されるデータは階層が深いので、レンダラーの設定は必須です。</p>
<pre class="brush: js; ">

   //各レンダラーの設定
    var imgRenderer = function(value,meta,rec,rIndex,cIndex,store){
        return String.format(&#039;&lt;div&quot;&gt;&lt;img src={0}&gt;{1}&lt;/div&gt;&#039;,
                  store.getAt(rIndex).data.media$group.media$thumbnail[0].url,
                  value.$t);
    };

    var titleRenderer = function(value,meta,rec,rIndex,cIndex,store){
        var data = store.getAt(rIndex).data;
        return String.format(&#039;&lt;div&gt;&lt;p&gt;&lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;by {1}&lt;p&gt;{2}&lt;/p&gt;&lt;/div&gt;&#039;,
            value.$t,
            data.author[0].name.$t,
            data.content.$t.length &gt; 20 ? data.content.$t.substring(0,20) + &#039;...&#039; :data.content.$t

        );
    };

		・・・

		cm:new Ext.grid.ColumnModel({
            columns:[
                {
                    id:&#039;id&#039;, header:&#039;ID&#039;, dataIndex:&#039;id&#039;, hidden:true
                },
                {
                    id:&#039;img&#039;, header:&#039;img&#039;, dataIndex:&#039;title&#039;, renderer:imgRenderer, width:120
                },
                {
                    id:&#039;title&#039;, header:&#039;title&#039;, dataIndex:&#039;title&#039;, renderer:titleRenderer, width:120
                },

                {
                    id:&#039;duration&#039;,
                    header:&#039;Duration&#039;,
                    dataIndex:&#039;media$group&#039;,
                    renderer:function(value){
                        var totalsec = value.yt$duration.seconds;
                        var min = Math.floor(totalsec / 60);
                        var sec = totalsec % 60;
                        return String.format(&#039;{0}:{1}&#039;,
                            String.leftPad(min,2,&#039;0&#039;),
                            String.leftPad(sec,2,&#039;0&#039;));
                    },
                    width:120
                }
            ]
        }),

		・・・
</pre>
<p>あとは必要におおじてtbarとbbarを設定します。この二つはこれまでにも出てきているので解説を省きます。</p>
<p>これでYouTubeのAPIを利用できるようになります。JSONPの使い方を覚えておけば、そのほかのAPIでJSONPに対応しているものがあれば、簡単に利用してマッシュアップが作れてしまいます。APIの仕様は変更されることもあるので、注意が必要です。今回は2010/5/6の時点のYouTube Data APIを利用しています。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F05%2F06%2Fextjs-tutorial29-youtube%2F&amp;linkname=ExJS%E5%85%A5%E9%96%8029%E3%80%80JSONP%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6YouTube%20Data%20API%E3%82%92%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%83%91%E3%83%8D%E3%83%AB%E3%81%AB%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/05/06/extjs-tutorial29-youtube/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ExtJS入門24　エディタブル・グリッドの基本(グリッドパネルをエディタブル・グリッドに変更)</title>
		<link>http://extjs.blog.sus4.co.jp/2010/04/23/extjs-tutorial24-editorgrid-basic/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/04/23/extjs-tutorial24-editorgrid-basic/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 02:38:54 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ext.grid.EditorGridPanel]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[エディタブル・グリッド]]></category>
		<category><![CDATA[エディター]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[ビジネスExtJS]]></category>
		<category><![CDATA[業務ウェブアプリケーションTips]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=556</guid>
		<description><![CDATA[今回はエディタブル・グリッド(エディター・グリッド)の紹介です。エディタブルとエディターはどっちの方が正しいのかわかりませんが。クラス名はエディター･グリッドなのですが、ここではエディタブル・グリッドで統一します。
エディタブル・グリッドはグリッドの内容をグリッド上で直接編集する機能です。一般的にはカラムのダブルクリックで編集することが多いと思います。今回は以前紹介したグリッドへの追加と削除をベースにエディタブル・グリッドに変更します。
ExtJS　フォームの基本とExtJS入門23を先にご覧下さい。

ExtJS入門　ExtJSのフォームについて（基本編）
ExtJS入門23　グリッドへの項目の追加と削除

グリッドパネル関連の過去の記事はこちらからです。

ExtJSで楽しくRIA業務アプリ開発 ExJS入門17　グリッド・パネル　基本編
ExtJSで楽しくRIA業務アプリ開発 ExtJS入門18　グリッド　レンダラーを使ってデザインを変える
ExtJS入門19　グリッドにページング機能を追加する
ExtJS入門20　グリッドにフィルタリング機能を追加する
ExJS入門21　グリッド・セレクション・モデル
ExJS入門22　グリッドのイベント処理（ダブルクリック、右クリック）

リファレンスはこちらから
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.grid.EditorGridPanelクラス
http://extdocs.xenophy.com/?class=Ext.grid.EditorGridPanel

HTML:


&#60;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Strict//EN&#34; &#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&#34;&#62;
&#60;html&#62;
&#60;head&#62;
    &#60;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34; /&#62;
    &#60;title&#62;ExtJS名古屋勉強会　エディタブル・グリッド&#60;/title&#62;

    &#60;!--Ext JS CSS--&#62;
    &#60;link rel=&#34;stylesheet&#34; href=&#34;../js/ext/resources/css/ext-all.css&#34; type=&#34;text/css&#34; /&#62;
    &#60;!--Ext JS--&#62;
    &#60;script type=&#34;text/javascript&#34; src=&#34;../js/ext/adapter/ext/ext-base.js&#34;&#62;&#60;/script&#62;

    &#60;script [...]]]></description>
			<content:encoded><![CDATA[<p>今回はエディタブル・グリッド(エディター・グリッド)の紹介です。エディタブルとエディターはどっちの方が正しいのかわかりませんが。クラス名はエディター･グリッドなのですが、ここではエディタブル・グリッドで統一します。<br />
エディタブル・グリッドはグリッドの内容をグリッド上で直接編集する機能です。一般的にはカラムのダブルクリックで編集することが多いと思います。今回は以前紹介したグリッドへの追加と削除をベースにエディタブル・グリッドに変更します。<br />
<div id="attachment_557" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.23-11.20.56.png" title="エディタブル･グリッド" rel="lightbox[556]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.23-11.20.56-150x150.png" alt="エディタブル･グリッド" title="エディタブル･グリッド" width="150" height="150" class="size-thumbnail wp-image-557" /></a><p class="wp-caption-text">エディタブル･グリッド</p></div></p>
<p>ExtJS　フォームの基本とExtJS入門23を先にご覧下さい。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/22/extjs-tutorial-form-baseic/">ExtJS入門　ExtJSのフォームについて（基本編）</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/20/extjs-tutorial23-gridadd/">ExtJS入門23　グリッドへの項目の追加と削除</a></li>
</ul>
<p>グリッドパネル関連の過去の記事はこちらからです。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/03/extjs-tutorial17-gridbasic/">ExtJSで楽しくRIA業務アプリ開発 ExJS入門17　グリッド・パネル　基本編</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/05/extjs-tutorial18-gridrenderer/">ExtJSで楽しくRIA業務アプリ開発 ExtJS入門18　グリッド　レンダラーを使ってデザインを変える</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/14/extjs-tutorial19-gridpaging/">ExtJS入門19　グリッドにページング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/15/extjs-tutorial20-grid-filter/">ExtJS入門20　グリッドにフィルタリング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/">ExJS入門21　グリッド・セレクション・モデル</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/19/extjs-tutorial-gridclick/">ExJS入門22　グリッドのイベント処理（ダブルクリック、右クリック）</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.grid.EditorGridPanelクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.grid.EditorGridPanel">http://extdocs.xenophy.com/?class=Ext.grid.EditorGridPanel</a></p>
<p><span id="more-556"></span></p>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
    &lt;title&gt;ExtJS名古屋勉強会　エディタブル・グリッド&lt;/title&gt;

    &lt;!--Ext JS CSS--&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;../js/ext/resources/css/ext-all.css&quot; type=&quot;text/css&quot; /&gt;
    &lt;!--Ext JS--&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;

    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/ext-all.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;editorgrid-basic.js&quot;&gt;&lt;/script&gt;
    &lt;style TYPE=&quot;text/css&quot;&gt;
    &lt;!--
        .add {background-image: url(../img/icon/add.png) !important;}
        .delete {background-image: url(../img/icon/delete.png) !important;}
    --&gt;
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div style=&quot;width:500px;margin:0 auto;padding:15px;background-color:#D3E1F1;font-size:small;&quot;&gt;
        &lt;p style=&quot;font-weight:bold;padding:3px;margin-bottom:10px;&quot;&gt;
        エディタブル・グリッドで項目を追加・変更します。
        &lt;/p&gt;

        &lt;div id=&quot;grid&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;editorgrid-basic.js&quot;&gt;editorgrid-basic.js&lt;/a&gt;&lt;br/&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>Java Script:</strong></p>
<pre class="brush: js; ">

//グリッドへの追加削除
Ext.onReady(function()
{
    var grid = new Ext.grid.EditorGridPanel({
        renderTo:&#039;grid&#039;,
        title:&#039;エディタブル・グリッド 追加と削除が可能&#039;,
        height:210,
        width:400,

        //カラムモデル
        cm:new Ext.grid.ColumnModel([
            {
                id:&#039;title&#039;,
                header:&#039;項目名&#039;,
                dataIndex:&#039;title&#039;,
                width:100,
                editor:{    //カラムのエディタを指定
                    xtype:&#039;textfield&#039;,
                    emptyText:&#039;入力してください。&#039;
                },
                renderer:function(v){   //カラムのデータが空のとき表示
                    return v ? v : &#039;ダブルクリックで編集&#039;;
                }
            }
        ]),

        //セレクションモデル
        sm:new Ext.grid.RowSelectionModel({
            singleSelect:true
        }),

        //ストア
        store:new Ext.data.JsonStore({
            fields:[&#039;title&#039;]
        }),

        //GridViewのコンフィグを設定
        viewConfig:{
            deferEmptyText:false,
            emptyText:&#039;グリッド項目はありません&#039;,
            forceFit:true
        },

        tbar:[
            {
                text:&#039;追加&#039;,
                iconCls:&#039;add&#039;,
                handler:function(btn){  //グリッドに項目を追加する処理
                    //編集中の場合は編集をやめる
                    grid.stopEditing();
                    var data = {};

                    var RecordType = grid.getStore().recordType;
                    var newItem = new RecordType(data);
                    grid.getStore().insert(0,newItem);
                }
            },
            {
                text:&#039;削除&#039;,
                iconCls:&#039;delete&#039;,
                handler:function(btn){  //選択したレコードを削除する処理

                    //編集中の場合は編集をやめる
                    grid.stopEditing();

                    //1.選択されている項目を取得
                    var record = grid.selModel.getSelected();

                    if (record) {
                        //2.recordをremoveでストアから取り除く
                        grid.getStore().remove(record);
                    }
                }
            }
        ]
    });
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_557" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.23-11.20.56.png" title="エディタブル･グリッド" rel="lightbox[556]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.23-11.20.56-300x173.png" alt="エディタブル･グリッド" title="エディタブル･グリッド" width="300" height="173" class="size-medium wp-image-557" /></a><p class="wp-caption-text">エディタブル･グリッド</p></div></p>
<p>基本的には<a target="_blank" href="http://extjs.blog.sus4.co.jp/2010/04/20/extjs-tutorial23-gridadd/">ExtJS入門23　グリッドへの項目の追加と削除</a>を基本にエディタブル・グリッドに変更します。<br />
Ext.grid.EditorGridクラスはExt.grid.GridPanelクラスのサブクラスであり、ほとんどのグリッドパネルの基本的なコンフィグがエディタブルグリッドに適応できます。そのため今回もExtJS入門23のグリッドパネルのコンフィグがほぼそのまま使えます。<br />
変更箇所はクラスをExt.grid.GridPanelからExt.grid.EditorGridPanelといくつかの編集のカラムの設定になります。<br />
クラスの変更は単純に書き換えるだけです。</p>
<p>つぎに編集時のエディタを設定します。前回のフォームの基本を踏まえて、今回はtextfieldで編集させます。もちろんDateFieldなどより高機能なエディタも設定できます。</p>
<pre class="brush: js; ">

//カラムモデル
cm:new Ext.grid.ColumnModel([
	{
		id:&#039;title&#039;,
		header:&#039;項目名&#039;,
		dataIndex:&#039;title&#039;,
		width:100,
		editor:{    //カラムのエディタを指定
			xtype:&#039;textfield&#039;,
			emptyText:&#039;入力してください。&#039;
		},
		renderer:function(v){   //カラムのデータが空のとき表示
			return v ? v : &#039;ダブルクリックで編集&#039;;
		}
	}
])
</pre>
<p>さらにここではrendererで空の状態でのグリッドの表示を設定しています。エディタに設定されているemptyTextはエディタが起動しているときだけしか表示されません。セルが空の場合に任意にテキストを表示したい場合は、サンプルのようにカラムのレンダラーで設定します。</p>
<p>またエディタを起動中に項目の追加・削除を行った場合少し気持ち悪い挙動をします。それはエディタが起動中にも関わらず、別の場所からストアが変更されているためです。これを避けるには、別の場所で編集が始まったらグリッドパネルの編集をとめる必要があります。編集をとめるにはEditorGridPanelクラスのstopEditiong()メソッドを実行します。tbarのボタンのハンドラー内で実行しています。</p>
<pre class="brush: js; ">

tbar:[
	{
		text:&#039;追加&#039;,
		iconCls:&#039;add&#039;,
		handler:function(btn){  //グリッドに項目を追加する処理
			//編集中の場合は編集をやめる
			grid.stopEditing();
			var data = {};

			var RecordType = grid.getStore().recordType;
			var newItem = new RecordType(data);
			grid.getStore().insert(0,newItem);
		}
	}
]
</pre>
<p>グリッドからエディタブル・グリッドへの変更はこれだけで終了です。グリッドさえ分かっていれば簡単ですね。エディットされた内容はストアに保存されています。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F04%2F23%2Fextjs-tutorial24-editorgrid-basic%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8024%E3%80%80%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%96%E3%83%AB%E3%83%BB%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E5%9F%BA%E6%9C%AC%28%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%83%91%E3%83%8D%E3%83%AB%E3%82%92%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%96%E3%83%AB%E3%83%BB%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%81%AB%E5%A4%89%E6%9B%B4%29"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/04/23/extjs-tutorial24-editorgrid-basic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS入門　ExtJSのフォームについて（基本編）</title>
		<link>http://extjs.blog.sus4.co.jp/2010/04/22/extjs-tutorial-form-baseic/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/04/22/extjs-tutorial-form-baseic/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 03:19:56 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[DateField]]></category>
		<category><![CDATA[Ext.form.FormPanel]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NumberField]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[vtype]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[フォーム]]></category>
		<category><![CDATA[フォームパネル]]></category>
		<category><![CDATA[勉強会]]></category>
		<category><![CDATA[業務ウェブアプリケーションTips]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=551</guid>
		<description><![CDATA[前回のサンプルでグリッドに項目を追加する際に、おまけで紹介した、任意の値を追加する処理にExtJSのフォームがでてきました。ユーザーに何かしらの入力を促す際、フォームは重要になってきます。グリッドに入力を追加するだけでなく、既存の値を変更する場合もフォームで入力させるのが一般的です。今回はExtJSのフォームのなかでも基本中の基本の部分を簡単に紹介します。]]></description>
			<content:encoded><![CDATA[<p>前回までグリッドについてのサンプルを紹介してきましたが、今回はグリッドを少しはなれてExtJSのフォームについて簡単に紹介をします。<br />
<div id="attachment_553" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.22-11.32.58.png" title="フォームの値を取得" rel="lightbox[551]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.22-11.32.58-150x150.png" alt="フォームの値を取得" title="フォームの値を取得" width="150" height="150" class="size-thumbnail wp-image-553" /></a><p class="wp-caption-text">フォームの値を取得</p></div></p>
<p>前回のサンプルでグリッドに項目を追加する際に、おまけで紹介した、任意の値を追加する処理にExtJSのフォームがでてきました。ユーザーに何かしらの入力を促す際、フォームは重要になってきます。グリッドに入力を追加するだけでなく、既存の値を変更する場合もフォームで入力させるのが一般的です。今回はExtJSのフォームのなかでも基本中の基本の部分を簡単に紹介します。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/20/extjs-tutorial23-gridadd/">ExtJS入門23　グリッドへの項目の追加と削除</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.FormPanelクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.FormPanel">http://extdocs.xenophy.com/?class=Ext.form.FormPanel</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.Fieldクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.Field">http://extdocs.xenophy.com/?class=Ext.form.Field</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.TextFieldクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.TextField">http://extdocs.xenophy.com/?class=Ext.form.TextField</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.NumberFieldクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.NumberField">http://extdocs.xenophy.com/?class=Ext.form.NumberField</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.DateFieldクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.DateField">http://extdocs.xenophy.com/?class=Ext.form.DateField</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.VTypesクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.VTypes">http://extdocs.xenophy.com/?class=Ext.form.VTypes</a></p>
<p><span id="more-551"></span></p>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
    &lt;title&gt;ExtJS名古屋勉強会　Fieldについて&lt;/title&gt;

    &lt;!--Ext JS CSS--&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;../js/ext/resources/css/ext-all.css&quot; type=&quot;text/css&quot; /&gt;
    &lt;!--Ext JS--&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;

    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/ext-all.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/src/locale/ext-lang-ja.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;form-exsample.js&quot;&gt;&lt;/script&gt;
    &lt;style TYPE=&quot;text/css&quot;&gt;
    &lt;!--
        .tick {background-image: url(../img/icon/tick.png) !important;}
    --&gt;
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div style=&quot;width:500px;margin:0 auto;padding:15px;background-color:#D3E1F1;font-size:small;&quot;&gt;
        &lt;p style=&quot;font-weight:bold;padding:3px;margin-bottom:10px;&quot;&gt;

            Extのフォームフィールドについて
        &lt;/p&gt;
        &lt;div id=&quot;form&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;form-exsample.js&quot;&gt;form-exsample.js&lt;/a&gt;&lt;br/&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>Java Script:</strong></p>
<pre class="brush: js; ">

//フォームの簡単な紹介
Ext.onReady(function()
{
    //グリッドパネルの作成 主要な設定は直接コンフィグオプションに入れています。
    var form = new Ext.form.FormPanel({
        renderTo:&#039;form&#039;,
        title:&#039;フォームの簡単な紹介&#039;,
        height:280,
        width:500,
        bodyStyle:{
            padding:&#039;8px&#039;
        },
        labelWidth:180,
        items:[
            {
                xtype:&#039;textfield&#039;,
                name:&#039;samplefield1&#039;,
                fieldLabel:&#039;テキストフィールド1&#039;,
                emptyText:&#039;入力してください&#039;,   //空のときのテキスト
                anchor:&#039;90%&#039;
            },
            {
                xtype:&#039;textfield&#039;,
                name:&#039;samplefield2&#039;,
                fieldLabel:&#039;テキストフィールド2(必須項目)&#039;,
                emptyText:&#039;入力してください&#039;,
                allowBlank:false,   //このフィールドを必須項目にします
                anchor:&#039;90%&#039;,
                msgTarget:&#039;under&#039;   //入力に誤りがある場合はフィールドの下に表示
            },
            {
                xtype:&#039;displayfield&#039;,
                name:&#039;samplefield3&#039;,
                fieldLabel:&#039;ディスプレイフィールド&#039;,
                value:&#039;表示だけのフィールドです。&#039;,
                anchor:&#039;90%&#039;
            },
            new Ext.form.NumberField({
                name:&#039;samplefield4&#039;,
                fieldLabel:&#039;ナンバーフィールド&#039;,
                allowDecimals:false,    //小数点を入力できないようにします
                anchor:&#039;90%&#039;

            }),
            {
                xtype:&#039;textfield&#039;,
                name:&#039;samplefield5&#039;,
                fieldLabel:&#039;Emailフィールド&#039;,
                emptyText:&#039;入力してください&#039;,
                anchor:&#039;90%&#039;,
                vtype:&#039;email&#039;,  //vtypeコンフィグでバリデーションが設定
                msgTarget:&#039;under&#039;
            },
            {
                xtype:&#039;datefield&#039;,
                name:&#039;samplefield6&#039;,
                fieldLabel:&#039;日付フィールド&#039;,
                emptyText:&#039;入力してください&#039;,
                width:100,
                msgTarget:&#039;side&#039;
            }
        ],
        buttonAlign:&#039;center&#039;,
        buttons:[
            {
                text:&#039;決定&#039;,
                iconCls:&#039;tick&#039;,
                handler:function(){
                    //値の取り出し

                    //フォームパネルからフィールドを取得
                    var formFields = form.getForm();

                    //フィールドから値を取得
                    var formValues = formFields.getValues();

                    //入力項目を表示する処理(普通は値をポストしますが、今回はフィールド名と値を表示する)
                    var data = [];
                    Ext.iterate(formValues,function(key,val,arr){
                        data.push({
                            fieldname:key,
                            formvalue:val
                        });
                    })

                    var tpl = new Ext.XTemplate(
                        &#039;&lt;tpl for=&quot;.&quot;&gt;&#039;,
                        &#039;&lt;p&gt;{fieldname}:{formvalue}&lt;/p&gt;&#039;,
                        &#039;&lt;/tpl&gt;&#039;
                    );

                    //表示処理
                    Ext.Msg.show({
                        title:&#039;フォームの値を取得&#039;,
                        msg:tpl.apply(data),
                        width:300,
                        buttons:Ext.Msg.OK
                    });
                }
            }
        ]
    });
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_552" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.22-11.32.51.png" title="基本のフォーム" rel="lightbox[551]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.22-11.32.51-300x209.png" alt="基本のフォーム" title="基本のフォーム" width="300" height="209" class="size-medium wp-image-552" /></a><p class="wp-caption-text">基本のフォーム</p></div><br />
<div id="attachment_553" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.22-11.32.58.png" title="フォームの値を取得" rel="lightbox[551]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.22-11.32.58-300x196.png" alt="フォームの値を取得" title="フォームの値を取得" width="300" height="196" class="size-medium wp-image-553" /></a><p class="wp-caption-text">フォームの値を取得</p></div></p>
<p>ExtJSのフォームはExt.form.Fieldクラスで定義されています。このサブクラスに	Checkbox, CheckboxGroup, DisplayField, Hidden, HtmlEditor, TextFieldなどが定義されており、実際にはこれらのサブクラスを使ってフォームを生成します。<br />
今回はTextField,DisplayFieldに加えて,DateFieldとNumberフィールドを使ってみます。</p>
<p>ExtJSのフィールドはフォームパネル（Ext.form.FormPanel）に配置されることが一般的です。フォームパネルでは、ラベルの表示やボタンの連携を行ってくれます。そのため基本的なフォームを作る場合はフォームパネルの中にフィールドをレイアウトするのが一般的です。またフィールドは単体でツールバーや、エディタブルグリッド内に配置することもできます。</p>
<p>ではそれぞれのフィールドを見ていきます。今回は基本的なコンフィグオプションにしか触れません。詳しくはAPIリファレンスで確認してください。</p>
<p>TextField：<br />
テキストフィールドを生成します。もっとも基本的なフィールドです。いくつかのコンフィグオプションが用意されています。またvtypeでバリデーションを設定することで、Emailやurlなどの妥当性のチェックを自動的に実行できます。</p>
<p>name:フィールドのname属性<br />
fieldLabel:フィールドの見出しを設定します。<br />
emptyText:入力が空の場合に表示されるテキスト。空のときもgetValue()したときにこの値が返る<br />
anchor:フィールドの幅の設定パーセントで指定。自動的にリサイズされる。<br />
allowBlank:Boolean,falseでフィールドを必須項目にできる<br />
msgTarget:バリデーションを通過できなかった場合にエラーを表示する位置を設定します<br />
vtype:バリデーションの種類を設定します。予め用意されたvtype以外にも独自のvtypeを作って設定することもできます。ExtJSのフォーラムで検索すると色々なvtypeが見つかります。</p>
<p>DisplayField:<br />
表示のみのフィールドです、ディスプレイを表示するだけで入力はできません。ただしgetValuesしたとき、表示されている値が取得されます。</p>
<p>value:表示する値を設定</p>
<p>NumberField:<br />
ナンバーフィールドはxtypeが設定されていません。このフィールドは数字のみの入力を受け付けます。コンフィグの設定で受け付ける数値の設定が可能です（負の数、小数点、最大値、最小値など）。今回は小数点のみ無効に設定しています。<br />
allowDecimals:Boolean　小数点の入力許可設定</p>
<p>DateField:<br />
デートフィールドは日付を入力するフィールドです。デートフィールドを生成すると自動的にデートピッカーがフィールドの右端に設定されて、ピッカーからの日付の入力も可能になります。</p>
<p>フィールドについてはこのような感じです。基本的にコンフィグオプションを設定することで、フィールドの機能を設定してきます。次にフィールドの値を取得する方法の紹介です。</p>
<p>フィールドの値はフォームパネルから直接取得できません。フォームパネルからフィールドを取得しそこから値を取得します。最初は戸惑うかもしれませんが、特に難しいことをやっているわけではありません。<br />
フォームの値を取得しているのは以下の部分です。</p>
<pre class="brush: js; ">

                    //フォームパネルからフィールドを取得
                    var formFields = form.getForm();

                    //フィールドから値を取得
                    var formValues = formFields.getValues();
</pre>
<p>まずフォームパネルのgetForm()メソッドでフォーム自体へのアクセスを取得します。<br />
次に各フィールドからの値をgetValues()メソッドで一括で取得します。<br />
取得した値はオブジェクトで取得されます（プロパティ名にフィールのname属性）。<br />
以下のように連結して一気に取得するほうが一般的かもしれません。</p>
<pre class="brush: js; ">

                    var formValues = form.getForm().getValues();
</pre>
<p>今回はフォームの基本を簡単に紹介しました、次回はフォームを使ってグリッドの値の変更するサンプルを紹介します。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F04%2F22%2Fextjs-tutorial-form-baseic%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%80%E3%80%80ExtJS%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%EF%BC%88%E5%9F%BA%E6%9C%AC%E7%B7%A8%EF%BC%89"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/04/22/extjs-tutorial-form-baseic/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>ExtJS入門23　グリッドへの項目の追加と削除</title>
		<link>http://extjs.blog.sus4.co.jp/2010/04/20/extjs-tutorial23-gridadd/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/04/20/extjs-tutorial23-gridadd/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 03:28:15 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ext.data.JsonStore]]></category>
		<category><![CDATA[Ext.form.FormPanel]]></category>
		<category><![CDATA[Ext.grid.GridPanel]]></category>
		<category><![CDATA[Ext.Window]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[GridPanel]]></category>
		<category><![CDATA[GridView]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[record]]></category>
		<category><![CDATA[recordType]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[viewConfig]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[勉強会]]></category>
		<category><![CDATA[業務ウェブアプリケーションTips]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=542</guid>
		<description><![CDATA[今回は空っぽのグリッドに対して、新規項目の追加とグリッドの項目の削除を行うサンプルを紹介します。
ローカルのデータを取り扱います。
グリッドのデータはストアで管理されています。グリッドは常にストアの状況を把握しています。ストアの情報に変化があった場合は即座にグリッドに反映されます。]]></description>
			<content:encoded><![CDATA[<p>今回は空っぽのグリッドに対して、新規項目の追加とグリッドの項目の削除を行うサンプルを紹介します。<br />
ローカルのデータを取り扱います。(サーバーサイドのプログラムを使ってグリッドのデータを取得している場合は、サーバー上のデータを削除する必要があります。)<br />
<div id="attachment_544" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.20-12.22.31.png" title="追加と削除" rel="lightbox[542]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.20-12.22.31-150x150.png" alt="追加と削除" title="追加と削除" width="150" height="150" class="size-thumbnail wp-image-544" /></a><p class="wp-caption-text">追加と削除</p></div><br />
グリッドのデータはストアで管理されています。グリッドは常にストアの状況を把握しています。ストアの情報に変化があった場合は即座にグリッドに反映されます。グリッドへの項目の追加と削除はグリッドのストアへの項目の追加と削除を行っているといえます。</p>
<p>グリッドパネル関連の過去の記事はこちらからです。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/03/extjs-tutorial17-gridbasic/">ExtJSで楽しくRIA業務アプリ開発 ExJS入門17　グリッド・パネル　基本編</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/05/extjs-tutorial18-gridrenderer/">ExtJSで楽しくRIA業務アプリ開発 ExtJS入門18　グリッド　レンダラーを使ってデザインを変える</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/14/extjs-tutorial19-gridpaging/">ExtJS入門19　グリッドにページング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/15/extjs-tutorial20-grid-filter/">ExtJS入門20　グリッドにフィルタリング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/">ExtJS入門21　グリッド・セレクション・モデル</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/19/extjs-tutorial-gridclick/">ExtJS入門22　グリッドのイベント処理（ダブルクリック、右クリック）</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.data.JsonStoreクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.data.JsonStore">http://extdocs.xenophy.com/?class=Ext.data.JsonStore</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.grid.GridViewクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.grid.GridView">http://extdocs.xenophy.com/?class=Ext.grid.GridView</a></p>
<p><span id="more-542"></span></p>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
    &lt;title&gt;ExtJS名古屋勉強会　データの追加と削除&lt;/title&gt;

    &lt;!--Ext JS CSS--&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;../js/ext/resources/css/ext-all.css&quot; type=&quot;text/css&quot; /&gt;
    &lt;!--Ext JS--&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;

    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/ext-all.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;grid-edit.js&quot;&gt;&lt;/script&gt;
    &lt;style TYPE=&quot;text/css&quot;&gt;
    &lt;!--
        .add {background-image: url(../img/icon/add.png) !important;}
        .delete {background-image: url(../img/icon/delete.png) !important;}
    --&gt;
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div style=&quot;width:500px;margin:0 auto;padding:15px;background-color:#D3E1F1;font-size:small;&quot;&gt;
        &lt;p style=&quot;font-weight:bold;padding:3px;margin-bottom:10px;&quot;&gt;
            グリッドの項目を追加・削除できるようにしています。
        &lt;/p&gt;

        &lt;div id=&quot;grid&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;grid-edit.js&quot;&gt;grid-edit.js&lt;/a&gt;&lt;br/&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>Java Script:</strong></p>
<pre class="brush: js; ">

//グリッドへの追加と削除
Ext.onReady(function()
{
    //グリッドパネルの作成 主要な設定は直接コンフィグオプションに入れています。
    var grid = new Ext.grid.GridPanel({
        renderTo:&#039;grid&#039;,
        id:&#039;my-grid&#039;,
        title:&#039;SingleSelectのグリッドパネル 追加と削除が可能&#039;,
        height:210,
        width:400,

        //カラムモデル
        cm:new Ext.grid.ColumnModel([
            {
                id:&#039;title&#039;,
                header:&#039;項目名&#039;,
                dataIndex:&#039;title&#039;,
                width:100
            }
        ]),

        //セレクションモデル
        sm:new Ext.grid.RowSelectionModel({
            singleSelect:true
        }),

        //ストア
        store:new Ext.data.JsonStore({
            fields:[&#039;title&#039;]
        }),

        //GridViewのコンフィグを設定
        viewConfig:{
            deferEmptyText:false,
            emptyText:&#039;グリッド項目はありません&#039;,
            forceFit:true
        },

        tbar:[
            {
                text:&#039;追加&#039;,
                iconCls:&#039;add&#039;,
                handler:function(btn){  //グリッドに項目を追加する処理
                    //1.追加したいデータ
                    var data = {
                        title:&#039;新しい項目&#039;
                    };

                    //2.ストアのrecordの型を取得
                    var RecordType = grid.getStore().recordType;

                    //3.データをrecordの型に入れて新しい項目を作る
                    var newItem = new RecordType(data);

                    //4.ストアのinsertもしくはaddメソッドで追加
                    grid.getStore().insert(0,newItem);
                }
            },
            {
                text:&#039;削除&#039;,
                iconCls:&#039;delete&#039;,
                handler:function(btn){  //選択したレコードを削除する処理

                    //1.選択されている項目を取得
                    var record = grid.selModel.getSelected();

                    if (record) {
                        //2.recordをremoveでストアから取り除く
                        grid.getStore().remove(record);
                    }
                }
            },&#039;-&gt;&#039;,
            {
                text:&#039;フォームで入力(おまけ)&#039;,
                iconCls:&#039;add&#039;,
                handler:function(){　//フォームで入力した項目を追加する
                    var formPanel = new Ext.form.FormPanel({
                        border:false,
                        bodyStyle:{
                            padding:&#039;15px&#039;
                        },
                        items:[
                            {
                                name:&#039;title&#039;,
                                xtype:&#039;textfield&#039;,
                                fieldLabel:&#039;新しい項目の名称&#039;,
                                anchor:&#039;100%&#039;
                            }
                        ]
                    });

                    var win = new Ext.Window({
                        title:&#039;新しい項目の追加&#039;,
                        layout:&#039;fit&#039;,
                        items:[formPanel],
                        modal:true,
                        width:300,
                        height:300,
                        buttonAlign:&#039;center&#039;,
                        buttons:[
                            {
                                text:&#039;閉じる&#039;,
                                handler:function(){
                                    win.close();
                                }
                            },
                            {
                                text:&#039;追加&#039;,
                                handler:function(){
                                    var values = formPanel.getForm().getValues();

                                    var RecordType = grid.getStore().recordType;
                                    var newItem = new RecordType(values);
                                    grid.getStore().insert(0,newItem);  

                                    win.close();
                                }
                            }
                        ]
                    });

                    win.show();

                }
            }
        ]
    });
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_543" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.20-12.22.16.png" title="空のとき" rel="lightbox[542]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.20-12.22.16-300x208.png" alt="空のとき" title="空のとき" width="300" height="208" class="size-medium wp-image-543" /></a><p class="wp-caption-text">空のとき</p></div><br />
<div id="attachment_544" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.20-12.22.31.png" title="追加と削除" rel="lightbox[542]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.20-12.22.31-300x188.png" alt="追加と削除" title="追加と削除" width="300" height="188" class="size-medium wp-image-544" /></a><p class="wp-caption-text">追加と削除</p></div></p>
<p>今回は事前にグリッドのデータを用意する必要はありません。空のグリッドからはじめます。<br />
グリッドが空のときグリッドは基本的に真っ白です。しかしグリッドの見た目を管理しているGridViewのコンフィグを設定することで、項目がない場合にテキストを表示させることができます<br />
GridViewはGridPanelの内部で自動的に生成されます。GridViewはGridPanelのコンフィグオプションのviewにGridViewクラスを設定することができますが、GridPanelのviewConfigコンフィグオプションに直接GridViewのコンフィグを設定することも可能です。<br />
今回はviewConfigオプションでGridViewの設定を指定しています。</p>
<pre class="brush: js; ">

//GridViewのコンフィグを設定
viewConfig:{
	deferEmptyText:false,
	emptyText:&#039;グリッド項目はありません&#039;,
	forceFit:true
}
</pre>
<p>GridViewのコンフィグについてはAPIリファセンスを確認指定ください。ここでは今回使うものだけを簡単に紹介します。</p>
<p>emptyText:グリッドが空のとき表示させるテキスト<br />
deferEmptyText:booleanで指定。ストアがロードされるまでemptyTextの表示を待つかどうか<br />
forceFit:booleanで指定。カラムの幅を自動的にグリッドいっぱいに広がるように自動的に調整する。</p>
<p>今回はそもそも初期データがないのでdeferEmptyTextをfalseにして、ロードまで待たないようにしています。</p>
<p>これでグリッドパネルの準備ができました。早速グリッドへの追加のための処理を考えます。</p>
<p>・追加</p>
<p>グリッドへの追加はtbarの「追加」ボタンから起動するようにします。tbarボタンの設定は以前の記事を参考にしてください。tbarが押された後に実際の追加の処理をhandlerの中で記述していきます。<br />
ステップとしては4段階あります。</p>
<pre class="brush: js; ">

 tbar:[
	{
		text:&#039;追加&#039;,
		iconCls:&#039;add&#039;,
		handler:function(btn){  //グリッドに項目を追加する処理
			//1.追加したいデータ
			var data = {
				title:&#039;新しい項目&#039;
			};

			//2.ストアのrecordの型を取得
			var RecordType = grid.getStore().recordType;

			//3.データをrecordの型に入れて新しい項目を作る
			var newItem = new RecordType(data);

			//4.ストアのinsertもしくはaddメソッドで追加
			grid.getStore().insert(0,newItem);
		}
	},
</pre>
<p>ここではあまり実用的ではありませんが、固定したデータをボタンが押されるごとに追加させます。まず追加するデータを用意します(Step 1)。<br />
次に用意したデータをストアに追加するには、ストアのrecordの型にデータをあわせる必要があります。そのためrecordのコンストラクタをストアのrecordTypeから取得します(Step 2)。このrecordTypeに用意したデータを当てはめてストアに合った新しいrecordを作成します。(Step 3)<br />
recordが生成されたなら、あとは実際にストアに追加します。追加のためのメソッドにはaddメソッドとinsertメソッドがあります。addメソッドはストオの最後に追加し、insertメソッドはストアのデータの指定したindexに挿入します。ここではinsertを使いindexを0に指定することで、ストアのデータの先頭に追加しています。(Step 4)<br />
これでストアに新しい項目が追加されました。ストアに追加されると即座にグリッドが再描画されて最新のストアの無いようにもとづいたグリッドの項目が表示されます。</p>
<p>・削除</p>
<p>グリッドからの項目の削除は追加に比べると簡単です。ストアの中から指定したrecordを取り除くことでグリッドから項目が削除されます。削除もtbarのボタンから呼び出すため、指定したrecordは現在選択中の項目にすることにします。また今回は紹介しませんが、前回紹介したコンテクストメニューを使うとより、ローカルアプリのような操作感で削除を行えます。</p>
<pre class="brush: js; ">

 tbar:[
	{
		text:&#039;削除&#039;,
		iconCls:&#039;delete&#039;,
		handler:function(btn){  //選択したレコードを削除する処理

			//1.選択されている項目を取得
			var record = grid.selModel.getSelected();

			if (record) {
				//2.recordをremoveでストアから取り除く
				grid.getStore().remove(record);
			}
		}
	}
</pre>
<p>まず現在選択中の項目をrecordで取得します。次にrecordをストアから削除します。ストアからの削除はremoveメソッドを使います。引数に対象のrecordを渡すとストアから削除されます。removeが行われるとすぐにグリッドに反映され対象のグリッド項目が取り除かれます。</p>
<p>このようにグリッドへの項目の追加と削除はストアにrecordを追加・削除することになります。storeとrecordが呼び出せる場所からであればどこからでも実行することができます。</p>
<p>ここでサンプルでは固定したデータを追加するだけでしたが、サンプルのコードにはポップアップで入力フォームを呼び出して、そのフォームからrecordを作って追加する処理もおまけで載せておきました。Ext.WindowやExt.form.FormPanelなどがいきなり出てきていますが、これらのクラスの解説はまたの機会に紹介します。APIリファセンスを見て考えてみるとリファレンスを読む練習になるかもしれません。ExtJS名古屋勉強会では時間があれば解説します。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F04%2F20%2Fextjs-tutorial23-gridadd%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8023%E3%80%80%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%81%B8%E3%81%AE%E9%A0%85%E7%9B%AE%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%81%A8%E5%89%8A%E9%99%A4"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/04/20/extjs-tutorial23-gridadd/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>ExtJS入門22　グリッドのイベント処理（ダブルクリック、右クリック）</title>
		<link>http://extjs.blog.sus4.co.jp/2010/04/19/extjs-tutorial-gridclick/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/04/19/extjs-tutorial-gridclick/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 03:19:25 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[GridPanel]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[listeners]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rowcontextmenu]]></category>
		<category><![CDATA[rowdblclick]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[イベント]]></category>
		<category><![CDATA[コンテクストメニュー]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[ダブルクリック]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[右クリック]]></category>
		<category><![CDATA[業務ウェブアプリケーションTips]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=529</guid>
		<description><![CDATA[前回はツールバーでグリッドの情報を取得し、ポップアップで表示しました。今回はグリッドのダブルクリックと右クリックのイベントで詳細を表示する処理を実行します。

グリッドのダブルクリックと右クリック（コンテクストメニュー）で処理を実装することで、より直感的なグリッドの操作が可能になります。]]></description>
			<content:encoded><![CDATA[<p>前回はツールバーでグリッドの情報を取得し、ポップアップで表示しました。今回はグリッドのダブルクリックと右クリックのイベントで詳細を表示する処理を実行します。</p>
<p>グリッドのダブルクリックと右クリック（コンテクストメニュー）で処理を実装することで、より直感的なグリッドの操作が可能になります。<br />
サンプルは前回の<a target="_blank" href="http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/">ExJS入門21　グリッド・セレクション・モデル</a>をベースにイベントの処理を追加しています。</p>
<div id="attachment_530" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.19-12.13.01.png" title="右クリックメニュー" rel="lightbox[529]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.19-12.13.01-150x150.png" alt="右クリックメニュー" title="右クリックメニュー" width="150" height="150" class="size-thumbnail wp-image-530" /></a><p class="wp-caption-text">右クリックメニュー</p></div>
<p>グリッドパネル関連の過去の記事はこちらからです。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/03/extjs-tutorial17-gridbasic/">ExtJSで楽しくRIA業務アプリ開発 ExJS入門17　グリッド・パネル　基本編</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/05/extjs-tutorial18-gridrenderer/">ExtJSで楽しくRIA業務アプリ開発 ExtJS入門18　グリッド　レンダラーを使ってデザインを変える</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/14/extjs-tutorial19-gridpaging/">ExtJS入門19　グリッドにページング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/15/extjs-tutorial20-grid-filter/">ExtJS入門20　グリッドにフィルタリング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/">ExtJS入門21　グリッド・セレクション・モデル</a></li>
</ul>
<p>リファレンスはこちらから<br />
今回はExt.menu.Menuクラスを右クリックに仕込んでいます。</p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.grid.GridPanelクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.grid.GridPanel">http://extdocs.xenophy.com/?class=Ext.grid.GridPanel</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.menu.Menuクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.menu.Menu">http://extdocs.xenophy.com/?class=Ext.menu.Menu</a></p>
<p><span id="more-529"></span></p>
<p><strong>PHP:</strong></p>
<pre class="brush: php; ">

&lt;?php
    $limit = $_POST[&#039;limit&#039;];
    $start = $_POST[&#039;start&#039;];

    $name = $_POST[&#039;name&#039;];

    //全データ
    $data = array(
        array(
            &#039;id&#039;=&gt;1,
            &#039;rank&#039;=&gt;1,
            &#039;name&#039;=&gt;&#039;IE&#039;,
            &#039;percentage&#039;=&gt;62.69,
            &#039;url&#039; =&gt; &#039;http://www.microsoft.com/japan/windows/products/winfamily/ie/default.mspx&#039;,
            &#039;img&#039; =&gt; &#039;../img/ie64.png&#039;
        ),
        array(
            &#039;id&#039;=&gt;2,
            &#039;rank&#039;=&gt;2,
            &#039;name&#039;=&gt;&#039;Firefox&#039;,
            &#039;percentage&#039;=&gt;24.61,
            &#039;url&#039; =&gt;&#039;http://mozilla.jp/firefox/&#039;,
            &#039;img&#039; =&gt; &#039;../img/firefox64.png&#039;
        ),
        array(
            &#039;id&#039;=&gt;3,
            &#039;rank&#039;=&gt;3,
            &#039;name&#039;=&gt;&#039;Chrome&#039;,
            &#039;percentage&#039;=&gt;4.63,
            &#039;url&#039; =&gt; &#039;http://www.google.com/chrome/&#039;,
            &#039;img&#039; =&gt; &#039;../img/chrome64.png&#039;
        ),
        array(
            &#039;id&#039;=&gt;4,
            &#039;rank&#039;=&gt;4,
            &#039;name&#039;=&gt;&#039;Safari&#039;,
            &#039;percentage&#039;=&gt;4.46,
            &#039;url&#039;=&gt; &#039;http://www.apple.com/jp/safari/&#039;,
            &#039;img&#039; =&gt; &#039;../img/safari64.png&#039;
        ),
        array(
            &#039;id&#039;=&gt;5,
            &#039;rank&#039;=&gt;5,
            &#039;name&#039;=&gt;&#039;Opera&#039;,
            &#039;percentage&#039;=&gt;2.40,
            &#039;url&#039; =&gt; &#039;http://jp.opera.com/&#039;,
            &#039;img&#039; =&gt; &#039;../img/opera64.png&#039;
        ),
        array(
            &#039;id&#039;=&gt;6,
            &#039;rank&#039;=&gt;6,
            &#039;name&#039;=&gt;&#039;Opera Mini&#039;,
            &#039;percentage&#039;=&gt;0.53,
            &#039;url&#039; =&gt; &#039;http://jp.opera.com/&#039;,
            &#039;img&#039; =&gt; &#039;../img/opera64.png&#039;
        )
    );

    if ($name) {
        $newData = array();
        foreach($data as $val){
            if(stristr($val[&#039;name&#039;],$name)) {
                $newData[] = $val;
            }
        }
        $data = $newData;
    }

    if ($limit &amp;amp;&amp;amp; $start + $limit &lt;= count($data)) {
        //ページング用
        $rows = array_slice($data,$start,$limit);
    }else {
        //ページングしない
        $rows = $data;
    }

    $res = array(
        &#039;success&#039; =&gt; true,
        &#039;total&#039; =&gt; 6,
        &#039;rows&#039; =&gt; $rows
    );

    header(&quot;Content-Type: text/javascript; charset=utf-8&quot;);
    echo json_encode($res);

    die();
</pre>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
    &lt;title&gt;ExtJS名古屋勉強会　クリックイベント&lt;/title&gt;

    &lt;!--Ext JS CSS--&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;../js/ext/resources/css/ext-all.css&quot; type=&quot;text/css&quot; /&gt;
    &lt;!--Ext JS--&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;

    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/ext-all.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;grid-click.js&quot;&gt;&lt;/script&gt;
    &lt;style TYPE=&quot;text/css&quot;&gt;
    &lt;!--
        .info {background-image: url(../img/icon/information.png) !important;}
        .delete {background-image: url(../img/icon/delete.png) !important;}
    --&gt;
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div style=&quot;width:500px;margin:0 auto;padding:15px;background-color:#D3E1F1;font-size:small;&quot;&gt;
        &lt;p style=&quot;font-weight:bold;padding:3px;margin-bottom:10px;&quot;&gt;
            クリックイベントの処理を設定します。
        &lt;/p&gt;

        &lt;ul&gt;
            &lt;li&gt;rowdblclick:行のダブルクリック&lt;/li&gt;
            &lt;li&gt;rowcontextmenu:行の右クリック&lt;/li&gt;
        &lt;/ul&gt;
        &lt;div id=&quot;grid&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;grid-click.js&quot;&gt;grid-click.js&lt;/a&gt;&lt;br/&gt;

        PHP(JSONデータ)：&lt;a href=&quot;data.php&quot;&gt;data.php&lt;/a&gt;&lt;br /&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>Java Script:</strong></p>
<pre class="brush: js; ">

//グリッドイベント
Ext.onReady(function()
{
    //詳細表示処理
    //詳細表示イベント実行時にこの関数を呼ぶ。
    var showInfo = function(record) {
        if(!record) {return;};

        //表示するメッセージ
        var msg = new Ext.XTemplate(
            &#039;&lt;div style=&quot;width:200px; text-align:center;&quot;&gt;&#039;,
            &#039;ブラウザ名：{name}&lt;br/&gt;&#039;,
            &#039;順位：{rank}&lt;br/&gt;&#039;,
            &#039;シェア：{percentage}%&lt;br /&gt;&#039;,
            &#039;&lt;a href=&quot;{url}&quot; target=&quot;_blank&quot;&gt;DOWNLOAD&lt;/a&gt;&lt;br/&gt;&#039;,
            &#039;&lt;img src=&quot;{img}&quot; /&gt;&#039;,
            &#039;&lt;/div&gt;&#039;).apply(record.data);

        Ext.Msg.alert(&#039;選択中のブラウザ&#039;,msg);
    };

    //1.データを用意
    //今回はPHPでdata.phpでJSONを返しています。

    //2.データストアを用意
    var store = new Ext.data.JsonStore({
        url:&#039;data.php&#039;,//php等が使えない場合はここをdata:&#039;data.json&#039;としてローカルファイルの取得してもよいです。
        root:&#039;rows&#039;,            //実際のデータ位置（プロパティ名）
        totalProperty:&#039;total&#039;,  //全件数を返すプロパティ名を指定
        fields:[
            {name:&#039;id&#039;},
            {name:&#039;rank&#039;},
            {name:&#039;name&#039;},
            {name:&#039;percentage&#039;,type:&#039;float&#039;},
            {name:&#039;url&#039;,type:&#039;url&#039;},
            {name:&#039;img&#039;,type:&#039;url&#039;},
        ],
        autoLoad:true           //描写後に自動的に初回のリクエストをかける
    });

    //3.SelModelの設定
    //今回は一度に一つの行しか選択できないようにしている。
    var sm = new Ext.grid.RowSelectionModel({
        singleSelect:true
    });

    //4.カラムモデルを用意
    var column = new Ext.grid.ColumnModel([
        {
            id:&#039;rank&#039;,
            header:&#039;順位&#039;,
            dataIndex:&#039;rank&#039;,
            width:50
        },
        {
            id:&#039;name&#039;,
            header:&#039;ブラウザ名&#039;,
            dataIndex:&#039;name&#039;,
            width:100
        },
        {
            id:&#039;percentage&#039;,
            header:&#039;シェア&#039;,
            dataIndex:&#039;percentage&#039;,
            width:80
        },
        {
            id:&#039;id&#039;,
            header:&#039;ID&#039;,
            dataIndex:&#039;id&#039;,
            width:20
        }
    ]);

    var contextMenu = new Ext.menu.Menu({
        items: [
            {
                text:&#039;詳細表示&#039;,
                iconCls:&#039;info&#039;,
                scope:this,
                handler: function(btn){
                    var record = grid.selModel.getSelected();
                    showInfo(record);
                }
            },{
                text:&#039;削除&#039;,
                iconCls:&#039;delete&#039;,
                scope:this,
                handler:function(btn){
                    var record = grid.selModel.getSelected();
                    Ext.Msg.alert(&#039;選択中のブラウザの削除&#039;, &#039;「&#039; + record.get(&#039;name&#039;) + &#039;」を削除しますか？&#039;);
                }
            }
        ]
    });

    //5.グリッドパネルの作成
    var grid = new Ext.grid.GridPanel({
        renderTo:&#039;grid&#039;,
        id:&#039;my-grid&#039;,
        autoExpandColumn:&#039;name&#039;,
        title:&#039;SingleSelectのグリッドパネル&#039;,
        height:210,
        width:400,
        cm:column,
        sm:sm,
        store:store,
        tbar:[
            {
                text:&#039;詳細情報表示&#039;,
                iconCls:&#039;info&#039;,
                handler:function(btn){
                    var record = grid.selModel.getSelected();
                    showInfo(record);
                }
            },
            {
                text:&#039;削除&#039;,
                iconCls:&#039;delete&#039;,
                handler:function(btn){
                    var record = grid.selModel.getSelected();
                    Ext.Msg.alert(&#039;選択中のブラウザの削除&#039;, &#039;「&#039; + record.get(&#039;name&#039;) + &#039;」を削除しますか？&#039;);
                }
            }
        ],
        //イベントを設定する。
        /**
         *  今回はどちらのイベントも引数は同じ。
         *  rowdblclick:ダブルクリックイベント
         *  rowcontextmenu:ダブルクリックイベント
         *      grid:グリッド
         *      row:ダブルクリックした行のインデックス
         *      e:イベントオブジェクト
         *
         */
        listeners:{
            rowdblclick:function(grid, row, e){
                var record = grid.getStore().getAt(row);
                showInfo(record);
            },
            rowcontextmenu:function(grid, row, e){
                //右クリックでセレクト処理(セレクトしたものを後で右クリックメニューで取得する)
                grid.getSelectionModel().selectRow(row);

                //右クリックイベントを止める。ここで止めないとブラウザの右クリックメニューが表示されてしまう。
                e.stopEvent();

                //コンテクストメニューを表示
                contextMenu.showAt(e.getXY());
            }
        }
    });
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_530" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.19-12.13.01.png" title="右クリックメニュー" rel="lightbox[529]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.19-12.13.01-300x196.png" alt="右クリックメニュー" title="右クリックメニュー" width="300" height="196" class="size-medium wp-image-530" /></a><p class="wp-caption-text">右クリックメニュー</p></div><br />
<a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.19-12.13.30.png" title="詳細表示処理" rel="lightbox[529]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.19-12.13.30-300x200.png" alt="詳細表示処理" title="詳細表示処理" width="300" height="200" class="aligncenter size-medium wp-image-531" /></a><br />
<a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.19-12.13.45.png" title="削除処理" rel="lightbox[529]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.19-12.13.45-300x195.png" alt="削除処理" title="削除処理" width="300" height="195" class="aligncenter size-medium wp-image-532" /></a></p>
<p>グリッドの部分は基本的に<a target="_blank" href="http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/">前回のサンプル</a>のままです。<br />
ExtJSのクラスに定義されているイベントを処理するときはコンフィグ・オプションのlistenersにイベントごとの処理を記述していきます。<br />
今回はExt.grid.GridPanelクラスのrowdblclickイベントとrowcontextmenuイベントの処理を書いていきます。listenersコンフィグはオブジェクトで指定します。それぞれのイベントに対応するプロパティ名に処理を定義します。各イベントは違った引数を持ちます。ExtJSの標準クラスのイベントについては各クラスのAPIリファレンスのイベント項目に記載されています。<br />
今回は偶然ですがrowdblclickとrowcontextmenuのイベントは同じ引数を持ちます。</p>
<ul>
<li>第1引数：対象のグリッド・オブジェクト</li>
<li>第2引数：クリックした、行のインデックス</li>
<li>第3引数：イベントオブジェクト</li>
<ul>
第1引数のグリッドオブジェクトと第2引数のインデックスを使ってクリックした行に対応するストアのレコードを取り出すことができます。具体的には以下のようにstoreのgetAt()メソッドを使って取り出します。グリッドではグリッドのストアからrecordさえ取り出せれば後は自由に処理を実行できます。<br />
では実際にイベント処理を見ていきますrowdblclickは比較的シンプルですが、rowcontextmenuはほんの少しだけ複雑です。まずrowdblclickでイベント処理の感覚をつかむでおくと良いと思います。</p>
<p>・グリッドのダブルクリック　（rowdblclickイベント）</p>
<pre class="brush: js; ">

listeners:{
	 rowdblclick:function(grid, row, e){
		var record = grid.getStore().getAt(row);
		/**
		 * 上の処理はこう書いても同じです。
		 * var store = grid.getStore();
		 * var record = grid.getAt(row);
		 */

		showInfo(record);
	}
}
</pre>
<p>イベント処理はこれだけです。イベントの引数にそれぞれ、grid,row,eを当てています。ダブルクリックした対象のrecordをストアから取得して、そのレコードをshowInfo()で処理しています。showinfo()は詳細をポップアップで表示する処理です。grid.getStore()でストアを取得して、getAt()でレコードを取得します。showInfo()関数は前回のサンプルでtbarのハンドラーに仕込んだ処理と全く同じです。<br />
意外と簡単ですね。次にrowcontextmenuのイベントを処理します。</p>
<p>ExtJSでは独自の右クリックメニュー（コンテクストメニュー）を設定することができます。基本的な考え方としてはExtのMenuクラス(Ext.menu.Menuクラス等)を右クリックした位置に表示して、ブラウザの右クリックメニューをキャンセルさせることで、ExtJSで独自の右クリックメニューを表示させています。</p>
<p>rowdblclickと同じでrowcontextmenuも基本的にストアからrecordを取り出すことが目標です。<br />
処理の大まかな流れは</p>
<p>1.右クリックした行を選択する。<br />
　↓<br />
2.イベントを止める<br />
　↓<br />
3.メニューを表示<br />
　↓<br />
4.メニューの処理でrecordを取得</p>
<p>になります</p>
<p>実際にサンプルを見ていきます。</p>
<pre class="brush: js; ">

listeners:{
		rowcontextmenu:function(grid, row, e){

			//右クリックでセレクト処理(セレクトしたものを後で右クリックメニューで取得する)
			grid.getSelectionModel().selectRow(row);
			//右クリックイベントを止める。ここで止めないとブラウザの右クリックメニューが表示されてしまう。
			e.stopEvent();

			//コンテクストメニューを表示
			contextMenu.showAt(e.getXY());
		}
}
</pre>
<p>コンテクストメニューの処理</p>
<pre class="brush: js; ">

  var contextMenu = new Ext.menu.Menu({
        items: [
            {
                text:&#039;詳細表示&#039;,
                iconCls:&#039;info&#039;,
                scope:this,
                handler: function(btn){
                    var record = grid.selModel.getSelected();
                    showInfo(record);
                }
            },{
                text:&#039;削除&#039;,
                iconCls:&#039;delete&#039;,
                scope:this,
                handler:function(btn){
                    var record = grid.selModel.getSelected();
                    Ext.Msg.alert(&#039;選択中のブラウザの削除&#039;, &#039;「&#039; + record.get(&#039;name&#039;) + &#039;」を削除しますか？&#039;);
                }
            }
        ]
    });
</pre>
<p>右クリックした行を選択して、その後その行のレコードを取得して処理します。コンテクストメニューの処理は前回のtbarの記述とよく似ています。今回は詳細表示のほかに削除のメニューもつけています。削除の処理はまだダミーでポップアップが表示されるだけです。handlerの中が右クリックの実際の処理ですが、recordをセレクションモデルから取得しています。あとはrowdblclickと同じでshowInfow()に処理を渡しています。削除のほうも処理の内容はほぼ同じです。</p>
<p>これでグリッドの各行に対応した右クリックを表示することができるようになりました。右クリックメニューはさらに階層を使ってアクションを沢山指定することもできます。詳しくはAPIリファセンスを参照してください。</p>
<p>この2つのイベント以外にもグリッドには様々なイベントが定義されています。APIリファレンスのイベントの項目を見て、listenersに設定して試してみるとExtJSグリッドの多機能さが良く分かると思います。また独自のイベントを定義することもできます。イベントについてはまた別の機会に解説します。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F04%2F19%2Fextjs-tutorial-gridclick%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8022%E3%80%80%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E5%87%A6%E7%90%86%EF%BC%88%E3%83%80%E3%83%96%E3%83%AB%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%80%81%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%EF%BC%89"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/04/19/extjs-tutorial-gridclick/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ExJS入門21　グリッド・セレクション・モデル</title>
		<link>http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 02:45:07 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ext.XTemplate]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[GridPanel]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[ビジネスExtJS]]></category>
		<category><![CDATA[業務ウェブアプリケーションTips]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=520</guid>
		<description><![CDATA[グリッド関連4回目は、セレクションモデルを設定して、行の選択状態を取得する簡単なサンプルです。
ExtJSのグリッドの様々なセレクションモデルを設定して、行の選択の仕方を指定します。今回は一番基本となる、単一の行を選択するセレクションモデルを設定して、その行の情報を取り出すようにします。]]></description>
			<content:encoded><![CDATA[<p>グリッド関連4回目は、セレクションモデルを設定して、行の選択状態を取得する簡単なサンプルです。<br />
ExtJSのグリッドの様々なセレクションモデルを設定して、行の選択の仕方を指定します。今回は一番基本となる、単一の行を選択するセレクションモデルを設定して、その行の情報を取り出すようにします。以前に紹介したグリッドのサンプルではセレクションモデルが明示的に設定されていないためグリッドのデフォルトのセレクションモデルが自動的に設定されていました。実際に試してもらうと分かりやすいのですが、Ctrlもしくはcommandキーを押しながらクリックすると複数選択ができます。<br />
今回のサンプルではセレクションモデルを独自に設定して、一行だけを選択するようにします。<br />
<div id="attachment_524" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.16-11.43.06.png" title="セレクションモデル" rel="lightbox[520]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.16-11.43.06-150x150.png" alt="セレクションモデル" title="セレクションモデル" width="150" height="150" class="size-thumbnail wp-image-524" /></a><p class="wp-caption-text">セレクションモデル</p></div></p>
<p><span id="more-520"></span></p>
<p>グリッドパネルについてはこちらもご覧下さい。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/03/extjs-tutorial17-gridbasic/">ExtJSで楽しくRIA業務アプリ開発 ExJS入門17　グリッド・パネル　基本編</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/05/extjs-tutorial18-gridrenderer/">ExtJSで楽しくRIA業務アプリ開発 ExtJS入門18　グリッド　レンダラーを使ってデザインを変える</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/14/extjs-tutorial19-gridpaging/">ExtJS入門19　グリッドにページング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/15/extjs-tutorial20-grid-filter/">ExtJS入門20　グリッドにフィルタリング機能を追加する</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.grid.RowSelectionModelクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.grid.RowSelectionModel">http://extdocs.xenophy.com/?class=Ext.grid.RowSelectionModel</a></p>
<p><!--more--></p>
<p><strong>PHP:</strong></p>
<pre class="brush: html; ">

&lt;?php
    $limit = $_POST[&#039;limit&#039;];
    $start = $_POST[&#039;start&#039;];

    $name = $_POST[&#039;name&#039;];

    //全データ
    $data = array(
        array(
            &#039;id&#039;=&gt;1,
            &#039;rank&#039;=&gt;1,
            &#039;name&#039;=&gt;&#039;IE&#039;,
            &#039;percentage&#039;=&gt;62.69,
            &#039;url&#039; =&gt; &#039;http://www.microsoft.com/japan/windows/products/winfamily/ie/default.mspx&#039;,
            &#039;img&#039; =&gt; &#039;../img/ie64.png&#039;
        ),
        array(
            &#039;id&#039;=&gt;2,
            &#039;rank&#039;=&gt;2,
            &#039;name&#039;=&gt;&#039;Firefox&#039;,
            &#039;percentage&#039;=&gt;24.61,
            &#039;url&#039; =&gt;&#039;http://mozilla.jp/firefox/&#039;,
            &#039;img&#039; =&gt; &#039;../img/firefox64.png&#039;
        ),
        array(
            &#039;id&#039;=&gt;3,
            &#039;rank&#039;=&gt;3,
            &#039;name&#039;=&gt;&#039;Chrome&#039;,
            &#039;percentage&#039;=&gt;4.63,
            &#039;url&#039; =&gt; &#039;www.google.com/chrome/&#039;,
            &#039;img&#039; =&gt; &#039;../img/chrome64.png&#039;
        ),
        array(
            &#039;id&#039;=&gt;4,
            &#039;rank&#039;=&gt;4,
            &#039;name&#039;=&gt;&#039;Safari&#039;,
            &#039;percentage&#039;=&gt;4.46,
            &#039;url&#039;=&gt; &#039;http://www.apple.com/jp/safari/&#039;,
            &#039;img&#039; =&gt; &#039;../img/safari64.png&#039;
        ),
        array(
            &#039;id&#039;=&gt;5,
            &#039;rank&#039;=&gt;5,
            &#039;name&#039;=&gt;&#039;Opera&#039;,
            &#039;percentage&#039;=&gt;2.40,
            &#039;url&#039; =&gt; &#039;http://jp.opera.com/&#039;,
            &#039;img&#039; =&gt; &#039;../img/opera64.png&#039;
        ),
        array(
            &#039;id&#039;=&gt;6,
            &#039;rank&#039;=&gt;6,
            &#039;name&#039;=&gt;&#039;Opera Mini&#039;,
            &#039;percentage&#039;=&gt;0.53,
            &#039;url&#039; =&gt; &#039;http://jp.opera.com/&#039;,
            &#039;img&#039; =&gt; &#039;../img/opera64.png&#039;
        )
    );

    if ($name) {
        $newData = array();
        foreach($data as $val){
            if(stristr($val[&#039;name&#039;],$name)) {
                $newData[] = $val;
            }
        }
        $data = $newData;
    }

    if ($limit &amp;&amp; $start + $limit &lt;= count($data)) {
        //ページング用
        $rows = array_slice($data,$start,$limit);
    }else {
        //ページングしない
        $rows = $data;
    }

    $res = array(
        &#039;success&#039; =&gt; true,
        &#039;total&#039; =&gt; 6,
        &#039;rows&#039; =&gt; $rows
    );

    header(&quot;Content-Type: text/javascript; charset=utf-8&quot;);
    echo json_encode($res);

    die();
</pre>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
    &lt;title&gt;ExtJS名古屋勉強会　Selection&lt;/title&gt;

    &lt;!--Ext JS CSS--&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;../js/ext/resources/css/ext-all.css&quot; type=&quot;text/css&quot; /&gt;
    &lt;!--Ext JS--&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;

    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/ext-all.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;grid-selection.js&quot;&gt;&lt;/script&gt;
    &lt;style TYPE=&quot;text/css&quot;&gt;
    &lt;!--
        .tick {background-image: url(../img/icon/tick.png) !important;}
    --&gt;
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div style=&quot;width:500px;margin:0 auto;padding:15px;background-color:#D3E1F1;font-size:small;&quot;&gt;
        &lt;p style=&quot;font-weight:bold;padding:3px;margin-bottom:10px;&quot;&gt;
            行のセレクト情報を取得します。
        &lt;/p&gt;

        &lt;div id=&quot;grid&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;grid-selection.js&quot;&gt;grid-selection.js&lt;/a&gt;&lt;br/&gt;
        PHP(JSONデータ)：&lt;a href=&quot;data.php&quot;&gt;data.php&lt;/a&gt;&lt;br /&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>Java Script:</strong></p>
<pre class="brush: js; ">

//フィルターグリッド
Ext.onReady(function()
{
    //1.データを用意
    //今回はPHPでdata.phpでJSONを返しています。

    //2.データストアを用意
    var store = new Ext.data.JsonStore({
        url:&#039;data.php&#039;,
        root:&#039;rows&#039;,            //実際のデータ位置（プロパティ名）
        totalProperty:&#039;total&#039;,  //全件数を返すプロパティ名を指定
        fields:[
            {name:&#039;id&#039;},
            {name:&#039;rank&#039;},
            {name:&#039;name&#039;},
            {name:&#039;percentage&#039;,type:&#039;float&#039;},
            {name:&#039;url&#039;,type:&#039;url&#039;},
            {name:&#039;img&#039;,type:&#039;url&#039;},
        ],
        autoLoad:true           //描写後に自動的に初回のリクエストをかける
    });

    //3.SelModelの設定
    //今回は一度に一つの行しか選択できないようにしている。
    var sm = new Ext.grid.RowSelectionModel({
        singleSelect:true
    });

    //4.カラムモデルを用意
    var column = new Ext.grid.ColumnModel([
        {
            id:&#039;rank&#039;,
            header:&#039;順位&#039;,
            dataIndex:&#039;rank&#039;,
            width:50
        },
        {
            id:&#039;name&#039;,
            header:&#039;ブラウザ名&#039;,
            dataIndex:&#039;name&#039;,
            width:100
        },
        {
            id:&#039;percentage&#039;,
            header:&#039;シェア&#039;,
            dataIndex:&#039;percentage&#039;,
            width:80
        },
        {
            id:&#039;id&#039;,
            header:&#039;ID&#039;,
            dataIndex:&#039;id&#039;,
            width:20
        }
    ]);

    //5.グリッドパネルの作成
    var grid = new Ext.grid.GridPanel({
        renderTo:&#039;grid&#039;,
        id:&#039;my-grid&#039;,
        autoExpandColumn:&#039;name&#039;,
        title:&#039;SingleSelectのグリッドパネル&#039;,
        height:210,
        width:400,
        cm:column,
        sm:sm,
        store:store,
        tbar:[
            {
                text:&#039;選択中のブラウザ情報&#039;,
                iconCls:&#039;tick&#039;,
                handler:function(btn){
                    var record = grid.selModel.getSelected();
                    var msg;
                    if (!record) {
                        msg = &#039;ブラウザが選択されていません&#039;;
                    }else{
                        msg = new Ext.XTemplate(
                            &#039;&lt;div style=&quot;width:200px; text-align:center;&quot;&gt;&#039;,
                            &#039;ブラウザ名：{name}&lt;br/&gt;&#039;,
                            &#039;順位：{rank}&lt;br/&gt;&#039;,
                            &#039;シェア：{percentage}%&lt;br /&gt;&#039;,
                            &#039;&lt;a href=&quot;{url}&quot; target=&quot;_blank&quot;&gt;DOWNLOAD&lt;/a&gt;&lt;br/&gt;&#039;,
                            &#039;&lt;img src=&quot;{img}&quot; /&gt;&#039;,
                            &#039;&lt;/div&gt;&#039;).apply(record.data);
                    }

                    Ext.Msg.alert(&#039;選択中のブラウザ&#039;,msg);
                }
            }
        ]
    });
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_524" class="wp-caption aligncenter" style="width: 545px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.16-11.43.06.png" title="セレクションモデル" rel="lightbox[520]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.16-11.43.06.png" alt="セレクションモデル" title="セレクションモデル" width="535" height="468" class="size-full wp-image-524" /></a><p class="wp-caption-text">セレクションモデル</p></div></p>
<p>今回はRowSelectionModelクラスを使っています。RowSelectionModelクラスのコンフィグオプションのsingleSelectをTrueに設定するだけで、グリッドの一行のみを選択するようになります。これをGridPanelのselModelコンフィグに設定します。コンフィグsmはselModelの省略形です。</p>
<p>次に選択した行のデータの取り出しです。選択した行の状態を把握しているのは対象のグリッドに設定されているセレクションモデルになります。選択行の情報の取出しにはまずセレクションモデルを取得します。またRowSelectionModelではgetSelected()メソッドで選択行のレコードが取得できるため以下のようになります。</p>
<pre class="brush: js; ">

var record = grid.selModel.getSelected();
</pre>
<p>これで選択行のレコードが取得できました。recordはストアにある全データの中の1組データのまとまりです。storeクラスのfieldsで設定したデータの1組を保持しています。今回は単純にデータを取り出すだけですので,record.dataと直接データを取得しています。<br />
詳しくはExt.data.Recordクラスを参照してください。recordについてはEditorGridのサンプルの際に詳しく説明します。</p>
<p>これで1行を選択することができ、選択された一行のデータの取得方法が分かりました。今回はこの選択行の取得をtbarに設置したボタンで起動します。</p>
<p>GridPanelのtbarにはボタンやフィールドなどが置かれます。前回のフィルタリングではテキストフィールドをせっちしました。ここではボタンを設置して選択行の情報をポップアップで開くようにします。<br />
tbarの基本的な設定は以下のようになります。iconClsはボタンにアイコンを設定します。iconClsはCSSのスタイルで指定します。今回はHTMLの中に記述しています。<br />
handlerに処理を記述します。ボタンが押された後にここでグリッドの情報を取得してアラートを表示します。</p>
<pre class="brush: js; ">

 tbar:[
	{
		text:&#039;ボタンの表示名&#039;,
		iconCls:&#039;tick&#039;,
		handler:function(btn){
			//ボタンの処理
		}
	}
]
</pre>
<p>グリッドパネルのセレクションモデルには様々な選択方式があります。色々と試してみるとよいかもしれません。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F04%2F16%2Fextjs-tutorial21-gridselmodel%2F&amp;linkname=ExJS%E5%85%A5%E9%96%8021%E3%80%80%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%83%BB%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%A2%E3%83%87%E3%83%AB"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ExtJS入門20　グリッドにフィルタリング機能を追加する</title>
		<link>http://extjs.blog.sus4.co.jp/2010/04/15/extjs-tutorial20-grid-filter/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/04/15/extjs-tutorial20-grid-filter/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 02:50:37 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[GridPanel]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[フィルタリング]]></category>
		<category><![CDATA[フィルター]]></category>
		<category><![CDATA[業務ウェブアプリケーションTips]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=513</guid>
		<description><![CDATA[引き続きGridPanel関連のサンプルの紹介です。
今回はグリッドに表示されている一覧から特定のデータをフィルタリングして表示する方法をご紹介します。]]></description>
			<content:encoded><![CDATA[<p>引き続きGridPanel関連のサンプルの紹介です。<br />
今回はグリッドに表示されている一覧から特定のデータをフィルタリングして表示する方法をご紹介します。</p>
<div id="attachment_515" class="wp-caption aligncenter" style="width: 243px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.15-11.44.10.png" title="フィルタリング" rel="lightbox[513]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.15-11.44.10.png" alt="フィルタリング" title="フィルタリング" width="233" height="107" class="size-full wp-image-515" /></a><p class="wp-caption-text">フィルタリング</p></div>
<p>グリッドのデータはストアによって管理されています。グリッドの一覧からフィルタリングして特定の情報だけを表示したい場合は、大きく二つの方法があります。<br />
一つはstoreクラスのfilterメソッドを使ってフィルタリングを行う方法。もう一つはstoreがロードしているデータをフィルタリングされたデータに更新する、つまりサーバーサイドでフィルタリングを行ってstoreを更新する方法があります。<br />
今回はこの2つの機能を同時に持ったグリッドパネルのサンプルになります。</p>
<p>グリッドパネルについてはこちらもご覧下さい。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/03/extjs-tutorial17-gridbasic/">ExtJSで楽しくRIA業務アプリ開発 ExJS入門17　グリッド・パネル　基本編</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/05/extjs-tutorial18-gridrenderer/">ExtJSで楽しくRIA業務アプリ開発 ExtJS入門18　グリッド　レンダラーを使ってデザインを変える</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/14/extjs-tutorial19-gridpaging/">ExtJS入門19　グリッドにページング機能を追加する</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.data.Storeクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.data.Store">http://extdocs.xenophy.com/?class=Ext.data.Store</a></p>
<p><span id="more-513"></span></p>
<p><strong>PHP:</strong></p>
<pre class="brush: php; ">

&lt;?php
    $limit = $_POST[&#039;limit&#039;];
    $start = $_POST[&#039;start&#039;];

    $name = $_POST[&#039;name&#039;];

    //全データ
    $data = array(
        array(
            &#039;id&#039;=&gt;1,
            &#039;rank&#039;=&gt;1,
            &#039;name&#039;=&gt;&#039;IE&#039;,
            &#039;percentage&#039;=&gt;62.69
        ),
        array(
            &#039;id&#039;=&gt;2,
            &#039;rank&#039;=&gt;2,
            &#039;name&#039;=&gt;&#039;Firefox&#039;,
            &#039;percentage&#039;=&gt;24.61
        ),
        array(
            &#039;id&#039;=&gt;3,
            &#039;rank&#039;=&gt;3,
            &#039;name&#039;=&gt;&#039;Chrome&#039;,
            &#039;percentage&#039;=&gt;4.63
        ),
        array(
            &#039;id&#039;=&gt;4,
            &#039;rank&#039;=&gt;4,
            &#039;name&#039;=&gt;&#039;Safari&#039;,
            &#039;percentage&#039;=&gt;4.46
        ),
        array(
            &#039;id&#039;=&gt;5,
            &#039;rank&#039;=&gt;5,
            &#039;name&#039;=&gt;&#039;Opera&#039;,
            &#039;percentage&#039;=&gt;2.40
        ),
        array(
            &#039;id&#039;=&gt;6,
            &#039;rank&#039;=&gt;6,
            &#039;name&#039;=&gt;&#039;Opera Mini&#039;,
            &#039;percentage&#039;=&gt;0.53
        )
    );

    if ($name) {
        $newData = array();
        foreach($data as $val){
            if(stristr($val[&#039;name&#039;],$name)) {
                $newData[] = $val;
            }
        }
        $data = $newData;
    }

    if ($limit &amp;&amp; $start + $limit &lt;= count($data)) {
        //ページング用
        $rows = array_slice($data,$start,$limit);
    }else {
        //ページングしない
        $rows = $data;
    }

    $res = array(
        &#039;success&#039; =&gt; true,
        &#039;total&#039; =&gt; 6,
        &#039;rows&#039; =&gt; $rows
    );

    header(&quot;Content-Type: text/javascript; charset=utf-8&quot;);
    echo json_encode($res);

    die();
</pre>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
    &lt;title&gt;ExtJS名古屋勉強会　Grid　Filter and Sort&lt;/title&gt;

    &lt;!--Ext JS CSS--&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;../js/ext/resources/css/ext-all.css&quot; type=&quot;text/css&quot; /&gt;
    &lt;!--Ext JS--&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;

    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/ext-all.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;grid-filter.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div style=&quot;width:500px;margin:0 auto;padding:15px;background-color:#D3E1F1;font-size:small;&quot;&gt;
        &lt;p style=&quot;font-weight:bold;padding:3px;margin-bottom:10px;&quot;&gt;
        Gridデータのフィルタリングを行います。
        &lt;/p&gt;
        フィルタリングにはローカルのstore内で行うものと、サーバーサイドで行いstoreをリロードする方法の2種類があります。
        &lt;div id=&quot;grid&quot;&gt;&lt;/div&gt;

        &lt;br/&gt;
        Java Script：&lt;a href=&quot;grid-filter.js&quot;&gt;grid-filter.js&lt;/a&gt;&lt;br/&gt;
        PHP(JSONデータ)：&lt;a href=&quot;data.php&quot;&gt;data.php&lt;/a&gt;&lt;br /&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>Java Script:</strong></p>
<pre class="brush: js; ">

//フィルターグリッド
Ext.onReady(function()
{
    //1.データを用意
    //今回はPHPでdata.phpでJSONを返しています。

    //2.データストアを用意
    var store = new Ext.data.JsonStore({
        url:&#039;data.php&#039;,
        root:&#039;rows&#039;,            //実際のデータ位置（プロパティ名）
        totalProperty:&#039;total&#039;,  //全件数を返すプロパティ名を指定
        fields:[
            {name:&#039;id&#039;},
            {name:&#039;rank&#039;},
            {name:&#039;name&#039;},
            {name:&#039;percentage&#039;,type:&#039;float&#039;}
        ],
        autoLoad:true           //描写後に自動的に初回のリクエストをかける
    });

    //3.カラムモデルを用意
    var column = new Ext.grid.ColumnModel([
        {
            id:&#039;rank&#039;,
            header:&#039;順位&#039;,
            dataIndex:&#039;rank&#039;,
            width:50
        },
        {
            id:&#039;name&#039;,
            header:&#039;ブラウザ名&#039;,
            dataIndex:&#039;name&#039;,
            width:100
        },
        {
            id:&#039;percentage&#039;,
            header:&#039;シェア&#039;,
            dataIndex:&#039;percentage&#039;,
            width:80
        },
        {
            id:&#039;id&#039;,
            header:&#039;ID&#039;,
            dataIndex:&#039;id&#039;,
            width:20
        }
    ]);

    //4.フィルター用
    var tbar = [
        &#039;ローカル:&#039;,
        {
            xtype:&#039;textfield&#039;,
            emptyText:&#039;ブラウザ名を入力&#039;,
            listeners:{
                valid:function(field){
                    var cond = field.getValue();
                    store.filter(&#039;name&#039;,cond,true);
                }
            }
        },
        &#039;リモート:&#039;,
        {
            xtype:&#039;textfield&#039;,
            emptyText:&#039;ブラウザ名を入力&#039;,
            listeners:{
                valid:function(field){
                    var cond = field.getValue();
                    store.load({
                        params:{
                            name:cond
                        }
                    });
                }
            }
        }
    ];
    //5.グリッドパネルの作成
    new Ext.grid.GridPanel({
        renderTo:&#039;grid&#039;,
        id:&#039;my-grid&#039;,
        autoExpandColumn:&#039;name&#039;,
        title:&#039;フィルター付きグリッドパネル&#039;,
        height:210,
        width:400,
        cm:column,
        store:store,
        tbar:tbar
    });
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_514" class="wp-caption aligncenter" style="width: 558px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.15-11.43.46.png" title="Filter機能" rel="lightbox[513]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.15-11.43.46.png" alt="Filter機能" title="Filter機能" width="548" height="357" class="size-full wp-image-514" /></a><p class="wp-caption-text">Filter機能</p></div></p>
<p>リモートフィルタリング：<br />
サーバーサイドのPHPは前回のものから若干変更があります。サーバーサイドでのフィルターを実行するために、元データを変更する処理が追加されています。</p>
<p>リモート（サーバーサイド）でのフィルタリングは、storeの内容を入れ替えて行います。<br />
storeのloadメソッドを使ってstoreの内容をリロードします。loadメソッドの引数にはオブジェクトを渡します。この引数オブジェクトのparamsプロパティに設定されたオブジェクトがstoreの内容を再リクエストする際にPOST値として設定されます。<br />
今回の場合はブラウザ名でフィルタリングを行うため、paramsに設定するオブジェクトのnameプロパティに条件を設定しています。</p>
<pre class="brush: js; ">

store.load({
	//pramsプロパティに設定したオブジェクトがリクエスト時にPOST値に設定される
	params:{
		name:&#039;条件&#039;
	}
});
</pre>
<p>このリクエストに基づきサーバーサイドでフィルタリングを行い、結果を返すことでストアの内容はフィルタリングされたデータに切り替わります。<br />
注意点としては、storeにはフィルタリング後のデータしかストアされていない点です。後述するローカルのフィルタリングと違い、フィルター条件が変更されるたびにstoreを更新するためのリクエストが必要になります。、</p>
<p>ローカルフィルタリング：<br />
ローカルでのフィルタリングはグリッドのstoreにストア済みのデータの中からグリッドに表示する項目をフィルタリングする方法です。storeのfilterメソッドを使うことで、特定のデータのみをグリッドに表示させます。第1引数にnameを指定し,第2引数に条件を設定します。第3引数以降はオプションになり、マッチング条件を設定できます。詳しくはAPIリファレンスのfilterメソッドの項目をご覧下さい。<br />
今回はnameフィールドのブラウザ名が一部でもマッチする場合を設定してます。</p>
<pre class="brush: js; ">

	store.filter(
		&#039;name&#039;,	//対象のフィールド
		cond,	//検索条件。フォームより入力
		true	//先頭以外にもマッチさせる
	);
</pre>
<p>今回は紹介していませんが、より複雑な条件でフィルタリングを行う場合はfilterByメソッドを使います。filterByメソッドではカスタムのフィルタリング関数を記述してフィルタリングを実行できます。</p>
<p>storeのfilterメソッドが実行されると、条件にマッチしたrecordのみがGridに再設定されます。<br />
ローカルで行うフィルタリングでは、毎回リクエストを行わないため比較的すばやいフィルタリングが実行できます。ただし、あくまでstore内のデータだけに対してのフィルターになります。ページングなどを使っている場合に全件中からフィルタリングを行いたい場合はこの方法ではなく、リモートでフィルタリングを行う必要があります。</p>
<p>FireFoxのFirebugなどでリクエストの実行状況を見ながらサンプルを試すと、動作の状況がよくわかるかと思います。リモートの方は入力があるたびにリクエストが実行されていますが、ローカルのときはリクエストが実行されません。</p>
<p>またこのフィルタリング機能はstoreの機能ですので、グリッド以外にもstoreを使っている場所で様々な場所で使うことができるので、色々な場所で試してみるとよいかと思います。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F04%2F15%2Fextjs-tutorial20-grid-filter%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8020%E3%80%80%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%81%AB%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E6%A9%9F%E8%83%BD%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/04/15/extjs-tutorial20-grid-filter/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ExtJS入門　DomHelperの使い方3　位置指定の追加と削除</title>
		<link>http://extjs.blog.sus4.co.jp/2010/02/25/extjs-domhelper-insert-remove/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/02/25/extjs-domhelper-insert-remove/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 06:47:22 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[DomHelper]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[勉強会]]></category>
		<category><![CDATA[業務ウェブアプリケーションTips]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=385</guid>
		<description><![CDATA[DomHelperで要素を追加するの追加項目です。
DomHelperで要素の追加を行うときappendでは対象の要素の子の要素として要素を追加しましたが、insertBefore,insertAfterでは対象の要素の前後に要素を追加します。]]></description>
			<content:encoded><![CDATA[<p>DomHelperで要素を追加するの追加項目です。<br />
DomHelperで要素の追加を行うときappendでは対象の要素の子の要素として要素を追加しましたが、insertBefore,insertAfterでは対象の要素の前後に要素を追加します。<br />
今回はあえてパネルを使わずにやってみます。</p>
<p>DomHelperについてはこちらにサンプルがあります。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/01/14/extjs-tutorial13-domhelper1/">ExtJSで楽しくRIA業務アプリ開発 ExtJS入門13 Ext.DomHelperの使い方</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/01/14/extjs-tutorial14-domhelper2/">ExtJSで楽しくRIA業務アプリ開発 ExtJS入門14　DomHelperの使い方2</a></li>
</ul>
<p><span id="more-385"></span></p>
<p><strong>サンプルコード3 DomHelperを使った位置指定の追加とDomQueryを使った削除</strong></p>
<p><strong>・html</strong></p>
<pre class="brush: html; ">

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
    &lt;title&gt;ExtJS名古屋勉強会　DOMHelperの使い方 DOMの追加と削除&lt;/title&gt;

    &lt;!--Ext JS CSS--&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;../js/ext/resources/css/ext-all.css&quot; type=&quot;text/css&quot; /&gt;
    &lt;!--Ext JS--&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/ext-all.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;domhelper-sample4.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class=&quot;body&quot; style=&quot;padding:15px;&quot;&gt;
    &lt;h1&gt;位置を指定して追加する&lt;/h1&gt;
    &lt;div id=&quot;beforeBtn&quot; style=&quot;float:left;&quot;&gt;&lt;/div&gt;
    &lt;div id=&quot;afterBtn&quot; style=&quot;float:left;&quot;&gt;&lt;/div&gt;
    &lt;div id=&quot;bothBtn&quot; style=&quot;float:left;&quot;&gt;&lt;/div&gt;
    &lt;div id=&quot;removeBtn&quot; style=&quot;float:left;&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;clear:both;&quot;&gt;&lt;/div&gt;
    &lt;div id=&quot;insert-target&quot;&gt;
    &lt;hr/&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>・javascript</strong></p>
<pre class="brush: js; ">

Ext.onReady(function(){
    //初期値の設定
    var bcnt = 0;
    var acnt = 0;
    var bias = 3;
    var bchar = &#039;M&#039;;
    var achar = &quot;W&quot;;

    var before = function(target) {
        Ext.DomHelper.insertBefore(&#039;insert-target&#039;,{
            cls:&#039;add&#039;,
            html:String.leftPad(bchar,bcnt * bias,bchar)
        });
        bcnt++;
    };

    var after = function(target) {
        Ext.DomHelper.insertAfter(&#039;insert-target&#039;,{
            cls:&#039;add&#039;,
            html:String.leftPad(achar,acnt * bias,achar)
        });
        acnt++;
    };

    var remove = function(target) {
        //任意のDOMを見つけるにはDomQueryを使う。ここではCSSクラスがaddのもの全て。
        var elems = Ext.DomQuery.select(&#039;.add&#039;);
        Ext.each(elems,function(o,cnt,array){
            Ext.removeNode(o);
        });
        bcnt = acnt = 0;
    };

    //ボタンを作成
    new Ext.Button({
        renderTo:&#039;beforeBtn&#039;,
        text:&quot;追加(Before)&quot;,
        handler:before
    });

    new Ext.Button({
        renderTo:&#039;afterBtn&#039;,
        text:&quot;追加(After)&quot;,
        handler:after
    });

    new Ext.Button({
        renderTo:&#039;bothBtn&#039;,
        text:&quot;前後に追加&quot;,
        handler:function() {
            before();
            after();
        }
    });

    new Ext.Button({
        renderTo:&#039;removeBtn&#039;,
        text:&quot;追加したDOMを削除&quot;,
        handler:remove
    });
});
</pre>
<p><strong>・実行結果</strong><br />
<div id="attachment_479" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/02/SS-2010.02.25-14.42.41.png" title="DomHelper DOMの追加と削除" rel="lightbox[385]"><img src="http://extjs.blog.sus4.co.jp/files/2010/02/SS-2010.02.25-14.42.41-300x178.png" alt="DomHelper DOMの追加と削除" title="DomHelper DOMの追加と削除" width="300" height="178" class="size-medium wp-image-479" /></a><p class="wp-caption-text">DomHelper DOMの追加と削除</p></div></p>
<p>ボタンを4つ作って各ボタンに、直前に追加、直後に追加、両方に追加、削除を割り当てています。ボタンが押されると、罫線の前後の所定の位置に要素を追加します。<br />
またこのサンプルではDomQueryクラスを使って追加要素を探して、削除する処理も追加しています。DomHelperはDOMの生成や追加を行いますが、DomQueryはDOMツリーから任意の要素を探すことができます。今回はDomQueryの使い方について詳しく解説しませんが、追加した要素をCSSのクラスから探し出す処理を行っています。</p>
<p>グリッドパネルやツリーパネルの構築はブロックを組み立てるようなイメージですが、Ext.Panelは真っ白のキャンバスに絵を描いていく感覚に近いと気がします。パネルの中のDOMを自由に操れると、ExtJSの派手なUIの裏にある奥深いDOMの世界を体感できるようになります。ExtJSでDOMをいじって初めてExtJSをいじったことになると何処かで聞いたことがありますね。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F02%2F25%2Fextjs-domhelper-insert-remove%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%80%E3%80%80DomHelper%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B93%E3%80%80%E4%BD%8D%E7%BD%AE%E6%8C%87%E5%AE%9A%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%81%A8%E5%89%8A%E9%99%A4"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/02/25/extjs-domhelper-insert-remove/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS入門18　グリッド　レンダラーを使ってデザインを変える</title>
		<link>http://extjs.blog.sus4.co.jp/2010/02/05/extjs-tutorial18-gridrenderer/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/02/05/extjs-tutorial18-gridrenderer/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 03:14:32 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[勉強会]]></category>
		<category><![CDATA[業務ウェブアプリケーションTips]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=437</guid>
		<description><![CDATA[グリッドのデザインを変更するための機能として、レンダラー機能があります。
レンダラーを使うと、グリッドに設定する値を調整したり、デザインを変更することができます。]]></description>
			<content:encoded><![CDATA[<p>グリッドのデザインを変更するための機能として、レンダラー機能があります。<br />
レンダラーを使うと、グリッドに設定する値を調整したり、デザインを変更することができます。</p>
<p>レンダラーはカラムごとに設定します。そのためカラムモデルで各カラム設定に追加します。</p>
<p>前回のグリッドのサンプルを使って、レンダラーを使ってデザインを変更してみます。<br />
<span id="more-437"></span><br />
<strong>レンダラーを使ったサンプル</strong></p>
<p><strong>・HTML</strong></p>
<pre class="brush: html; ">

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
    &lt;title&gt;ExtJS名古屋勉強会　Gridの使い方　レンダラー編&lt;/title&gt;

    &lt;!--Ext JS CSS--&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;../js/ext/resources/css/ext-all.css&quot; type=&quot;text/css&quot; /&gt;
    &lt;!--Ext JS--&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/ext-all.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;grid-basic2.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>・JS</strong></p>
<pre class="brush: js; ">

Ext.onReady(function(){

    var data = [
        {
            id:1,
            rank:1,
            name:&#039;IE&#039;,
            percentage:62.69
        },
        {
            id:2,
            rank:2,
            name:&#039;Firefox&#039;,
            percentage:24.61
        },
        {
            id:3,
            rank:3,
            name:&#039;Chrome&#039;,
            percentage:4.63
        },
        {
            id:4,
            rank:4,
            name:&#039;Safari&#039;,
            percentage:4.46
        },
        {
            id:5,
            rank:5,
            name:&#039;Opera&#039;,
            percentage:2.40
        },
        {
            id:6,
            rank:6,
            name:&#039;Opera Mini&#039;,
            percentage:0.53
        }
    ];

    var store = new Ext.data.JsonStore({
        data:data,
        fields:[
            {name:&#039;id&#039;},
            {name:&#039;rank&#039;},
            {name:&#039;name&#039;},
            {name:&#039;percentage&#039;,type:&#039;float&#039;}
        ]
    });

	//レンダラーを作成する

	//ブラウザ名用レンダラー
	var browserRenderer = function(val) {
		var newVal;
		switch (val) {

		case &#039;IE&#039;:
			newVal = &#039;&lt;span style=&quot;color:blue;&quot;&gt;IE&lt;/span&gt;&#039;;
			break;

		case &#039;Chrome&#039;:
			newVal = String.format(&#039;{0}{1}{2}{3}{4}{5}&#039;,
					&#039;&lt;span style=&quot;color:blue;&quot;&gt;C&lt;/span&gt;&#039;,
					&#039;&lt;span style=&quot;color:red&quot;&gt;h&lt;/span&gt;&#039;,
					&#039;&lt;span style=&quot;color:yellow&quot;&gt;r&lt;/span&gt;&#039;,
					&#039;&lt;span style=&quot;color:blue&quot;&gt;o&lt;/span&gt;&#039;,
					&#039;&lt;span style=&quot;color:green&quot;&gt;m&lt;/span&gt;&#039;,
					&#039;&lt;span style=&quot;color:red&quot;&gt;e&lt;/span&gt;&#039;
			);
			break;

		case &#039;Firefox&#039;:
			newVal = &#039;&lt;span style=&quot;color:orange;&quot;&gt;Firefox&lt;/span&gt;&#039;;
			break;

		case &#039;Safari&#039;:
			newVal = &#039;&lt;span style=&quot;color:#AAA;&quot;&gt;Safari&lt;/span&gt;&#039;;
			break;

		case &#039;Opera&#039;:
			newVal = &#039;&lt;span style=&quot;color:red;&quot;&gt;Opera&lt;/span&gt;&#039;;
			break;

		default:
			newVal = val;
			break;
		}

		return newVal;
	};

	//ランキング用レンダラー
	var rankRenderer = function(val){
		var size = (8 - val) * 10;
		return String.format(&#039;&lt;span style=&quot;font-size:{0}px&quot;&gt;{1}&lt;/span&gt;&#039;,size,val);
	};

	//カラムモデル
    var column = new Ext.grid.ColumnModel([
        {
            header:&#039;順位&#039;,
            sortable:true,
            dataIndex:&#039;rank&#039;,
            width:90,
			renderer:rankRenderer
        },
        {
            header:&#039;ブラウザ名&#039;,
            sortable:true,
            dataIndex:&#039;name&#039;,
            width:100,
			renderer:browserRenderer
        },
        {
            header:&#039;シェア&#039;,
            sortable:true,
            dataIndex:&#039;percentage&#039;,
            width:80
        },
        {
            header:&#039;ID&#039;,
            sortable:true,
            dataIndex:&#039;id&#039;,
			hidden:true
        }
    ]);

    new Ext.grid.GridPanel({
        renderTo:Ext.getBody(),
        id:&#039;my-grid&#039;,
        title:&#039;2009年12月のブラウザシェア&#039;,
        height:420,
        width:280,
        cm:column,
        store:store
    });
});
</pre>
<p><strong>・実行結果</strong><br />
<div id="attachment_438" class="wp-caption aligncenter" style="width: 210px"><a href="http://extjs.blog.sus4.co.jp/files/2010/02/picture-5.png" title="レンダラー付きグリッド" rel="lightbox[437]"><img src="http://extjs.blog.sus4.co.jp/files/2010/02/picture-5-200x300.png" alt="レンダラー付きグリッド" title="レンダラー付きグリッド" width="200" height="300" class="size-medium wp-image-438" /></a><p class="wp-caption-text">レンダラー付きグリッド</p></div></p>
<p>APIリファレンスではExt.grid.ColumnModelのsetRendererとExt.grid.Columnクラスのrendererの部分に詳しく載っています。</p>
<p>Ext 3.0 &#8211; API Documentation 日本語版 &#8211; Ext.grid.ColumnModel<br />
<a href="http://extdocs.xenophy.com/?class=Ext.grid.ColumnModel">http://extdocs.xenophy.com/?class=Ext.grid.ColumnModel</a></p>
<p>Ext 3.0 &#8211; API Documentation 日本語版 &#8211; Ext.grid.Column<br />
<a href="http://extdocs.xenophy.com/?class=Ext.grid.Column">http://extdocs.xenophy.com/?class=Ext.grid.Column</a></p>
<p>レンダラーは関数として作ります。引数として渡されるのは以下のものがあります。</p>
<blockquote>
<ul>
<li>value : Object　セルのデータ値。</li>
<li>metadata : Object　セルのtd要素に追加するCSSクラス名等を含むオブジェクト</li>
<li>record : Ext.data.record　データが引き出されたExt.data.Record。</li>
<li>rowIndex : Number　列のインデックス</li>
<li>colIndex : Number　カラムのインデックス</li>
<li>store : Ext.data.Store　レコードが引き出された Ext.data.Storeオブジェクト。</li>
</ul>
<p>Ext 3.0 &#8211; API Documentation 日本語版 &#8211; Ext.grid.ColumnModel
</p></blockquote>
<p>単純にグリッドに設定される値だけを使うのであれあば、第一引数に渡される値を使うだけです。</p>
<p>返り値にはHTML返すこともできるので、今回はspanを追加して文字色と文字サイズを変更しています。</p>
<p>レンダラーを使うことで、グリッドのデザインをある程度自由に変更できます。rendererに渡される引数をもとに様々な値を返して、グリッドのデザインを変更することでエクセルっぽくないグリッドを作れたりします。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F02%2F05%2Fextjs-tutorial18-gridrenderer%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8018%E3%80%80%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%80%80%E3%83%AC%E3%83%B3%E3%83%80%E3%83%A9%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/02/05/extjs-tutorial18-gridrenderer/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
