<?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; grid</title>
	<atom:link href="http://extjs.blog.sus4.co.jp/tag/grid/feed/" rel="self" type="application/rss+xml" />
	<link>http://extjs.blog.sus4.co.jp</link>
	<description>株式会社sus4 開発チーム</description>
	<lastBuildDate>Wed, 01 Jun 2011 09:32:58 +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入門31 GridViewでグリッドの各行の背景色を変更する</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/10/extjs-tutorial31-grid-twitterrowview/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/10/extjs-tutorial31-grid-twitterrowview/#comments</comments>
		<pubDate>Mon, 10 May 2010 03:04:36 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ext.grid.GridPanel]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[getRowClass]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[GridPanel]]></category>
		<category><![CDATA[GridView]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JSONP]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[viewConfig]]></category>
		<category><![CDATA[グリッドビュー]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[背景色]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=611</guid>
		<description><![CDATA[もうグリッドはもうほんとにネタ切れですね、前回のTwitter APIを少し修正して最新一時間以内のtweetが分かるように背景色を変えてみたいと思います。グリッドの見た目はGridViewで変更します。GridViewはGridPanelクラスのviewConfigで設定できるということも以前のサンプルで紹介したので、今回はささっとサンプルを紹介します。]]></description>
			<content:encoded><![CDATA[<p>もうグリッドはもうほんとにネタ切れですね、前回のTwitter APIを少し修正して最新一時間以内のtweetが分かるように背景色を変えてみたいと思います。グリッドの見た目はGridViewで変更します。GridViewはGridPanelクラスのviewConfigで設定できるということも以前のサンプルで紹介したので、今回はささっとサンプルを紹介します。<br />
<div id="attachment_612" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-10_11-28-21.png" title="一時間以内のtweetだけ背景色を緑に" rel="lightbox[611]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-10_11-28-21-150x150.png" alt="一時間以内のtweetだけ背景色を緑に" title="一時間以内のtweetだけ背景色を緑に" width="150" height="150" class="size-thumbnail wp-image-612" /></a><p class="wp-caption-text">一時間以内のtweetだけ背景色を緑に</p></div><br />
ほぼ前回のサンプルコードをそのまま使用するので、前回のチュートリアルがお済でない方はこちらからどうぞ<br />
<a href="http://extjs.blog.sus4.co.jp/2010/05/07/exjs-tutorial30-gridtwitter/">ExJS入門30　Twitter Search 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>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/07/exjs-tutorial30-gridtwitter/">ExJS入門30　Twitter Search APIを使ったグリッドパネル</a></li>
</ul>
<p>リファレンスはこちらから<br />
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-611"></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 + GridView&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-rowclass.js&quot;&gt;&lt;/script&gt;
    &lt;style TYPE=&quot;text/css&quot;&gt;
    &lt;!--
        .search {background-image: url(../img/icon/magnifier.png) !important;}
        .recent-update {
            background-color:#EFFFEF;
        }
    --&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を利用したグリッドその2　（1時間以内の更新には背景を緑に、30秒毎に自動更新）
        &lt;/p&gt;

        &lt;div id=&quot;grid&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;grid-rowclass.js&quot;&gt;grid-rowclass.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);
        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.get(&#039;from_user&#039;),
            value,
            Date.parseDate(data.get(&#039;created_at&#039;),&#039;D, d M Y G:i:s O&#039;).format(&#039;H時m分s秒 n月j日&#039;)
        );
    };

    //閾値
    var gateTime = new Date().add(Date.HOUR, -1);

    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
                        }
                    });
                }
            }
        ],
		//GridViewの設定
        viewConfig:{
            getRowClass:function(record,rIndex,rParams,store){
                var postTime = Date.parseDate(record.get(&#039;created_at&#039;),&#039;D, d M Y G:i:s O&#039;);
                if (postTime &gt; gateTime) {
                    return &#039;recent-update&#039;;
                }
            }
        }
    });

    //自動アップデート
    var task = {
        run:function(){
            store.reload();
            //閾値の更新
            gateTime = new Date().add(Date.HOUR, -1);
        },
        interval:1000 * 30 //msec * sec
    };

    Ext.TaskMgr.start(task);
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_610" class="wp-caption aligncenter" style="width: 235px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-10_11-28-01.png" title="GridViewで行の背景色を変更する" rel="lightbox[611]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-10_11-28-01-225x300.png" alt="GridViewで行の背景色を変更する" title="GridViewで行の背景色を変更する" width="225" height="300" class="size-medium wp-image-610" /></a><p class="wp-caption-text">GridViewで行の背景色を変更する</p></div></p>
<p>APIからストアへの取得は前回のサンプルコードを参考にしてください。<br />
前回との違いはGridViewのgetRowClassメソッドをオーバーライドして、行ごとのクラスを設定するところです。<br />
GridViewクラスはGridPanelの見た目とUIを決定しています。GridViewを記述していないGridPanelであっても作成時にGridView自動的に生成されています。<br />
以前のサンプルでemptyTextを使用する例を簡単に紹介しました。GridViewクラスではさらにいくつかのグリッドの見た目設定を調整できます。<br />
今回のサンプルでは書くtweetのアップデート時の時刻から、最新一時間以内のものの背景色を変更します。各行に対してCSSのクラスを設定するにはGridViewクラスのgetRowClassメソッドをオーバーライドして、クラス名を返すことで、その行にカスタムのクラスを設定することができます。<br />
以下がサンプルコードで設定しているgetRowClassの部分です。</p>
<pre class="brush: js; ">

 //閾値
    var gateTime = new Date().add(Date.HOUR, -1);

	・・・

		viewConfig:{
            getRowClass:function(record,rIndex,rParams,store){
                var postTime = Date.parseDate(record.get(&#039;created_at&#039;),&#039;D, d M Y G:i:s O&#039;);
                if (postTime &gt; gateTime) {
                    return &#039;recent-update&#039;;
                }
            }
		}
</pre>
<p>gateTimeは一時間前の時刻を設定しています。<br />
Dateオブジェクトのaddメソッドを使うことで、日付の演算ができます。Date.HOUR -1で一時間前を設定しました。<br />
getRowClassメソッドは各行ごとに実行されるのでgateTimeは外で宣言しておくほうがよさそうです。<br />
postTimeはTwitter APIから取得される投稿時刻をパースしてDateオブジェクトを制しえしています。Date.parseDate()の第2引数に日付のフォーマットを指定しています。Twitter APIでは&#8217;D, d M Y G:i:s O&#8217;という日付のフォーマットでした。<br />
あとはgateTime以後の場合のみ&#8217;recent-update&#8217;という文字列を返り値にしています。これで一時間以内の行のCSSラスに&#8217;recent-update&#8217;が追加されます。</p>
<p>もう一つ前回からの変更点で、各tweetの日付を日本語のフォーマットにしています。これもparseDateを使っています。titleRendererを以下のように変更しています。Date.parseDate().format(&#8217;H時m分s秒 n月j日&#8217;)の部分です。</p>
<pre class="brush: js; ">

   var titleRenderer = function(value,meta,rec,rIndex,cIndex,store){
        var data = store.getAt(rIndex);
        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.get(&#039;from_user&#039;),
            value,
            Date.parseDate(data.get(&#039;created_at&#039;),&#039;D, d M Y G:i:s O&#039;).format(&#039;H時m分s秒 n月j日&#039;)
        );
    };
</pre>
<p>JSONPはYouTubeやTwitter以外の色々なサービスAPIでも供給されています。自分の良く使うサービスのAPIを調べてみてJSONPが利用できるならためしに使ってみると良いかもしれません。</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%2F10%2Fextjs-tutorial31-grid-twitterrowview%2F&amp;linkname=ExJS%E5%85%A5%E9%96%8031%20GridView%E3%81%A7%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E5%90%84%E8%A1%8C%E3%81%AE%E8%83%8C%E6%99%AF%E8%89%B2%E3%82%92%E5%A4%89%E6%9B%B4%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/05/10/extjs-tutorial31-grid-twitterrowview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>ExJS入門28　チェックボックス付きグリッドパネル</title>
		<link>http://extjs.blog.sus4.co.jp/2010/04/30/extjs-tutorial28-checkboxgrid/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/04/30/extjs-tutorial28-checkboxgrid/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 03:41:45 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[checkbox]]></category>
		<category><![CDATA[Ext.grid]]></category>
		<category><![CDATA[Ext.grid.CheckboxSelectionModel]]></category>
		<category><![CDATA[Ext.grid.GridPanel]]></category>
		<category><![CDATA[Ext.grid.RowSelectionModel]]></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[Records]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[XTemplate]]></category>
		<category><![CDATA[グリッド]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[サンプルコード]]></category>
		<category><![CDATA[ストア]]></category>
		<category><![CDATA[チェックボックス]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[複数選択]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=586</guid>
		<description><![CDATA[そろそろグリッドに関してもネタがなくなってきましたが、今回はグリッドにチェックボックスを追加するサンプルを紹介します。今回は<a href="http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/">ExJS入門21　グリッド・セレクション・モデル</a>のサンプルコードを使って、チェックボックス付きグリッドに変更します。]]></description>
			<content:encoded><![CDATA[<p>そろそろグリッドに関してもネタがなくなってきましたが、今回はグリッドにチェックボックスを追加するサンプルを紹介します。今回は<a href="http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/">ExJS入門21　グリッド・セレクション・モデル</a>のサンプルコードを使って、チェックボックス付きグリッドに変更します。</p>
<div id="attachment_587" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/greenshot_2010-04-30_12-12-27.png" title="チェックボックスつきグリッドパネル" rel="lightbox[586]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/greenshot_2010-04-30_12-12-27-150x150.png" alt="チェックボックスつきグリッドパネル" title="チェックボックスつきグリッドパネル" width="150" height="150" class="size-thumbnail wp-image-587" /></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/">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/01/28/extjs-tutorial-summary3/">第5回ExtJS勉強会＠名古屋 2/25　パネル内のエレメントを作成する</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.grid.CheckboxSelectionModelクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.grid.CheckboxSelectionModel">http://extdocs.xenophy.com/?class=Ext.grid.CheckboxSelectionModel</a></p>
<p><span id="more-586"></span><br />
<strong>JSON:</strong></p>
<pre class="brush: js; ">

{
    success:true,
    total:6,
    rows:[

        {
            &#039;id&#039;:1,
            &#039;rank&#039;:1,
            &#039;name&#039;:&#039;IE&#039;,
            &#039;percentage&#039;:62.69,
            &#039;url&#039; : &#039;http://www.microsoft.com/japan/windows/products/winfamily/ie/default.mspx&#039;,
            &#039;img&#039; : &#039;../img/ie64.png&#039;
        },
        {
            &#039;id&#039;:2,
            &#039;rank&#039;:2,
            &#039;name&#039;:&#039;Firefox&#039;,
            &#039;percentage&#039;:24.61,
            &#039;url&#039; :&#039;http://mozilla.jp/firefox/&#039;,
            &#039;img&#039; : &#039;../img/firefox64.png&#039;
        },
        {
            &#039;id&#039;:3,
            &#039;rank&#039;:3,
            &#039;name&#039;:&#039;Chrome&#039;,
            &#039;percentage&#039;:4.63,
            &#039;url&#039; : &#039;http://www.google.com/chrome/&#039;,
            &#039;img&#039; : &#039;../img/chrome64.png&#039;
        },
        {
            &#039;id&#039;:4,
            &#039;rank&#039;:4,
            &#039;name&#039;:&#039;Safari&#039;,
            &#039;percentage&#039;:4.46,
            &#039;url&#039;: &#039;http://www.apple.com/jp/safari/&#039;,
            &#039;img&#039; : &#039;../img/safari64.png&#039;
        },
        {
            &#039;id&#039;:5,
            &#039;rank&#039;:5,
            &#039;name&#039;:&#039;Opera&#039;,
            &#039;percentage&#039;:2.40,
            &#039;url&#039; : &#039;http://jp.opera.com/&#039;,
            &#039;img&#039; : &#039;../img/opera64.png&#039;
        },
        {
            &#039;id&#039;:6,
            &#039;rank&#039;:6,
            &#039;name&#039;:&#039;Opera Mini&#039;,
            &#039;percentage&#039;:0.53,
            &#039;url&#039; : &#039;http://jp.opera.com/&#039;,
            &#039;img&#039; : &#039;../img/opera64.png&#039;
        }
    ]
}
</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名古屋勉強会　セレクションモデルその2&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-selection2.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-selection2.js&quot;&gt;grid-selection2.js&lt;/a&gt;&lt;br/&gt;
        JSONデータ：&lt;a href=&quot;data.json&quot;&gt;data.json&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.データを用意
    //今回はファイルでdata.jsonを読み込んでいます

    //2.データストアを用意
    var store = new Ext.data.JsonStore({
        url:&#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 checkSm = new Ext.grid.CheckboxSelectionModel({
        /* 一行しかチェックできなくする場合
        singleSelect:true,
        header:&#039;&#039;
        */
    });

    //4.カラムモデルを用意
    var checkCm = new Ext.grid.ColumnModel([
        checkSm,    //セレクションモデルをカラムに設置
        {
            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;チェックボックスのグリッドパネル&#039;,
        height:210,
        width:400,
        cm:checkCm,
        sm:checkSm,
        store:store,
        tbar:[
            {
                text:&#039;選択中のブラウザ情報&#039;,
                iconCls:&#039;tick&#039;,
                handler:function(btn){
                    var record = grid.selModel.getSelections();
                    var msg;
                    if (!record) {
                        msg = &#039;ブラウザが選択されていません&#039;;
                    }else{
                        msg = new Ext.XTemplate(
                            &#039;&lt;div style=&quot;width:400px;&quot;&gt;&#039;,
                            &#039;&lt;tpl for=&quot;.&quot;&gt;&#039;,
                            &#039;&lt;div style=&quot;width:200px; text-align:center;&#039;,
                            &#039;{[xindex % 2 === 1 ? &quot;float:left&quot; : &quot;float:right;&quot;]}&#039;,
                            &#039;&quot;&gt;&#039;,
                            &#039;ブラウザ名：{values.data.name}&lt;br/&gt;&#039;,
                            &#039;順位：{values.data.rank}&lt;br/&gt;&#039;,
                            &#039;シェア：{values.data.percentage}%&lt;br /&gt;&#039;,
                            &#039;&lt;a href=&quot;{values.data.url}&quot; target=&quot;_blank&quot;&gt;DOWNLOAD&lt;/a&gt;&lt;br/&gt;&#039;,
                            &#039;&lt;img src=&quot;{values.data.img}&quot; /&gt;&#039;,
                            &#039;{xcount}&#039;,
                            &#039;{xindex}&#039;,
                            &#039;&lt;/div&gt;&#039;,
                            &#039;&lt;/tpl&gt;&#039;,
                            &#039;&lt;tpl if=&quot;xindex % 2 === 1&quot;&gt;&#039;,
                            &#039;&lt;div style=&quot;clear:both;&quot;&gt;&lt;/div&gt;&#039;,
                            &#039;&lt;/tpl&gt;&#039;,
                            &#039;&lt;/div&gt;&#039;
                            ).apply(record);
                    }

                    Ext.Msg.alert(&#039;選択中のブラウザ&#039;,msg);
                }
            }
        ]
    });
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_587" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/greenshot_2010-04-30_12-12-27.png" title="チェックボックスつきグリッドパネル" rel="lightbox[586]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/greenshot_2010-04-30_12-12-27-300x177.png" alt="チェックボックスつきグリッドパネル" title="チェックボックスつきグリッドパネル" width="300" height="177" class="size-medium wp-image-587" /></a><p class="wp-caption-text">チェックボックスつきグリッドパネル</p></div><br />
<div id="attachment_588" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/greenshot_2010-04-30_12-12-56.png" title="複数選択時の挙動" rel="lightbox[586]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/greenshot_2010-04-30_12-12-56-300x264.png" alt="複数選択時の挙動" title="複数選択時の挙動" width="300" height="264" class="size-medium wp-image-588" /></a><p class="wp-caption-text">複数選択時の挙動</p></div></p>
<p>グリッドのセレクションモデルにExt.grid.CheckboxSelectionModelクラスを指定することで、簡単にグリッドをチェックボックス付きにできます。<br />
まずチェックボックスセレクションモデルを作成します。<br />
Ext.grid.CheckboxSelectionModelはExt.grid.RowSelectionModelのサブクラスです。<br />
Ext.grid.CheckboxSelectionModelのコンフィグにはいくつかのオプションがありますが、各行のチェックボックスをクリックして行を選択するだけであれば初期値のままで十分機能します。<br />
サンプルコードの中でコメントアウトしているように、singleSelectをtrueにすることでラジオボタンのように1つしかチェックできなくすることもできます。その場合カラムのヘッダーに表示される、全て選択のチェックボックスの動作が気持ち悪くなるのでheaderを表示しないようにしています。</p>
<p>次に作成したセレクションモデルをカラムモデルに設置します。今回はカラムの先頭に置いていますが、任意の位置に設定できます。<br />
以上で、チェックボックス機能を備えたグリッドが完成します。今回はシングルセレクトではなく複数のレコードが選択されています。そのためtbarの情報を表示ボタンで実行する処理を変更する必要があります。</p>
<p>現在選択しているレコードの取得はセレクションモデルから取得します。以前のグリッドではgrid.selModel.getSelected()で現在選択されているレコードオブジェクトを取得できました。複数選択されている場合にgetSelected()を実行すると、最後に選択されたレコードだけを取得します。複数選択時はgetSelected()ではなくgetSelections()として選択されているレコードを配列で取得します。このメソッドはExt.grid.RowSelectionModelで定義されているので、Ext.grid.CheckboxSelectionModelでもそのまま使えます。</p>
<p>今回のサンプルでは、取得したレコードの配列をXTemplateで展開して表示しています。XTemplateについて詳しくはこちら<a href="http://extjs.blog.sus4.co.jp/2010/01/28/extjs-tutorial-summary3/">第5回ExtJS勉強会＠名古屋 2/25　パネル内のエレメントを作成する</a></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%2F30%2Fextjs-tutorial28-checkboxgrid%2F&amp;linkname=ExJS%E5%85%A5%E9%96%8028%E3%80%80%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E4%BB%98%E3%81%8D%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/04/30/extjs-tutorial28-checkboxgrid/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ExJS入門27　もう一つのエディタブル・グリッド　ux.RowEditorプラグイン</title>
		<link>http://extjs.blog.sus4.co.jp/2010/04/28/extjs-tutorial27-roweditor/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/04/28/extjs-tutorial27-roweditor/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 01:39:15 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ext.form.TextField]]></category>
		<category><![CDATA[Ext.grid.ColumnModel]]></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[JsonStore]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[ux]]></category>
		<category><![CDATA[エディタブルグリッド]]></category>
		<category><![CDATA[エディター]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[勉強会]]></category>
		<category><![CDATA[編集可能グリッド]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=573</guid>
		<description><![CDATA[Ext.gri.EditorGridクラスは、グリッドを表計算ソフトのように編集できるグリッドです。今回はもう一つのエディターグリッドといえるRowEditorを使ったグリッドのサンプルを紹介します。
RowEditorはユーザーエクステンション(ux)です。
ユーザーエクステンションは世界中のExtJS開発者が作成して、ExtJSのフォーラムの等で自身のUXを公開しています。
ExtJS Forum http://www.extjs.com/forum
またUXの情報が集められているhttp://extjs-ux.org/もあります。ここにはUX版のAPIドキュメントをまとめたものもあります(全てのUXを網羅しているわけではありませんが)。
UXはExtJSの基本ライブラリ以外には含まれないので、使いたいUXを見つけた場合は開発者のページ等からJS,CSS,画像等のファイルを入手する必要があります。
今回のRowEditorはextjs-ux.orgには無いようです。ExtJSのサンプルのページのRowEditorのサンプルからダウンロードするか、
以下の作者のサイトからも入手できます。
Using the ExtJS Row Editor
グリッドパネル関連の過去の記事はこちらからです。

ExtJSで楽しくRIA業務アプリ開発 ExJS入門17　グリッド・パネル　基本編
ExtJSで楽しくRIA業務アプリ開発 ExtJS入門18　グリッド　レンダラーを使ってデザインを変える
ExtJS入門19　グリッドにページング機能を追加する
ExtJS入門20　グリッドにフィルタリング機能を追加する
ExJS入門21　グリッド・セレクション・モデル
ExJS入門22　グリッドのイベント処理（ダブルクリック、右クリック）
ExtJS入門23　グリッドへの項目の追加と削除
ExtJS入門24　エディタブル・グリッドの基本(グリッドパネルをエディタブル・グリッドに変更)
ExJS入門25　エディタブル・グリッド(Ext.Ajaxを使った編集内容の保存)
ExJS入門26　エディタブル・グリッド（色々なエディターを設定する)


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名古屋勉強会　Row Editor プラグイン&#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;

 [...]]]></description>
			<content:encoded><![CDATA[<p>Ext.gri.EditorGridクラスは、グリッドを表計算ソフトのように編集できるグリッドです。今回はもう一つのエディターグリッドといえるRowEditorを使ったグリッドのサンプルを紹介します。<br />
<div id="attachment_577" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/roweditor.png" title="ux Grid RowEditor" rel="lightbox[573]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/roweditor-150x150.png" alt="ux Grid RowEditor" title="ux Grid RowEditor" width="150" height="150" class="size-thumbnail wp-image-577" /></a><p class="wp-caption-text">ux Grid RowEditor</p></div></p>
<p>RowEditorはユーザーエクステンション(ux)です。<br />
ユーザーエクステンションは世界中のExtJS開発者が作成して、ExtJSのフォーラムの等で自身のUXを公開しています。<br />
<a target="_blank" href="http://www.extjs.com/forum/">ExtJS Forum http://www.extjs.com/forum</a><br />
<div id="attachment_579" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/greenshot_2010-04-28_10-31-04.png" title="Ext: User Extensions and Plugins" rel="lightbox[573]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/greenshot_2010-04-28_10-31-04-150x150.png" alt="Ext: User Extensions and Plugins" title="Ext: User Extensions and Plugins" width="150" height="150" class="size-thumbnail wp-image-579" /></a><p class="wp-caption-text">Ext: User Extensions and Plugins</p></div></p>
<p>またUXの情報が集められている<a target="_blank" href="http://extjs-ux.org/docs/index.html">http://extjs-ux.org/</a>もあります。ここにはUX版のAPIドキュメントをまとめたものもあります(全てのUXを網羅しているわけではありませんが)。<br />
UXはExtJSの基本ライブラリ以外には含まれないので、使いたいUXを見つけた場合は開発者のページ等からJS,CSS,画像等のファイルを入手する必要があります。<br />
今回のRowEditorはextjs-ux.orgには無いようです。ExtJSのサンプルのページのRowEditorのサンプルからダウンロードするか、<br />
以下の作者のサイトからも入手できます。<br />
<a target="_blank" href="http://edspencer.net/2009/09/using-the-extjs-row-editor.html">Using the ExtJS Row Editor</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>
</ul>
<p><span id="more-573"></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名古屋勉強会　Row Editor プラグイン&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;!--ux (rowedirtorを読み込む)--&gt;
    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../js/ux/RowEditor/RowEditor.css&quot; /&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ux/RowEditor/RowEditor.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;roweditorgrid.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;
        UX RowEditorを使ってグリッド項目の編集を行います。
        &lt;/p&gt;
        &lt;div id=&quot;grid&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;roweditorgrid.js&quot;&gt;roweditorgrid.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; ">

//Row Editor グリッド
Ext.onReady(function()
{
    var editor = new Ext.ux.grid.RowEditor({
        saveText:&#039;変更&#039;,
        cancelText:&#039;キャンセル&#039;
    });

    var grid = new Ext.grid.GridPanel({
        renderTo:&#039;grid&#039;,
        title:&#039;UX RowEditorをグリッドに設置&#039;,
        height:210,
        width:400,
        plugins:[editor],
        //カラムモデル
        cm:new Ext.grid.ColumnModel([
            {
                id:&#039;id&#039;,
                header:&#039;ID&#039;,
                width:30,
                dataIndex:&#039;id&#039;
            },
            {
                id:&#039;name&#039;,
                header:&#039;ブラウザ名&#039;,
                dataIndex:&#039;name&#039;,
                width:100,
                editor:new Ext.form.TextField({
                    allowBlank:false
                }),
                renderer:function(v){   //カラムのデータが空のとき表示
                    return v ? v : &#039;ダブルクリックで編集&#039;;
                }
            },
            {
                id:&#039;url&#039;,
                header:&#039;URL&#039;,
                dataIndex:&#039;url&#039;,
                width:100,
                editor:new Ext.form.TextField(),
                renderer:function(v){   //カラムのデータが空のとき表示
                    return v ? v : &#039;ダブルクリックで編集&#039;;
                }
            }
        ]),

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

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

        //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>&lt;strong&gt;実行結果:&lt;/strong&gt;<br />
<div id="attachment_576" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/greenshot_2010-04-28_10-27-28.png" title="RowEditor" rel="lightbox[573]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/greenshot_2010-04-28_10-27-28-300x171.png" alt="RowEditor" title="RowEditor" width="300" height="171" class="size-medium wp-image-576" /></a><p class="wp-caption-text">RowEditor</p></div></p>
<p>RowEditorの設置場所は任意でかまいませんが、今回はextとは分けてuxディレクトリを作って、さらにRowEditorディレクトリを作って設置しています。UXはJSだけでなくCSSファイルや画像も含むためです。まれに使用している画像名が同じ場合もあるため個々のUXごとにディレクトリと管理が楽になります。RowEditor.cssの画像の読み先が少し変でしたので、それにあわせて画像の設置位置が換えてあります。CSS自体を書き換えても良いと思います。</p>
<p>RowEditorはグリッドのプラグインとして設定します。グリッドへのプラグインの設置はGridのコンフィグのpluginsに配列で指定します。配列なのは複数のプラグインを登録できるようしているためです。<br />
[code lang=&quot;js&quot;]<br />
	var editor = new Ext.ux.grid.RowEditor({<br />
        saveText:'変更',<br />
        cancelText:'キャンセル'<br />
    });</p>
<p>    var grid = new Ext.grid.GridPanel({<br />
        renderTo:'grid',<br />
        title:'UX RowEditorをグリッドに設置',<br />
        height:210,<br />
        width:400,<br />
        plugins:[editor], </p>
<p>		・・・</p>
<p>	});<br />
[/code]</p>
<p>RowEditorのコンフィグオプションはAPIリファレンスが無いためソースから調査しないといけません。いかに大まかなコンフィグオプションをまとめておきます。<br />
実際使う場合に必要なのは設定は特に無いので空のままでもかまいません。サンプルではボタンが日本語化されないので、保存とキャンセルの文字を日本語に変更しています。</p>
<p>RowEditorが呼び出すエディターはエディタブル・グリッドと同様にカラムモデルで指定します。エディタを設定しないカラムは編集できません。<br />
allowBlank等の設定もも使用できます。RowEditorに必要な設定はこれくらいです。UXのファイル正しく設置できれば特に難しくないかもしれません。<br />
またux.RowEditorはExt-3.1だと少し崩れました。ExtJS 3.2ではきちんと動作しました。（昨日3.2.1も公開されていますね。アップデートのペースがかなり早くなっている気がします。）</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%2F28%2Fextjs-tutorial27-roweditor%2F&amp;linkname=ExJS%E5%85%A5%E9%96%8027%E3%80%80%E3%82%82%E3%81%86%E4%B8%80%E3%81%A4%E3%81%AE%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%80%80ux.RowEditor%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3"><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/28/extjs-tutorial27-roweditor/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ExJS入門26　エディタブル・グリッド（色々なエディターを設定する)</title>
		<link>http://extjs.blog.sus4.co.jp/2010/04/27/extjs-tutorial26-editorfield/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/04/27/extjs-tutorial26-editorfield/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 03:42:33 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ext.data.ArrayStore]]></category>
		<category><![CDATA[Ext.form.ComboBox]]></category>
		<category><![CDATA[Ext.form.DateField]]></category>
		<category><![CDATA[Ext.form.NumberField]]></category>
		<category><![CDATA[Ext.form.TextField]]></category>
		<category><![CDATA[Ext.grid.EditorGridPanel]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[エディタブル・グリッド]]></category>
		<category><![CDATA[コンボボックス]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[デートフィールド]]></category>
		<category><![CDATA[ナンバーフィールド]]></category>
		<category><![CDATA[レンダラー]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=570</guid>
		<description><![CDATA[エディタブルグリッドのサンプルその3になります。
今回は色々なグリッドを編集する際のエディタにテキストフィールド以外のエディタを指定します。このサンプルではTextField, DateField, NumberField.ComboBoxを使います。]]></description>
			<content:encoded><![CDATA[<p>エディタブルグリッドのサンプルその3になります。<br />
今回は色々なグリッドを編集する際のエディタにテキストフィールド以外のエディタを指定します。このサンプルではTextField, DateField, NumberField.ComboBoxを使います。</p>
<div id="attachment_569" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.27-12.03.23.png" title="ComboBoxをエディターに設定" rel="lightbox[570]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.27-12.03.23-150x150.png" alt="ComboBoxをエディターに設定" title="ComboBoxをエディターに設定" width="150" height="150" class="size-thumbnail wp-image-569" /></a><p class="wp-caption-text">ComboBoxをエディターに設定</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/">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>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.grid.ColumnModelクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.grid.ColumnModel">http://extdocs.xenophy.com/?class=Ext.grid.ColumnModel</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.ComboBoxクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.ComboBox">http://extdocs.xenophy.com/?class=Ext.form.ComboBox</a></p>
<p><span id="more-570"></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-field.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-field.js&quot;&gt;editorgrid-field.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 emptyRenderer = function(v) {
        return v ? v : &#039;ダブルクリックして編集&#039;;
    };

    //日付用レンダラー
    var dateRenderer = function(v){
        if (Ext.isDate(v)){
            return v.format(&#039;Y/m/d&#039;);
        }else{
            return &#039;日付なし&#039;;
        }
    }

    //コンボボックス用のレンダラー
    var comboRenderer = function(combo){
        //カラムモデルへのレンダラーを返す。
        return function(value){
            //カラムに渡された値から、DisplayFieldを遡る。
            var record = combo.findRecord(combo.valueField,value);
            return record ? String.format(&#039;{0}({1})&#039;,record.get(&#039;name&#039;),record.get(&#039;furi&#039;)) : combo.valueNotFoundText;
        }
    }; 

    //コンボボックス
    var combo = new Ext.form.ComboBox({
        emptyText:&#039;日付を入力してください。&#039;,
        store:new Ext.data.ArrayStore({
            data:[
                [&#039;Javascript&#039;,&#039;js&#039;,&#039;ジャバスクリプト&#039;],
                [&#039;PHP&#039;,&#039;php&#039;,&#039;ピーエイチピー&#039;],
                [&#039;Python&#039;,&#039;py&#039;,&#039;パイソン&#039;],
                [&#039;Ruby&#039;,&#039;rb&#039;,&#039;ルビー&#039;],
                [&#039;Perl&#039;,&#039;pl&#039;,&#039;パール&#039;]
            ],
            fields:[&#039;name&#039;,&#039;extname&#039;,&#039;furi&#039;]
        }),
        mode:&#039;local&#039;,
        editable:false,
        triggerAction:&#039;all&#039;,
        displayField:&#039;name&#039;,
        valueField:&#039;extname&#039;,
        valueNotFoundText:&#039;値なし&#039;
    });

    var grid = new Ext.grid.EditorGridPanel({
        renderTo:&#039;grid&#039;,
        title:&#039;エディタブル・グリッド 色々なエディタ&#039;,
        height:210,
        width:500,

        //カラムモデル コンフィグをオブジェクトで渡している
        cm:new Ext.grid.ColumnModel({
            //デフォルトのカラム設定
            defaults:{
                editor:{
                    xtype:&#039;textfield&#039;,
                    emptyText:&#039;入力してください&#039;
                },
                 renderer:emptyRenderer
            },
            columns:[
                {
                    id:&#039;title&#039;,
                    header:&#039;テキスト&#039;,
                    dataIndex:&#039;title&#039;,
                    width:120
                },
                {
                    id:&#039;date&#039;,
                    header:&#039;日付&#039;,
                    dataIndex:&#039;date&#039;,
                    width:80,
                    editor:{    //xtypeでDateFieldを指定
                        xtype:&#039;datefield&#039;,
                        emptyText:&#039;日付を入力してください。&#039;,
                        format:&#039;Y/m/d&#039;
                    },
                    renderer:dateRenderer
                },
                {
                    id:&#039;type&#039;,
                    header:&#039;コンボボックス&#039;,
                    dataIndex:&#039;type&#039;,
                    width:130,
                    editor:combo,
                    renderer:comboRenderer(combo)
                },
                {
                    id:&#039;value&#039;,
                    header:&#039;ナンバー&#039;,
                    dataIndex:&#039;value&#039;,
                    width:100,
                    editor:new Ext.form.NumberField({
                        allowDecimals:false,
                        allowNegative:false
                    })
                }

            ]
        }),

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

        //ストア
        store:new Ext.data.JsonStore({
            fields:[&#039;title&#039;,&#039;date&#039;,&#039;type&#039;,&#039;value&#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_568" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.27-12.03.12.png" title="DateFieldをエディターに設定" rel="lightbox[570]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.27-12.03.12-300x184.png" alt="DateFieldをエディターに設定" title="DateFieldをエディターに設定" width="300" height="184" class="size-medium wp-image-568" /></a><p class="wp-caption-text">DateFieldをエディターに設定</p></div><br />
<div id="attachment_569" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.27-12.03.23.png" title="ComboBoxをエディターに設定" rel="lightbox[570]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.27-12.03.23-300x174.png" alt="ComboBoxをエディターに設定" title="ComboBoxをエディターに設定" width="300" height="174" class="size-medium wp-image-569" /></a><p class="wp-caption-text">ComboBoxをエディターに設定</p></div></p>
<p>エディタのグリッドはカラムモデル(Ext.grid.ColumnModel)クラスで設定します。前回までは絡むモデルの呼び出しの際の引数に配列でカラムの構造を指定してました。今回はオブジェクトで指定しています。オブジェクト指定することでカラムモデルクラスのコンフィグオプションを設定できます。カラムの構造はcolumnsコンフィグに指定します。またdefaultsはデフォルトのカラムの型を設定できます。今回はエディタとレンダラーを設定しています。そのためeditor,rendererを設定していない一つ目のtitleカラムにデフォルトからエディターとレンダラーが設定されることになります。</p>
<pre class="brush: js; ">

new Ext.grid.ColumnModel({
	//デフォルトのカラム設定
	defaults:{
		editor:{
			xtype:&#039;textfield&#039;,
			emptyText:&#039;入力してください&#039;
		},
		 renderer:emptyRenderer
	},
	columns:[
		{
			id:&#039;title&#039;,
			header:&#039;テキスト&#039;,
			dataIndex:&#039;title&#039;,
			width:120
		},

		・・・省略・・・

		{
			id:&#039;value&#039;,
			header:&#039;ナンバー&#039;,
			dataIndex:&#039;value&#039;,
			width:100,
			editor:new Ext.form.NumberField({
				allowDecimals:false,
				allowNegative:false
			})
		}

	]
})
</pre>
<p>エディタの設定は各カラムのeditor設定で指定します。</p>
<pre class="brush: js; ">

new Ext.grid.ColumnModel({
columns:[
		{
			id:&#039;title&#039;,
			header:&#039;テキスト&#039;,
			dataIndex:&#039;title&#039;,
			width:120
		},
		{
			id:&#039;date&#039;,
			header:&#039;日付&#039;,
			dataIndex:&#039;date&#039;,
			width:80,
			editor:{    //xtypeでDateFieldを指定
				xtype:&#039;datefield&#039;,
				emptyText:&#039;日付を入力してください。&#039;,
				format:&#039;Y/m/d&#039;
			},
			renderer:dateRenderer
		},
		{
			id:&#039;type&#039;,
			header:&#039;コンボボックス&#039;,
			dataIndex:&#039;type&#039;,
			width:130,
			editor:combo,
			renderer:comboRenderer(combo)
		},
		{
			id:&#039;value&#039;,
			header:&#039;ナンバー&#039;,
			dataIndex:&#039;value&#039;,
			width:100,
			editor:new Ext.form.NumberField({
				allowDecimals:false,
				allowNegative:false
			})
		}

	]
})
</pre>
<p>・日付エディター<br />
dateカラムはデートフィールド(Ext.form.DateField)が設定されています。ここではxtypeで指定しています。デートフィールドはデートピッカーが付いた日付に特化したフィールドです。formatでデートピッカーから選んだ日付の表示形式を設定します。グリッドに設定される値はDate型のため、レンダラーでカスタムの日付形式を設定できます。</p>
<pre class="brush: js; ">

//日付用レンダラー
var dateRenderer = function(v){
	if (Ext.isDate(v)){
		return v.format(&#039;Y/m/d&#039;);
	}else{
		return &#039;日付なし&#039;;
	}
}
</pre>
<p>・数値エディター<br />
valueカラムはナンバーフィールド(Ext.form.NumberField)が設定されています。Ext.from.NumberFieldはxtypeが設定されていないので、newしています。コンフィグにはallowDecimalsとallowNegativeをfalseにして自然数のみを入力させています。</p>
<p>・セレクトボックスエディター<br />
コンボボックスをエディタに設定します。一番手間がかかっています。その理由としてはコンボボックスのvalueFieldとdisplayFieldが同一でない場合にレンダラーで正しくdisplayFieldの値を表示させる処理です。コンボボックスで項目を選択するとvalueFieldで指定した値がグリッドの値として渡されます。そのためコンボボックスのdisplayFieldを設定された値(valueFieldの値)から遡って、取得する必要があります。またrendererで呼ばれる際の引数にエディタへの参照が含まれないため、上手くコンボボックスへアクセスしなければいけません。<br />
ここでは予めコンボボックスをcomboという変数に設定してレンダラーを作成しています。</p>
<pre class="brush: js; ">

    //コンボボックス用のレンダラー
    var comboRenderer = function(combo){
        //カラムモデルへのレンダラーを返す。
        return function(value){
            //カラムに渡された値から、DisplayFieldを遡る。
            var record = combo.findRecord(combo.valueField,value);
            return record ? String.format(&#039;{0}({1})&#039;,record.get(&#039;name&#039;),record.get(&#039;furi&#039;)) : combo.valueNotFoundText;
        }
    }; 

    //コンボボックス
    var combo = new Ext.form.ComboBox({
        emptyText:&#039;日付を入力してください。&#039;,
        store:new Ext.data.ArrayStore({
            data:[
                [&#039;Javascript&#039;,&#039;js&#039;,&#039;ジャバスクリプト&#039;],
                [&#039;PHP&#039;,&#039;php&#039;,&#039;ピーエイチピー&#039;],
                [&#039;Python&#039;,&#039;py&#039;,&#039;パイソン&#039;],
                [&#039;Ruby&#039;,&#039;rb&#039;,&#039;ルビー&#039;],
                [&#039;Perl&#039;,&#039;pl&#039;,&#039;パール&#039;]
            ],
            fields:[&#039;name&#039;,&#039;extname&#039;,&#039;furi&#039;]
        }),
        mode:&#039;local&#039;,
        editable:false,
        triggerAction:&#039;all&#039;,
        displayField:&#039;name&#039;,
        valueField:&#039;extname&#039;,
        valueNotFoundText:&#039;値なし&#039;
    });
</pre>
<p>レンダラーに設定する関数を出力する関数をcomboRendererで作成します。このcomboRederer関数ににコンボボックスの参照comboを引数として設定しています。そのため、出力された実際のレンダラーの関数はcomboへのアクセスが可能になります。<br />
このレンダラー出力関数をエディターにcombo指定されているカラムに設定することで、コンボボックスのストアの情報を全て使って表示を変更できます。</p>
<p>今回のcomboRenderer関数はエディタブルグリッドにコンボボックスが設定されていて、なおかつコンボボックスのvalueFieldとdiplayFieldに違う値が設定されている際に必要になります。意外と使える機会が多いので、今回のサンプルを覚えておくと良いかもしれません。</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%2F27%2Fextjs-tutorial26-editorfield%2F&amp;linkname=ExJS%E5%85%A5%E9%96%8026%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%EF%BC%88%E8%89%B2%E3%80%85%E3%81%AA%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%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/27/extjs-tutorial26-editorfield/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ExtJSで楽しくRIA業務アプリ開発 ExJS入門25　エディタブル・グリッド(Ext.Ajaxを使った編集内容の保存)</title>
		<link>http://extjs.blog.sus4.co.jp/2010/04/26/extjs-tutorial25-editorgridsave/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/04/26/extjs-tutorial25-editorgridsave/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 03:56:41 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Ext.Ajax]]></category>
		<category><![CDATA[Ext.Ajax.request]]></category>
		<category><![CDATA[Ext.grid.EditorGridPanel]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[LoadMask]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[エディタブル・グリッド]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[ローディングマスク]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=561</guid>
		<description><![CDATA[エディタブル・グリッドはグリッド上でストアの情報が編集できるグリッドです。前回のサンプルでは編集を行ったあとのストアの情報をどこにも保存していませんでした。今回はExt.Ajaxクラスを使って、編集後のストアのデータをサーバーへ送信するサンプルを紹介します。]]></description>
			<content:encoded><![CDATA[<p>エディタブル・グリッドはグリッド上でストアの情報が編集できるグリッドです。前回のサンプルでは編集を行ったあとのストアの情報をどこにも保存していませんでした。今回はExt.Ajaxクラスを使って、編集後のストアのデータをサーバーへ送信するサンプルを紹介します。<br />
<div id="attachment_562" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.48.31.png" title="Ajaxで保存" rel="lightbox[561]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.48.31-150x150.png" alt="Ajaxで保存" title="Ajaxで保存" width="150" height="150" class="size-thumbnail wp-image-562" /></a><p class="wp-caption-text">Ajaxで保存</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>
</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.Ajaxクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.Ajax">http://extdocs.xenophy.com/?class=Ext.Ajax</a></p>
<p><span id="more-561"></span><br />
<strong>PHP:</strong></p>
<pre class="brush: php; ">

&lt;?php
    $fail = array(
        &#039;success&#039; =&gt; false,
        &#039;errmsg&#039; =&gt; &#039;保存に失敗しました&#039;
    );
    header(&quot;Content-Type: text/javascript; charset=utf-8&quot;);

    $record = $_POST[&#039;records&#039;];
    if (!$record) {
       echo json_encode($fail);
       die();
    };

    //JSONから配列へ取り出し
    $data = json_decode($record);

    /**
     * DB等へ保存処理
     */

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

   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;editorgrid-save.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;}
        .save {background-image: url(../img/icon/disk.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;
        エディタブル・グリッドで変更した内容をPOSTします。
        &lt;/p&gt;

        &lt;div id=&quot;grid&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;editorgrid-save.js&quot;&gt;editorgrid-save.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 onSave = function(){
        //編集をとめる
        grid.stopEditing();

        var modifiedRecords = grid.getStore().getModifiedRecords();
        if (modifiedRecords.length &gt; 0) {

            //POSTするパラメータ
            var params = [];

            //編集があったレコードからJSONでデータを取り出す。
            Ext.each(modifiedRecords,function(record){
                params.push(record.data);
            });

            //JSONをエンコードする。
            params = Ext.encode(params);

            //Ajaxリクエスト処理

            //ローディングマスクを設置
            Ext.getBody().mask(&#039;保存中です。&#039;);

            //Ext.Ajaxクラスを使用してリクエスト
            Ext.Ajax.request({
                url:&#039;save.php&#039;,  //ポストするURL
                params:{
                    records:params
                },
                success:function(res,opt){      //成功時
                    var res = Ext.decode(res.responseText);
                    if (res.success){
                        //正しく保存できた場合
                        //変更をストアにセットする。（赤い三角が消える）
                        grid.getStore().commitChanges();
                        //grid.getStore().reload();
                    }else{
                        Ext.Msg.alert(&#039;エラー&#039;,&#039;保存に失敗しました。&#039;);
                    }
                    //ローディングマスクを外す
                    Ext.getBody().unmask();
                },
                failure:function(res,opt){      //接続エラーなど
                    Ext.Msg.alert(&#039;エラー&#039;,&#039;保存に失敗しました。&#039;);
                    //ローディングマスクを外す
                    Ext.getBody().unmask();
                }
            });
        }

    }

    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;],
            autoSave:false
        }),

        //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);
                    }
                }
            },&#039;-&gt;&#039;,
            {
                text:&#039;保存&#039;,
                iconCls:&#039;save&#039;,
                handler:function(){
                    onSave();
                }
            }
        ]
    });
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_562" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.48.31.png" title="Ajaxで保存" rel="lightbox[561]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.48.31-300x171.png" alt="Ajaxで保存" title="Ajaxで保存" width="300" height="171" class="size-medium wp-image-562" /></a><p class="wp-caption-text">Ajaxで保存</p></div></p>
<p>エディタブル・グリッドではストアの内容を保存するタイミングはいくつかのパターンがあります。一つは対象のレコードの編集が終わったあとに、すぐリクエストをかける方法。この方法では、特に保存ボタンをつけずに、EditorGridクラスのaftereditイベントの中で保存を実行します。またストアのwriterを設定して、変更を保存することもできます。</p>
<p>今回は明確に保存ボタンを作成して、グリッドの編集を終えて保存ボタンを押したときに、変更のあったレコードを送信するようにします。保存ボタンはtbarに設置して、ボタンが押されるとonSave()関数が実行されるようになっています。保存処理は全てこの関数の中で記述しています。</p>
<p>onSave()の大まかな処理の流れは、<br />
編集をやめる　→　変更のあったレコードの取り出し　→　レコードからJSONデータの取り出し　→　ローディングマスクの設置　→　AJAXリクエスト　→　リクエスト結果のハンドリング　→　ストアを更新　→　ローディングマスクの除去。<br />
となっています。</p>
<p>まず編集をとめます。tbarに保存ボタンがあるので、編集中でもボタンが押せてしまします。grid.storeEditing()で編集中のエディタを止めます。</p>
<pre class="brush: js; ">

        //編集をとめる
        grid.stopEditing();
</pre>
<p>次に編集されたデータの取出しです。これはストアのgetModifiedRecords()メソッドを使うと一発で取得できます。getModifiedRecords()はストアが最後にコミットされてから変更があったレコード記憶し配列で返します。ここで帰ってくるレコードはオブジェクトです。サーバーへはJSONで送信したいので全てのレコードからデータをJSONで取り出します。Ext.each()はphpのforeachのように第一引数に設定された配列を列挙して、第二引数に設定された関数を実行していきます。ここではparams配列に各レコードのJSONデータを取り出して追加しています。</p>
<pre class="brush: js; ">

	//ストアから保存する対象のレコードを全て取得
	var modifiedRecords = grid.getStore().getModifiedRecords();

	//POSTするパラメータを初期化
	var params = [];

	//編集があったレコードからJSONでデータを取り出す。
	Ext.each(modifiedRecords,function(record){
		params.push(record.data);
	});
</pre>
<p>次は取り出したJSONを文字列にエンコードします。これはJSONの配列をそのままポストでできないためです。またリクエスト中にローディングマスクを設置します。マスクの設定は簡単で対象のExtエレメントのmaskメソッドを呼ぶだけです。引数にマスクに表示したい文字列を設定します。</p>
<pre class="brush: js; ">

	//JSONをエンコードする。
	params = Ext.encode(params);

	//Ajaxリクエスト処理

	//ローディングマスクを設置
	Ext.getBody().mask(&#039;保存中です。&#039;);
</pre>
<p>さていよいよAjaxリクエストですが、ExtJSではAjaxリクエストの際にはExt.Ajaxクラスを使用します。Ext.Ajaxはシングルトンです。Ext.Ajax.request()としてリクエストを実行します。引数にリクエストの設定をオブジェクトで指定します。</p>
<p>Ext.Ajax.requestの引数<br />
	url:リクエスト先のURL<br />
	params:リクエストの際に送信するパラメータ<br />
	success:リクエスト成功時のコールバック関数<br />
    failure:リクエスト失敗時のコールバック関数</p>
<p>今回はsave.phpへ保存します。paramsには先ほど取り出してエンコードしたJSONデータを設定します。リクエストが成功した場合はsuccessに設定したコールバック関数が実行されます。failureは失敗したに呼ばれます。どちらも同じ引数(response:レスポンスデータを含むオブジェクト,option:リクエストしたパラメータ)を持って実行されます。</p>
<pre class="brush: js; ">

//Ext.Ajaxクラスを使用してリクエスト
Ext.Ajax.request({
	url:&#039;save.php&#039;,  //ポストするURL
	params:{
		records:params
	},
	success:function(res,opt){
		//成功時
	},
	failure:function(res,opt){
		//接続エラーなど
	}
});
</pre>
<p>save.phpはサーバーの処理の実行結果をJSON形式で返します。今回のサンプルでは保存が成功した場合は</p>
<pre class="brush: js; ">

{
	success:true,
	total:10,
	row:{/*変更した配列*/}
}
</pre>
<p>失敗した場合は</p>
<pre class="brush: js; ">

{
	success:false,
	errmsg:&#039;エラーメッセージ&#039;
}
</pre>
<p>がレスポンスとして返されます。<br />
successはサーバへの接続が成功した場合に呼ばれます。そのため何かのエラーで保存が失敗しレスポンスにfalseが返ってきた場合もsuccess側のコールバックが呼ばれます。本当に保存が成功しているかどうかはレスポンスの中のsuccessを見て判断します。<br />
successの第一引数はレスポンスデータを含むXMLHttpRequestオブジェクトです。この中のresponseTextに実際のレスポンスがあります。今回の場合このレスポンスは文字列にエンコードされたJSONです。そのためresponseTextを取り出してJSONにエンコードする必要があります。</p>
<pre class="brush: js; ">

	success:function(res,opt){      //成功時
		var res = Ext.decode(res.responseText);
		if (res.success){
			//正しく保存できた場合
			//変更をストアにセットする。（赤い三角が消える）
			grid.getStore().commitChanges();
			//grid.getStore().reload();
		}else{
			Ext.Msg.alert(&#039;エラー&#039;,&#039;保存に失敗しました。&#039;);
		}
		//ローディングマスクを外す
		Ext.getBody().unmask();
	},
	failure:function(res,opt){      //接続エラーなど
		Ext.Msg.alert(&#039;エラー&#039;,&#039;保存に失敗しました。&#039;);
		//ローディングマスクを外す
		Ext.getBody().unmask();
	}
});
</pre>
<p>ここでは変数resにレスポンスからJSONデータを取り出します。<br />
res.successがtrueの場合のみ、保存が成功しているのでストアの後処理を実行します。今回は単純に変更があったものをコミットして、modifiedRecordsをクリアしているだけですが、実際にはサーバー上との整合性のために新規追加項目のID等を振りなおす必要があります。もしくはストアをリロードしてサーバーの最新情報とグリッドを同期します。</p>
<p>最後にマスクを外します。マスクを追加したときと同じように対象のExtエレメントのunmaskメソッドを実行すれば外せます。</p>
<p>今回紹介したサンプルではサーバーサイドで実際にDB等に保存は行っていません。実際にAjaxのポストを取得してDBなどに保存するようにサーバーサイドのサンプルコードを変更して試してください。ExtJSでの基本的なAjaxのやりとりはJSONがよいと思います。phpであれば特に面倒な処理もなくjson_encodeとjson_decodeを使えば変換も楽におこなえます。<br />
AjaxのやりとりはFirefoxのアドオンFirebugを使うと分かりやすいです。<br />
<div id="attachment_563" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.50.19.png" title="FirebugでPOSTの確認" rel="lightbox[561]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.50.19-300x143.png" alt="FirebugでPOSTの確認" title="FirebugでPOSTの確認" width="300" height="143" class="size-medium wp-image-563" /></a><p class="wp-caption-text">FirebugでPOSTの確認</p></div><br />
<div id="attachment_564" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.50.32.png" title="Firebugでレスポンスのの確認" rel="lightbox[561]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.50.32-300x88.png" alt="Firebugでレスポンスのの確認" title="Firebugでレスポンスのの確認" width="300" height="88" class="size-medium wp-image-564" /></a><p class="wp-caption-text">Firebugでレスポンスのの確認</p></div></p>
<p>Ajaxリクエスト自体はグリッドだけでなく、どこでも使えるので、色々なリクエストを試してみるとよいと思います。</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%2F26%2Fextjs-tutorial25-editorgridsave%2F&amp;linkname=ExtJS%E3%81%A7%E6%A5%BD%E3%81%97%E3%81%8FRIA%E6%A5%AD%E5%8B%99%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%20ExJS%E5%85%A5%E9%96%8025%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%28Ext.Ajax%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E7%B7%A8%E9%9B%86%E5%86%85%E5%AE%B9%E3%81%AE%E4%BF%9D%E5%AD%98%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/26/extjs-tutorial25-editorgridsave/feed/</wfw:commentRss>
		<slash:comments>3</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>
	</channel>
</rss>

