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

<channel>
	<title>ExtJSで楽しくRIA業務アプリ開発 &#187; Tips</title>
	<atom:link href="http://extjs.blog.sus4.co.jp/tag/tips/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>0.95のハマリどころ</title>
		<link>http://extjs.blog.sus4.co.jp/2010/09/19/0-95%e3%81%ae%e3%83%8f%e3%83%9e%e3%83%aa%e3%81%a9%e3%81%93%e3%82%8d/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/09/19/0-95%e3%81%ae%e3%83%8f%e3%83%9e%e3%83%aa%e3%81%a9%e3%81%93%e3%82%8d/#comments</comments>
		<pubDate>Sun, 19 Sep 2010 09:56:33 +0000</pubDate>
		<dc:creator>野村 亮之</dc:creator>
				<category><![CDATA[Sencha Touch]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[sencha]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=796</guid>
		<description><![CDATA[0.93から０.９５にアップデートした際に、動かなかったところをメモ。]]></description>
			<content:encoded><![CDATA[<p>0.93から０.９５にアップデートした際に、動かなかったところをメモ。</p>
<ul>
<li>itemsに直接オブジェクトを書くと、レンダーしてくれない（泣。0.93までしてくれていて便利だったのに。１つのComponentを仕込むだけでも、配列で書きましょう。</li>
<li>Ext.platform消滅。Ext.is.xxxで判断するように、サンプルの方は書き直されていました。</li>
<li>NestedListがStoreを使うようになったみたい（これは聞いただけなので、自分自身ではまったところではない）。</li>
</ul>
<p>itemsのところだけが、見つけるのが大変でしたが、あとはエラーを吐いてくれるので、Touch本体のソースを見ながら修正しました。<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%2F09%2F19%2F0-95%25e3%2581%25ae%25e3%2583%258f%25e3%2583%259e%25e3%2583%25aa%25e3%2581%25a9%25e3%2581%2593%25e3%2582%258d%2F&amp;linkname=0.95%E3%81%AE%E3%83%8F%E3%83%9E%E3%83%AA%E3%81%A9%E3%81%93%E3%82%8D"><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/09/19/0-95%e3%81%ae%e3%83%8f%e3%83%9e%e3%83%aa%e3%81%a9%e3%81%93%e3%82%8d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS入門38　独自のVTypeを定義してフォームを検証する</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/21/extjs-tutorial38-formvtype/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/21/extjs-tutorial38-formvtype/#comments</comments>
		<pubDate>Fri, 21 May 2010 04:05:36 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ext.apply]]></category>
		<category><![CDATA[Ext.form.FormPanel]]></category>
		<category><![CDATA[Ext.form.TextField]]></category>
		<category><![CDATA[Ext.form.VTypes]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[vtype]]></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=659</guid>
		<description><![CDATA[今回はフォームのVTypeに独自のバリデーションを設定して、フォームの検証を行うサンプルです。]]></description>
			<content:encoded><![CDATA[<p>今回はフォームのVTypeに独自のバリデーションを設定して、フォームの検証を行うサンプルです。<br />
<div id="attachment_660" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-21_12-07-01.png" title="カスタムのVTypeを定義してフォームを検証する。" rel="lightbox[659]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-21_12-07-01-150x150.png" alt="カスタムのVTypeを定義してフォームを検証する。" title="カスタムのVTypeを定義してフォームを検証する。" width="150" height="150" class="size-thumbnail wp-image-660" /></a><p class="wp-caption-text">カスタムのVTypeを定義してフォームを検証する。</p></div><br />
フォーム関連の過去の記事はこちらからです。</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>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.VTypesクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.VTypes">http://extdocs.xenophy.com/?class=Ext.form.VTypes</a></p>
<p><span id="more-659"></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名古屋勉強会　フォーム　カスタムのVTypeの作成&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-vtype.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のフォーム　カスタムVTypeの作成してフォームを検証します。
        &lt;/p&gt;
        &lt;div id=&quot;form&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;form-vtype.js&quot;&gt;form-vtype.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()
{
    Ext.apply(Ext.form.VTypes,{

        //EXTという文字以外を入力させないルール
        onlyEXT:function(val){
            var pattern = /[^EXT]/g;
            return !pattern.test(val);
        },
        onlyEXTText:&#039;EXTしか入力できません。大文字と小文字を区別します。&#039;,
        onlyEXTMask:/[EXT]/,

        //自分で設定した日付形式でチェックする場合
        mydate:function(val) {
            var dt = Date.parseDate(val,&#039;Y:m:d&#039;,true);
            return dt ? val : false;
        },
        mydateText:&#039;日付の形式が間違っています。2010:01:01の形式で入力してください。&#039;,
        mydateMask:/[0-9:]/
    });

    var form = new Ext.form.FormPanel({
        renderTo:&#039;form&#039;,
        title:&#039;カスタムのVTypeを使ったフォーム&#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:{
            xtype:&#039;textfield&#039;,
            anchor:&#039;90%&#039;,
            msgTarget:&#039;under&#039;
        },
        items:[
            {
                name:&#039;normal&#039;,
                fieldLabel:&#039;チェックなしフィールド&#039;,
                emptyText:&#039;チェックなし&#039;
            },
            {
                name:&#039;email&#039;,
                fieldLabel:&#039;Emailフィールド&#039;,
                emptyText:&#039;Email入力してください&#039;,
                vtype:&#039;email&#039;  //vtypeコンフィグでバリデーションが設定　emailはデフォルトであるvtype
            },
            {
                name:&#039;onlyabc&#039;,
                fieldLabel:&#039;onlyEXTフィールド&#039;,
                emptyText:&#039;EXTのみ入力可&#039;,
                vtype:&#039;onlyEXT&#039;
            },
            {
                name:&#039;mydatefield&#039;,
                fieldLabel:&#039;mydateフィールド&#039;,
                emptyText:&#039;日付を入力&#039;,   //空のときのテキスト
                anchor:&#039;90%&#039;,
                vtype:&#039;mydate&#039;
            },
        ],
        buttonAlign:&#039;center&#039;,
        buttons:[
            {
                text:&#039;決定&#039;,
                formBind:true,
                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_660" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-21_12-07-01.png" title="カスタムのVTypeを定義してフォームを検証する。" rel="lightbox[659]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-21_12-07-01-300x210.png" alt="カスタムのVTypeを定義してフォームを検証する。" title="カスタムのVTypeを定義してフォームを検証する。" width="300" height="210" class="size-medium wp-image-660" /></a><p class="wp-caption-text">カスタムのVTypeを定義してフォームを検証する。</p></div></p>
<p>ExtJSでは予め、いくつかのVtypeが用意されています。</p>
<ul>
<li>alpha:アルファベット</li>
<li>alphanum:アルファベットと数字</li>
<li>email:E-mailアドレス</li>
<li>url:URL</li>
</ul>
<p>これをフォームフィールドのvtypeコンフィグに設定することでフィールドのvalidateが実行されたときに、検証方法を指定できます。<br />
使用例は以下のような形です。vtypeを文字列で指定します。</p>
<pre class="brush: js; ">

//emailを設定する場合
new Ext.form.Textfield({
	name:&#039;email&#039;,
	fieldLabel:&#039;Emailフィールド&#039;,
	emptyText:&#039;Email入力してください&#039;,
	vtype:&#039;email&#039;  //vtypeコンフィグでバリデーションが設定　emailはデフォルトであるvtype
}),
</pre>
<p>さて今回の本題ですが、VTypeに独自の検証法を定義する方法です。今回のサンプルでは2種類の独自VTypeを定義して使っています。<br />
一つはE、X、T、の3文字のうちどれかしか入力できないフィールド。もう一つは独自の日付チェックを設定しています。<br />
ExtJSのVTypeはExt.form.VTypesクラスというシングルトンクラスで管理されています。独自で作成したvtypeもここに登録しなければいけません。<br />
登録方法はExt.form.VTypesクラスをオーバーライドすることで登録します。ExtJSのクラスのオーバーライドではExt.apply()を使ってExtJSで2つのオブジェクトをマージする方法があります。<br />
Ext.apply()メソッドは引数を2つもち、第一引数側に第二引数のオブジェクトを追記します。</p>
<pre class="brush: js; ">

    Ext.apply(targetObj,{srcObj});
</pre>
<p>仮にtargetObjとsrcObjに同じプロパティが設定されいる場合は、srcObj側のプロパティに上書きされます。またマージする方向を逆にしたExt.applyIf()というメソッドも用意されています。</p>
<p>今回の場合</p>
<pre class="brush: js; ">

Ext.apply(Ext.form.VTypes,{

        //EXTという文字以外を入力させないルール
        onlyEXT:function(val){
            var pattern = /[^EXT]/g;
            return !pattern.test(val);
        },
        onlyEXTText:&#039;EXTしか入力できません。大文字と小文字を区別します。&#039;,
        onlyEXTMask:/[EXT]/,
</pre>
<p>		・・・<br />
});<br />
[/code]<br />
というようにExt.form.VTypesにオブジェクトを追加しています。Ext.form.VTypesクラスに登録を行うと各フィールドのコンフィグで独自のvtypeを読み出すことができます。</p>
<p>では実際のvtypeの記述方法です。まずEXTしか入力できないルールを作成します	。<br />
独自のvtypeのためには3つのプロパティを設定できます。</p>
<ul>
<li>vtype名:実際の検証処理関数。falseを返すとInvalidになる。またこの関数名がフィールドのvtypeコンフィグから呼び出す名前になる。</li>
<li>vtype名Text:このルールで検証結果がInvalidの場合に表示されるエラーメッセージ</li>
<li>vtype名Mask:このvtypeが設定されているフィールドへの入力を制限する。正規表現でしてい</li>
</ul>
<p>オブジェクトとしては以下のように記述して、Ext.form.VTypesに追加します。</p>
<pre class="brush: js; ">

Ext.apply(Ext.form.VTypes,
	{
			//EXTという文字以外を入力させないルール
			onlyEXT:function(val){
				var pattern = /[^EXT]/g;
				return !pattern.test(val);
			},
			onlyEXTText:&#039;EXTしか入力できません。大文字と小文字を区別します。&#039;,
			onlyEXTMask:/[EXT]/,
</pre>
<p>	}<br />
);<br />
[/code]<br />
VTypeを登録したら、使いたいフィールドで</p>
<pre class="brush: js; ">

vtype:&#039;onlyEXT&#039;
</pre>
<p>を設定します。<br />
vtype：onlyExtのフィールドではEXTの3文字のうちどれかしか入力できません。onlyEXTMaskで設定した入力制限が効いているためです。しかし日本語環境では日本語が入力できてしまいます。入力があるとonlyEXTに設定した検証関数で検証されます。ここでEXT以外の文字列があった場合はfalseを返すようにしています。検証関数からfalseが返るとfieldはInvalidになりエラーメッセージを表示します。ここにはonlyEXTTextで設定したエラーメッセージが表示されることになります。<br />
これで指定した文字以外の入力を制限します。</p>
<p>次に独自の日付フォーマットをチェックするVTypeの例です。VTypeの設定は以下のようになります。</p>
<pre class="brush: js; ">

Ext.apply(Ext.form.VTypes,
	{
        //自分で設定した日付形式でチェックする場合
        mydate:function(val) {
            var dt = Date.parseDate(val,&#039;Y:m:d&#039;,true);
            return dt ? val : false;
        },
        mydateText:&#039;日付の形式が間違っています。2010:01:01の形式で入力してください。&#039;,
        mydateMask:/[0-9:]/
	}
);
</pre>
<p>このVTypeではmydate関数内でDate.parseDate()で独自の日付形式でDateオブジェクトの生成を行っています。valにパースできない文字列が入ってきたばあいはdtにはundefinedが返されます。<br />
parseDate()メソッドは賢く例えば5/32を指定した場合は、自動的に6/1にしてくれます。しかし現実的に5/32とは入力された場合は5/31の入力間違いの可能性が高いので、エラーにして欲しいと思います。その場合はparseDate<br />
()メソッドの第三引数にbooleanで厳密な日付のチェックを行うか指定できます。ここがtrueの場合は5/32といった実際にはない日付はエラーになります。</p>
<p>今回はVTypesに独自のVtypeを追加する方法を紹介しました。フォームの検証はサーバーサイドでも行う必要がありますが、クライアントサイドのUIで処理することで、わざわざ情報をポストすることがないので高速に実行できます。前回紹介した<a href="http://extjs.blog.sus4.co.jp/2010/05/20/extjs-tutorial37-formerrors/">サーバーからエラーメッセージを表示する方法</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%2F05%2F21%2Fextjs-tutorial38-formvtype%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8038%E3%80%80%E7%8B%AC%E8%87%AA%E3%81%AEVType%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%A6%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E6%A4%9C%E8%A8%BC%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/21/extjs-tutorial38-formvtype/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入門35 Tableレイアウトのフォーム</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/18/extjs-tutorial35-tablelayout/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/18/extjs-tutorial35-tablelayout/#comments</comments>
		<pubDate>Tue, 18 May 2010 04:18:26 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ext.form.FormPanel]]></category>
		<category><![CDATA[Ext.form.TextField]]></category>
		<category><![CDATA[Ext.layout.TableLayout]]></category>
		<category><![CDATA[Ext.XTemplate]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[table]]></category>
		<category><![CDATA[tableレイアウト]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[エディター]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[テーブル]]></category>
		<category><![CDATA[フォーム]]></category>
		<category><![CDATA[フォームパネル]]></category>
		<category><![CDATA[レイアウト]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=644</guid>
		<description><![CDATA[今回はtableレイアウトのフォームの簡単な紹介です。基本的な部分はcolumnレイアウトのときと同じです。tableレイアウトではcolspan,rowspanを使ってレイアウトを設定します。]]></description>
			<content:encoded><![CDATA[<p>今回はtableレイアウトのフォームの簡単な紹介です。基本的な部分はcolumnレイアウトのときと同じです。tableレイアウトではcolspan,rowspanを使ってレイアウトを設定します。<a href="http://extjs.blog.sus4.co.jp/2010/05/14/631/">ExtJS入門33 Columnレイアウトのフォーム</a><br />
<div id="attachment_643" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-18_12-51-45.png" title="Tableレイアウトのフォーム" rel="lightbox[644]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-18_12-51-45-150x150.png" alt="Tableレイアウトのフォーム" title="Tableレイアウトのフォーム" width="150" height="150" class="size-thumbnail wp-image-643" /></a><p class="wp-caption-text">Tableレイアウトのフォーム</p></div></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>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.layout.TableLayoutクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.layout.TableLayout">http://extdocs.xenophy.com/?class=Ext.layout.TableLayout</a></p>
<p><span id="more-644"></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名古屋勉強会　フォーム　Columnレイアウト&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-layout2.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-layout2.js&quot;&gt;form-layout2.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({
        autoScroll:true,
        renderTo:&#039;form&#039;,
        title:&#039;tableレイアウトのフォーム&#039;,
        height:600,
        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を設定する
        layout:&#039;table&#039;,
        layoutConfig:{
            columns:3
        },
        defaults:{
            border:false,
            xtype:&#039;fieldset&#039;,
            labelAlign:&#039;top&#039;,
            anchor:&#039;90%&#039;,
            defaults:{
                xtype:&#039;textfield&#039;,
                emptyText:&#039;入力してください&#039;,   //空のときのテキスト
                msgTarget:&#039;under&#039;,   //入力に誤りがある場合はフィールドの下に表示
                allowBlank:false,
                anchor:&#039;90%&#039;
            }
        },
        items:[
            {
                xtype:&#039;displayfield&#039;,
                value:&#039;fieldLabelはformレイアウトの場合しか表示されないので、さらにフィールドセットでラップしてformレイアウトの中にフィールド入れています。&lt;br/&gt;&amp;nbsp;&#039;,
                hideLabel:true
            },
            {
                items:{
                    name:&#039;samplefield1&#039;,
                    fieldLabel:&#039;テキストフィールド1&#039;
                }
            },
            {
                items:{
                    name:&#039;samplefield2&#039;,
                    fieldLabel:&#039;テキストフィールド2&#039;
                }
            },
            {
                rowspan:2,
                items:[
                    {
                        name:&#039;samplefield3-1&#039;,
                        fieldLabel:&#039;テキストフィールド3-1&#039;
                    },
                    {
                        name:&#039;samplefield3-2&#039;,
                        fieldLabel:&#039;テキストフィールド3-2&#039;
                    },
                    {
                        name:&#039;samplefield3-3&#039;,
                        fieldLabel:&#039;テキストフィールド3-3&#039;
                    }
                ]
            },
            {
                colspan:2,
                items:{
                    name:&#039;samplefieldr4&#039;,
                    fieldLabel:&#039;テキストフィールド4&#039;
                }
            },
            {
                colspan:2,
                items:{
                    name:&#039;samplefield5&#039;,
                    fieldLabel:&#039;テキストフィールド5&#039;
                }
            },
            {
                colspan:2,
                items:{
                    name:&#039;samplefield6&#039;,
                    fieldLabel:&#039;テキストフィールド6&#039;
                }
            },
            {
                items:{
                    name:&#039;samplefield7&#039;,
                    fieldLabel:&#039;テキストフィールド7&#039;
                }
            },
            {
                title:&#039;左のセット&#039;,
                colspan:2,
                border:true,
                bodyStyle:&#039;padding:3px&#039;,
                items:[
                    {
                        name:&#039;samplefield8&#039;,
                        fieldLabel:&#039;テキストフィールド8&#039;
                    },
                    {
                        name:&#039;samplefield9&#039;,
                        fieldLabel:&#039;テキストフィールド9&#039;
                    }
                ]
            },
            {
                title:&#039;右のセット&#039;,
                border:true,
                bodyStyle:&#039;padding:3px&#039;,
                collapsible:true,
                items:[
                    {
                        name:&#039;samplefield10&#039;,
                        fieldLabel:&#039;テキストフィールド10&#039;
                    },
                    {
                        name:&#039;samplefield11&#039;,
                        fieldLabel:&#039;テキストフィールド11&#039;
                    }
                ]
            }
        ],
        buttonAlign:&#039;center&#039;,
        buttons:[
            {
                text:&#039;セット&#039;,
                iconCls:&#039;add&#039;,
                handler:function(){
                    //初期値もセットできる
                    var formFields = form.getForm();
                    formFields.setValues({
                        samplefield7:&#039;test&#039;,
                        samplefield8:&#039;test&#039;
                    });
                }
            },
            {
                text:&#039;決定&#039;,
                formBind:true,
                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_643" class="wp-caption aligncenter" style="width: 249px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-18_12-51-45.png" title="Tableレイアウトのフォーム" rel="lightbox[644]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-18_12-51-45-239x300.png" alt="Tableレイアウトのフォーム" title="Tableレイアウトのフォーム" width="239" height="300" class="size-medium wp-image-643" /></a><p class="wp-caption-text">Tableレイアウトのフォーム</p></div></p>
<p>テーブルレイアウトは、表のようにパネルを配置します。これをフォームに適応するには前回同様fieldsetでラップしてfieldset内はformレイアウトを使いラベルを表示させます。<br />
tableレイアウトは列の数を予め設定しておく必要があります。レイアウトのコンフィグの設定はlayoutConfigで行います。</p>
<pre class="brush: js; ">

        layout:&#039;table&#039;,
        layoutConfig:{
            columns:3
        }
</pre>
<p>layoutConfigにはオブジェクトで設定情報を渡します。columnsで列数を指定します。ここでは3列にしました。<br />
これでtableレイアウトはitemsに設定されているコンポーネントを横に3つずつならべて表示してくれます。</p>
<p>さらにtableレイアウトではcolspan,rowspanが設定できます。columnレイアウトと同じように、itemsのそれぞれのコンポーネントに個別で指定します。<br />
サンプルコードではフィールド３，４が以下のようになっています。。</p>
<pre class="brush: js; ">

{
	rowspan:2,
	items:[
		{
			name:&#039;samplefield3-1&#039;,
			fieldLabel:&#039;テキストフィールド3-1&#039;
		},
		・・・
},
{
	colspan:2,
	items:{
		name:&#039;samplefieldr4&#039;,
		fieldLabel:&#039;テキストフィールド4&#039;
	}
},
</pre>
<p>rowspanを設定するとその数だけ行を縦に連結します。対してcolspanは列を横に連結します。<br />
注意点としては、rowspanを設定した場合vertical-alignがmiddleになり真ん中に寄せられる点です。右のセットのように折りたためるfieldsetの場合は折りたたんだ状態で真ん中によってしまうので少し不恰好です。フォーラムを見るとtableレイアウトクラスを拡張すればvalignをtopにできるようです。<br />
columnと違ってrowspanが設定できるのがtableレイアウトの良いところなのですが、ちょっと残念です。<br />
しかしtableレイアウトも上手く使うことで複雑なフォームのレイアウトが可能です。色々なフィールドで試してみると良いかも知れません。</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%2F18%2Fextjs-tutorial35-tablelayout%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8035%20Table%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0"><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/18/extjs-tutorial35-tablelayout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS入門32　フォームパネルとフィールド(基本編)</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/13/extjs-tutorial32-formbasic/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/13/extjs-tutorial32-formbasic/#comments</comments>
		<pubDate>Thu, 13 May 2010 04:26:46 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[DateField]]></category>
		<category><![CDATA[Ext.form.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[formBind]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[monitorValid]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[フォーム]]></category>
		<category><![CDATA[フォームパネル]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=627</guid>
		<description><![CDATA[今回からExtJSのフォームに関するサンプルコードを紹介していきます。フォームに関しては以前簡単なサンプルを紹介しているので、まずは以前紹介した基本的なフォームの修正版からはじめてみたいと思います。]]></description>
			<content:encoded><![CDATA[<p>今回からExtJSのフォームに関するサンプルコードを紹介していきます。フォームに関しては以前簡単なサンプルを紹介しているので、まずは以前紹介した基本的なフォームの修正版からはじめてみたいと思います。<br />
<div id="attachment_628" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-13_13-22-50.png" title="フォームパネルと基本的なフィールド" rel="lightbox[627]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-13_13-22-50-150x150.png" alt="フォームパネルと基本的なフィールド" title="フォームパネルと基本的なフィールド" width="150" height="150" class="size-thumbnail wp-image-628" /></a><p class="wp-caption-text">フォームパネルと基本的なフィールド</p></div></p>
<p>フォーム関連の過去の記事はこちらからです。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/22/extjs-tutorial-form-baseic/">ExtJS入門　ExtJSのフォームについて（基本編）</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.FormPanelクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.FormPanel">http://extdocs.xenophy.com/?class=Ext.form.FormPanel</a></p>
<p><span id="more-627"></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名古屋勉強会　フォーム　その1&lt;/title&gt;

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

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

            Extのフォームフィールドについて
        &lt;/p&gt;
        &lt;div id=&quot;form&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        &lt;div id=&quot;form2&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;form-exsample.js&quot;&gt;form-exsample.js&lt;/a&gt;&lt;br/&gt;
    &lt;/div&gt;

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

//フォームの簡単な紹介
Ext.onReady(function()
{
    var form = new Ext.form.FormPanel({
        renderTo:&#039;form&#039;,
        title:&#039;フォームの簡単な紹介&#039;,
        height:280,
        width:500,
        bodyStyle:{
            padding:&#039;8px&#039;
        },
        footerStyle:{   //ボタン周りの表示の調整用スタイル
            border:&#039;solid 1px #99BBE8&#039;,
            &#039;border-top&#039;:&#039;none&#039;
        },
        labelWidth:180,
        monitorValid:true,  //定期的に妥当性のチェックを行いボタンを連動させます。ボタン側でformBindを設定する
        items:[
            {
                xtype:&#039;textfield&#039;,
                name:&#039;samplefield1&#039;,
                fieldLabel:&#039;テキストフィールド1&#039;,
                emptyText:&#039;入力してください&#039;,   //空のときのテキスト
                anchor:&#039;90%&#039;
            },
            {
                xtype:&#039;textfield&#039;,
                name:&#039;samplefield2&#039;,
                fieldLabel:&#039;テキストフィールド2(必須項目)&#039;,
                emptyText:&#039;入力してください&#039;,
                allowBlank:false,   //このフィールドを必須項目にします
                anchor:&#039;90%&#039;,
                msgTarget:&#039;under&#039;   //入力に誤りがある場合はフィールドの下に表示
            },
            {
                xtype:&#039;displayfield&#039;,
                name:&#039;samplefield3&#039;,
                fieldLabel:&#039;ディスプレイフィールド&#039;,
                value:&#039;表示だけのフィールドです。&#039;,
                anchor:&#039;90%&#039;
            },
            new Ext.form.NumberField({
                name:&#039;samplefield4&#039;,
                fieldLabel:&#039;ナンバーフィールド&#039;,
                allowDecimals:false,    //小数点を入力できないようにします
                anchor:&#039;90%&#039;

            }),
            {
                xtype:&#039;textfield&#039;,
                name:&#039;samplefield5&#039;,
                fieldLabel:&#039;Emailフィールド&#039;,
                emptyText:&#039;入力してください&#039;,
                anchor:&#039;90%&#039;,
                vtype:&#039;email&#039;,  //vtypeコンフィグでバリデーションが設定
                msgTarget:&#039;under&#039;
            },
            {
                xtype:&#039;datefield&#039;,
                name:&#039;samplefield6&#039;,
                fieldLabel:&#039;日付フィールド&#039;,
                emptyText:&#039;入力してください&#039;,
                width:100,
                msgTarget:&#039;side&#039;
            }
        ],
        buttonAlign:&#039;center&#039;,
        buttons:[
            {
                text:&#039;決定&#039;,
                formBind:true,
                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
                    });
                }
            }
        ]
    });

    //msgTargetにqtipを設定した場合はクイックティップスを起動しないといけない
    Ext.QuickTips.init();

    var form2 = new Ext.form.FormPanel({
        renderTo:&#039;form2&#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,
        monitorValid:true,  //定期的に妥当性のチェックを行いボタンを連動させます。ボタン側でformBindを設定する

        defaults:{
            xtype:&#039;textfield&#039;,  //デフォルトを設定する
            //msgTarget:&#039;qtip&#039;,    //フィールドのmsgTargtの初期値はqtipです。
            allowBlank:false,   //このフィールドを必須項目にします
            anchor:&#039;90%&#039;,
            emptyText:&#039;入力してください&#039;   //空のときのテキスト
        },
        items:[
            {
                name:&#039;form2-field1&#039;,
                fieldLabel:&#039;テキストフィールド1&#039;,
                value:&#039;初期のテキスト&#039;
            },
            {
                name:&#039;form2-field2&#039;,
                fieldLabel:&#039;テキストフィールド2(必須項目)&#039;
            }
        ],
        buttonAlign:&#039;center&#039;,
        buttons:[
            {
                text:&#039;リセット&#039;,
                iconCls:&#039;reset&#039;,
                handler:function(){
                    var formFields = form2.getForm();
                    formFields.reset();
                }
            },
            {
                text:&#039;決定&#039;,
                formBind:true,
                iconCls:&#039;tick&#039;,
                handler:function(){
                    //値の取り出し

                    //フォームパネルからフィールドを取得
                    var formFields = form2.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_628" class="wp-caption aligncenter" style="width: 248px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-13_13-22-50.png" title="フォームパネルと基本的なフィールド" rel="lightbox[627]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-13_13-22-50-238x300.png" alt="フォームパネルと基本的なフィールド" title="フォームパネルと基本的なフィールド" width="238" height="300" class="size-medium wp-image-628" /></a><p class="wp-caption-text">フォームパネルと基本的なフィールド</p></div></p>
<p>以前紹介した基本的なフォームに少し修正を加えたサンプルコードになります。<br />
上のフォームは前回とほとんど同じです。変更点はフォームの妥当性チェックと送信ボタンを連動させています。<br />
フォームパネルでmonitorValidをtrueに設定し、buttonsの中で連動させたいものにformBinde:trueを設定します。</p>
<pre class="brush: js; ">

    var form = new Ext.form.FormPanel({
		・・・
        monitorValid:true,  //定期的に妥当性のチェックを行いボタンを連動させます。ボタン側でformBindを設定する
        items:[],
		・・・
		buttons[
			{
				・・・
				formBine:true,
				・・・
			}
		]
	});
</pre>
<p>monitorValidを有効にすると、定期的に現在の妥当性の状況を確認してボタンを有効/無効に切り替えます。(monitorValidが有効なときフォームパネルは定期的にcllientValidationイベント実行します。)<br />
monitorValid + formBindを設定すると、フォームパネル中に含まれる全てのフォームの妥当性チェックを正しく通過しない限り、ボタンを無効にできるので非常に便利です。<br />
上側のフォームの以前のサンプルコードからの変更以上です。</p>
<p>次に下側のフォームです。こちらのフォームでは2つのテキストフィールドをフォームパネルに設置しています。<br />
フォームパネルでは、普通は複数のフォームを設定します。defaultsコンフィグにフィールドの共通設定を記述しておくと毎回繰り返す必要がなくなります。</p>
<pre class="brush: js; ">

 defaults:{
            xtype:&#039;textfield&#039;,  //デフォルトを設定する
            //msgTarget:&#039;qtip&#039;,    //フィールドのmsgTargtの初期値はqtipです。
            allowBlank:false,   //このフィールドを必須項目にします
            anchor:&#039;90%&#039;,
            emptyText:&#039;入力してください&#039;   //空のときのテキスト
        },
</pre>
<p>msgTargetをデフォルトの&#8221;qtip&#8221;のままにして、エラーメッセージをクイックティップスで表示します。クイックティップスで表示する場合はExt.QuickTip.init()を実行して、アプリ全体のクイックティップスを初期化しておく必要があります。</p>
<pre class="brush: js; ">

  //msgTargetにqtipを設定した場合はクイックティップスを起動しないといけない
    Ext.QuickTips.init();
</pre>
<p>下側のフォームでもmonitorValid + formBindを有効にしています。さらにもう一つボタンを設置してフォームの入力内容をリセットしています。リセットボタンのハンドラでBasicForm のreset()メソッドでフィールドをリセットしています</p>
<pre class="brush: js; ">

        items:[
            {
                name:&#039;form2-field1&#039;,
                fieldLabel:&#039;テキストフィールド1&#039;,
				value:&#039;初期テキスト&#039;
            },
            {
                name:&#039;form2-field2&#039;,
                fieldLabel:&#039;テキストフィールド2(必須項目)&#039;
            }
        ],
         buttons[
			{
                text:&#039;リセット&#039;,
                iconCls:&#039;reset&#039;,
                handler:function(){
                    var formFields = form2.getForm();
                    formFields.reset();
                }
			},
			・・・
		]
</pre>
<p>ここでは注意が必要で、2つのテキストフィールドのうち上側には初期値を設定しています。reset()メソッドでは、フォームを空にするのではなく、フォームの初期の状態に戻すという点です。そのため初期値が設定されている、上のフィールドではフィールドが空になるのではなくvalueに設定されている初期値に戻ります。</p>
<p>以上の2つのフォームの基本形です。複雑なフォームも今回のサンプルの発展形です。次回からはもう少し複雑なフォームを紹介します。</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%2F13%2Fextjs-tutorial32-formbasic%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8032%E3%80%80%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%91%E3%83%8D%E3%83%AB%E3%81%A8%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%28%E5%9F%BA%E6%9C%AC%E7%B7%A8%29"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/05/13/extjs-tutorial32-formbasic/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入門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入門26　エディタブル・グリッド（色々なエディターを設定する)</title>
		<link>http://extjs.blog.sus4.co.jp/2010/04/27/extjs-tutorial26-editorfield/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/04/27/extjs-tutorial26-editorfield/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 03:42:33 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ext.data.ArrayStore]]></category>
		<category><![CDATA[Ext.form.ComboBox]]></category>
		<category><![CDATA[Ext.form.DateField]]></category>
		<category><![CDATA[Ext.form.NumberField]]></category>
		<category><![CDATA[Ext.form.TextField]]></category>
		<category><![CDATA[Ext.grid.EditorGridPanel]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[エディタブル・グリッド]]></category>
		<category><![CDATA[コンボボックス]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[デートフィールド]]></category>
		<category><![CDATA[ナンバーフィールド]]></category>
		<category><![CDATA[レンダラー]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=570</guid>
		<description><![CDATA[エディタブルグリッドのサンプルその3になります。
今回は色々なグリッドを編集する際のエディタにテキストフィールド以外のエディタを指定します。このサンプルではTextField, DateField, NumberField.ComboBoxを使います。]]></description>
			<content:encoded><![CDATA[<p>エディタブルグリッドのサンプルその3になります。<br />
今回は色々なグリッドを編集する際のエディタにテキストフィールド以外のエディタを指定します。このサンプルではTextField, DateField, NumberField.ComboBoxを使います。</p>
<div id="attachment_569" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.27-12.03.23.png" title="ComboBoxをエディターに設定" rel="lightbox[570]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.27-12.03.23-150x150.png" alt="ComboBoxをエディターに設定" title="ComboBoxをエディターに設定" width="150" height="150" class="size-thumbnail wp-image-569" /></a><p class="wp-caption-text">ComboBoxをエディターに設定</p></div>
<p>グリッドパネル関連の過去の記事はこちらからです。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/03/extjs-tutorial17-gridbasic/">ExtJSで楽しくRIA業務アプリ開発 ExJS入門17　グリッド・パネル　基本編</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/05/extjs-tutorial18-gridrenderer/">ExtJSで楽しくRIA業務アプリ開発 ExtJS入門18　グリッド　レンダラーを使ってデザインを変える</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/14/extjs-tutorial19-gridpaging/">ExtJS入門19　グリッドにページング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/15/extjs-tutorial20-grid-filter/">ExtJS入門20　グリッドにフィルタリング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/">ExJS入門21　グリッド・セレクション・モデル</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/19/extjs-tutorial-gridclick/">ExJS入門22　グリッドのイベント処理（ダブルクリック、右クリック）</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/20/extjs-tutorial23-gridadd/">ExtJS入門23　グリッドへの項目の追加と削除</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/23/extjs-tutorial24-editorgrid-basic/">ExtJS入門24　エディタブル・グリッドの基本(グリッドパネルをエディタブル・グリッドに変更)</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/26/extjs-tutorial25-editorgridsave/">ExJS入門25　エディタブル・グリッド(Ext.Ajaxを使った編集内容の保存)</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.grid.ColumnModelクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.grid.ColumnModel">http://extdocs.xenophy.com/?class=Ext.grid.ColumnModel</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.TextFieldクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.TextField">http://extdocs.xenophy.com/?class=Ext.form.TextField</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.NumberFieldクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.NumberField">http://extdocs.xenophy.com/?class=Ext.form.NumberField</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.DateFieldクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.DateField">http://extdocs.xenophy.com/?class=Ext.form.DateField</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.ComboBoxクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.ComboBox">http://extdocs.xenophy.com/?class=Ext.form.ComboBox</a></p>
<p><span id="more-570"></span></p>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

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

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

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

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

Ext.onReady(function()
{

    //空のときのレンダラー
    var emptyRenderer = function(v) {
        return v ? v : &#039;ダブルクリックして編集&#039;;
    };

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

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

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

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

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

            ]
        }),

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

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

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

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

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

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

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

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

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

		・・・省略・・・

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

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

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

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

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

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

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

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=561</guid>
		<description><![CDATA[エディタブル・グリッドはグリッド上でストアの情報が編集できるグリッドです。前回のサンプルでは編集を行ったあとのストアの情報をどこにも保存していませんでした。今回はExt.Ajaxクラスを使って、編集後のストアのデータをサーバーへ送信するサンプルを紹介します。]]></description>
			<content:encoded><![CDATA[<p>エディタブル・グリッドはグリッド上でストアの情報が編集できるグリッドです。前回のサンプルでは編集を行ったあとのストアの情報をどこにも保存していませんでした。今回はExt.Ajaxクラスを使って、編集後のストアのデータをサーバーへ送信するサンプルを紹介します。<br />
<div id="attachment_562" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.48.31.png" title="Ajaxで保存" rel="lightbox[561]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.48.31-150x150.png" alt="Ajaxで保存" title="Ajaxで保存" width="150" height="150" class="size-thumbnail wp-image-562" /></a><p class="wp-caption-text">Ajaxで保存</p></div></p>
<p>グリッドパネル関連の過去の記事はこちらからです。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/03/extjs-tutorial17-gridbasic/">ExtJSで楽しくRIA業務アプリ開発 ExJS入門17　グリッド・パネル　基本編</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/02/05/extjs-tutorial18-gridrenderer/">ExtJSで楽しくRIA業務アプリ開発 ExtJS入門18　グリッド　レンダラーを使ってデザインを変える</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/14/extjs-tutorial19-gridpaging/">ExtJS入門19　グリッドにページング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/15/extjs-tutorial20-grid-filter/">ExtJS入門20　グリッドにフィルタリング機能を追加する</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/16/extjs-tutorial21-gridselmodel/">ExJS入門21　グリッド・セレクション・モデル</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/19/extjs-tutorial-gridclick/">ExJS入門22　グリッドのイベント処理（ダブルクリック、右クリック）</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/20/extjs-tutorial23-gridadd/">ExtJS入門23　グリッドへの項目の追加と削除</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/23/extjs-tutorial24-editorgrid-basic/">ExtJS入門24　エディタブル・グリッドの基本(グリッドパネルをエディタブル・グリッドに変更)</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.data.JsonStoreクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.data.JsonStore">http://extdocs.xenophy.com/?class=Ext.data.JsonStore</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.Ajaxクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.Ajax">http://extdocs.xenophy.com/?class=Ext.Ajax</a></p>
<p><span id="more-561"></span><br />
<strong>PHP:</strong></p>
<pre class="brush: php; ">

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

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

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

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

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

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

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

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

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

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

//グリッドへの追加削除
Ext.onReady(function()
{
    //保存リクエスト
    var onSave = function(){
        //編集をとめる
        grid.stopEditing();

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

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

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

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

            //Ajaxリクエスト処理

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

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

    }

    var grid = new Ext.grid.EditorGridPanel({
        renderTo:&#039;grid&#039;,
        title:&#039;エディタブル・グリッドの保存&#039;,
        height:210,
        width:400,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	//Ajaxリクエスト処理

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

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

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

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

	success:function(res,opt){      //成功時
		var res = Ext.decode(res.responseText);
		if (res.success){
			//正しく保存できた場合
			//変更をストアにセットする。（赤い三角が消える）
			grid.getStore().commitChanges();
			//grid.getStore().reload();
		}else{
			Ext.Msg.alert(&#039;エラー&#039;,&#039;保存に失敗しました。&#039;);
		}
		//ローディングマスクを外す
		Ext.getBody().unmask();
	},
	failure:function(res,opt){      //接続エラーなど
		Ext.Msg.alert(&#039;エラー&#039;,&#039;保存に失敗しました。&#039;);
		//ローディングマスクを外す
		Ext.getBody().unmask();
	}
});
</pre>
<p>ここでは変数resにレスポンスからJSONデータを取り出します。<br />
res.successがtrueの場合のみ、保存が成功しているのでストアの後処理を実行します。今回は単純に変更があったものをコミットして、modifiedRecordsをクリアしているだけですが、実際にはサーバー上との整合性のために新規追加項目のID等を振りなおす必要があります。もしくはストアをリロードしてサーバーの最新情報とグリッドを同期します。</p>
<p>最後にマスクを外します。マスクを追加したときと同じように対象のExtエレメントのunmaskメソッドを実行すれば外せます。</p>
<p>今回紹介したサンプルではサーバーサイドで実際にDB等に保存は行っていません。実際にAjaxのポストを取得してDBなどに保存するようにサーバーサイドのサンプルコードを変更して試してください。ExtJSでの基本的なAjaxのやりとりはJSONがよいと思います。phpであれば特に面倒な処理もなくjson_encodeとjson_decodeを使えば変換も楽におこなえます。<br />
AjaxのやりとりはFirefoxのアドオンFirebugを使うと分かりやすいです。<br />
<div id="attachment_563" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.50.19.png" title="FirebugでPOSTの確認" rel="lightbox[561]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.50.19-300x143.png" alt="FirebugでPOSTの確認" title="FirebugでPOSTの確認" width="300" height="143" class="size-medium wp-image-563" /></a><p class="wp-caption-text">FirebugでPOSTの確認</p></div><br />
<div id="attachment_564" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.50.32.png" title="Firebugでレスポンスのの確認" rel="lightbox[561]"><img src="http://extjs.blog.sus4.co.jp/files/2010/04/SS-2010.04.26-11.50.32-300x88.png" alt="Firebugでレスポンスのの確認" title="Firebugでレスポンスのの確認" width="300" height="88" class="size-medium wp-image-564" /></a><p class="wp-caption-text">Firebugでレスポンスのの確認</p></div></p>
<p>Ajaxリクエスト自体はグリッドだけでなく、どこでも使えるので、色々なリクエストを試してみるとよいと思います。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F04%2F26%2Fextjs-tutorial25-editorgridsave%2F&amp;linkname=ExtJS%E3%81%A7%E6%A5%BD%E3%81%97%E3%81%8FRIA%E6%A5%AD%E5%8B%99%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%20ExJS%E5%85%A5%E9%96%8025%E3%80%80%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%96%E3%83%AB%E3%83%BB%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%28Ext.Ajax%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E7%B7%A8%E9%9B%86%E5%86%85%E5%AE%B9%E3%81%AE%E4%BF%9D%E5%AD%98%29"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/04/26/extjs-tutorial25-editorgridsave/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ExtJS入門24　エディタブル・グリッドの基本(グリッドパネルをエディタブル・グリッドに変更)</title>
		<link>http://extjs.blog.sus4.co.jp/2010/04/23/extjs-tutorial24-editorgrid-basic/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/04/23/extjs-tutorial24-editorgrid-basic/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 02:38:54 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ext.grid.EditorGridPanel]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[エディタブル・グリッド]]></category>
		<category><![CDATA[エディター]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[ビジネスExtJS]]></category>
		<category><![CDATA[業務ウェブアプリケーションTips]]></category>

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

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

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

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

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

HTML:


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

			var RecordType = grid.getStore().recordType;
			var newItem = new RecordType(data);
			grid.getStore().insert(0,newItem);
		}
	}
]
</pre>
<p>グリッドからエディタブル・グリッドへの変更はこれだけで終了です。グリッドさえ分かっていれば簡単ですね。エディットされた内容はストアに保存されています。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F04%2F23%2Fextjs-tutorial24-editorgrid-basic%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8024%E3%80%80%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%96%E3%83%AB%E3%83%BB%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E5%9F%BA%E6%9C%AC%28%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%83%91%E3%83%8D%E3%83%AB%E3%82%92%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%96%E3%83%AB%E3%83%BB%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%81%AB%E5%A4%89%E6%9B%B4%29"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/04/23/extjs-tutorial24-editorgrid-basic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

