<?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; JavaScript</title>
	<atom:link href="http://extjs.blog.sus4.co.jp/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://extjs.blog.sus4.co.jp</link>
	<description>株式会社sus4 開発チーム</description>
	<lastBuildDate>Wed, 01 Jun 2011 09:32:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>0.95のハマリどころ</title>
		<link>http://extjs.blog.sus4.co.jp/2010/09/19/0-95%e3%81%ae%e3%83%8f%e3%83%9e%e3%83%aa%e3%81%a9%e3%81%93%e3%82%8d/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/09/19/0-95%e3%81%ae%e3%83%8f%e3%83%9e%e3%83%aa%e3%81%a9%e3%81%93%e3%82%8d/#comments</comments>
		<pubDate>Sun, 19 Sep 2010 09:56:33 +0000</pubDate>
		<dc:creator>野村 亮之</dc:creator>
				<category><![CDATA[Sencha Touch]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[sencha]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=796</guid>
		<description><![CDATA[0.93から０.９５にアップデートした際に、動かなかったところをメモ。]]></description>
			<content:encoded><![CDATA[<p>0.93から０.９５にアップデートした際に、動かなかったところをメモ。</p>
<ul>
<li>itemsに直接オブジェクトを書くと、レンダーしてくれない（泣。0.93までしてくれていて便利だったのに。１つのComponentを仕込むだけでも、配列で書きましょう。</li>
<li>Ext.platform消滅。Ext.is.xxxで判断するように、サンプルの方は書き直されていました。</li>
<li>NestedListがStoreを使うようになったみたい（これは聞いただけなので、自分自身ではまったところではない）。</li>
</ul>
<p>itemsのところだけが、見つけるのが大変でしたが、あとはエラーを吐いてくれるので、Touch本体のソースを見ながら修正しました。<br />
いやー、まだまだ仕様変わりそうだなぁ。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F09%2F19%2F0-95%25e3%2581%25ae%25e3%2583%258f%25e3%2583%259e%25e3%2583%25aa%25e3%2581%25a9%25e3%2581%2593%25e3%2582%258d%2F&amp;linkname=0.95%E3%81%AE%E3%83%8F%E3%83%9E%E3%83%AA%E3%81%A9%E3%81%93%E3%82%8D"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/09/19/0-95%e3%81%ae%e3%83%8f%e3%83%9e%e3%83%aa%e3%81%a9%e3%81%93%e3%82%8d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ext JS/Sencha Touch入門40　Ajaxリクエスト処理</title>
		<link>http://extjs.blog.sus4.co.jp/2010/08/05/ext-tutorial40/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/08/05/ext-tutorial40/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 02:06:27 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[Sencha Touch]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Ext.Ajax]]></category>
		<category><![CDATA[Ext.Ajax.request]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[Toolbar]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=765</guid>
		<description><![CDATA[今回はExt JS,Sencha Touchのどちらでも非常によく使うAaxの処理を紹介します。
サンプルコードはSencha Touchですが、Ajaxリクエストの処理はExt JSでもほぼ同じです。]]></description>
			<content:encoded><![CDATA[<p>今回はExt JS,Sencha Touchのどちらでも非常によく使うAjaxの処理を紹介します。</p>
<p>サンプルコードはSencha Touchですが、Ajaxリクエストの処理はExt JSでもほぼ同じです。<br />
<div id="attachment_774" class="wp-caption aligncenter" style="width: 208px"><a href="http://extjs.blog.sus4.co.jp/files/2010/08/picture-8.png" title="Ajax サンプル" rel="lightbox[765]"><img src="http://extjs.blog.sus4.co.jp/files/2010/08/picture-8-198x300.png" alt="Ajax サンプル" title="Ajax サンプル" width="198" height="300" class="size-medium wp-image-774" /></a><p class="wp-caption-text">Ajax サンプル</p></div></p>
<p>まずAjaxでリクエストする先を用意する必要があります。<br />
今回はPHPで作成しました。<br />
<strong>・PHP</strong></p>
<pre class="brush: php; ">

&lt;?php
//サンプル

//3秒待つ
sleep(3);

//POST値の処理
$param = $_POST[&#039;id&#039;];
$res[&#039;id&#039;] = $param;

if ($param) {
    $res[&#039;success&#039;] = true;
}else {
    $res[&#039;success&#039;] = false;
}

//JSONで返す
header(&#039;Content-Type: application/json&#039;);
echo json_encode($res);
die();
?&gt;
</pre>
<p>3秒処理を遅らせています。<br />
レスポンスにはJSON形式でPOSTされた情報とサーバーサイドでの処理が正しく終わったらsuccessにtrueを返すようにしています。</p>
<p>HTMLファイルはSencha Touchの基本形のものでよいです。<br />
<strong>・HTML</strong></p>
<pre class="brush: html; ">

&lt;!DOCTYPE html&gt;
&lt;html manifest=&quot;index.manifest&quot;&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;
    &lt;title&gt;Ajax Sample&lt;/title&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;../../st/resources/css/ext-touch.css&quot; type=&quot;text/css&quot;&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../../st/ext-touch-debug.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;index.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>今回のサンプルではパネルをひとつ作ってツールバー上に、Ajaxリクエストをキックするボタンを配置します。このボタンをタップするとAjax リクエストが実行されるようにします。</p>
<p>・Javascript</p>
<pre class="brush: js; ">

Ext.setup({
    onReady: function() {

        //リクエスト処理
        var ajax = function(callback) {
            //ローディングマスク
            panel.el.mask(
                false,
                &#039; &lt;div style=&quot;margin:50% auto; text-align:center;color:#EEE;&quot;&gt;&lt;img src=&quot;loader.gif&quot;/&gt; &lt;br /&gt;お待ちください...&lt;/div&gt;&#039;);

            //Ajax リクエスト
            Ext.Ajax.request({
                url:&#039;post.php&#039;,
                params:{
                    id:&#039;test&#039;
                },
                success:function(result,opt){
                    //マスクを外す
                    panel.el.unmask();
                    var res = Ext.decode(result.responseText);
                    if (res.success) {
                        window.alert(&#039;Success&#039;);
                        if (Ext.isFunction(callback)) {callback()};
                    }
                },
                failure:function(result,opt){
                    window.alert(&#039;リクエスト失敗。ネットワーク接続を確認してください。&#039;);
                }
            });
        };

        //パネルの生成
        var panel = new Ext.Panel({
            fullscreen: true,
            styleHtmlContent:true,
            dockedItems:[
                {
                    xtype:&#039;toolbar&#039;,
                    dock:&#039;top&#039;,
                    items:[
                        {
                            ui:&#039;mask&#039;,
                            iconCls:&#039;action&#039;,
                            handler:function(){
                                //コールバック関数
                                var callback = function(){
                                    panel.update(&#039;Success!&#039;);
                                };

                                //Ajax処理実行
                                ajax(callback);
                            }
                        }
                    ]
                }
            ],
            html:&#039;Ajax Request Sample&#039;
        });
    }
});
</pre>
<p>前回のHello, World　+ Tbarのサンプルによく似ていますが、今回はxtypeでツールバーを作成しています。<br />
xtypeについては<a target="_blank" href="http://extjs.blog.sus4.co.jp/2009/11/11/extjs-tutorial5/">コチラ</a></p>
<p>ボタンのコンフィグオプションで<br />
ui:&#8217;mask&#8217;,<br />
iconCls:&#8217;action&#8217;<br />
が設定されています。iconClsではボタンに配置する画像をCSSで設定できますが、今回はSencha Touchに予め用意されているactionクラスをそのまま使います。<br />
Sencha Touchのパッケージ内のexamplesのiconsサンプルをみるとどんなアイコンがあるのかが分かります。</p>
<p><strong>Ajax リクエスト処理</strong><br />
Ext JSおよびSencha TouchではExt.Ajaxクラスを使用してAjax処理を行ないます。このクラスはシングルトンですので、Ajax処理を呼びたい箇所でExt.Ajaxのrequestメソッドを呼び出します。パラメーターはURLなので設定はオブジェクトで渡します。</p>
<p><strong>・Ext.Ajax.request</strong><br />
Ext.Ajax.requestの引数に渡しているもの</p>
<ul>
<li>url:(String)リクエスト先のURL</li>
<li>params:(Object) パラメータ</li>
<li>success:(Function) Ajaxリクエスト成功時のコールバック関数</li>
<li>failure:(Function) Ajaxリクエスト失敗時のコールバック関数 </li>
</ul>
<p>最も単純なAjaxリクエストへ渡す設定は上の4つのものになります。<br />
paramsに設定されているパラメータをurlの先にPOSTして,正しいレスポンスが返ってきたときにsuccessに設定されているコールバック関数が実行されます。リクエスト自体が失敗した場合(404などが返ってきた場合。)にfailureに設定されているコールバックが実行されます。</p>
<p>サンプルではajaxという関数にAjaxの処理をまとめています。<br />
Ext.Ajax.request()の部分で実際にAjaxを実行します。</p>
<p>ajax関数の中では、リクエスト中に画面全体にマスクを掛ける処理を、行っています。</p>
<p><strong>・ローディングマスク</strong><br />
<div id="attachment_775" class="wp-caption aligncenter" style="width: 208px"><a href="http://extjs.blog.sus4.co.jp/files/2010/08/picture-10.png" title="ローディングマスク" rel="lightbox[765]"><img src="http://extjs.blog.sus4.co.jp/files/2010/08/picture-10-198x300.png" alt="ローディングマスクを表示" title="ローディングマスク" width="198" height="300" class="size-medium wp-image-775" /></a><p class="wp-caption-text">ローディングマスクを表示</p></div></p>
<pre class="brush: js; ">

panel.el.mask(
                false,
                &#039; &lt;div style=&quot;margin:50% auto; text-align:center;color:#EEE;&quot;&gt;&lt;img src=&quot;loader.gif&quot;/&gt; &lt;br /&gt;お待ちください...&lt;/div&gt;&#039;);
</pre>
<p>Ext.Elementのmaskメソッドでそのエレメントにマスクをかける処理を実行します。Ext JSとSencha Touchでは引数が違うので注意が必要です。<br />
Sencha Touchのマスク処理はスタイルがあんまり良くないので、独自で設定する必要があります。ローディング用の画像もないので適当なものを用意する必要があります。今回はこんなのGifアニメを作って設定しています。<br />
<div id="attachment_769" class="wp-caption aligncenter" style="width: 62px"><a href="http://extjs.blog.sus4.co.jp/files/2010/08/loader.gif" title="loader" rel="lightbox[765]"><img src="http://extjs.blog.sus4.co.jp/files/2010/08/loader.gif" alt="ローディング用Gifアニメ" title="loader" width="52" height="52" class="size-full wp-image-769" /></a><p class="wp-caption-text">ローディング用Gifアニメ</p></div></p>
<p>マスクを外すときは同様にExt.Elementのunmaskメソッドで行ないます。サンプルでは<br />
successのコールバックの中でpanel.elをunmaskを実行しています。</p>
<pre class="brush: js; ">

success:function(result,opt){
　//マスクを外す
　panel.el.unmask();
　　　　　・
　　　　　・
　　　　　・
}
</pre>
<p><strong>・コールバック処理</strong></p>
<pre class="brush: js; ">

success:function(result,opt){
  //マスクを外す
  panel.el.unmask();
  var res = Ext.decode(result.responseText);
  if (res.success) {
    window.alert(&#039;Success&#039;);
    if (Ext.isFunction(callback)) {callback()};
  }
},
failure:function(result,opt){
  window.alert(&#039;リクエスト失敗。ネットワーク接続を確認してください。&#039;);
}
</pre>
<p>リクエスト成功/失敗時はwindow.alertを使って結果を表示してます。<br />
また今回のサンプルではsuccess時にさらに呼び出し元でコールバックを設定して、パネル内の要素を&#8221;Success&#8221;に書き換えています。</p>
<p><strong>・レスポンスボディーの取り出し</strong><br />
successのコールバックの第一引数にレスポンスがオブジェクトとして渡されます。<br />
サンプルではresultという名前に設定しています。resultの中のresponseTextにレスポンスのボディーが格納されています。<br />
サンプルのPHPの場合ではJSONの文字列を返しています。レスポンスボディーはそのままではただのテキストです、そのため文字列からJSONに変換する必要があります。<br />
Sencha TouchでもExt JSと同じようにExt.util.JSONクラスを使ってJSONの変換を行います。<br />
今回は文字列からオブジェクトへの変換(JSON.decode)処理を使います。</p>
<pre class="brush: js; ">

success:function(result,opt){
  //文字列からオブジェクトに変換する
  var res = Ext.decode(result.responseText);

  //resはオブジェクトとして扱えるようになる。
  if (res.success) {
    window.alert(&#039;Success&#039;);
   　　・
　　　・
　　　・
  }
}
</pre>
<p>Ext.decodeはExt.util.JSON.decodeへのエイリアスです。Ext.decodeで呼び出した方が簡素なのでこちらを使っています。<br />
このExt.decodeを使ってレスポンスボディの文字列をJavascriptのオブジェクトとして扱えるように変換します。<br />
変換されたレスポンスボディはオブジェクトとして扱えるので、res.successのようにドットシンタックスで任意のプロパティ値を取得できるようになります。</p>
<p>以上、Ext.Ajax.requestの簡単な使い方です。詳しくはAPIリファレンスをご覧ください。<br />
<a target="_blank" href="http://www.sencha.com/deploy/touch/docs/?class=Ext.Ajax">Sencha Touch API Documentation<br />
http://www.sencha.com/deploy/touch/docs/?class=Ext.Ajax</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%2F08%2F05%2Fext-tutorial40%2F&amp;linkname=Ext%20JS%2FSencha%20Touch%E5%85%A5%E9%96%8040%E3%80%80Ajax%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E5%87%A6%E7%90%86"><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/08/05/ext-tutorial40/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>Sencha Touch入門:Sencha Touch の付属サンプルCarouselを使ってSencha Touchのコツをつかむ</title>
		<link>http://extjs.blog.sus4.co.jp/2010/06/28/sencha-ex-carousel/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/06/28/sencha-ex-carousel/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 06:39:24 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[Sencha Touch]]></category>
		<category><![CDATA[Carousel]]></category>
		<category><![CDATA[Examples]]></category>
		<category><![CDATA[Ext.setup()]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[onReady]]></category>
		<category><![CDATA[sencha]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[レイアウト]]></category>
		<category><![CDATA[入門]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=712</guid>
		<description><![CDATA[Sencha Touch入門




Sencha Touch に付属するでもCarouselを見ながら、基本的なSencha Touchの使い方を紹介します。
コードは配布されているSencha Touchパッケージの/examples/carousel　にあります。
ここではindex.htmlについては,前回の記事をごらんください。
index.jsをお好きなエディタで開きながらご覧下さい。
iPad or iPhoneがあるとなおよいと思います。
Ext JSの基本についてはこちらをご覧下さい：
Ext.onReadyからはじめるExtJSのまとめ
Sencha TouchはこれまでのExt JSのコードと違う個所がいくつかあります。
今回はその中でも基本となる、3点を紹介します。
1.Ext.setup()
2.onReadyコンフィグ
3.panelのfullscreenコンフィグ
1.Ext.setup();
これまでのExt JSのアプリではExt.onReady()をアプリの起動ポイントとして使っていることがほとんどでした。
Sencha Touch付属のサンプルではExt.setup()を使って、様々な初期設定を行っています。onReady()もこの
Ext.setup()のなかで設定されています。
APIをみるとsetupで設定できる項目一覧が乗っているので簡単に訳しておきます。


fullscreen &#8211; Boolean -　フルスクリーン設定
tabletStartupScreen &#8211; String &#8211; iPad用の起動時画像へのパス　サイズは768&#215;1004 縦長でないといけない
phoneStartupScreen &#8211; String &#8211; iPhoneと iPod touch用起動時画像へのパス　320&#215;460 で縦長でないといけない
icon -タブレットとスマートフォン両方に使われるアイコン画像へのパス　72&#215;72がよい
tabletIcon &#8211; String &#8211; タブレット用アイコン画像へのパス こちらがiconで設定される画像より優先される　72&#215;72がよい.
phoneIcon &#8211; String &#8211; スマートフォン用アイコン画像へのパス こちらがiconで設定される画像より優先される　57&#215;57がよい.
glossOnIcon &#8211; Boolean &#8211; iPhone, iPad and iPod Touchのアイコンにグロスのエフェクトをつけるかどうか
statusBarStyle &#8211; String &#8211; iOS web アプリのステータスバーのスタイルの設定. default, black,black-translucentのどれかを選択。
preloadImages [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Sencha Touch入門</strong></p>
<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>Sencha Touch に付属するでもCarouselを見ながら、基本的なSencha Touchの使い方を紹介します。<br />
コードは配布されているSencha Touchパッケージの/examples/carousel　にあります。<br />
ここではindex.htmlについては,前回の記事をごらんください。<br />
index.jsをお好きなエディタで開きながらご覧下さい。<br />
iPad or iPhoneがあるとなおよいと思います。</p>
<p>Ext JSの基本についてはこちらをご覧下さい：<br />
<a href="http://extjs.blog.sus4.co.jp/2009/10/29/%E5%8B%89%E5%BC%B7%E4%BC%9Aext-onready%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8Bextjs%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81/">Ext.onReadyからはじめるExtJSのまとめ</a></p>
<div id="attachment_714" class="wp-caption aligncenter" style="width: 210px"><a href="http://extjs.blog.sus4.co.jp/files/2010/06/iphone1.PNG" title="Sencha Touch Examples" rel="lightbox[712]"><img class="size-medium wp-image-714" title="Sencha Touch Examples" src="http://extjs.blog.sus4.co.jp/files/2010/06/iphone1-200x300.PNG" alt="Sencha Touch Examples" width="200" height="300" /></a><p class="wp-caption-text">Sencha Touch Examples</p></div>
<p>Sencha TouchはこれまでのExt JSのコードと違う個所がいくつかあります。<br />
今回はその中でも基本となる、3点を紹介します。<br />
1.Ext.setup()<br />
2.onReadyコンフィグ<br />
3.panelのfullscreenコンフィグ</p>
<p><strong>1.Ext.setup();</strong></p>
<p>これまでのExt JSのアプリではExt.onReady()をアプリの起動ポイントとして使っていることがほとんどでした。<br />
Sencha Touch付属のサンプルではExt.setup()を使って、様々な初期設定を行っています。onReady()もこの<br />
Ext.setup()のなかで設定されています。</p>
<p>APIをみるとsetupで設定できる項目一覧が乗っているので簡単に訳しておきます。</p>
<blockquote>
<ul>
<li>fullscreen &#8211; Boolean -　フルスクリーン設定</li>
<li>tabletStartupScreen &#8211; String &#8211; iPad用の起動時画像へのパス　サイズは768&#215;1004 縦長でないといけない</li>
<li>phoneStartupScreen &#8211; String &#8211; iPhoneと iPod touch用起動時画像へのパス　320&#215;460 で縦長でないといけない</li>
<li>icon -タブレットとスマートフォン両方に使われるアイコン画像へのパス　72&#215;72がよい</li>
<li>tabletIcon &#8211; String &#8211; タブレット用アイコン画像へのパス こちらがiconで設定される画像より優先される　72&#215;72がよい.</li>
<li>phoneIcon &#8211; String &#8211; スマートフォン用アイコン画像へのパス こちらがiconで設定される画像より優先される　57&#215;57がよい.</li>
<li>glossOnIcon &#8211; Boolean &#8211; iPhone, iPad and iPod Touchのアイコンにグロスのエフェクトをつけるかどうか</li>
<li>statusBarStyle &#8211; String &#8211; iOS web アプリのステータスバーのスタイルの設定. default, black,black-translucentのどれかを選択。</li>
<li>preloadImages &#8211; Array &#8211; プリロードする画像へのパスの配列（詳細は後日調査）</li>
<li>onReady &#8211; Function &#8211; DOM構築後に実行される関数。アプリの起動ポイントになることが多い。</li>
<li>scope &#8211; Scope &#8211; スコープの設定</li>
</ul>
</blockquote>
<p>画像系の設定が多いですね。</p>
<p>CarouselサンプルのExt.setup()で設定される、他の項目をみるといくつか画像が設定されています。<br />
Sencha TouchのWebアプリをホーム画面に追加してから起動すると,iPadはtabletStartupScreen,<br />
iPhoneはphoneStartUpScreenが起動時の画面として登録されます。</p>
<p>Safariのツールバーで[+]をタップすると以下のようなメニューがでるので、ホームに追加します。</p>
<div id="attachment_716" class="wp-caption aligncenter" style="width: 210px"><a href="http://extjs.blog.sus4.co.jp/files/2010/06/iphone3.png" title="Sencha Touch アプリをホーム画面に追加" rel="lightbox[712]"><img class="size-medium wp-image-716" title="Sencha Touch アプリをホーム画面に追加" src="http://extjs.blog.sus4.co.jp/files/2010/06/iphone3-200x300.png" alt="Sencha Touch アプリをホーム画面に追加" width="200" height="300" /></a><p class="wp-caption-text">Sencha Touch アプリをホーム画面に追加</p></div>
<p>iconはホーム画面に設定される際のアイコンになる画像です。（ただし現状ではiPadでは正しく設定されましたが、iPhone4では上手くいきませんでした。もう少し詳しく調べてみます。）<br />
iPhone4だとこうなりました。</p>
<div id="attachment_719" class="wp-caption aligncenter" style="width: 210px"><a href="http://extjs.blog.sus4.co.jp/files/2010/06/iphone6.PNG" title="ホーム画面に追加されたSencha Touch アプリ" rel="lightbox[712]"><img class="size-medium wp-image-719" title="ホーム画面に追加されたSencha Touch アプリ" src="http://extjs.blog.sus4.co.jp/files/2010/06/iphone6-200x300.PNG" alt="ホーム画面に追加されたSencha Touch アプリ" width="200" height="300" /></a><p class="wp-caption-text">ホーム画面に追加されたSencha Touch アプリ</p></div>
<ul>
<li>tabletStartupScreen　:　タブレット用（iPad）</li>
<li>phoneStartupScreen　: スマートフォン用（iPhone,iPod Touch）</li>
<li>icon :アイコンとなる画像（iPadでしか正しく設定されない？）</li>
</ul>
<p>まだAndroidの文字がありませんが、これから対応されていくと思います。</p>
<div id="attachment_717" class="wp-caption aligncenter" style="width: 210px"><a href="http://extjs.blog.sus4.co.jp/files/2010/06/iphone4.PNG" title="iPhoneでの起動時の画像" rel="lightbox[712]"><img class="size-medium wp-image-717" title="iPhoneでの起動時の画像" src="http://extjs.blog.sus4.co.jp/files/2010/06/iphone4-200x300.PNG" alt="iPhoneでの起動時の画像" width="200" height="300" /></a><p class="wp-caption-text">iPhoneでの起動時の画像</p></div>
<p>またホーム画面から起動すると自動的にURLバーとSafariのツールバーが非表示になります。これだけでぐっとネイティブアプリのような見た目になります。</p>
<p><strong>2.onReadyコンフィグ</strong><br />
次にonReadyで実行される処理を見ていきます。<br />
Carouselサンプルでは上下2つの領域に2つのカルーセルのコンテナが配置されています(carousel1,2)。それぞれのコンテナにはさらに子となる要素を設定して、その要素をスライドさせることができます。<br />
carousel1も2もほぼ同じ内容ですので1のほうだけを紹介します。</p>
<pre class="brush: js; ">

// Create a Carousel of Items
var carousel1 = new Ext.Carousel({
defaults: { cls: &#039;card&#039; },
items: [
{
html: &#039;&lt;h1&gt;Carousel&lt;/h1&gt;&lt;p&gt;Navigate the two carousels on this page by swiping left/right or clickin    g on one side of the circle indicators below.&lt;/p&gt;&#039;
}, {
title: &#039;Tab 2&#039;,
html: &#039;2&#039;
}, {
title: &#039;Tab 3&#039;,
html: &#039;3&#039;
}]
});
</pre>
<p>基本的にはExt JSでpanel等の配下にさらに子となるパネルを入れる作業とおなじです。<br />
TabPanelやCardレイアウトのパネルで設定したように,itemsの中にパネルを設定しています。ここでは単純にHTMLで内容を記述した3枚のパネルを使っています。defaultsでそれぞれのパネルのCSSクラスにcardというセレクタを追加してます。</p>
<p><strong>3.fullscreen設定</strong><br />
このサンプルはほんとに簡単で上で作ったカルーセルコンテナをパネルに配置しているだけです。<br />
ただしこのカルーセルの親となるパネルのコンフィグでfullscreen設定をtrueにする必要があります。<br />
この設定で、Ext JSのViewportのように画面全体にパネルを広げます。<br />
ここではlayoutでvboxを設定しています。これはExt JSのレイアウトと同じですね。<br />
この部分だけをみるとExt JSのコードとほとんど区別が付きません。<br />
これまで培ったExt JSのノウハウをそのままSencha Touchで作るタッチスクリーンのアプリに活かせるのよく分かります。</p>
<pre class="brush: js; ">

new Ext.Panel({
fullscreen: true,
layout: {
type: &#039;vbox&#039;,
align: &#039;stretch&#039;
},
defaults: {
flex: 1
},
items: [carousel1, carousel2]
});
</pre>
<p>またデバッグの方法を考える必要があります。モバイルSafariではデバッグメニューを表示できますが不十分です。<br />
FirefoxでSencha Touchアプリを見るとレイアウトがかなり崩れています。<br />
よい方法を見つけられた方は是非教えてください。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F06%2F28%2Fsencha-ex-carousel%2F&amp;linkname=Sencha%20Touch%E5%85%A5%E9%96%80%3ASencha%20Touch%20%E3%81%AE%E4%BB%98%E5%B1%9E%E3%82%B5%E3%83%B3%E3%83%97%E3%83%ABCarousel%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6Sencha%20Touch%E3%81%AE%E3%82%B3%E3%83%84%E3%82%92%E3%81%A4%E3%81%8B%E3%82%80"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/06/28/sencha-ex-carousel/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ext JS +JQTouch =  Sencha Touch!!</title>
		<link>http://extjs.blog.sus4.co.jp/2010/06/18/ext-js-jqtouch-sencha-touch/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/06/18/ext-js-jqtouch-sencha-touch/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 04:02:11 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[iPhone/iPad]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[sencha]]></category>
		<category><![CDATA[Sencha Touch]]></category>
		<category><![CDATA[Webアプリ]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=681</guid>
		<description><![CDATA[



先日の会社名変更の衝撃からまだそんなに日がたっていませんが。早くもSencha.comからSenchaブランドのプロダクト第一弾が公開されました。
ExtJSとJQTouchを組み合わせたようなモバイルWebアプリ開発フレームワークです。

Sencha &#8211; Sencha Touch Overview &#8211; HTML5 Mobile App Framework.

タイトルにもあるようにHTML5の機能をふんだんに使用しています。ExtJSがIE6から動くマルチプラットフォームが一つの売りだったためHTML5の機能を入れられないんじゃなと思っていました。
モバイル機器専用として割り切ることでHTML5に対応させたExtJSとも考えられます。
将来的にHTML5の機能はExtJSに組み込まれんだろうと思います。
サンプルも沢山用意されているので、一度iPhoneやiPadで試してみるとよいかもしれません。

iPhone 3G,3GSで試すと3GSはなかなかの使用感ですが、3Gだとピッカー系のUIやフォームの動きがあやしいかんじです。メモリとCPUが結構必要な感じです。
Androidはまだ改善中とのことです。UIの制御でバグっぽい箇所がいくつかありました。スライドさせるUIが全体的に不安定な気がします。

現在のところまともに使えそうなのはiPadとiPhone 3GSですね。
実際サンプルのソースコードを見ると、Ext.～が使われて安心しました。Sencha.get()だったらどうしようと心配してましたがExtで使えるようです。
サンプルのソースコードを見ると、Extと同じ書き方がされているのが分かります。ExtJSの開発者はスムーズにSencha Touchに移行できそうです。APIドキュメントも慣れ親しんだExtJS APIドキュメントと同じようなものが用意されているので全体を眺めてみるとExtJSとの違いが分かります。videoやaudioといったHTML5っぽいクラスが追加されています。
ただこのSencha TouchドキュメントはiPadではまともに動きません。Sencha TouchドキュメントはExt JSで書かれているということなんだと思います。APIドキュメントがiPadで見れると実用は別にして、なんとなくうれしい気がするので期待しています。
あとはCANVASが使えれば、携帯ゲームを作ることも簡単になるかもしれません。
Sencha Touchは既存のモバイル向けJavascriptライブラリとは違いフレームワークです。雰囲気でいえばApple のDashcodeのようにモバイルアプリケーションを作るのに近いといえます。JQTouchを含め既存のJSのCocoa Touch風UIライブラリではUIのみしか提供されませんでしたが、Sencha TouchではモデルやAjax処理も内包しています。そのためより高度なモバイル向けWebアプリを作ることが可能になりそうです。
またいわゆるハイブリッドアプリケーションの形式を取れば、iPhone Appとして開発してAppstoreへの申請も可能かもしれません。
最近AppleのiPhone AppではFlashやC#など開発言語の締め出しがおこなわれましたが、Javascript + HTMLは現状OKです。またAppleのDashcodeがある以上Javascriptが禁止されることはまずないと思います。
色々期待はしますが、まだベータ版といった感じなので遊びで色々やってみるのも面白いかもしれません。Ext JSを開発してれば、簡単なアプリをすぐ作れてしまうんじゃないかなと思います。
追記：Vimeoにビデオも上がってました。

Sencha Touch Introduction from Sencha on Vimeo.
]]></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>先日の会社名変更の衝撃からまだそんなに日がたっていませんが。早くもSencha.comからSenchaブランドのプロダクト第一弾が公開されました。</p>
<p>ExtJSとJQTouchを組み合わせたようなモバイルWebアプリ開発フレームワークです。</p>
<p style="text-align: center;"><a href="http://www.sencha.com/products/touch/index.php"><img src="http://extjs.blog.sus4.co.jp/files/2010/06/logo-sencha-sm.png" alt="" /></a></p>
<p><a href="http://www.sencha.com/products/touch/index.php">Sencha &#8211; Sencha Touch Overview &#8211; HTML5 Mobile App Framework</a>.</p>
<p><span id="more-681"></span></p>
<p>タイトルにもあるようにHTML5の機能をふんだんに使用しています。ExtJSがIE6から動くマルチプラットフォームが一つの売りだったためHTML5の機能を入れられないんじゃなと思っていました。</p>
<p>モバイル機器専用として割り切ることでHTML5に対応させたExtJSとも考えられます。</p>
<p>将来的にHTML5の機能はExtJSに組み込まれんだろうと思います。</p>
<p>サンプルも沢山用意されているので、一度iPhoneやiPadで試してみるとよいかもしれません。</p>
<p style="text-align: center;"><a href="http://www.sencha.com/products/touch/index.php"><img src="http://extjs.blog.sus4.co.jp/files/2010/06/animation2.png" alt="" /></a></p>
<p>iPhone 3G,3GSで試すと3GSはなかなかの使用感ですが、3Gだとピッカー系のUIやフォームの動きがあやしいかんじです。メモリとCPUが結構必要な感じです。</p>
<p>Androidはまだ改善中とのことです。UIの制御でバグっぽい箇所がいくつかありました。スライドさせるUIが全体的に不安定な気がします。<br />
<a href="http://extjs.blog.sus4.co.jp/files/2010/06/sencha-touch-sample.jpg" title="Sencha Touchのサンプル" rel="lightbox[681]"><img class="aligncenter size-medium wp-image-686" title="Sencha Touchのサンプル" src="http://extjs.blog.sus4.co.jp/files/2010/06/sencha-touch-sample-200x300.jpg" alt="Sencha Touchのサンプル" width="200" height="300" /></a></p>
<p>現在のところまともに使えそうなのはiPadとiPhone 3GSですね。</p>
<p>実際サンプルのソースコードを見ると、Ext.～が使われて安心しました。Sencha.get()だったらどうしようと心配してましたがExtで使えるようです。</p>
<p>サンプルのソースコードを見ると、Extと同じ書き方がされているのが分かります。ExtJSの開発者はスムーズにSencha Touchに移行できそうです。APIドキュメントも慣れ親しんだExtJS APIドキュメントと同じようなものが用意されているので全体を眺めてみるとExtJSとの違いが分かります。videoやaudioといったHTML5っぽいクラスが追加されています。</p>
<p>ただこのSencha TouchドキュメントはiPadではまともに動きません。Sencha TouchドキュメントはExt JSで書かれているということなんだと思います。APIドキュメントがiPadで見れると実用は別にして、なんとなくうれしい気がするので期待しています。</p>
<p>あとはCANVASが使えれば、携帯ゲームを作ることも簡単になるかもしれません。</p>
<p>Sencha Touchは既存のモバイル向けJavascriptライブラリとは違いフレームワークです。雰囲気でいえばApple のDashcodeのようにモバイルアプリケーションを作るのに近いといえます。JQTouchを含め既存のJSのCocoa Touch風UIライブラリではUIのみしか提供されませんでしたが、Sencha TouchではモデルやAjax処理も内包しています。そのためより高度なモバイル向けWebアプリを作ることが可能になりそうです。</p>
<p>またいわゆるハイブリッドアプリケーションの形式を取れば、iPhone Appとして開発してAppstoreへの申請も可能かもしれません。</p>
<p>最近AppleのiPhone AppではFlashやC#など開発言語の締め出しがおこなわれましたが、Javascript + HTMLは現状OKです。またAppleのDashcodeがある以上Javascriptが禁止されることはまずないと思います。</p>
<p>色々期待はしますが、まだベータ版といった感じなので遊びで色々やってみるのも面白いかもしれません。Ext JSを開発してれば、簡単なアプリをすぐ作れてしまうんじゃないかなと思います。</p>
<p>追記：Vimeoにビデオも上がってました。<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="311" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=12636777&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="311" src="http://vimeo.com/moogaloop.swf?clip_id=12636777&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://vimeo.com/12636777">Sencha Touch Introduction</a> from <a href="http://vimeo.com/sencha">Sencha</a> on <a href="http://vimeo.com">Vimeo</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%2F06%2F18%2Fext-js-jqtouch-sencha-touch%2F&amp;linkname=Ext%20JS%20%2BJQTouch%20%3D%20%20Sencha%20Touch%21%21"><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/06/18/ext-js-jqtouch-sencha-touch/feed/</wfw:commentRss>
		<slash:comments>0</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入門38　独自のVTypeを定義してフォームを検証する</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/21/extjs-tutorial38-formvtype/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/21/extjs-tutorial38-formvtype/#comments</comments>
		<pubDate>Fri, 21 May 2010 04:05:36 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[Ext.apply]]></category>
		<category><![CDATA[Ext.form.FormPanel]]></category>
		<category><![CDATA[Ext.form.TextField]]></category>
		<category><![CDATA[Ext.form.VTypes]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[vtype]]></category>
		<category><![CDATA[エディター]]></category>
		<category><![CDATA[オーバーライド]]></category>
		<category><![CDATA[カスタム]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[フォーム]]></category>
		<category><![CDATA[フォームパネル]]></category>
		<category><![CDATA[拡張]]></category>

		<guid isPermaLink="false">http://extjs.blog.sus4.co.jp/?p=659</guid>
		<description><![CDATA[今回はフォームのVTypeに独自のバリデーションを設定して、フォームの検証を行うサンプルです。]]></description>
			<content:encoded><![CDATA[<p>今回はフォームのVTypeに独自のバリデーションを設定して、フォームの検証を行うサンプルです。<br />
<div id="attachment_660" class="wp-caption aligncenter" style="width: 160px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-21_12-07-01.png" title="カスタムのVTypeを定義してフォームを検証する。" rel="lightbox[659]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-21_12-07-01-150x150.png" alt="カスタムのVTypeを定義してフォームを検証する。" title="カスタムのVTypeを定義してフォームを検証する。" width="150" height="150" class="size-thumbnail wp-image-660" /></a><p class="wp-caption-text">カスタムのVTypeを定義してフォームを検証する。</p></div><br />
フォーム関連の過去の記事はこちらからです。</p>
<ul>
<li><a href="http://extjs.blog.sus4.co.jp/2010/04/22/extjs-tutorial-form-baseic/">ExtJS入門　ExtJSのフォームについて（基本編）</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/13/extjs-tutorial32-formbasic/">ExtJS入門32　フォームパネルとフィールド(基本編)</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/14/631/">ExtJS入門33 Columnレイアウトのフォー</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/17/extjs-tutorial34-combobox/">ExtJS入門34 ComboBoxの基本</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/18/extjs-tutorial35-tablelayout/">ExtJS入門35 Tableレイアウトのフォーム</a></li>
<li><a href="http://extjs.blog.sus4.co.jp/2010/05/20/extjs-tutorial37-formerrors/">ExtJS入門37 サーバーサイドで処理したフォームのエラーメッセージを表示するム</a></li>
</ul>
<p>リファレンスはこちらから<br />
ExtJS -3.0 日本語APIドキュメント &#8211; Ext.form.VTypesクラス<br />
<a target="_blank" href="http://extdocs.xenophy.com/?class=Ext.form.VTypes">http://extdocs.xenophy.com/?class=Ext.form.VTypes</a></p>
<p><span id="more-659"></span></p>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

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

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

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

            Extのフォーム　カスタムVTypeの作成してフォームを検証します。
        &lt;/p&gt;
        &lt;div id=&quot;form&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;form-vtype.js&quot;&gt;form-vtype.js&lt;/a&gt;&lt;br/&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>Java Script:</strong></p>
<pre class="brush: js; ">

Ext.onReady(function()
{
    Ext.apply(Ext.form.VTypes,{

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

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

    var form = new Ext.form.FormPanel({
        renderTo:&#039;form&#039;,
        title:&#039;カスタムのVTypeを使ったフォーム&#039;,
        height:280,
        width:500,
        bodyStyle:{
            padding:&#039;8px&#039;
        },
        footerStyle:{   //ボタン周りの表示の調整用スタイル
            border:&#039;solid 1px #99BBE8&#039;,
            &#039;border-top&#039;:&#039;none&#039;
        },
        labelWidth:180,
        monitorValid:true,  //定期的に妥当性のチェックを行いボタンを連動させます。ボタン側でformBindを設定する
        defaults:{
            xtype:&#039;textfield&#039;,
            anchor:&#039;90%&#039;,
            msgTarget:&#039;under&#039;
        },
        items:[
            {
                name:&#039;normal&#039;,
                fieldLabel:&#039;チェックなしフィールド&#039;,
                emptyText:&#039;チェックなし&#039;
            },
            {
                name:&#039;email&#039;,
                fieldLabel:&#039;Emailフィールド&#039;,
                emptyText:&#039;Email入力してください&#039;,
                vtype:&#039;email&#039;  //vtypeコンフィグでバリデーションが設定　emailはデフォルトであるvtype
            },
            {
                name:&#039;onlyabc&#039;,
                fieldLabel:&#039;onlyEXTフィールド&#039;,
                emptyText:&#039;EXTのみ入力可&#039;,
                vtype:&#039;onlyEXT&#039;
            },
            {
                name:&#039;mydatefield&#039;,
                fieldLabel:&#039;mydateフィールド&#039;,
                emptyText:&#039;日付を入力&#039;,   //空のときのテキスト
                anchor:&#039;90%&#039;,
                vtype:&#039;mydate&#039;
            },
        ],
        buttonAlign:&#039;center&#039;,
        buttons:[
            {
                text:&#039;決定&#039;,
                formBind:true,
                iconCls:&#039;tick&#039;,
                handler:function(){
                    //値の取り出し

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

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

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

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

                    //表示処理
                    Ext.Msg.show({
                        title:&#039;フォームの値を取得&#039;,
                        msg:tpl.apply(data),
                        width:300,
                        buttons:Ext.Msg.OK
                    });
                }
            }
        ]
    });
});
</pre>
<p><strong>実行結果:</strong><br />
<div id="attachment_660" class="wp-caption aligncenter" style="width: 310px"><a href="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-21_12-07-01.png" title="カスタムのVTypeを定義してフォームを検証する。" rel="lightbox[659]"><img src="http://extjs.blog.sus4.co.jp/files/2010/05/greenshot_2010-05-21_12-07-01-300x210.png" alt="カスタムのVTypeを定義してフォームを検証する。" title="カスタムのVTypeを定義してフォームを検証する。" width="300" height="210" class="size-medium wp-image-660" /></a><p class="wp-caption-text">カスタムのVTypeを定義してフォームを検証する。</p></div></p>
<p>ExtJSでは予め、いくつかのVtypeが用意されています。</p>
<ul>
<li>alpha:アルファベット</li>
<li>alphanum:アルファベットと数字</li>
<li>email:E-mailアドレス</li>
<li>url:URL</li>
</ul>
<p>これをフォームフィールドのvtypeコンフィグに設定することでフィールドのvalidateが実行されたときに、検証方法を指定できます。<br />
使用例は以下のような形です。vtypeを文字列で指定します。</p>
<pre class="brush: js; ">

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

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

Ext.apply(Ext.form.VTypes,{

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

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

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

Ext.apply(Ext.form.VTypes,
	{
        //自分で設定した日付形式でチェックする場合
        mydate:function(val) {
            var dt = Date.parseDate(val,&#039;Y:m:d&#039;,true);
            return dt ? val : false;
        },
        mydateText:&#039;日付の形式が間違っています。2010:01:01の形式で入力してください。&#039;,
        mydateMask:/[0-9:]/
	}
);
</pre>
<p>このVTypeではmydate関数内でDate.parseDate()で独自の日付形式でDateオブジェクトの生成を行っています。valにパースできない文字列が入ってきたばあいはdtにはundefinedが返されます。<br />
parseDate()メソッドは賢く例えば5/32を指定した場合は、自動的に6/1にしてくれます。しかし現実的に5/32とは入力された場合は5/31の入力間違いの可能性が高いので、エラーにして欲しいと思います。その場合はparseDate<br />
()メソッドの第三引数にbooleanで厳密な日付のチェックを行うか指定できます。ここがtrueの場合は5/32といった実際にはない日付はエラーになります。</p>
<p>今回はVTypesに独自のVtypeを追加する方法を紹介しました。フォームの検証はサーバーサイドでも行う必要がありますが、クライアントサイドのUIで処理することで、わざわざ情報をポストすることがないので高速に実行できます。前回紹介した<a href="http://extjs.blog.sus4.co.jp/2010/05/20/extjs-tutorial37-formerrors/">サーバーからエラーメッセージを表示する方法</a>と一緒に利用することで、ユーザビリティのよいフォームパネルが作成できます。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F05%2F21%2Fextjs-tutorial38-formvtype%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8038%E3%80%80%E7%8B%AC%E8%87%AA%E3%81%AEVType%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%A6%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%99%E3%82%8B"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/05/21/extjs-tutorial38-formvtype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS入門37 サーバーサイドで処理したフォームのエラーメッセージを表示する</title>
		<link>http://extjs.blog.sus4.co.jp/2010/05/20/extjs-tutorial37-formerrors/</link>
		<comments>http://extjs.blog.sus4.co.jp/2010/05/20/extjs-tutorial37-formerrors/#comments</comments>
		<pubDate>Thu, 20 May 2010 06:21:39 +0000</pubDate>
		<dc:creator>佐竹 裕行</dc:creator>
				<category><![CDATA[ExtJSチュートリアルｓｕｓ４版]]></category>
		<category><![CDATA[ExtJS勉強会＠名古屋資料]]></category>
		<category><![CDATA[DateField]]></category>
		<category><![CDATA[Ext.form.FormPanel]]></category>
		<category><![CDATA[Ext.form.NumberField]]></category>
		<category><![CDATA[Ext.form.TextField]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[エラーメッセージ]]></category>
		<category><![CDATA[エラー処理]]></category>
		<category><![CDATA[サンプル]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[フォーム]]></category>
		<category><![CDATA[フォームパネル]]></category>

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

{
    success:false,
    errors:{
        &#039;samplefield1&#039;:&#039;間違っています。&#039; ,
        &#039;samplefield2&#039;:&#039;間違っています。&#039; ,
        &#039;samplefield4&#039;:&#039;間違っています。&#039; ,
        &#039;samplefield5&#039;:&#039;間違っています。&#039; ,
        &#039;samplefield6&#039;:&#039;特に設定することも無く、エラーメッセージを表示できます。&#039;
    }
}
</pre>
<p><strong>HTML:</strong></p>
<pre class="brush: html; ">

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

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

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

            Extのフォームフィールドへのエラーの表示
        &lt;/p&gt;
        &lt;div id=&quot;form&quot;&gt;&lt;/div&gt;
        &lt;br/&gt;
        Java Script：&lt;a href=&quot;form-errors.js&quot;&gt;form-errors.js&lt;/a&gt;&lt;br/&gt;
		JSON File：&lt;a href=&quot;errors.json&quot;&gt;errors.json&lt;/a&gt;&lt;br/&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>Java Script:</strong></p>
<pre class="brush: js; ">

Ext.onReady(function()
{
    var form = new Ext.form.FormPanel({
        renderTo:&#039;form&#039;,
        autoScroll:true,

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

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

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

 {
   success:false,//or true
   errors:{
     &#039;フィールド名&#039;:&#039;メッセージ&#039;
        ・・・・
   }//エラーがない場合は空
 }
</pre>
<p>実際にサンプルコードを動かしてみると、どんな値を送ってもerros.jsonのJSONが返り、各フィールドにエラーメッセージが表示されます。<br />
msgTargetをunderにしておくと見やすくなります。<br />
このJSONでsamplefield3:&#8217;間違っています&#8217;を付け加えた場合、displayfieldにもエラーメッセージを出してしまうので注意してください。</p>
<p>フォームのsubmit後の処理はsubmit()メソッドの引数にオブジェクトで処理を渡すこともできますが、簡単なエラー処理であればJSONの形をきちんとするだけで、submit()の引数になる長い処理を記述しなくてよいので便利です。</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fextjs.blog.sus4.co.jp%2F2010%2F05%2F20%2Fextjs-tutorial37-formerrors%2F&amp;linkname=ExtJS%E5%85%A5%E9%96%8037%20%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%89%E3%81%A7%E5%87%A6%E7%90%86%E3%81%97%E3%81%9F%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B"><img src="http://extjs.blog.sus4.co.jp/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://extjs.blog.sus4.co.jp/2010/05/20/extjs-tutorial37-formerrors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS入門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>
	</channel>
</rss>

