<?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; 勉強会</title>
	<atom:link href="http://extjs.blog.sus4.co.jp/tag/%e5%8b%89%e5%bc%b7%e4%bc%9a/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>7月のExt JS勉強会（東京）「Sencha Touchのはじめかた　」まとめ</title>
		<link>http://extjs.blog.sus4.co.jp/2010/07/29/tutorial-tokyo-20100728/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/07/29/tutorial-tokyo-20100728/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 11:52:18 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[dockedItems]]></category>
		<category><![CDATA[Ext.Panel]]></category>
		<category><![CDATA[Ext.Toolbar]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[HelloWorld]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[sample]]></category>
		<category><![CDATA[sencha]]></category>
		<category><![CDATA[Sencha Touch]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=741</guid>
		<description><![CDATA[7月のExt JS勉強会（東京）のまとめ
]]></description>
			<content:encoded><![CDATA[<p><div style="margin-left: 1em; float: right;"><script type="text/javascript"><!--
google_ad_client = "pub-9023017642999258";
/* 336x280, ExtJS Blog 09/11/15 */
google_ad_slot = "7497179445";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
<p>7月の勉強会(東京)のまとめになります。</p>
<hr />開発環境<br />
→　好きなやり方。とりあえずささっと試したいならjsdo.itがおすすめ。コードの共有もできる。デバイスに依存しない部分なら結構使える。</p>
<p>検証機(タッチパネルデバイス)<br />
→　iPhone 3GS以降 or iPad　が無難。Mac があるならiPhone　シュミレーターが一番安定している。iPhone 3G,Android端末は微妙。</p>
<p>APIリファレンス<br />
→　発表し忘れ項目。Sencha Touchを学ぶうえで公式のAPIリファレンスはとても重要。Ext JSほど充実していないが、サンプルコードも載っているのですごく参考になります。Sencha Touchのパッケージにも入っていますが、以下のURLで見れます。もちろん英語です。<br />
<a href="http://www.sencha.com/deploy/touch/docs/">http://www.sencha.com/deploy/touch/docs/</a></p>
<p>本家フォーラム<br />
→　Sencha はExt の頃からforumで活発な議論が交わされています。Sencha のメンバーからのリプライも早いので、バグっぽいものを見つけたらとりあえずforum内を見てみると以外とすでに質問があがっていたりします。Sencha Touchのライブラリ自体に怪しい部分がたくさんあるので、困ったら覗いてみると良いかもしれません。<br />
<a href="http://www.sencha.com/forum/">http://www.sencha.com/forum/</a></p>
<p><span id="more-741"></span></p>
<p><strong>Hello,World!</strong><br />
とにかく短い行数でSencha Touchアプリを書く。<br />
HTML + JSで30行くらいかけば、とりあえずSencha Touchで動くWebアプリになっている。<br />
XCodeのプロジェクトテンプレートのviewベースのテンプレートのようなものを目指しました。<br />
コードはjsdo.itにあがっている Hello, World!になります。<br />
勉強会当日のサンプルコード間違ってました。すいません。jsdo.it上も修正済みです。</p>
<p><script src="http://jsdo.it/blogparts/dPu2/js" type="text/javascript"></script></p>
<p><a title="Hello, World!" href="http://jsdo.it/satake.sus4/dPu2">Hello, World! &#8211; jsdo.it &#8211; share JavaScript, HTML5 and CSS</a></p>
<p>多くのSench TouchのHTMLは以下のようにシンプルなものになります。<br />
 <strong>・HTML</strong></p>
<pre class="brush: html; ">

 &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;helloworld&lt;/title&gt;
 &lt;!-- 1. Sencha Touch CSSの読み込み--&gt;
 &lt;link rel=&quot;stylesheet&quot; href=&quot;st/resources/css/ext-touch.css&quot; type=&quot;text/css&quot;&gt;
 &lt;!-- 2. Sencha Touch ライブラリの読み込み--&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;st/ext-touch-debug.js&quot;&gt;&lt;/script&gt;
 &lt;!-- 3. Sencha Touch アプリケーションの読み込み--&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;main.js&quot;&gt;&lt;/script&gt;
 &lt;/head&gt;
 &lt;body&gt;&lt;/body&gt;
 &lt;/html&gt;
</pre>
<p>この中でやることは3つ。</p>
<ul>
<li>Sencha TouchのCSSを読み込む</li>
<li>Sencha TouchのJSを読み込む(3種類から選べるますが,ext-touch-debug.js)</li>
<li>自分のアプリケーションのJSファイル</li>
</ul>
<p>Sencha Touchの中には3種類のライブラリがあります。ext-touch.jsが本番用の圧縮されたライブラリです。<br />
 運用環境ではこのライブラリを使うとファイル読み込みファイルが小さくなります。<br />
 ただし、難読化されているのでライブラリ中のバグが見つけにくくなります。開発中は-debugのついた2つのライブラリから選択するが無難です。<br />
 ext-touch-debug.jsとext-touch-debug-w-comments.jsはファイル名の通りコメントがあるかないかの違いがあります。コメント付きは当然ファイルが大きくなるので、ext-touch-debug.jsを選んでおくとちょうどよいかもしれません。</p>
<p>ではmain.jsの中を見ていきます</p>
<p><strong>・javascript</strong></p>
<pre class="brush: js; ">

 Ext.setup({
 onReady: function() {
 var panel = new Ext.Panel({
 fullscreen: true,
 styleHtmlContent:true,
 html:&#039;Hello, Sencha Touch!!&#039;
 });
 }
 });
</pre>
<p>これだけです。なるべくよけいな物を排除しました。ポイントはExt.setup()とその引数のオブジェクトです。複雑なアプリを作る場合でも、このサンプルのような処理を必ず行います。</p>
<p>Ext.setup()でアプリの起動時の動作を定義します。引数にアプリの基本設定をオブジェクトの形式で渡します。(オブジェクトリテラル)</p>
<pre class="brush: js; ">

 Ext.setup(
 {
 //オブジェクトリテラル
 }
 );
</pre>
<p>Ext JSおよびSencha Touchではこのオブジェクトでコンポーネントの基本設定を記述する方法をよく取ります。</p>
<p>引数に渡されているオブジェクトはこんな感じです。</p>
<pre class="brush: js; ">

 {
 onReady: function() {
 //起動の処理
 }
 }
</pre>
<p> onReadyというプロパティに関数をセットしています。この関数がSencha Touchアプリの起動ポイントになります。複雑なアプリでも基本的にこのonReadyに設定されている部分から処理が始まっていきます。</p>
<p>さらに、その処理の中身をみると、以下のようになっています。</p>
<pre class="brush: js; ">

 var panel = new Ext.Panel({
 fullscreen: true,
 styleHtmlContent:true,
 html:&#039;Hello, Sencha Touch!!&#039;
 });
</pre>
<p> panelという変数で新しいExt.Panelを作成しています。このパネルの引数にもパネルの初期設定がオブジェクトが渡されています。<br />
 ここで今回のサンプルの基本となるパネルを作成します。Sencha Touchでは様々なパネルが用意さていますが、このサンプルでは最も基本的なExt.Panelクラスのパネルを作成しています。<br />
 Ext.Panelクラスにはコンフィグオプションと呼ばれるもので作成するパネルを定義することができます。new Ext.Panel()の引数に渡されてるオブジェクトの中身が今回作成するExt.Panelのコンフィグオプション設定になります。<br />
 コンフィグオプションはクラスごとにあらかじめ定義されている、<br />
 特別なオプションのことでAPIリファレンスを見るとどのクラスがどんなコンフィグオプションを持っているかが分かります。<br />
 <a href="http://extjs.blog.sus4.co.jp/files/2010/07/picture-5.png" title="Ext.PanelのAPIリファレンス" rel="lightbox[741]"><img class="aligncenter size-medium wp-image-746" title="Ext.PanelのAPIリファレンス" src="http://extjs.blog.sus4.co.jp/files/2010/07/picture-5-300x201.png" alt="Ext.PanelのAPIリファレンス" width="300" height="201" /></a><br />
 <a href="http://www.sencha.com/deploy/touch/docs/?class=Ext.Panel">http://www.sencha.com/deploy/touch/docs/?class=Ext.Panel</a><br />
 今回のサンプルではfullscreen,styleHtmlContent,htmlの３つだけを使っています。</p>
<p>・fullscreen:boolean パネルのwidthとheightを可能であれば100%に設定する。初期値false。これをtrueにするとmonitorOrientationのコンフィグが強制的にtrueに設定されるそうです。</p>
<p>・styleHtmlContent:多分boolean(APIリファセンス間違ってる) 自動的にHTMLコンテンツ用のスタイルを適応します。初期値はfalse。これをtrueにするとSencha Touchで定義されているパネルないHTMLコンテンツ用のスタイルを設定します。パネルの内容がコンポーネント等でなくHTMLの時はtrueにしておくと良いようです。具体的には以下のCSSがパネルのHTML要素に設定されます。</p>
<blockquote><p>
-webkit-user-select: auto;<br />
 color: #333;<br />
 font-size: 0.8em;<br />
 line-height: 1.5;<br />
 padding: 1.5em;</p></blockquote>
<p>・html:パネル内のHTMLコンテンツを設定。パネルがレンダリングされた後にこのHTMLが描画されます。</p>
<p>以上がHello, Worldサンプルのためのすべてのコードになります。<br />
 jsdo.it上であればHTMLファイルの方を記述する必要がないので、javascriptを10行書いて、Sencha Touchのライブラリ(jsとcss)を追加すればおしまいです。</p>
<p><strong>・実行結果</strong><br />
 <a href="http://extjs.blog.sus4.co.jp/files/2010/07/picture-7.png" title="Hello, World" rel="lightbox[741]"><img class="aligncenter size-medium wp-image-748" title="Hello, World" src="http://extjs.blog.sus4.co.jp/files/2010/07/picture-7-207x300.png" alt="Hello, World" width="207" height="300" /></a></p>
<p><strong>Hello,Worldにツールバーを追加するサンプル<br />
 </strong><br />
 <script src="http://jsdo.it/blogparts/z1IF/js" type="text/javascript"></script></p>
<p class="ttlBpJsdoit" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"><a title="Hello, World + tbar" href="http://jsdo.it/satake.sus4/z1IF">Hello, World + tbar &#8211; jsdo.it &#8211; share JavaScript, HTML5 and CSS</a></p>
<p><strong>・HTML</strong><br />
同じ</p>
<p><strong>・Javascript</strong></p>
<pre class="brush: js; ">

Ext.setup({
onReady: function() {
//dockするアイテム
var tbar = new Ext.Toolbar({
dock:&#039;top&#039;,　//dockする場所,
title:&#039;Hello, World&#039;,　//Toolbarの見出し
items:[
{
text:&#039;ボタン&#039;
}
]
});

//Dock先
var panel = new Ext.Panel({
fullscreen: true,
styleHtmlContent:true,
dockedItems:tbar,　//ここでtbarをdockedItemsに設定。
html:&#039;Hello, Sencha Touch!!&#039;
});
}
});
</pre>
<p>つぎにHello,Worldにツールバーを追加します。Ext JSではtbarというコンフィグオプションで設定していました。Sencha TouchではdockeItemsというコンフィグで設定します。<br />
APIリファレンスによると<br />
dockedItems:このパネルにドックされるコンポーネントまたはコンポーネントのまとまり(配列)<br />
となっています。<br />
コンポーネントであればなんでも設置できそうです。ここにExt.Toolbarオブジェクトを渡すことでiPhoneぽいUIのツールバーをパネルに追加できます。<br />
まずExt.Toolbarを作成します。</p>
<pre class="brush: js; ">

//dockするアイテム
var tbar = new Ext.Toolbar({
dock:&#039;top&#039;,　//dockする場所,
title:&#039;Hello, World&#039;,　//Toolbarの見出し
items:[
{
text:&#039;ボタン&#039;
}
]
});
</pre>
<p>Ext.Toolbarにも様々なコンフィグオプションがあります。詳しくはAPIリファレンスで確認してください。ここではdock,title,itemsの3つを設定します。<br />
<a href="http://www.sencha.com/deploy/touch/docs/?class=Ext.Toolbar">http://www.sencha.com/deploy/touch/docs/?class=Ext.Toolbar</a></p>
<p>・dock：String(ドックさせる場所)。APIリファレンスに載っていませんが、親パネルのどの位置に自分を設置するかを指定します。選べる位置は4種類,top,bottom,left,rightです。<br />
・title：String このツールバーの見出しのテキストを設定します。<br />
・items：Object/Array　このツールバーの子の要素を設定します。</p>
<p>今回のサンプルではExt.Toolbarのitemsにnew したクラスでなくオブジェクトを渡しています。今のところはサンプルのように書けばボタンが作れると思っておいてよいです。そのうちブログでも取り上げるかもしれません。defaultsコンフィグとxtypeでボタンを生成しています。こちらの記事を参考にしていただけるよいかもしれません。<br />
<a href="http://extjs.blog.sus4.co.jp/2009/11/11/extjs-tutorial5/">http://extjs.blog.sus4.co.jp/2009/11/11/extjs-tutorial5/</a></p>
<p>これでExt.Toolbarがtbarという変数で作成できたので、これをパネルのdockedItemsに設定します。</p>
<pre class="brush: js; ">

//Dock先
var panel = new Ext.Panel({
fullscreen: true,
styleHtmlContent:true,
dockedItems:tbar,　//ここでtbarをdockedItemsに設定。
html:&#039;Hello, Sencha Touch!!&#039;
});
</pre>
<p><strong>・実行結果</strong><br />
<a href="http://extjs.blog.sus4.co.jp/files/2010/07/picture-6.png" title="Hello, Worldにツールバーを追加" rel="lightbox[741]"><img class="aligncenter size-medium wp-image-747" title="Hello, Worldにツールバーを追加" src="http://extjs.blog.sus4.co.jp/files/2010/07/picture-6-200x300.png" alt="Hello, Worldにツールバーを追加" width="200" height="300" /></a></p>
<p>ツールバーがあるだけで、iPhoneアプリっぽくなりました。<br />
Sencha Touchアプリの基本は今回のHello, Worldになります。これを改造していくことでより複雑なアプリが作れるようになります。Sencha Touch付属のexamplesの中を眺めてみるとよいかもしれません。</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%2F07%2F29%2Ftutorial-tokyo-20100728%2F&amp;linkname=7%E6%9C%88%E3%81%AEExt%20JS%E5%8B%89%E5%BC%B7%E4%BC%9A%EF%BC%88%E6%9D%B1%E4%BA%AC%EF%BC%89%E3%80%8CSencha%20Touch%E3%81%AE%E3%81%AF%E3%81%98%E3%82%81%E3%81%8B%E3%81%9F%E3%80%80%E3%80%8D%E3%81%BE%E3%81%A8%E3%82%81"><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/07/29/tutorial-tokyo-20100728/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sencha Touch 入門:Sencha Touchのはじめかた（Ext JS &amp; Sencha Touch勉強会7月＠東京）のサンプルコード</title>
		<link>http://extjs.blog.sus4.co.jp/2010/07/27/sencha-studygroup-tokyo20100728/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/07/27/sencha-studygroup-tokyo20100728/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 12:27:19 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[dockedItems]]></category>
		<category><![CDATA[Ext.Carousel]]></category>
		<category><![CDATA[Ext.Toolbar]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[jsdo.it]]></category>
		<category><![CDATA[sencha]]></category>
		<category><![CDATA[Sencha Touch]]></category>
		<category><![CDATA[勉強会]]></category>
		<category><![CDATA[勉強会まとめ]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=736</guid>
		<description><![CDATA[2010/7/25のExt JS &#038; Sencha Touch勉強会7月＠東京でのsus4　佐竹の担当箇所のSencha Touch入門篇で使うサンプルコードをjsdo.itで公開しました。]]></description>
			<content:encoded><![CDATA[<p>2010/7/25のExt JS &amp; Sencha Touch勉強会7月＠東京でのsus4　佐竹の担当箇所のSencha Touch入門篇で使うサンプルコードをjsdo.itで公開しました。<br />
明日の勉強会では、PCのブラウザでも動作するサンプルばかりですので、jsdo.it上でも動作を確認できます。<br />
また簡単なサンプルばかりですので、forkしていただいて実際に手を動かしてももらうとより理解が深まると思います。<br />
勉強会では持ち時間的に２,３つしか紹介できないと思います。<br />
勉強会のアジェンダはこちらです。</p>
<p><a href="http://extjs.blog.sus4.co.jp/2010/07/27/getting-started-width-sencha-touch-tokyo/">Sencha Touch 入門: Ext JS &amp; Sencha Touch勉強会7月＠東京(2010/7/25 )のアジェンダ</a></p>
<p><strong>Sencha Touchのはじめかたサンプルコード</strong></p>
<p><strong>Sencha Hello, World!</strong><br />
<script src="http://jsdo.it/blogparts/dPu2/js" type="text/javascript"></script> <a title="Hello, World!" href="http://jsdo.it/satake.sus4/dPu2">Hello, World! &#8211; jsdo.it &#8211; share JavaScript, HTML5 and CSS</a></p>
<hr />
<span id="more-736"></span><br />
<strong>Sencha Hello, World! + tbar</strong> <script src="http://jsdo.it/blogparts/z1IF/js" type="text/javascript"></script></p>
<p class="ttlBpJsdoit" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"><a title="Hello, World + tbar" href="http://jsdo.it/satake.sus4/z1IF">Hello, World + tbar &#8211; jsdo.it &#8211; share JavaScript, HTML5 and CSS</a></p>
<hr />
<p><strong>Sencha Touch Complex Docked Items</strong><br />
<script src="http://jsdo.it/blogparts/eh7b/js" type="text/javascript"></script> <a title="Sencha Touch Complex Docked Items" href="http://jsdo.it/satake.sus4/eh7b">Sencha Touch Complex Docked Items &#8211; jsdo.it &#8211; share JavaScript, HTML5 and CSS</a> </p>
<hr />
<p><strong>Sencha Carousel (Edit)</strong><br />
<script src="http://jsdo.it/blogparts/czlu/js" type="text/javascript"></script></p>
<p class="ttlBpJsdoit" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"><a title="Sencha Carousel (Edit)" href="http://jsdo.it/satake.sus4/czlu">Sencha Carousel (Edit) &#8211; jsdo.it &#8211; share JavaScript, HTML5 and CSS</a></p>
<hr />
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F07%2F27%2Fsencha-studygroup-tokyo20100728%2F&amp;linkname=Sencha%20Touch%20%E5%85%A5%E9%96%80%3ASencha%20Touch%E3%81%AE%E3%81%AF%E3%81%98%E3%82%81%E3%81%8B%E3%81%9F%EF%BC%88Ext%20JS%20%26%23038%3B%20Sencha%20Touch%E5%8B%89%E5%BC%B7%E4%BC%9A7%E6%9C%88%EF%BC%A0%E6%9D%B1%E4%BA%AC%EF%BC%89%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/07/27/sencha-studygroup-tokyo20100728/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sencha Touch 入門: Ext JS &amp; Sencha Touch勉強会7月＠東京(2010/7/25 )のアジェンダ</title>
		<link>http://extjs.blog.sus4.co.jp/2010/07/27/getting-started-width-sencha-touch-tokyo/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/07/27/getting-started-width-sencha-touch-tokyo/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 05:44:06 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[Sencha Touch]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[sencha]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=732</guid>
		<description><![CDATA[2010/7/25のExt JS &#038; Sencha Touch勉強会7月＠東京でのsus4　佐竹の担当箇所のSencha Touch入門篇アジェンダです。
]]></description>
			<content:encoded><![CDATA[<p><div style="margin-left: 1em; float: right;"><script type="text/javascript"><!--
google_ad_client = "pub-9023017642999258";
/* 336x280, ExtJS Blog 09/11/15 */
google_ad_slot = "7497179445";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
<p>2010/7/25のExt JS &amp; Sencha Touch勉強会7月＠東京でのsus4　佐竹の担当箇所のSencha Touch入門篇アジェンダです。</p>
<p>時間と場所は下記の通りです。残念ながら既に定員に達しているようです。<br />
当日はUstreamでも配信も予定されているようですので、こちらでご覧ください。<br />
<a href="http://www.ustream.tv/channel/extjapan" target="_blank">http://www.ustream.tv/channel/extjapan</a><br />
以下 Ext Japanブログより転載</p>
<blockquote><p>日時：2010年7月28日（水）19:00～21:00（18:45開場）<br />
募集人数：45名<br />
場所：東京都港区東新橋1-9-1 東京汐留ビルディング9Fソフトバンク株式会社内（今回はいつもと会場が違いますので、ご注意ください。）<br />
参加費：無料<br />
アジェンダ：<br />
Senchaへのブランド変更について（直鳥）<br />
Sencha Touch入門（株式会社sus4 佐竹様）<br />
Sencha TouchとYubizoで作るネイティブアプリ（株式会社アイキューブドシステムズ 佐々木様）<br />
SpreadOfficeとSencha Touch（小堤）<br />
ホワイトクラウド シェアードHaaSのご紹介（ソフトバンクテレコム株式会社 加藤様）</p></blockquote>
<p>&#8212;&#8211;</p>
<p><strong>Sencha Touch入門：Sencha Touchのはじめかた　佐竹裕行 &#8211; 株式会社sus4</strong></p>
<p><strong>・Sencha TouchでつくるiPhone/iPadアプリ</strong></p>
<p><strong>・Sencha Touchの環境</strong><br />
エディタ等<br />
デバッグコンソール</p>
<p><strong>・Hello, World!</strong><br />
Sencha Touchのアプリを作る。<br />
HTML + JS合わせても30行くらいで<br />
APIリファレンス、デバッグ環境など</p>
<p><strong>・付属サンプルCarouselの解説</strong><br />
以前書いたブログの記事ベースにもう少し詳しく、Sencha Touchアプリの作り方を紹介します。<br />
<a href="http://extjs.blog.sus4.co.jp/2010/06/28/sencha-ex-carousel/" target="_blank">http://extjs.blog.sus4.co.jp/2010/06/28/sencha-ex-carousel/</a></p>
<p>&#8212;&#8211;</p>
<p>時間的にSencha Touchのさわり位しかできないと思いますが、<br />
実際に手を動かしてSencha Touchを作ることと、その際のTipsが紹介できれば良いかなと思います。<br />
APIリファレンスの読み方、フォーラム利用等。<br />
内容はできるだけ簡単にして、ExtJSを知らなくても分かる内容です。<br />
まさに入門という内容で、サンプルもできる限り簡単なものにしました。<br />
Hello,World!に至ってはHTML + JS合わせても30行程度コードを書くだけです。<br />
Sencha Touchの開発の雰囲気がつかめれば良いかなと思っています。<br />
またSencha Touchのパッケージに含まれるexamplesを自力で読めるようになるのが目標です。</p>
<p><strong>事前の準備しておくと良いもの：</strong><br />
・Sencha Touch ライブラリのダウンロード<br />
<a href="http://extjs.co.jp/products/touch/" target="_blank">http://extjs.co.jp/products/touch/</a></p>
<p>・iPhone、iPad、Androidでバイスの実機　もしくは　XCode付属iPhoneシュミレーター<br />
Android,iPhone 3G以下はあまりおすすめできません。<br />
XCodeはダウンロードに数GBかかるので事前にインストールしておくいていただくとスムーズです。</p>
<p>・ExtJS自体を知らない方はこのブログのチュートリアルの以前の記事を読んでおいていただけると良いかと思います。<br />
<a href="http://extjs.blog.sus4.co.jp/2009/10/29/勉強会ext-onreadyからはじめるextjsのまとめ/" target="_blank">勉強会ext-onreadyからはじめるextjsのまとめ</a><br />
<a href="http://extjs.blog.sus4.co.jp/tag/sencha-touch/">sus4 Ext JSブログ内Sencha Touchの記事</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%2F07%2F27%2Fgetting-started-width-sencha-touch-tokyo%2F&amp;linkname=Sencha%20Touch%20%E5%85%A5%E9%96%80%3A%20Ext%20JS%20%26%23038%3B%20Sencha%20Touch%E5%8B%89%E5%BC%B7%E4%BC%9A7%E6%9C%88%EF%BC%A0%E6%9D%B1%E4%BA%AC%282010%2F7%2F25%20%29%E3%81%AE%E3%82%A2%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%80"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/07/27/getting-started-width-sencha-touch-tokyo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ExtJS入門39　ファイルをアップロードするフォームフィールド</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/24/extjs-tutorial39-fileuploadfield/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/24/extjs-tutorial39-fileuploadfield/#comments</comments>
		<pubDate>Mon, 24 May 2010 09:15:23 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Ext.form.FormPanel]]></category>
		<category><![CDATA[Ext.form.TextField]]></category>
		<category><![CDATA[Ext.ux.form.FileUploadField]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[ux]]></category>
		<category><![CDATA[エディタブル・グリッド]]></category>
		<category><![CDATA[エディター]]></category>
		<category><![CDATA[コールバック]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[ファイルアップロード]]></category>
		<category><![CDATA[フォーム]]></category>
		<category><![CDATA[フォームパネル]]></category>
		<category><![CDATA[勉強会]]></category>

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

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

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

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

    header(&quot;Content-Type: text/html; charset=utf-8&quot;);
    echo json_encode($res);
</pre>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;

&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
    &lt;title&gt;ExtJS名古屋勉強会　フォーム　ファイルのアップロード&lt;/title&gt;

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

    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/ext-all.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/src/locale/ext-lang-ja.js&quot;&gt;&lt;/script&gt;

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

    &lt;script type=&quot;text/javascript&quot; src=&quot;form-fileupload.js&quot;&gt;&lt;/script&gt;
    &lt;style TYPE=&quot;text/css&quot;&gt;
    &lt;!--
        .tick {background-image: url(../img/icon/tick.png) !important;}
    --&gt;
    &lt;/style&gt;

&lt;/head&gt;
&lt;body&gt;
    &lt;div style=&quot;width:500px;margin:0 auto;padding:15px;background-color:#D3E1F1;font-size:small;&quot;&gt;
        &lt;p style=&quot;font-weight:bold;padding:3px;margin-bottom:10px;&quot;&gt;
            Extのファイルのアップロードフォーム&lt;br /&gt;
            ux.fileUploadField　を使ってファイルをアップロードできるフォームを作成します。
        &lt;/p&gt;
        &lt;div id=&quot;form&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        &lt;div id=&quot;form2&quot;&gt;&lt;/div&gt;

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

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

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

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

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

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

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

    var form = new Ext.form.FormPanel({

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

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

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

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

                        //失敗時
                        failure:function(basicForm,action){
                            Ext.Msg.alert(&#039;エラー&#039;,&#039;サーバーへの接続に失敗しました。&#039;).setIcon(Ext.Msg.ERROR);
                        }
                    });
                }
            }
        ]
    });
</pre>
<p>formの送信後はファイル保存の処理はサーバーサイドで行われます。ファイルを送信するので、これまでの短いテキストのやり取りとは違いリクエストからレスポンスまでの時間が多少気になります。そのためsubmit()メソッドに渡す設定の中のwaitMsgに送信～完了までの間に表示するロードマスクで表示するテキストを設定します。このロードマスクはリクエストが完了後に自動的に消えるので手軽に使用できます。ファイルアップロードなどの処理はサーバーサイドでの処理に時間が駆るので、一般的にロードマスクを表示させるようにしておくのがよいでしょう。</p>
<p>今回のサンプルの注意として,FireFoxでfirerebugを起動したままファイルの送信リクエストを事項すると、レスポンスのJSONが上手く展開できないようです。上手くいかないときは一度Firebugを無効にして試してみてください。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F05%2F24%2Fextjs-tutorial39-fileuploadfield%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8039%E3%80%80%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/05/24/extjs-tutorial39-fileuploadfield/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS入門36 HTMLの標準フォームにExtJSのフィールドを設置する</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/19/extjs-tutorial36-formhtml/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/19/extjs-tutorial36-formhtml/#comments</comments>
		<pubDate>Wed, 19 May 2010 04:02:30 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ext.Button]]></category>
		<category><![CDATA[Ext.form.TextField]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[renderTo]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[イベント]]></category>
		<category><![CDATA[エディター]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[フォーム]]></category>
		<category><![CDATA[ボタン]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=647</guid>
		<description><![CDATA[今回はExtJSのフォーム（フィールド）をHTMLのノーマルなインプットのようにform要素に仕込むサンプルを紹介します。
]]></description>
			<content:encoded><![CDATA[<p>今回はExtJSのフォーム（フィールド）をHTMLのノーマルなインプットのようにform要素に仕込むサンプルを紹介します。<br />
<div id="attachment_648" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-19_12-34-37.png" title="HTMLの標準フォームにExt.form.Textfieldをレンダリング" rel="lightbox[647]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-19_12-34-37-150x150.png" alt="HTMLの標準フォームにExt.form.Textfieldをレンダリング" title="HTMLの標準フォームにExt.form.Textfieldをレンダリング" width="150" height="150" class="size-thumbnail wp-image-648" /></a><p class="wp-caption-text">HTMLの標準フォームにExt.form.Textfieldをレンダリング</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>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/18/extjs-tutorial35-tablelayout/">ExtJS入門35 Tableレイアウトのフォーム</a></li>
</ul>
<p>リファレンスはこちらから<br />
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><span id="more-647"></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名古屋勉強 htmlにフィールドをレンダリング&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-layout3.js&quot;&gt;&lt;/script&gt;
    &lt;style TYPE=&quot;text/css&quot;&gt;
    &lt;!--
        .submit {background-image: url(../img/icon/tick.png) !important;}
        .message {
           background-color:#FFF;
           padding:10px;
           color:red;
        }
        form p
        {
            margin:5px;
        }
    --&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のフォームのレイアウト HTMLにExtのフィールドを仕込む
        &lt;/p&gt;
        &lt;div id=&quot;msg&quot;&gt;&lt;/div&gt;
        &lt;form method=&quot;post&quot; action=&quot;post.php&quot; name=&quot;extform&quot;&gt;
            &lt;p&gt;インプット1:&lt;span id=&quot;input1&quot;&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;インプット2:&lt;span id=&quot;input2&quot;&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;インプット3:&lt;span id=&quot;input3&quot;&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;インプット4:&lt;span id=&quot;input4&quot;&gt;&lt;/span&gt;&lt;/p&gt;

            &lt;p&gt;普通のイプット:&lt;input name=&quot;input5&quot; type=&quot;text&quot;/&gt;&lt;/p&gt;
        &lt;br/&gt;
        &lt;/form&gt;
        &lt;div id=&quot;submit&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;form-layout3.js&quot;&gt;form-layout3.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 dh = Ext.DomHelper;

    for (var i=1;i &lt; 5; i++)
    new Ext.form.TextField({
        renderTo:&#039;input&#039; + i,
        allowBlank:false,
        name:&#039;input&#039; + i,
        listeners:{
            blur:function(field){
                var value = field.getValue();
                console.debug(value);
                console.debug(value.length);
                if (value.length &lt; 5) {
                    msg = &#039;短すぎます&#039;;
                    field.markInvalid(msg);
                }
            },
            invalid:function(field,msg){
                var msgdiv = Ext.get(&#039;msg-&#039; + field.name);
                if (msgdiv) {
                    msgdiv.remove();
                }
                dh.append(&#039;msg&#039;,
                    {
                        tag: &#039;div&#039;,
                        cls:&#039;message&#039;,
                        id: &#039;msg-&#039; + field.name,
                        html:field.name + &#039;:&#039; + msg
                    }
                );
            },
            valid:function(field){
                var msg = Ext.get(&#039;msg-&#039; + field.name);
                if (msg) {
                    msg.remove();
                }
            }
        }
    });

    new Ext.Button({
        renderTo:&#039;submit&#039;,
        text:&#039;送信&#039;,
        iconCls:&#039;submit&#039;,
        handler:function(){
            document.extform.submit();
        }
    });
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_648" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-19_12-34-37.png" title="HTMLの標準フォームにExt.form.Textfieldをレンダリング" rel="lightbox[647]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-19_12-34-37-300x192.png" alt="HTMLの標準フォームにExt.form.Textfieldをレンダリング" title="HTMLの標準フォームにExt.form.Textfieldをレンダリング" width="300" height="192" class="size-medium wp-image-648" /></a><p class="wp-caption-text">HTMLの標準フォームにExt.form.Textfieldをレンダリング</p></div></p>
<p>テーブルレイアウトは、表のようにパネルを配置します。これをフォームに適応するには前回同様fieldsetでラップしてfieldset内はformレイアウトを使いラベルを表示させます。<br />
tableレイアウトは列の数を予め設定しておく必要があります。レイアウトのコンフィグの設定はlayoutConfigで行います。</p>
<pre class="brush: html; ">

        layout:&#039;table&#039;,
        layoutConfig:{
            columns:3
        }
</pre>
<p>ExtJSのフィールドをHTMLで記述したフォームの中に設置しています。フィールドのrenderToコンフィグでレンダリング先を指定しいます。<br />
例えばinput1のフィールドはspan#input1に下のように描画されます。</p>
<pre class="brush: js; ">

&lt;span id=&quot;input1&quot;&gt;
	&lt;input type=&quot;text&quot; name=&quot;input1&quot; id=&quot;ext-comp-1001&quot; autocomplete=&quot;off&quot; size=&quot;20&quot; class=&quot; x-form-text x-form-field  x-form-invalid&quot;&gt;
&lt;/span&gt;	
</pre>
<p>このようにテキストフィールドはinput type=&#8221;text&#8221;&#8230;という要素が生成されるためHTMLのフォームの中にExtJSのフィールドを仕込むことができます。<br />
ただしfieldLabelなどの機能は利用できません。fieldLabelなどは親となるコンポーネントに依存しているためです。<br />
ExtJSのフィールドにすることで、イベントリスナを設定することができるようになります。サンプルコードではblurイベントが発火されると、長さをチェックするような処理を記述しています。もちろんAjaxリクエストなども可能です。<br />
invalid時のエラーメッセージも表示されなくなるので、サンプルコードではDomHelperを使ってエラーメッセージを表示するようにしています。</p>
<p>一見普通のフォームに見せておいて裏側でバリバリExtを使うといったことが可能になります。<br />
サンプルコードではサブミットボタンもExtJSのボタンにしてしています。フィールドと同じようにrenderToで指定した要素にレンダリングしています。<br />
formBindは使えませんが、妥当性のチェックとボタンを手動でしていして、disabledに設定することもできると思います。<br />
datefield等を使うこともできるので、単発で使うこともできますが、ExtJSのライブラリのサイズが大きいのが少しマイナス要素です。ExtJS2.3ではextjs.comで必要なライブラリだけを選べるサービスがあったのですが、3.ｘではなくなっています。</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%2F19%2Fextjs-tutorial36-formhtml%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8036%20HTML%E3%81%AE%E6%A8%99%E6%BA%96%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%ABExtJS%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E8%A8%AD%E7%BD%AE%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/19/extjs-tutorial36-formhtml/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入門34 ComboBoxの基本</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/17/extjs-tutorial34-combobox/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/17/extjs-tutorial34-combobox/#comments</comments>
		<pubDate>Mon, 17 May 2010 04:13:00 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[ComboBox]]></category>
		<category><![CDATA[DataView]]></category>
		<category><![CDATA[Ext.form.ComboBox]]></category>
		<category><![CDATA[Ext.form.FormPanel]]></category>
		<category><![CDATA[Ext.XTemplate]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[コンボボックス]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[データビュー]]></category>
		<category><![CDATA[フォーム]]></category>
		<category><![CDATA[フォームパネル]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=638</guid>
		<description><![CDATA[今回は以前紹グリッドのサンプルで簡単に紹介したコンボボックスを取り上げます。コンボボックスはHTMLフォームのセレクトボックスのような選択式のフォームを生成します。ExtJSのコンボボックスでは、項目のデータをストアから利用します。今回はグリッドの回で使ったサンプルのストアとデータを利用しています。]]></description>
			<content:encoded><![CDATA[<p>今回は以前紹グリッドのサンプルで簡単に紹介したコンボボックスを取り上げます。コンボボックスはHTMLフォームのセレクトボックスのような選択式のフォームを生成します。ExtJSのコンボボックスでは、項目のデータをストアから利用します。今回はグリッドの回で使ったサンプルのストアとデータを利用しています。<br />
<div id="attachment_639" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-17_13-07-58.png" title="ComComboBoxの基本" rel="lightbox[638]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-17_13-07-58-150x150.png" alt="ComboBoxの基本" title="ComComboBoxの基本" width="150" height="150" class="size-thumbnail wp-image-639" /></a><p class="wp-caption-text">ComboBoxの基本</p></div></p>
<p>グリッド関連の記事</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/?s=grid">ExtJSで楽しくRIA業務アプリ開発のgridの記事一覧</a></li>
</ul>
<p>フォーム関連の過去の記事はこちらからです。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/22/extjs-tutorial-form-baseic/">ExtJS入門　ExtJSのフォームについて（基本編）</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/13/extjs-tutorial32-formbasic/">ExtJS入門32　フォームパネルとフィールド(基本編)</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/14/631/">ExtJS入門33 Columnレイアウトのフォーム</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.ComboBoxクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.ComboBox">http://extdocs.xenophy.com/?class=Ext.form.ComboBox</a></p>
<p><span id="more-638"></span></p>
<p><strong>JSON DATA:</strong></p>
<pre class="brush: js; ">

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

        {
            &#039;id&#039;:1,
            &#039;rank&#039;:1,
            &#039;name&#039;:&#039;IE&#039;,
            &#039;percentage&#039;:62.69,
            &#039;url&#039; : &#039;http://www.microsoft.com/japan/windows/products/winfamily/ie/default.mspx&#039;,
            &#039;img&#039; : &#039;../img/ie64.png&#039;
        },
        {
            &#039;id&#039;:2,
            &#039;rank&#039;:2,
            &#039;name&#039;:&#039;Firefox&#039;,
            &#039;percentage&#039;:24.61,
            &#039;url&#039; :&#039;http://mozilla.jp/firefox/&#039;,
            &#039;img&#039; : &#039;../img/firefox64.png&#039;
        },
        {
            &#039;id&#039;:3,
            &#039;rank&#039;:3,
            &#039;name&#039;:&#039;Chrome&#039;,
            &#039;percentage&#039;:4.63,
            &#039;url&#039; : &#039;http://www.google.com/chrome/&#039;,
            &#039;img&#039; : &#039;../img/chrome64.png&#039;
        },
        {
            &#039;id&#039;:4,
            &#039;rank&#039;:4,
            &#039;name&#039;:&#039;Safari&#039;,
            &#039;percentage&#039;:4.46,
            &#039;url&#039;: &#039;http://www.apple.com/jp/safari/&#039;,
            &#039;img&#039; : &#039;../img/safari64.png&#039;
        },
        {
            &#039;id&#039;:5,
            &#039;rank&#039;:5,
            &#039;name&#039;:&#039;Opera&#039;,
            &#039;percentage&#039;:2.40,
            &#039;url&#039; : &#039;http://jp.opera.com/&#039;,
            &#039;img&#039; : &#039;../img/opera64.png&#039;
        },
        {
            &#039;id&#039;:6,
            &#039;rank&#039;:6,
            &#039;name&#039;:&#039;Opera Mini&#039;,
            &#039;percentage&#039;:0.53,
            &#039;url&#039; : &#039;http://jp.opera.com/&#039;,
            &#039;img&#039; : &#039;../img/opera64.png&#039;
        }
    ]
}
</pre>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

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

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

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

            Extのコンボボックス
        &lt;/p&gt;
        &lt;div id=&quot;form&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;form-combo.js&quot;&gt;form-combo.js&lt;/a&gt;&lt;br/&gt;
        JSON file：&lt;a href=&quot;data.json&quot;&gt;data.json&lt;/a&gt;&lt;br/&gt;

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

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

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

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

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

    var form = new Ext.form.FormPanel({
        renderTo:&#039;form&#039;,
        title:&#039;コンボボックスフォーム&#039;,
        height:280,
        width:500,
        bodyStyle:{
            padding:&#039;8px&#039;
        },
        footerStyle:{   //ボタン周りの表示の調整用スタイル
            border:&#039;solid 1px #99BBE8&#039;,
            &#039;border-top&#039;:&#039;none&#039;
        },
        labelWidth:180,
        items:[
            combo1,combo2,combo3
        ],
        buttonAlign:&#039;center&#039;,
        buttons:[
            {
                text:&#039;決定&#039;,
                iconCls:&#039;tick&#039;,
                handler:function(){
                    //フォームパネルからフィールドを取得
                    var formFields = form.getForm();
                    //フィールドから値を取得
                    var formValues = formFields.getValues();
                    //入力項目を表示する処理(普通は値をポストしますが、今回はフィールド名と値を表示する)
                    var data = [];
                    Ext.iterate(formValues,function(key,val,arr){
                        data.push({
                            fieldname:key,
                            formvalue:val
                        });
                    });

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

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

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

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

var combo3 = new Ext.form.ComboBox({
		・・・
        itemSelector:&#039;div.browser-list&#039;,
        tpl:new Ext.XTemplate(
            &#039;&lt;tpl for=&quot;.&quot;&gt;&#039;,
                &#039;&lt;div class=&quot;browser-list&quot; style=&quot;text-align:center;&quot;&gt;&#039;,
                &#039;&lt;img src={img} width=&quot;50&quot;/&gt;&lt;br/&gt;&#039;,
                &#039;{name}&#039;,
                &#039;&lt;/div&gt;&#039;,
            &#039;&lt;/tpl&gt;&#039;
        )
		・・・
    });
</pre>
<p>コンボボックスのtplのコンフィグオプションにXTemplateでテンプレートを設定します。DataViewのようにitemSelectorを設定してクリックするノードを指定します。サンプルコードではdiv.browser-listを指定しています。今回のテンプレートではブラウザの画像を表示するように設定しています。XTemplateとDataViewの知識があれば特に難しいことは無く、簡単にデザインを変更できます。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F05%2F17%2Fextjs-tutorial34-combobox%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8034%20ComboBox%E3%81%AE%E5%9F%BA%E6%9C%AC"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/05/17/extjs-tutorial34-combobox/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ExtJS入門33 Columnレイアウトのフォーム</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/14/631/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/14/631/#comments</comments>
		<pubDate>Fri, 14 May 2010 03:50:49 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Column]]></category>
		<category><![CDATA[ColumnLayout]]></category>
		<category><![CDATA[Ext.form.FieldSet]]></category>
		<category><![CDATA[Ext.form.FormPanel]]></category>
		<category><![CDATA[Ext.form.TextField]]></category>
		<category><![CDATA[Ext.XTemplate]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[FieldSet]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[カラムレイアウト]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[フィールドセット]]></category>
		<category><![CDATA[フォーム]]></category>
		<category><![CDATA[フォームパネル]]></category>
		<category><![CDATA[プロパティ メソッド イベント コンフィグオプション ダイレクトリンク ContainerLayout   ColumnLayout Ext.layout.ColumnLayout]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=631</guid>
		<description><![CDATA[フォームのレイアウトについてフォームパネルのではデフォルトで'form'レイアウトが設定されています。'form'レイアウトでは、fieldLabelを表示するなどフォームフィールドを設置に最適なレイアウトを提供してくれます。しかし複雑なフォームの配置ができません。フォームパネルのレイアウトコンフィグを変更することでより自由なレイアウトでフィールドを配置する方法を紹介します。
今回はcolumnレイアウトの紹介です。]]></description>
			<content:encoded><![CDATA[<p>フォームのレイアウトについてフォームパネルのではデフォルトで&#8217;form&#8217;レイアウトが設定されています。&#8217;form&#8217;レイアウトでは、fieldLabelを表示するなどフォームフィールドを設置に最適なレイアウトを提供してくれます。しかし複雑なフォームの配置ができません。フォームパネルのレイアウトコンフィグを変更することでより自由なレイアウトでフィールドを配置する方法を紹介します。<br />
今回はcolumnレイアウトの紹介です。<br />
<div id="attachment_632" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-14_12-45-38.png" title="Columnレイアウトのフォーム" rel="lightbox[631]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-14_12-45-38-150x150.png" alt="Columnレイアウトのフォーム" title="Columnレイアウトのフォーム" width="150" height="150" class="size-thumbnail wp-image-632" /></a><p class="wp-caption-text">Columnレイアウトのフォーム</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>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.FormPanelクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.FormPanel">http://extdocs.xenophy.com/?class=Ext.form.FormPanel</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.FieldSetクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.FieldSet">http://extdocs.xenophy.com/?class=Ext.form.FieldSet</a></p>
<p>ExtJS -3.0 日本語APIドキュメント &#8211; Ext.layout.ColumnLayoutクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.layout.ColumnLayout">http://extdocs.xenophy.com/?class=Ext.layout.ColumnLayout</a></p>
<p><span id="more-631"></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-layout.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-layout.js&quot;&gt;form-layout.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;,
        autoScroll:true,
        title:&#039;Columnレイアウトのフォーム&#039;,
        height:380,
        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;column&#039;,
        defaults:{
            columnWidth:.5,
            border:false,
            xtype:&#039;fieldset&#039;,
            labelAlign:&#039;top&#039;,
            defaults:{
                xtype:&#039;textfield&#039;,
                emptyText:&#039;入力してください&#039;,   //空のときのテキスト
                anchor:&#039;90%&#039;,
                msgTarget:&#039;under&#039;,   //入力に誤りがある場合はフィールドの下に表示
                allowBlank:false
            }
        },
        items:[
            {
                xtype:&#039;displayfield&#039;,
                value:&#039;fieldLabelはformレイアウトの場合しか表示されないので、さらにフィールドセットでラップしてformレイアウトの中にフィールド入れています。&lt;br/&gt;&amp;amp;nbsp;&#039;,
                hideLabel:true,
                columnWidth:.9
            },
            {
                items:{
                    name:&#039;samplefield1&#039;,
                    fieldLabel:&#039;テキストフィールド1&#039;
                }
            },
            {
                items:{
                    name:&#039;samplefield2&#039;,
                    fieldLabel:&#039;テキストフィールド2&#039;
                }
            },
            {
                columnWidth:.2,
                items:{
                    name:&#039;samplefield3&#039;,
                    fieldLabel:&#039;テキストフィールド3&#039;,
                }
            },
            {
                columnWidth:.2,
                items:{
                    name:&#039;samplefield4&#039;,
                    fieldLabel:&#039;テキストフィールド4&#039;,
                }
            },
            {
                columnWidth:.2,
                items:{
                    name:&#039;samplefield5&#039;,
                    fieldLabel:&#039;テキストフィールド5&#039;,
                }
            },
            {
                columnWidth:.2,
                items:{
                    name:&#039;samplefield6&#039;,
                    fieldLabel:&#039;テキストフィールド6&#039;,
                }
            },
            {
                columnWidth:.2,
                items:{
                    name:&#039;samplefield7&#039;,
                    fieldLabel:&#039;テキストフィールド7&#039;,
                }
            },
            {
                title:&#039;左のセット&#039;,
                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_632" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-14_12-45-38.png" title="Columnレイアウトのフォーム" rel="lightbox[631]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-14_12-45-38-300x274.png" alt="Columnレイアウトのフォーム" title="Columnレイアウトのフォーム" width="300" height="274" class="size-medium wp-image-632" /></a><p class="wp-caption-text">Columnレイアウトのフォーム</p></div></p>
<p>まずcolumnレイアウトの紹介です。カラムレイアウトでは列表示を指定できます。itemsに配置するコンポーネントにcolumnWidthで幅の占有率を指定します。（0～1.0）。<br />
これでフィールドをカラムの表示にできます。しかしカラムレイアウトの直下のitemsにフィールドを置いた場合、fieldLabel等が生成されません。fieldLabelを表示するためにはformレイアウトの中にフィールドを設置する必要があります。<br />
そこで、columnレイアウトの直下のコンポーネントはfieldsetに設定してfieldsetのレイアウトをformにすることで,formレイアウト内にフィールドを配置することで解消できます。サンプルコードではフォームパネルの直下にfieldsetを9個設置してそれぞれ1～2個のフィールドを置いています。<br />
構造だけを抜き出すとこんな感じになります。</p>
<pre class="brush: js; ">

new Ext.form.FormPanel({
       ・・・
        layout:&#039;column&#039;,
        defaults:{
            columnWidth:.5,
            xtype:&#039;fieldset&#039;,
            defaults:{
			・・・
            }
        },
        items:[
            {
                xtype:&#039;displayfield&#039;,
                columnWidth:.9
            },
            {
				//filedset1
            },
            {
				//filedset2
            },
            {
				//filedset3
            },
            {
				//filedset4
            },
            {
				//filedset5
            },
            {
				//filedset6
            },
            {
				//filedset7
            {
                title:&#039;左のセット&#039;,
				//filedset8
            },
            {
                title:&#039;右のセット&#039;,
				//filedset9
        ]
		・・・
});
</pre>
<p>それぞれのfieldset内に実際の入力フィールドがあります。そしてcolumnWidthもフィールドではなくfieldsetに記述している点に注意してください。</p>
<p>fieldsetのオプションはほとんど同じなので,defaultsで設定を記述しています。defaultsの中のdefaultsはfieldset内のフィールドの初期値の設定です。<br />
defaultsとdefaultsの中のdefaultsでフォーム内大まかなコンフィグを決めておくとコードが見やすくなります。</p>
<pre class="brush: js; ">

	defaults:{
            columnWidth:.5,
            border:false,
            xtype:&#039;fieldset&#039;,
            labelAlign:&#039;top&#039;,
            defaults:{
                xtype:&#039;textfield&#039;,
                emptyText:&#039;入力してください&#039;,   //空のときのテキスト
                anchor:&#039;90%&#039;,
                msgTarget:&#039;under&#039;,   //入力に誤りがある場合はフィールドの下に表示
                allowBlank:false,
                columnWidth:.3
            }
        },
</pre>
<p>フィールドセットはフィールドをまとめるコンテナで、パネルのように動作してくれます。Ext.form.FieldSetクラスは<br />
Observable > Component > BoxComponent > Container > Panel > FieldSet<br />
というようにパネルを継承しています。そのためExt.Panelで使えるレイアウト関連のオプションが使えるわけです(collapsibleなど)。<br />
フィールドセットのデフォルトのlayoutはformに設定されています。そのためフィールドに配置したフィールドはformレイアウトで表示されます。そのためlayoutを指定しない場合は縦に並べて表示されます。(テキストフィールド8、9、10、11の部分)<br />
サンプルコードは少し複雑ですがフィールドセットのベーシックな使い方をしているのがテキストフィールド8、9、10、11の部分になります。</p>
<pre class="brush: js; ">

			//defaultsで大まかなオプションは決めてある
			{
                title:&#039;左のセット&#039;,
                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;
                    }
                ]
            }
</pre>
<p>今回の場合は<br />
FormPanel<br />
→fieldset<br />
→→field<br />
→fieldset<br />
→→field<br />
・・・<br />
という構造になっています。このフォームの場合、値の取得や初期値のセットを再帰的に行わないといけない感じがしますが、フィールドセットにラップされているフィールドはFormPanelのgetFrom()メソッドできちんと取得されます。フォームの値の取得やセットのときはラップされていることを特に意識することなく実行できます。すごく便利ですね。</p>
<p>今回はカラムレイアウトの紹介でした。次回は別のレイアウトを紹介しようと思います。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F05%2F14%2F631%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8033%20Column%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/14/631/feed/</wfw:commentRss>
		<slash:comments>1</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>ExtJS入門　JSONP経由でTwitterの情報をDataViewに表示する その2</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/12/extjs-tutorial-twitter-dataview-sample2/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/12/extjs-tutorial-twitter-dataview-sample2/#comments</comments>
		<pubDate>Wed, 12 May 2010 02:42:00 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[DataView]]></category>
		<category><![CDATA[Ext.DataView]]></category>
		<category><![CDATA[Ext.XTemplate]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JSONP]]></category>
		<category><![CDATA[JsonStore]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Twitter Search API]]></category>
		<category><![CDATA[イベント]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[データビュー]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=621</guid>
		<description><![CDATA[前回のサンプルのおまけです。前回のサンプルコードExt.DataViewを使ってTwitter Search APIの情報を表示していました。今回はダブルクリックイベントとホバリング時のCSSクラスの設定を行ってもう少し使えるアプリっぽく修正しました。]]></description>
			<content:encoded><![CDATA[<p>前回のサンプルのおまけです。前回のサンプルコードExt.DataViewを使ってTwitter Search APIの情報を表示していました。今回はダブルクリックイベントとホバリング時のCSSクラスの設定を行ってもう少し使えるアプリっぽく修正しました。<br />
<div id="attachment_623" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-12_11-15-16.png" title="DataViewのホバリング設定" rel="lightbox[621]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-12_11-15-16-150x150.png" alt="DataViewのホバリング設定" title="DataViewのホバリング設定" width="150" height="150" class="size-thumbnail wp-image-623" /></a><p class="wp-caption-text">DataViewのホバリング設定</p></div><br />
<a href="http://extjs.blog.sus4.co.jp/2010/05/11/extjs-tutorial-twitter-dataview-sample/">ExtJS入門　JSONP経由でTwitterの情報をDataViewに表示する</a></p>
<p>関連の記事はこちらからです。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/06/extjs-tutorial29-youtube/">ExJS入門29　JSONPを使ってYouTube Data APIをグリッドパネルに読み込む</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/07/exjs-tutorial30-gridtwitter/">ExJS入門30　Twitter Search APIを使ったグリッドパネル</a></li>
<li>
	<a href="http://extjs.blog.sus4.co.jp/2010/05/11/extjs-tutorial-twitter-dataview-sample/">ExtJS入門　JSONP経由でTwitterの情報をDataViewに表示する</a>
	</li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.DataViewクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.DataView">http://extdocs.xenophy.com/?class=Ext.DataView</a></p>
<p><span id="more-621"></span></p>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

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

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

    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/ext/ext-all.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;dataview-twitter2.js&quot;&gt;&lt;/script&gt;
    &lt;style TYPE=&quot;text/css&quot;&gt;
    &lt;!--
        .search {background-image: url(../img/icon/magnifier.png) !important;}
        .tweet
        {
            width:148px;
            height:300px;
            margin:2px;
            padding:3px;
            border:dotted 1px #CCC;
            background-color:#F9F9F9;
            float:left;
        }
        .tweet-hover
        {
            background-color:#F0F0FF;
        }
        .tweet_text
        {
            background-color:#FFF;
            padding:3px;
        }

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

    --&gt;
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div style=&quot;width:500px;margin:0 auto;padding:15px;background-color:#D3E1F1;font-size:small;&quot;&gt;
        &lt;p style=&quot;font-weight:bold;padding:3px;margin-bottom:10px;&quot;&gt;
            Twitter Search APIを利用したデータビュー　（30秒毎に自動更新）
        &lt;/p&gt;

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

Ext.onReady(function(){

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

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

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

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

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

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

	itemSelector:&#039;div.tweet&#039;,
	overClass:&#039;tweet-hover&#039;,
	listeners:{
		dblclick:function(dataview,index,node,e){
			var record = dataview.getStore().getAt(index);
			window.open(String.format(
				&#039;http://twitter.com/{0}/status/{1}&#039;,
				record.get(&#039;from_user&#039;),
				record.get(&#039;id&#039;)
			));
		}
	}
</pre>
<p>今回は前回のサンプルの簡単な発展形の紹介になりました。次回はチュートリアルに戻りたいと思います。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F05%2F12%2Fextjs-tutorial-twitter-dataview-sample2%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%80%E3%80%80JSONP%E7%B5%8C%E7%94%B1%E3%81%A7Twitter%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92DataView%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%20%E3%81%9D%E3%81%AE2"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/05/12/extjs-tutorial-twitter-dataview-sample2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

