<?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; JSON</title>
	<atom:link href="http://extjs.blog.sus4.co.jp/tag/json/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>ExtJS入門39　ファイルをアップロードするフォームフィールド</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/24/extjs-tutorial39-fileuploadfield/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/24/extjs-tutorial39-fileuploadfield/#comments</comments>
		<pubDate>Mon, 24 May 2010 09:15:23 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Ext.form.FormPanel]]></category>
		<category><![CDATA[Ext.form.TextField]]></category>
		<category><![CDATA[Ext.ux.form.FileUploadField]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></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>
		<category><![CDATA[フォーム]]></category>
		<category><![CDATA[フォームパネル]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=663</guid>
		<description><![CDATA[ExtJSの標準のライブラリではファイルアップロード用のフォームフィールドは用意されていません。ファイルのアップロードフィールドを作成するためには、uxのExt.ux.form.FileUploadFieldを使うことが比較的多いです。今回はこのUXを使ってファイルを送信するフォームパネルのサンプルです。]]></description>
			<content:encoded><![CDATA[<p>ExtJSの標準のライブラリではファイルアップロード用のフォームフィールドは用意されていません。ファイルのアップロードフィールドを作成するためには、uxのExt.ux.form.FileUploadFieldを使うことが比較的多いです。今回はこのUXを使ってファイルを送信するフォームパネルのサンプルです。</p>
<div id="attachment_664" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-24_18-07-17.png" title="Ext.ux.form.FileUploadField" rel="lightbox[663]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-24_18-07-17-150x150.png" alt="Ext.ux.form.FileUploadField" title="Ext.ux.form.FileUploadField" width="150" height="150" class="size-thumbnail wp-image-664" /></a><p class="wp-caption-text">Ext.ux.form.FileUploadField</p></div>
<p>フォーム関連の過去の記事はこちらからです。</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/05/13/extjs-tutorial32-formbasic/">ExtJS入門32　フォームパネルとフィールド(基本編)</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/14/631/">ExtJS入門33 Columnレイアウトのフォー</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/17/extjs-tutorial34-combobox/">ExtJS入門34 ComboBoxの基本</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/18/extjs-tutorial35-tablelayout/">ExtJS入門35 Tableレイアウトのフォーム</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/20/extjs-tutorial37-formerrors/">ExtJS入門37 サーバーサイドで処理したフォームのエラーメッセージを表示するム</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/21/extjs-tutorial38-formvtype/">ExtJS入門38　独自のVTypeを定義してフォームを検証する</a></li>
</ul>
<p><span id="more-663"></span></p>
<p><strong>PHP</strong></p>
<pre class="brush: php; ">

&lt;?php
    $target = &#039;upload/&#039; . $_FILES[&#039;my-upload-file&#039;][&#039;name&#039;];
    @move_uploaded_file($_FILES[&#039;my-upload-file&#039;][&#039;tmp_name&#039;],$target);

    $res = array(
        &#039;success&#039; =&gt; true
    );

    if (!file_exists($target)) {
        $res = array(
            &#039;success&#039; =&gt; false,
            &#039;msg&#039;   =&gt; &#039;ファイルのアップロードに失敗しました。&#039;
        );
    }

    header(&quot;Content-Type: text/html; charset=utf-8&quot;);
    echo json_encode($res);
</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;../js/ext/src/locale/ext-lang-ja.js&quot;&gt;&lt;/script&gt;

    &lt;!--ux fileupload--&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ux/fileuploadfield/FileUploadField.js&quot;&gt;&lt;/script&gt;
    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../js/ux/fileuploadfield/css/fileuploadfield.css&quot;/&gt;

    &lt;script type=&quot;text/javascript&quot; src=&quot;form-fileupload.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;br /&gt;
            ux.fileUploadField　を使ってファイルをアップロードできるフォームを作成します。
        &lt;/p&gt;
        &lt;div id=&quot;form&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        &lt;div id=&quot;form2&quot;&gt;&lt;/div&gt;

        &lt;br/&gt;
        Java Script：&lt;a href=&quot;form-fileupload.js&quot;&gt;form-fileupload.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;,
        url:&#039;file-upload.php&#039;,
        fileUpload: true,
        title:&#039;フォームの簡単な紹介&#039;,
        height:280,
        width:500,
        bodyStyle:{
            padding:&#039;8px&#039;
        },
        footerStyle:{   //ボタン周りの表示の調整用スタイル
            border:&#039;solid 1px #99BBE8&#039;,
            &#039;border-top&#039;:&#039;none&#039;
        },
        labelWidth:180,
        monitorValid:true,  //定期的に妥当性のチェックを行いボタンを連動させます。ボタン側でformBindを設定する
        defaults:{
            anchor:&#039;100%&#039;
        },
        items:[
            {
                xtype: &#039;fileuploadfield&#039;,
                id: &#039;form-file&#039;,
                emptyText: &#039;ファイルを選択&#039;,
                fieldLabel: &#039;ファイルアップロードフィールド&#039;,
                name: &#039;my-upload-file&#039;,
                buttonText: &#039;ファイルを選択&#039;
            },{
                xtype:&#039;textfield&#039;,
                fieldLabel:&#039;キャプション&#039;,
                name:&#039;caption&#039;
            }
        ],
        buttonAlign:&#039;center&#039;,
        buttons:[
            {
                text:&#039;送信&#039;,
                formBind:true,
                iconCls:&#039;tick&#039;,
                handler:function(){
                    //ファイルを送信してコールバックを設定。
                    form.getForm().submit({

                        //リクエスト時にローダーを表示する
                        waitMsg: &#039;ファイルを送信中です...&#039;,

                        //リクエスト成功時
                        success:function(basicForm,action){

                            if (action.result.success){
                                form.getForm().reset();
                            }else{
                                Ext.Msg.alert(&#039;エラー&#039;,&#039;ファイルのアップロードに失敗しました。&#039;).setIcon(Ext.Msg.ERROR);
                            }
                        },

                        //失敗時
                        failure:function(basicForm,action){
                            Ext.Msg.alert(&#039;エラー&#039;,&#039;サーバーへの接続に失敗しました。&#039;).setIcon(Ext.Msg.ERROR);
                        }
                    });
                }
            }
        ]
    });
});
</pre>
<p>uxは都度作者のサイトやExtJSのフォーラムなどで入手する必要があります。<br />
Ext.ux.form.FileUploadFieldはExtJSのライブラリをダウンロードしたときに含まれるexsamplesの中にもあります。</p>
<p>今回は<br />
js/ext<br />
js/ux/fileupload/FileUploadField.js<br />
js/ux/fileupload/css/fileuploadfield.css<br />
というディレクトリ構成になっています。</p>
<p>uxファイルの読み込みはext-all.jsの後、使用される処理の前に行います。<br />
今回はファイルをポスト後にPHP側で処理を行うので、サーバーサイドも所定の位置に設定しておきます。<br />
これで読み込みが正しくできれば準備は完了です。</p>
<p>では早速FileUploadFieldを使ってみます。基本的いままのフィールドと同じやり方で作成します。<br />
formPanelには送信先のURLをurlコンフィグに設定しておきます、またfileUploadコンフィグをtrueにしてファイルを送信するためformPanelを指定します。<br />
次にfileuploadfieldをitemsに設定します。xtypeは&#8217;fileuploadfield&#8217;です。</p>
<pre class="brush: js; ">

    var form = new Ext.form.FormPanel({
        ・・・
        url:&#039;file-upload.php&#039;,
        fileUpload: true,
		・・・
        items:[
            {
                xtype: &#039;fileuploadfield&#039;,
                id: &#039;form-file&#039;,
                emptyText: &#039;ファイルを選択&#039;,
                fieldLabel: &#039;ファイルアップロードフィールド&#039;,
                name: &#039;my-upload-file&#039;,
                buttonText: &#039;ファイルを選択&#039;
            },{
                xtype:&#039;textfield&#039;,
                fieldLabel:&#039;キャプション&#039;,
                name:&#039;caption&#039;
            }
        ],
		・・・・
  });
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_664" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-24_18-07-17.png" title="Ext.ux.form.FileUploadField" rel="lightbox[663]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-24_18-07-17-300x226.png" alt="Ext.ux.form.FileUploadField" title="Ext.ux.form.FileUploadField" width="300" height="226" class="size-medium wp-image-664" /></a><p class="wp-caption-text">Ext.ux.form.FileUploadField</p></div><br />
<div id="attachment_665" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-24_18-09-04.png" title="フォーム送信時のローディングマスク" rel="lightbox[663]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-24_18-09-04-300x229.png" alt="フォーム送信時のローディングマスク" title="フォーム送信時のローディングマスク" width="300" height="229" class="size-medium wp-image-665" /></a><p class="wp-caption-text">フォーム送信時のローディングマスク</p></div></p>
<p>フィールド自体の設定はこれまでのほかのフォームフィールドと同じです。formPanelのfileUploadをtrueにすることが重要です。<br />
後は送信ボタンをつけてformPanelのurlに指定した場所にPOSTするだけです。送信されるサーバーの方は簡単なサンプルです。適時お好みの処理に変更してください。<br />
ファイルの送信ではページの読み込みは行われません、フォームのsubmit()メソッドの引数にリクエスト成功後のコールバックを指定して。ファイルの送信が完了したら、フォームをクリアして初期状態に戻るようにします。</p>
<p>basicFormのsubmit()メソッドにオブジェクトでコールバックが設定できることは既に説明しました。今回もファイルの送信成功後の処理をsuccessの中で実行します。また接続などのエラーはfailureの中に記述します。今回は成功すればフォームをクリアし、失敗時はポップアップを表示します。</p>
<pre class="brush: js; ">

    var form = new Ext.form.FormPanel({

        items:[
			・・・ファイルアップロードフィールド・・・
		],
        buttonAlign:&#039;center&#039;,
        buttons:[
            {
                text:&#039;送信&#039;,
                formBind:true,
                iconCls:&#039;tick&#039;,
                handler:function(){
                    //ファイルを送信してコールバックを設定。
                    form.getForm().submit({

                        //リクエスト時にローダーを表示する
                        waitMsg: &#039;ファイルを送信中です...&#039;,

                        //リクエスト成功時
                        success:function(basicForm,action){

                            if (action.result.success){
                                form.getForm().reset();
                            }else{
                                Ext.Msg.alert(&#039;エラー&#039;,&#039;ファイルのアップロードに失敗しました。&#039;).setIcon(Ext.Msg.ERROR);
                            }
                        },

                        //失敗時
                        failure:function(basicForm,action){
                            Ext.Msg.alert(&#039;エラー&#039;,&#039;サーバーへの接続に失敗しました。&#039;).setIcon(Ext.Msg.ERROR);
                        }
                    });
                }
            }
        ]
    });
</pre>
<p>formの送信後はファイル保存の処理はサーバーサイドで行われます。ファイルを送信するので、これまでの短いテキストのやり取りとは違いリクエストからレスポンスまでの時間が多少気になります。そのためsubmit()メソッドに渡す設定の中のwaitMsgに送信～完了までの間に表示するロードマスクで表示するテキストを設定します。このロードマスクはリクエストが完了後に自動的に消えるので手軽に使用できます。ファイルアップロードなどの処理はサーバーサイドでの処理に時間が駆るので、一般的にロードマスクを表示させるようにしておくのがよいでしょう。</p>
<p>今回のサンプルの注意として,FireFoxでfirerebugを起動したままファイルの送信リクエストを事項すると、レスポンスのJSONが上手く展開できないようです。上手くいかないときは一度Firebugを無効にして試してみてください。</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%2F24%2Fextjs-tutorial39-fileuploadfield%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8039%E3%80%80%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%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/05/24/extjs-tutorial39-fileuploadfield/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS入門37 サーバーサイドで処理したフォームのエラーメッセージを表示する</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/20/extjs-tutorial37-formerrors/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/20/extjs-tutorial37-formerrors/#comments</comments>
		<pubDate>Thu, 20 May 2010 06:21:39 +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[Ext.form.NumberField]]></category>
		<category><![CDATA[Ext.form.TextField]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></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>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=655</guid>
		<description><![CDATA[今回はExtJSのフォームのエラー表示の便利な方法を紹介します。一般的なwebアプリの場合、FormPanelからフィールドの値をサーバーに送信後サーバーサイドで値のチェックが実行されます。その際にエラーが見つかった場合にそれをフィールドへ通知する便利な方法がExtJSでは用意されています。]]></description>
			<content:encoded><![CDATA[<p>今回はExtJSのフォームのエラー表示の便利な方法を紹介します。一般的なwebアプリの場合、FormPanelからフィールドの値をサーバーに送信後サーバーサイドで値のチェックが実行されます。その際にエラーが見つかった場合にそれをフィールドへ通知する便利な方法がExtJSでは用意されています。<br />
<div id="attachment_654" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-20_14-54-05.png" title="サーバーからのエラー結果を表示する。" rel="lightbox[655]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-20_14-54-05-150x150.png" alt="サーバーからのエラー結果を表示する" title="サーバーからのエラー結果を表示する。" width="150" height="150" class="size-thumbnail wp-image-654" /></a><p class="wp-caption-text">サーバーからのエラー結果を表示する</p></div><br />
ポストした後、サーバーのチェックが行われエラーの結果がJSONで返ってくるフォームパネルのサンプルです。</p>
<p>フォーム関連の過去の記事はこちらからです。</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/05/13/extjs-tutorial32-formbasic/">ExtJS入門32　フォームパネルとフィールド(基本編)</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/14/631/">ExtJS入門33 Columnレイアウトのフォー</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/17/extjs-tutorial34-combobox/">ExtJS入門34 ComboBoxの基本</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/18/extjs-tutorial35-tablelayout/">ExtJS入門35 Tableレイアウトのフォーム</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/19/extjs-tutorial36-formhtml/">ExtJS入門36 HTMLの標準フォームにExtJSのフィールドを設置する</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.BasicFormクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.BasicForm">http://extdocs.xenophy.com/?class=Ext.form.BasicForm</a></p>
<p><span id="more-655"></span></p>
<p><strong>JSON(今回はこのファイルがフォームの送信先になっています):</strong></p>
<pre class="brush: js; ">

{
    success:false,
    errors:{
        &#039;samplefield1&#039;:&#039;間違っています。&#039; ,
        &#039;samplefield2&#039;:&#039;間違っています。&#039; ,
        &#039;samplefield4&#039;:&#039;間違っています。&#039; ,
        &#039;samplefield5&#039;:&#039;間違っています。&#039; ,
        &#039;samplefield6&#039;:&#039;特に設定することも無く、エラーメッセージを表示できます。&#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名古屋勉強会　フォーム　エラーの表示&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-errors.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-errors.js&quot;&gt;form-errors.js&lt;/a&gt;&lt;br/&gt;
		JSON File：&lt;a href=&quot;errors.json&quot;&gt;errors.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()
{
    var form = new Ext.form.FormPanel({
        renderTo:&#039;form&#039;,
        autoScroll:true,

        url:&#039;errors.json&#039;,//送信先URL　今回はエラーを返す静的なJSONファイルを指定しています。

        title:&#039;フォームの簡単な紹介&#039;,
        height:330,
        width:500,
        bodyStyle:{
            padding:&#039;8px&#039;
        },
        footerStyle:{   //ボタン周りの表示の調整用スタイル
            border:&#039;solid 1px #99BBE8&#039;,
            &#039;border-top&#039;:&#039;none&#039;
        },
        labelWidth:180,
        defaults:{
            msgTarget:&#039;under&#039;,
            anchor:&#039;90%&#039;,
            xtype:&#039;textfield&#039;
        },
        items:[
            {
                name:&#039;samplefield1&#039;,
                fieldLabel:&#039;テキストフィールド1&#039;,
                emptyText:&#039;入力してください&#039;,   //空のときのテキスト
            },
            {
                name:&#039;samplefield2&#039;,
                fieldLabel:&#039;テキストフィールド2(必須項目)&#039;,
                emptyText:&#039;入力してください&#039;,
            },
            {
                xtype:&#039;displayfield&#039;,
                name:&#039;samplefield3&#039;,
                fieldLabel:&#039;ディスプレイフィールド&#039;,
                value:&#039;表示だけのフィールドです。&#039;,
            },
            new Ext.form.NumberField({
                name:&#039;samplefield4&#039;,
                fieldLabel:&#039;ナンバーフィールド&#039;,
                allowDecimals:false,    //小数点を入力できないようにします
            }),
            {
                name:&#039;samplefield5&#039;,
                fieldLabel:&#039;Emailフィールド&#039;,
                emptyText:&#039;入力してください&#039;,
                vtype:&#039;email&#039;,  //vtypeコンフィグでバリデーションが設定
            },
            {
                xtype:&#039;datefield&#039;,
                name:&#039;samplefield6&#039;,
                fieldLabel:&#039;日付フィールド&#039;,
                emptyText:&#039;入力してください&#039;,
                anchor:false,//anchorをキャンセル
                width:100
            }
        ],
        buttonAlign:&#039;center&#039;,
        buttons:[
            {
                text:&#039;送信&#039;,
                //formBind:true,
                iconCls:&#039;tick&#039;,
                handler:function(){
                    //ポストする。
                    form.getForm().submit();
                    //今回はフィールドに何を入れてもエラーが返ってきますになります。
                }
            }
        ]
    });
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_654" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-20_14-54-05.png" title="サーバーからのエラー結果を表示する。" rel="lightbox[655]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-20_14-54-05-300x243.png" alt="サーバーからのエラー結果を表示する" title="サーバーからのエラー結果を表示する。" width="300" height="243" class="size-medium wp-image-654" /></a><p class="wp-caption-text">サーバーからのエラー結果を表示する</p></div></p>
<p>今回のキモになるのはサーバーから返されるJSONの型です。今回はサーバーサイドのプログラムを書かずにどんな値を送信しても静的なJSONファイルが返ってくるようにしています。</p>
<pre class="brush: js; ">

{
    success:false,
    errors:{
        &#039;samplefield1&#039;:&#039;間違っています。&#039; ,
        &#039;samplefield2&#039;:&#039;間違っています。&#039; ,
        &#039;samplefield4&#039;:&#039;間違っています。&#039; ,
        &#039;samplefield5&#039;:&#039;間違っています。&#039; ,
        &#039;samplefield6&#039;:&#039;特に設定することも無く、エラーメッセージを表示できます。&#039;
    }
}
</pre>
<p>サーバーサイドで処理する際は、レスポンスとして返却するJSONを上のような形式にします。<br />
successはエラーが合った場合必ずfalseを返すようにします。<br />
errorsにはオブジェクトでエラーのあったフィールド名：エラーメッセージという形式でエラーを列挙します。<br />
このJSONのフォーマットでレスポンスを返すとExtJSのフォームが自動的にエラーを表示してくれます。<br />
ポイントはerrors:{}の形式を必ずこの形にすることです。</p>
<pre class="brush: js; ">

 {
   success:false,//or true
   errors:{
     &#039;フィールド名&#039;:&#039;メッセージ&#039;
        ・・・・
   }//エラーがない場合は空
 }
</pre>
<p>実際にサンプルコードを動かしてみると、どんな値を送ってもerros.jsonのJSONが返り、各フィールドにエラーメッセージが表示されます。<br />
msgTargetをunderにしておくと見やすくなります。<br />
このJSONでsamplefield3:&#8217;間違っています&#8217;を付け加えた場合、displayfieldにもエラーメッセージを出してしまうので注意してください。</p>
<p>フォームのsubmit後の処理はsubmit()メソッドの引数にオブジェクトで処理を渡すこともできますが、簡単なエラー処理であればJSONの形をきちんとするだけで、submit()の引数になる長い処理を記述しなくてよいので便利です。</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%2F20%2Fextjs-tutorial37-formerrors%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8037%20%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%89%E3%81%A7%E5%87%A6%E7%90%86%E3%81%97%E3%81%9F%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E8%A1%A8%E7%A4%BA%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/20/extjs-tutorial37-formerrors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS入門34 ComboBoxの基本</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/17/extjs-tutorial34-combobox/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/17/extjs-tutorial34-combobox/#comments</comments>
		<pubDate>Mon, 17 May 2010 04:13:00 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[ComboBox]]></category>
		<category><![CDATA[DataView]]></category>
		<category><![CDATA[Ext.form.ComboBox]]></category>
		<category><![CDATA[Ext.form.FormPanel]]></category>
		<category><![CDATA[Ext.XTemplate]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[コンボボックス]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[データビュー]]></category>
		<category><![CDATA[フォーム]]></category>
		<category><![CDATA[フォームパネル]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=638</guid>
		<description><![CDATA[今回は以前紹グリッドのサンプルで簡単に紹介したコンボボックスを取り上げます。コンボボックスはHTMLフォームのセレクトボックスのような選択式のフォームを生成します。ExtJSのコンボボックスでは、項目のデータをストアから利用します。今回はグリッドの回で使ったサンプルのストアとデータを利用しています。]]></description>
			<content:encoded><![CDATA[<p>今回は以前紹グリッドのサンプルで簡単に紹介したコンボボックスを取り上げます。コンボボックスはHTMLフォームのセレクトボックスのような選択式のフォームを生成します。ExtJSのコンボボックスでは、項目のデータをストアから利用します。今回はグリッドの回で使ったサンプルのストアとデータを利用しています。<br />
<div id="attachment_639" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-17_13-07-58.png" title="ComComboBoxの基本" rel="lightbox[638]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-17_13-07-58-150x150.png" alt="ComboBoxの基本" title="ComComboBoxの基本" width="150" height="150" class="size-thumbnail wp-image-639" /></a><p class="wp-caption-text">ComboBoxの基本</p></div></p>
<p>グリッド関連の記事</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/?s=grid">ExtJSで楽しくRIA業務アプリ開発のgridの記事一覧</a></li>
</ul>
<p>フォーム関連の過去の記事はこちらからです。</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/05/13/extjs-tutorial32-formbasic/">ExtJS入門32　フォームパネルとフィールド(基本編)</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/14/631/">ExtJS入門33 Columnレイアウトのフォーム</a></li>
</ul>
<p>リファレンスはこちらから<br />
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-638"></span></p>
<p><strong>JSON DATA:</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名古屋勉強会　フォーム　コンボボックス&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-combo.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;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;form-combo.js&quot;&gt;form-combo.js&lt;/a&gt;&lt;br/&gt;
        JSON file：&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()
{
    var data = [
        {
            &#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;
        }
    ];

    var combo1 = new Ext.form.ComboBox({
        name:&#039;combo1&#039;,
        fieldLabel:&#039;ブラウザを選択(ローカルデータ)&#039;,
        store:new Ext.data.JsonStore({
            fields:[&#039;id&#039;,&#039;name&#039;],
            data:data
        }),
        mode:&#039;local&#039;,
        typeAhead:true, //入力文字から自動補完
        displayField:&#039;name&#039;,
        valueField:&#039;id&#039;,
        emptyText:&#039;入力可能&#039;,
        hiddenName:&#039;browser1&#039;
    });

    var combo2 = new Ext.form.ComboBox({
        name:&#039;combo2&#039;,
        fieldLabel:&#039;ブラウザを選択(リモートデータ)&#039;,
        store:new Ext.data.JsonStore({
            fields:[&#039;id&#039;,&#039;name&#039;,&#039;img&#039;],
            url:&#039;data.json&#039;,
            total:&#039;total&#039;,
            root:&#039;rows&#039;,
            autoLoad:true
        }),
        mode:&#039;remote&#039;,
        triggerAction:&#039;all&#039;,
        editable:false, //自由入力不可
        displayField:&#039;name&#039;,
        emptyText:&#039;選択してください&#039;,
        valueField:&#039;id&#039;,
        //hidenNameをつけないとgetValuesしたときの値はdisplayFieldの値になる
    });

    var combo3 = new Ext.form.ComboBox({
        name:&#039;combo3&#039;,
        fieldLabel:&#039;ブラウザを選択(テンプレート)&#039;,
        store:new Ext.data.JsonStore({
            fields:[&#039;id&#039;,&#039;name&#039;,&#039;img&#039;],
            url:&#039;data.json&#039;,
            total:&#039;total&#039;,
            root:&#039;rows&#039;,
            autoLoad:true
        }),
        mode:&#039;remote&#039;,
        triggerAction:&#039;all&#039;,
        editable:false, //自由入力不可
        displayField:&#039;name&#039;,
        valueField:&#039;id&#039;,
        hiddenName:&#039;browser3&#039;,
        itemSelector:&#039;div.browser-list&#039;,
        emptyText:&#039;選択してください&#039;,
        tpl:new Ext.XTemplate(
            &#039;&lt;tpl for=&quot;.&quot;&gt;&#039;,
                &#039;&lt;div class=&quot;browser-list&quot; style=&quot;text-align:center;&quot;&gt;&#039;,
                &#039;&lt;img src={img} width=&quot;50&quot;/&gt;&lt;br/&gt;&#039;,
                &#039;{name}&#039;,
                &#039;&lt;/div&gt;&#039;,
            &#039;&lt;/tpl&gt;&#039;
        )
    });

    var form = new Ext.form.FormPanel({
        renderTo:&#039;form&#039;,
        title:&#039;コンボボックスフォーム&#039;,
        height:280,
        width:500,
        bodyStyle:{
            padding:&#039;8px&#039;
        },
        footerStyle:{   //ボタン周りの表示の調整用スタイル
            border:&#039;solid 1px #99BBE8&#039;,
            &#039;border-top&#039;:&#039;none&#039;
        },
        labelWidth:180,
        items:[
            combo1,combo2,combo3
        ],
        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_639" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-17_13-07-58.png" title="ComComboBoxの基本" rel="lightbox[638]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-17_13-07-58-300x264.png" alt="ComboBoxの基本" title="ComComboBoxの基本" width="300" height="264" class="size-medium wp-image-639" /></a><p class="wp-caption-text">ComboBoxの基本</p></div></p>
<p>上の2つが基本的なコンボボックスです。まずこの2つの解説です。<br />
コンボボックスは基本的にテキストフィールドです。スーパークラスも以下のようになっています<br />
Observable > Component > BoxComponent > Field > TextField > TriggerField > ComboBox<br />
クリックできて、クリックすると選択項目がたちあがるTriggerFieldがコンボボックスです。同じような動きをするフィールドにDateFieldがあります。こちらはクリックするとDatePickerが立ち上がるTriggerFieldといえます。<br />
選択項目はDataViewをして描写されます。すこしややこしくなってきましたが、Ext.form.ComboBoxクラスを使っているならば基本的に面倒なことはComboBoxクラスがやってくれます。基本的なコンフィグオプションを設定するだけでコンボボックスを作成できます。</p>
<p>コンボボックスで設定する基本的なコンフィグオプションは以下のようなものです。</p>
<ul>
<li>name: フィールドの名前、getValuesしたときのプロパティ名になる</li>
<li>typeAhead: boolean 入力から項目を自動補完するかどうか</li>
<li>triggerAction: ▼をクリックしたときに送信するクエリを選択。&#8217;all&#8217;など</li>
<li>store: ストア</li>
<li>mode: ストアにデータ読み込む方法　local もしくは remote</li>
<li>displayField: コンボボックスの表示部分に設定するストアの項目</li>
<li>valueField: コンボボックスの値として設定するストアの項目</li>
<li>hiddenName コンボボックスの値として設定するストアの項目</li>
</ul>
<p>typeAheadとtriggerActionで基本的な動作を制御します。typeAheadがtrueの場合、フィールドに入力を行うとそれに対応する項目が絞り込まれます。triggerActionでは▼をクリックしたときに読み込まれるデータを取得するためにサーバーに送信するクエリを選択します。&#8217;all&#8217;を指定します。全件を取得したくない場合はフィールドに入力されている項目を初期のクエリとしてサーバーに送信することができます。その場合は以下のように設定します。</p>
<pre class="brush: js; ">

 queryParam:&#039;searchkeyword&#039;,
 triggerAction:&#039;query&#039;,
</pre>
<p>queryParamに送信するプロパティ名、triggerActionを&#8217;query&#8217;に変更。これでコンボボックスの項目を取得する際にフィールドに入力されいる項目を送信します。ただしフィールドに入力がない場合は、サーバーへの取得を行わないので注意が必要です。</p>
<p>コンボボックスにもストアが必要です。今回は以前グリッドサンプルコードで使ったブラウザシェアのデータを使いたいと思います。そのためストアも以前のグリッドパネルとよく似ています。<br />
一つ目が選択項目となるデータをJSファイルの中（ローカル）に持ってJsonStoreのdataに読み込んでいる形です。都度リクエストをかけることなく選択項目を表示します。2つ目はデータをリモートに持ちリクエストを投げてデータをストアに読み込みます。</p>
<pre class="brush: js; ">

new Ext.data.JsonStore({
	fields:[&#039;id&#039;,&#039;name&#039;,&#039;img&#039;],
	url:&#039;data.json&#039;,	//ローカルの場合はJSONデータを指定
	total:&#039;total&#039;,
	root:&#039;rows&#039;,
	autoLoad:true
})
</pre>
<p>modeの設定はストアの読み込み方法に応じて&#8217;local&#8217;と&#8217;remote&#8217;のどちらかを設定します。</p>
<p>displayFieldはストアのfieldsの中でコンボボックスの選択項目に表示される項目を指定します。今回はブラウザ名を表示させるためにnameを設定しました。<br />
valueFieldはfieldsのなかで値として設定する項目を指定します。valueFieldで設定された値はhiddenNameに指定された名前でフォームの値としてgetValues()を事項したときに取得されます。<br />
この辺りがコンボボックスの少しややこしいところです。nameは選択されている項目を表示するためのテキストフィールド名前です。nameの名前でフォームの値として設定されるのは表示されている文字列です。<br />
表示は文字列で、実際に送信される値はidの数字がよい、といった場合は別途hiddenNameで設定する必要があります。今回のサンプルではcombo1、combo2の両方にvalueFieldが設定されています、しかしcombo1はhiddenNameが設定されていますが、combo2には設定されていません。この場合getValues()したときに取得されるのは</p>
<p>	browser1:2 			//ブラウザのID<br />
	combo2:Firefox	//フィールドに表示されていた文字列</p>
<p>となります。フィールドに表示されている値ではないものを送信したい場合はcombo1のようにhiddenNameを設定するようにします。</p>
<p>以上が基本的なコンボボックスの設定です。</p>
<p>少しややこしい説明でしたが、まとめると</p>
<ul>
<li>ストアを作る</li>
<li>ストアに応じてmodeを決める。</li>
<li>ストアに応じてdisplayFieldを決める。</li>
<li>もし表示している値でないものを送る場合はvalueFieldとhiddenNameを設定する。</li>
<li>基本的にtriggerAction:&#8217;all&#8217;</li>
<li>入力補完する場合はtypeAheadをtrueに</li>
</ul>
<p>といった形です。</p>
<p>3つ目のコンボボックスはおまけえ、セレクトボックスの表示項目のデザインを変更しています。</p>
<pre class="brush: js; ">

var combo3 = new Ext.form.ComboBox({
		・・・
        itemSelector:&#039;div.browser-list&#039;,
        tpl:new Ext.XTemplate(
            &#039;&lt;tpl for=&quot;.&quot;&gt;&#039;,
                &#039;&lt;div class=&quot;browser-list&quot; style=&quot;text-align:center;&quot;&gt;&#039;,
                &#039;&lt;img src={img} width=&quot;50&quot;/&gt;&lt;br/&gt;&#039;,
                &#039;{name}&#039;,
                &#039;&lt;/div&gt;&#039;,
            &#039;&lt;/tpl&gt;&#039;
        )
		・・・
    });
</pre>
<p>コンボボックスのtplのコンフィグオプションにXTemplateでテンプレートを設定します。DataViewのようにitemSelectorを設定してクリックするノードを指定します。サンプルコードではdiv.browser-listを指定しています。今回のテンプレートではブラウザの画像を表示するように設定しています。XTemplateとDataViewの知識があれば特に難しいことは無く、簡単にデザインを変更できます。</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%2F17%2Fextjs-tutorial34-combobox%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8034%20ComboBox%E3%81%AE%E5%9F%BA%E6%9C%AC"><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/17/extjs-tutorial34-combobox/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ExtJS入門　JSONP経由でTwitterの情報をDataViewに表示する その2</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/12/extjs-tutorial-twitter-dataview-sample2/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/12/extjs-tutorial-twitter-dataview-sample2/#comments</comments>
		<pubDate>Wed, 12 May 2010 02:42:00 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[DataView]]></category>
		<category><![CDATA[Ext.DataView]]></category>
		<category><![CDATA[Ext.XTemplate]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JSONP]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Twitter Search API]]></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=621</guid>
		<description><![CDATA[前回のサンプルのおまけです。前回のサンプルコードExt.DataViewを使ってTwitter Search APIの情報を表示していました。今回はダブルクリックイベントとホバリング時のCSSクラスの設定を行ってもう少し使えるアプリっぽく修正しました。]]></description>
			<content:encoded><![CDATA[<p>前回のサンプルのおまけです。前回のサンプルコードExt.DataViewを使ってTwitter Search APIの情報を表示していました。今回はダブルクリックイベントとホバリング時のCSSクラスの設定を行ってもう少し使えるアプリっぽく修正しました。<br />
<div id="attachment_623" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-12_11-15-16.png" title="DataViewのホバリング設定" rel="lightbox[621]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-12_11-15-16-150x150.png" alt="DataViewのホバリング設定" title="DataViewのホバリング設定" width="150" height="150" class="size-thumbnail wp-image-623" /></a><p class="wp-caption-text">DataViewのホバリング設定</p></div><br />
<a href="http://extjs.blog.sus4.co.jp/2010/05/11/extjs-tutorial-twitter-dataview-sample/">ExtJS入門　JSONP経由でTwitterの情報をDataViewに表示する</a></p>
<p>関連の記事はこちらからです。</p>
<ul>
<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>
<li>
	<a href="http://extjs.blog.sus4.co.jp/2010/05/11/extjs-tutorial-twitter-dataview-sample/">ExtJS入門　JSONP経由でTwitterの情報をDataViewに表示する</a>
	</li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.DataViewクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.DataView">http://extdocs.xenophy.com/?class=Ext.DataView</a></p>
<p><span id="more-621"></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 DataView&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;dataview-twitter2.js&quot;&gt;&lt;/script&gt;
    &lt;style TYPE=&quot;text/css&quot;&gt;
    &lt;!--
        .search {background-image: url(../img/icon/magnifier.png) !important;}
        .tweet
        {
            width:148px;
            height:300px;
            margin:2px;
            padding:3px;
            border:dotted 1px #CCC;
            background-color:#F9F9F9;
            float:left;
        }
        .tweet-hover
        {
            background-color:#F0F0FF;
        }
        .tweet_text
        {
            background-color:#FFF;
            padding:3px;
        }

        span.tweet_date
        {
            font-size:x-small;
        }

    --&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;panel&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;dataview-twitter2.js&quot;&gt;dataview-twitter2.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 tpl = new Ext.XTemplate(
        &#039;&lt;div id=&quot;twitter-tpl&quot;&gt;&#039;,
        &#039;&lt;tpl for=&quot;.&quot;&gt;&#039;,
            &#039;&lt;div class=&quot;tweet&quot; &gt;&#039;,
            &#039;&lt;img src={profile_image_url} alt=&quot;{from_user}&quot;/&gt;&#039;,
            &#039;&lt;h1&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://twitter.com/{from_user}&quot;&gt;&lt;b&gt;{from_user}&lt;/b&gt;&lt;/a&gt;:{1}&lt;/h1&gt;&#039;,
                &#039;&lt;span class=&quot;tweet_date&quot;&gt;{[Date.parseDate(values.created_at,&quot;D, d M Y G:i:s O&quot;).format(&quot;H時m分s秒 n月j日&quot;)]} &lt;/span&gt;&#039;,
            &#039;&lt;br/&gt;&#039;,
                &#039;&lt;div class=&quot;tweet_text&quot;&gt;{text}&lt;/div&gt;&#039;,
            &#039;&lt;/div&gt;&#039;,
        &#039;&lt;/tpl&gt;&#039;,
    &#039;&lt;/div&gt;&#039;);

    var panel = new Ext.Panel({
        renderTo:&#039;panel&#039;,
        height:600,
        width:500,
        autoExpandColumn:&#039;title&#039;,
            autoScroll:true,
        items:new Ext.DataView({
            tpl:tpl,
            store:store,
            autoHeight:true,
            itemSelector:&#039;div.tweet&#039;,
            emptyText:&#039;No Tweet&#039;,
            //ホバリング時のクラス
            overClass:&#039;tweet-hover&#039;,
            listeners:{
                dblclick:function(dataview,index,node,e){
                    var record = dataview.getStore().getAt(index);
                    window.open(String.format(
                        &#039;http://twitter.com/{0}/status/{1}&#039;,
                        record.get(&#039;from_user&#039;),
                        record.get(&#039;id&#039;)
                    ));
                }
            }
        }),
        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 = panel.getTopToolbar();
                    var value = tbar.getComponent(&#039;keyword&#039;).getValue();

                    store.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_622" class="wp-caption aligncenter" style="width: 247px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-12_11-15-37.png" title="Twitter Data View改" rel="lightbox[621]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-12_11-15-37-237x300.png" alt="Twitter Data View改" title="Twitter Data View改" width="237" height="300" class="size-medium wp-image-622" /></a><p class="wp-caption-text">Twitter Data View改</p></div><br />
<div id="attachment_623" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-12_11-15-16.png" title="DataViewのホバリング設定" rel="lightbox[621]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-12_11-15-16-300x222.png" alt="DataViewのホバリング設定" title="DataViewのホバリング設定" width="300" height="222" class="size-medium wp-image-623" /></a><p class="wp-caption-text">DataViewのホバリング設定</p></div></p>
<p>HTMLファイル内でホバリング時に使用するスタイルを記述しておきます。サンプルでは背景色を青っぽく変更しているだけです。<br />
Ext.DataViewでitemSelectorコンフィグに指定したDOMノードにイベントを設定できます。サンプルではdiv.tweet上で動作するようになっています。<br />
データビューはこのノード上ホバリング時にoverClassで指定したCSSクラスをこのノードのCSSクラスに追加します。</p>
<p>次にイベント処理です。イベント処理もホバリングと同じくitemSelectorで指定することでdiv.tweetの要素にイベントハンドラを設定されます。サンプルではdblclickイベントが呼ばれると、そのtweetの単独のページを別windowで開くように処理しています。</p>
<pre class="brush: js; ">

	itemSelector:&#039;div.tweet&#039;,
	overClass:&#039;tweet-hover&#039;,
	listeners:{
		dblclick:function(dataview,index,node,e){
			var record = dataview.getStore().getAt(index);
			window.open(String.format(
				&#039;http://twitter.com/{0}/status/{1}&#039;,
				record.get(&#039;from_user&#039;),
				record.get(&#039;id&#039;)
			));
		}
	}
</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%2F05%2F12%2Fextjs-tutorial-twitter-dataview-sample2%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%80%E3%80%80JSONP%E7%B5%8C%E7%94%B1%E3%81%A7Twitter%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92DataView%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%20%E3%81%9D%E3%81%AE2"><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/12/extjs-tutorial-twitter-dataview-sample2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS入門　JSONP経由でTwitterの情報をDataViewに表示する</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/11/extjs-tutorial-twitter-dataview-sample/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/11/extjs-tutorial-twitter-dataview-sample/#comments</comments>
		<pubDate>Tue, 11 May 2010 05:05:07 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[DataView]]></category>
		<category><![CDATA[Ext.XTemplate]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JSONP]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Twitter Search API]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[データビュー]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=618</guid>
		<description><![CDATA[JSONPでTwitter APIを利用する小ネタの紹介です。前回まではグリッドのデータソースとしてJSONPで色々なAPIを利用していました。APIから取得したデータはストアに保存されています。そのためグリッド以外にも利用することができます。今回は前回と同じTwitter Search APIをデータソースにして表示をグリッドパネルからデータビューに変更してみます。]]></description>
			<content:encoded><![CDATA[<p>JSONPでTwitter APIを利用する小ネタの紹介です。前回まではグリッドのデータソースとしてJSONPで色々なAPIを利用していました。APIから取得したデータはストアに保存されています。そのためグリッド以外にも利用することができます。今回は前回と同じTwitter Search APIをデータソースにして表示をグリッドパネルからデータビューに変更してみます。</p>
<div id="attachment_617" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-11_13-39-44.png" title="Twitter API をDataViewの表示" rel="lightbox[618]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-11_13-39-44-150x150.png" alt="Twitter API をDataViewの表示" title="Twitter API をDataViewの表示" width="150" height="150" class="size-thumbnail wp-image-617" /></a><p class="wp-caption-text">Twitter API をDataViewの表示</p></div>
<p>グリッドパネル関連の過去の記事はこちらからです。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/01/28/extjs-tutorial-summary3/">第5回ExtJS勉強会＠名古屋 2/25　パネル内のエレメントを作成する</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>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/10/extjs-tutorial31-grid-twitterrowview/">ExJS入門31 GridViewでグリッドの各行の背景色を変更する</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.DataViewクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.DataView">http://extdocs.xenophy.com/?class=Ext.DataView</a></p>
<p><span id="more-618"></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 DataView&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;dataview-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;}
        .tweet
        {
            width:148px;
            height:300px;
            margin:2px;
            padding:3px;
            border:dotted 1px #CCC;
            background-color:#F9F9F9;
        }
        .tweet_text
        {
            background-color:#FFF;
            padding:3px;
        }

        span.tweet_date
        {
            font-size:x-small;
        }

    --&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;panel&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;dataview-twitter.js&quot;&gt;dataview-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 tpl = new Ext.XTemplate(
        &#039;&lt;div id=&quot;twitter-tpl&quot;&gt;&#039;,
        &#039;&lt;tpl for=&quot;.&quot;&gt;&#039;,
            &#039;&lt;div class=&quot;tweet&quot; &gt;&#039;,
            &#039;&lt;img src={profile_image_url} alt=&quot;{from_user}&quot;/&gt;&#039;,
            &#039;&lt;h1&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://twitter.com/{from_user}&quot;&gt;&lt;b&gt;{from_user}&lt;/b&gt;&lt;/a&gt;:{1}&lt;/h1&gt;&#039;,
                &#039;&lt;span class=&quot;tweet_date&quot;&gt;{[Date.parseDate(values.created_at,&quot;D, d M Y G:i:s O&quot;).format(&quot;H時m分s秒 n月j日&quot;)]} &lt;/span&gt;&#039;,
            &#039;&lt;br/&gt;&#039;,
                &#039;&lt;div class=&quot;tweet_text&quot;&gt;{text}&lt;/div&gt;&#039;,
            &#039;&lt;/div&gt;&#039;,
        &#039;&lt;/tpl&gt;&#039;,
    &#039;&lt;/div&gt;&#039;);

    var panel = new Ext.Panel({
        renderTo:&#039;panel&#039;,
        height:600,
        width:500,
        autoExpandColumn:&#039;title&#039;,
            autoScroll:true,
        items:new Ext.DataView({
            tpl:tpl,
            store:store,
            autoHeight:true,
            itemSelector:&#039;div.tweet&#039;,
            emptyText:&#039;No Tweet&#039;
        }),
        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 = panel.getTopToolbar();
                    var value = tbar.getComponent(&#039;keyword&#039;).getValue();

                    store.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_617" class="wp-caption aligncenter" style="width: 236px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-11_13-39-44.png" title="Twitter API をDataViewの表示" rel="lightbox[618]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-11_13-39-44-226x300.png" alt="Twitter API をDataViewの表示" title="Twitter API をDataViewの表示" width="226" height="300" class="size-medium wp-image-617" /></a><p class="wp-caption-text">Twitter API をDataViewの表示</p></div></p>
<p>APIからJsonStoreへデータを読み込む流れは前回のサンプルコードと同じです。データビューの基本的な紹介はこちらをご覧下さい。<a href="http://extjs.blog.sus4.co.jp/2010/01/28/extjs-tutorial-summary3/">第5回ExtJS勉強会＠名古屋 2/25　パネル内のエレメントを作成する</a></p>
<p>APIからストアにデータを読み込んでデータビュー(Ext.DataView)クラスに渡します。データビューはテンプレートを指定する必要があります。このテンプレートにデータの表示の仕方を記述します。今回は以下のようにして、tweetをグリッド状に並べています。</p>
<pre class="brush: js; ">

    var tpl = new Ext.XTemplate(
        &#039;&lt;div id=&quot;twitter-tpl&quot;&gt;&#039;,
        &#039;&lt;tpl for=&quot;.&quot;&gt;&#039;,
            &#039;&lt;div class=&quot;tweet&quot; &gt;&#039;,
            &#039;&lt;img src={profile_image_url} alt=&quot;{from_user}&quot;/&gt;&#039;,
            &#039;&lt;h1&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://twitter.com/{from_user}&quot;&gt;&lt;b&gt;{from_user}&lt;/b&gt;&lt;/a&gt;:{1}&lt;/h1&gt;&#039;,
                &#039;&lt;span class=&quot;tweet_date&quot;&gt;{[Date.parseDate(values.created_at,&quot;D, d M Y G:i:s O&quot;).format(&quot;H時m分s秒 n月j日&quot;)]} &lt;/span&gt;&#039;,
            &#039;&lt;br/&gt;&#039;,
                &#039;&lt;div class=&quot;tweet_text&quot;&gt;{text}&lt;/div&gt;&#039;,
            &#039;&lt;/div&gt;&#039;,
        &#039;&lt;/tpl&gt;&#039;,
    &#039;&lt;/div&gt;&#039;);
</pre>
<p>少し変わっているところとしては、日付を以下のように処理して、フォーマットしています。</p>
<pre class="brush: js; ">

&#039;&lt;span class=&quot;tweet_date&quot;&gt;{[Date.parseDate(values.created_at,&quot;D, d M Y G:i:s O&quot;).format(&quot;H時m分s秒 n月j日&quot;)]} &lt;/span&gt;&#039;,
</pre>
<p>テンプレート文字列内で&#8221;{[ ・・・ ]}&#8221;を囲うことで処理を記述することができます。ここではループの中の現在のデータにアクセスするためにvaluesという変数を使う必要があります。</p>
<p>DataViewのコンフィグで<br />
overClassやlisternersでイベントを取得することより高機能なパネルへ発展も可能です。<br />
Twitterには沢山のAPIが用意されているます、UPDATEや自分のタイムラインを表示できるようにすれば自分専用のTwitterクライアントを作ることも可能です。<br />
時間があるときに作ってみるのも良いかもしれません。</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%2F11%2Fextjs-tutorial-twitter-dataview-sample%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%80%E3%80%80JSONP%E7%B5%8C%E7%94%B1%E3%81%A7Twitter%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92DataView%E3%81%AB%E8%A1%A8%E7%A4%BA%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/11/extjs-tutorial-twitter-dataview-sample/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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>
	</channel>
</rss>

