<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>PHP学習日記</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/" />
    <link rel="self" type="application/atom+xml" href="http://php.sunvisor.net/atom.xml" />
    <id>tag:php.sunvisor.net,2009-06-06:/2</id>
    <updated>2009-06-06T05:45:52Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.25</generator>

<entry>
    <title>A5:SQLのER図にCakePHP仕様のテーブルを追加するスクリプト</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2008/12/a5sqlercakephp.html" />
    <id>tag:hisashi.heteml.jp,2008:/php//2.72</id>

    <published>2008-12-12T03:53:53Z</published>
    <updated>2009-06-06T05:45:52Z</updated>

    <summary>「徹底入門」でもおすすめになっていますが，ER図やSQL文がかけるデータベースツ...</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="DBDesigner4" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<p>「徹底入門」でもおすすめになっていますが，ER図やSQL文がかけるデータベースツールの<a href="http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/index.html">A5:SQL</a>というのがあります。これはすごい優れものでして，本当に便利に使っています。作者の松さんには毎日感謝しています。このA5:SQLは，Donkeyを使ってスクリプトを書くことができます。そのスクリプトを使って，A5:SQLのER図にCakePHP仕様のテーブルを追加するスクリプトを書いてみました。CakePHP仕様のテーブルとは，IDがオートインクリメントのINTで，createdとmodifiedというDATETIMEのフィールドがあるテーブルです。リスト用のnameフィールドもつけた単純なテーブルのエンティティをER図に追加します。</p>
<pre class="javascript"><span style="color: rgb(0, 153, 0); font-style: italic;"> //CakePHPCakePHP仕様のテーブルを追加する</span>
<span style="color: rgb(0, 51, 102); font-weight: bold;">var</span> frmER = application.<span style="color: rgb(0, 102, 0);">getActiveWindow</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(102, 204, 102);">)</span>;
<span style="color: rgb(0, 0, 102); font-weight: bold;">if</span> <span style="color: rgb(102, 204, 102);">(</span>frmER.<span style="color: rgb(0, 102, 0);">formType</span> != <span style="color: rgb(51, 102, 204);">&quot;A5EREditor&quot;</span><span style="color: rgb(102, 204, 102);">)</span> <span style="color: rgb(102, 204, 102);">{</span>
	<span style="color: rgb(0, 0, 102);">alert</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">&quot;アクティブウィンドウをERエディタにしてから実行してください。(1)&quot;</span><span style="color: rgb(102, 204, 102);">)</span>;
	exit<span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(102, 204, 102);">)</span>;
<span style="color: rgb(102, 204, 102);">}</span>
<span style="color: rgb(0, 51, 102); font-weight: bold;">var</span> sources = <span style="color: rgb(0, 51, 102); font-weight: bold;">new</span> Strings;
&nbsp;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">&quot;&quot;</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">&quot;[Entity]&quot;</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">&quot;PName=cakes&quot;</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">&quot;LName=新しいCakePHPテーブル&quot;</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">&quot;Comment=&quot;</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">&quot;TableOption=&quot;</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">&quot;Left=250&quot;</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">&quot;Top=250&quot;</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">'Field=&quot;ID&quot;,&quot;id&quot;,&quot;INT AUTO_INCREMENT&quot;,&quot;NOT NULL&quot;,0,&quot;&quot;,&quot;&quot;,$FFFFFFFF'</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">'Field=&quot;名前&quot;,&quot;name&quot;,&quot;@VARCHAR(100)&quot;,,,&quot;&quot;,&quot;&quot;,$FFFFFFFF'</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">'Field=&quot;作成日&quot;,&quot;created&quot;,&quot;@DATETIME&quot;,,,&quot;&quot;,&quot;&quot;,$FFFFFFFF'</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">'Field=&quot;更新日&quot;,&quot;modified&quot;,&quot;@DATETIME&quot;,,,&quot;&quot;,&quot;&quot;,$FFFFFFFF'</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">&quot;EffectMode=None&quot;</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">&quot;Color=$000000&quot;</span><span style="color: rgb(102, 204, 102);">)</span>;
sources.<span style="color: rgb(0, 102, 0);">add</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(51, 102, 204);">&quot;BkColor=$FFFFFF&quot;</span><span style="color: rgb(102, 204, 102);">)</span>;
frmER.<span style="color: rgb(0, 102, 0);">source</span> = sources;
&nbsp;</pre>
<p>A5:SQLのスクリプトエディタで上記のスクリプトを作成し，A5:SQLのscripts/Toolフォルダに保存します。</p>
<p>A5:SQLを再起動すると，ツールメニューに「CakePHP仕様のテーブルを追加する」が追加されます。</p>
<p>メニューを実行するとER図にエンティティが追加されます。</p>
<p>今度は，A5:SQLのER図からモデルのソースコードを出力するようなスクリプトが書けるといいかも。<a href="http://php.sunvisor.net/2007/11/scaffold.html">dbdesigner2cake.php</a>みたいな感じだし。と思っていますがいつかできるでしょうか。</p>
<p>&nbsp;</p>]]>
        
    </content>
</entry>

<entry>
    <title>cake1.2でbakeを使う</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2008/12/cake12bake.html" />
    <id>tag:hisashi.heteml.jp,2008:/php//2.71</id>

    <published>2008-12-09T05:38:10Z</published>
    <updated>2009-06-06T05:45:52Z</updated>

    <summary>CakePHP1.2をインストールした後，cake.phpを使ってプロジェクトを作成する手順のメモです。</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<div>xampp環境にCakePHP 1.2(以後cake1.2)をインストールする際には，xamppのドキュメントルート(xampp\htdocs)に入れるというのが一般的で，いろんなとこの解説にもそう書いてあります。僕の場合はそれをxamppのルート(xampp\cake)に入れるようにしました。ドキュメントルートに入れると，/cake/app/にアクセスしたらすぐに動作確認できるのでいいのですが，ドキュメントルートからは外した位置に入れたかったのです。bakeでプロジェクトを作成する方法をとれば，それでも全然問題なく利用できます。</div>
<h2>Bakeでプロジェクトを作る</h2>
<div>アプリケーションを開発する際には，cake1.2の場合は，cake.phpでもってプロジェクトを作成します。</div>
<div>cake.phpをWindows環境で使用する場合は，cake.batを使うのがいいようです。php.exeにはパスが通っていなければなりません。コマンドプロンプトを立ち上げてcake.phpがあるフォルダ，&lt;Cakeのインストールフォルダ&gt;\cake\consoleをカレントフォルダにします。cake.batのあるフォルダにパスを通さなければならないという記述がいくつかのサイトにありますが，それは不要です。</div>
<div>
<pre class="dos">
D:\&gt;cd C:\xampp\cake\cake\console</pre>
</div>
<div>プロジェクトを作成するためにbake projectオプションを指定し，appフォルダの作成先を-appオプションで指定します。書籍「徹底入門」ではbakeオプションのみで実行するようになっていますが，そうするとプロジェクトの作成後，そのままデータベース設定になだれ込みます。「徹底入門」にあるようにプロジェクトの作成だけを行いたい場合は，bake projectを指定します。</div>
<div>
<pre class="dos">
D:\xampp\cake\cake\console&gt;<b><span style="color: rgb(51, 102, 255);">cake bake project -app D:\xampp\htdocs\new_project</span></b></pre>
</div>
<div>次のような画面が表示されます。</div>
<pre>
Welcome to CakePHP v1.2.0.7692 RC3 Console
---------------------------------------------------------------
App : new_project
Path: D:\xampp\htdocs\new_project
---------------------------------------------------------------
What is the full path for this app including the app directory name?
Example: D:\xampp\htdocs\new_project\myapp
[D:\xampp\htdocs\new_project\myapp] &gt; <b><span style="color: rgb(51, 102, 255);">D:\xampp\htdocs\new_project</span></b>
</pre>
<div>最後に不要なmyappという設定がついていますので，それを省いたパスを指定し直します。</div>
<pre>
Bake Project
Skel Directory: D:\xampp\cake\cake\console\libs\templates\skel
Will be copied to: D:\xampp\htdocs\new_project
---------------------------------------------------------------
Look okay? (y/n/q)
[y] &gt; <b><span style="color: rgb(51, 102, 255);">y</span></b>
Do you want verbose output? (y/n)
[n] &gt; <b><span style="color: rgb(51, 102, 255);">y</span></b>
</pre>
<div>「くどくどと出力してもよろしいでっか？」と聞いてきます。yとすると作業内容を出力してくれます。</div>
<pre>
---------------------------------------------------------------
Created: new_project in D:\xampp\htdocs\new_project
---------------------------------------------------------------
D:\xampp\htdocs\new_project created
D:\xampp\cake\cake\console\libs\templates\skel\.htaccess copied to D:\xampp\htdo
cs\new_project\.htaccess

<span style="color: rgb(153, 153, 153);">（くどくど・・・・）</span>

Random hash key created for 'Security.salt'
CAKE_CORE_INCLUDE_PATH set to D:\xampp\cake in webroot/index.php
CAKE_CORE_INCLUDE_PATH set to D:\xampp\cake in webroot/test.php
Remember to check these value after moving to production server

</pre>
<div>これで指定したパスにプロジェクトが作られます。ブラウザでアクセスしたら，「甘いケーキが焼けたよ！」てなページが表示されます。この後，</div>
<pre>
D:\xampp\cake\cake\console&gt;<span style="color: rgb(51, 102, 255);"><b>cake bake -app D:\xampp\htdocs\test_project</b></span>
</pre>
<div>とprojectをつけずに実行します。まだデータベース設定が行われていないので，データベース設定の画面が現れます。データベースの設定を完了するといったん終了しますので，もう一度同じコマンドを実行すると，やっとメニューが表示されます。</div>
<div>&nbsp;</div>
<div>D:\xampp\cake\cake\console&gt;cake bake -app D:\xampp\htdocs\test_project</div>
<pre>
Welcome to CakePHP v1.2.0.7692 RC3 Console

---------------------------------------------------------------
App : new_project
Path: D:\xampp\htdocs\new_project
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
</pre>
<div>これで必要な部品をbakeして開発の元とします。</div>
<h2>Eclipseにプロジェクトを追加</h2>
<div>開発にはEclipse+PDTを使用していますが，ワークスペースはドキュメントルートに指定しています。CakeのCoreディレクトリをPHPプロジェクトとして追加しておきます。bakeでロジェクトを作ったならば，そのフォルダもPHPプロジェクトとして追加します。PHPインクルードパスにCakeのCoreプロジェクトを追加しておきます。<br />
<br />
<a href="http://php.sunvisor.net/2007/11/eclipse_pdtcakephp.html">Eclipse PDTでのCakePHP開発時のコード補完に関する情報</a>にあるようにctpファイルの中からヘルパーのコード補完をするためのファイルは，appフォルダのvendorフォルダに，viw_link.phpという名前で保存しています。</div>
<div>&nbsp;</div>
<p>&nbsp;</p>]]>
        
    </content>
</entry>

<entry>
    <title>CSVファイルをDBにインポート</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2008/12/csvdb.html" />
    <id>tag:hisashi.heteml.jp,2008:/php//2.70</id>

    <published>2008-12-03T05:17:06Z</published>
    <updated>2009-06-06T05:45:52Z</updated>

    <summary>サーバのテーブルに，CakePHP経由でアップロードしたCSVファイルをインポートする必要がありましたので，その処理を作ってみました。CSVファイルをサーバにアップロードし，そのファイルをDBにインポートするという手順になろうかと思います。</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<p>サーバのテーブルに，CakePHP経由でアップロードしたCSVファイルをインポートする必要がありましたので，その処理を作ってみました。CSVファイルをサーバにアップロードし，そのファイルをDBにインポートするという手順になろうかと思います。</p>
<h2>ビュー</h2>
<pre class="php">
&lt;div <span style="color: rgb(0, 0, 0); font-weight: bold;">class</span>=<span style="color: rgb(255, 0, 0);">&quot;options form&quot;</span>&gt;
&lt;div <span style="color: rgb(0, 0, 0); font-weight: bold;">class</span>=<span style="color: rgb(255, 0, 0);">&quot;actions&quot;</span>&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;?php <a href="http://www.php.net/echo"><span style="color: rgb(0, 0, 102);">echo</span></a> <span style="color: rgb(0, 0, 255);">$html</span>-&gt;<span style="color: rgb(0, 102, 0);">link</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(255, 0, 0);">'メニューに戻る'</span>, <a href="http://www.php.net/array"><span style="color: rgb(0, 0, 102);">array</span></a><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(255, 0, 0);">'action'</span>=&gt;<span style="color: rgb(255, 0, 0);">'index'</span><span style="color: rgb(102, 204, 102);">)</span><span style="color: rgb(102, 204, 102);">)</span>;?&gt;&lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;
<span style="color: rgb(0, 0, 0); font-weight: bold;">&lt;?php</span> <a href="http://www.php.net/echo"><span style="color: rgb(0, 0, 102);">echo</span></a> <span style="color: rgb(0, 0, 255);">$form</span>-&gt;<span style="color: rgb(0, 102, 0);">create</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(255, 0, 0);">'Options'</span>, <a href="http://www.php.net/array"><span style="color: rgb(0, 0, 102);">array</span></a><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(255, 0, 0);">'action'</span>=&gt;<span style="color: rgb(255, 0, 0);">'upload'</span>, <span style="color: rgb(255, 0, 0);">'type'</span> =&gt; <span style="color: rgb(255, 0, 0);">'file'</span><span style="color: rgb(102, 204, 102);">)</span><span style="color: rgb(102, 204, 102);">)</span>;?&gt;
    &lt;fieldset&gt;
        &lt;legend&gt;データのアップロード&lt;/legend&gt;
    <span style="color: rgb(0, 0, 0); font-weight: bold;">&lt;?php</span>
        <a href="http://www.php.net/echo"><span style="color: rgb(0, 0, 102);">echo</span></a> <span style="color: rgb(0, 0, 255);">$form</span>-&gt;<span style="color: rgb(0, 102, 0);">file</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(255, 0, 0);">'result'</span><span style="color: rgb(102, 204, 102);">)</span>;
    <span style="color: rgb(0, 0, 0); font-weight: bold;">?&gt;</span>
    &lt;/fieldset&gt;
<span style="color: rgb(0, 0, 0); font-weight: bold;">&lt;?php</span> <a href="http://www.php.net/echo"><span style="color: rgb(0, 0, 102);">echo</span></a> <span style="color: rgb(0, 0, 255);">$form</span>-&gt;<span style="color: rgb(0, 102, 0);">end</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(255, 0, 0);">'アップロード'</span><span style="color: rgb(102, 204, 102);">)</span>;?&gt;
&lt;/div&gt;
&nbsp;</pre>
<p>$form-&gt;createでtypeをfileにする。するとSubmitするとファイルがtmpフォルダにアップロードされます。</p>
<h2>コントローラ</h2>
<pre class="php">
    <span style="color: rgb(0, 0, 0); font-weight: bold;">function</span> upload<span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(102, 204, 102);">)</span><span style="color: rgb(102, 204, 102);">{</span>
        <span style="color: rgb(177, 177, 0);">if</span> <span style="color: rgb(102, 204, 102);">(</span>!<a href="http://www.php.net/empty"><span style="color: rgb(0, 0, 102);">empty</span></a><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(0, 0, 255);">$this</span>-&gt;<span style="color: rgb(0, 102, 0);">data</span><span style="color: rgb(102, 204, 102);">)</span><span style="color: rgb(102, 204, 102);">)</span> <span style="color: rgb(102, 204, 102);">{</span>
            <span style="color: rgb(0, 0, 255);">$model</span> =&amp; <span style="color: rgb(0, 0, 255);">$this</span>-&gt;<span style="color: rgb(0, 102, 0);">Result</span>;
            <span style="color: rgb(128, 128, 128); font-style: italic;">/* @var $model result */</span>
            <span style="color: rgb(0, 0, 255);">$up_file</span> = <span style="color: rgb(0, 0, 255);">$this</span>-&gt;<span style="color: rgb(0, 102, 0);">data</span><span style="color: rgb(102, 204, 102);">[</span><span style="color: rgb(255, 0, 0);">'Options'</span><span style="color: rgb(102, 204, 102);">]</span><span style="color: rgb(102, 204, 102);">[</span><span style="color: rgb(255, 0, 0);">'result'</span><span style="color: rgb(102, 204, 102);">]</span><span style="color: rgb(102, 204, 102);">[</span><span style="color: rgb(255, 0, 0);">'tmp_name'</span><span style="color: rgb(102, 204, 102);">]</span>;
            <span style="color: rgb(0, 0, 255);">$fileName</span> = CSV_FILE_PATH.<span style="color: rgb(255, 0, 0);">&quot;result.csv&quot;</span>;
            <span style="color: rgb(177, 177, 0);">if</span> <span style="color: rgb(102, 204, 102);">(</span><a href="http://www.php.net/is_uploaded_file"><span style="color: rgb(0, 0, 102);">is_uploaded_file</span></a><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(0, 0, 255);">$up_file</span><span style="color: rgb(102, 204, 102);">)</span><span style="color: rgb(102, 204, 102);">)</span><span style="color: rgb(102, 204, 102);">{</span>
                <a href="http://www.php.net/move_uploaded_file"><span style="color: rgb(0, 0, 102);">move_uploaded_file</span></a><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(0, 0, 255);">$up_file</span>, <span style="color: rgb(0, 0, 255);">$fileName</span><span style="color: rgb(102, 204, 102);">)</span>;
                <span style="color: rgb(0, 0, 255);">$model</span>-&gt;<span style="color: rgb(0, 102, 0);">loadFromCSV</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(0, 0, 255);">$fileName</span><span style="color: rgb(102, 204, 102);">)</span>;         
                <span style="color: rgb(0, 0, 255);">$this</span>-&gt;<span style="color: rgb(0, 102, 0);">Session</span>-&gt;<span style="color: rgb(0, 102, 0);">setFlash</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(255, 0, 0);">'データをアップロードしました。'</span><span style="color: rgb(102, 204, 102);">)</span>;
                <span style="color: rgb(0, 0, 255);">$this</span>-&gt;<span style="color: rgb(0, 102, 0);">redirect</span><span style="color: rgb(102, 204, 102);">(</span><a href="http://www.php.net/array"><span style="color: rgb(0, 0, 102);">array</span></a><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(255, 0, 0);">'action'</span>=&gt;<span style="color: rgb(255, 0, 0);">'index'</span><span style="color: rgb(102, 204, 102);">)</span><span style="color: rgb(102, 204, 102);">)</span>;
            <span style="color: rgb(102, 204, 102);">}</span>
        <span style="color: rgb(102, 204, 102);">}</span>
    <span style="color: rgb(102, 204, 102);">}</span>
&nbsp;</pre>
<p>コントローラでは，返された$this-&gt;dataの'tmp_name'の中にアップロードされたファイル名が入っています。上記のコードでは，それのファイルをmove_uploaded_file関数で，特定の場所に保存しています。その後，モデルに定義したloadFromCSVメソッドでDBに読み込んでいます。</p>
<h2>モデル</h2>
<pre class="php">
    <span style="color: rgb(0, 0, 0); font-weight: bold;">function</span> loadFromCSV<span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(0, 0, 255);">$fileName</span><span style="color: rgb(102, 204, 102);">)</span> <span style="color: rgb(102, 204, 102);">{</span>
        <span style="color: rgb(0, 0, 255);">$this</span>-&gt;<span style="color: rgb(0, 102, 0);">begin</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(102, 204, 102);">)</span>;
        try<span style="color: rgb(102, 204, 102);">{</span>
            <span style="color: rgb(0, 0, 255);">$this</span>-&gt;<span style="color: rgb(0, 102, 0);">deleteAll</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(255, 0, 0);">'1 = 1'</span>, <span style="color: rgb(0, 0, 0); font-weight: bold;">false</span><span style="color: rgb(102, 204, 102);">)</span>;
            <span style="color: rgb(0, 0, 255);">$csvData</span> = <a href="http://www.php.net/file"><span style="color: rgb(0, 0, 102);">file</span></a><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(0, 0, 255);">$fileName</span>, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES<span style="color: rgb(102, 204, 102);">)</span>;
            <span style="color: rgb(177, 177, 0);">foreach</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(0, 0, 255);">$csvData</span> <span style="color: rgb(177, 177, 0);">as</span> <span style="color: rgb(0, 0, 255);">$line</span><span style="color: rgb(102, 204, 102);">)</span><span style="color: rgb(102, 204, 102);">{</span>
                <span style="color: rgb(0, 0, 255);">$record</span> = <a href="http://www.php.net/split"><span style="color: rgb(0, 0, 102);">split</span></a><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(255, 0, 0);">&quot;,&quot;</span>, <span style="color: rgb(0, 0, 255);">$line</span><span style="color: rgb(102, 204, 102);">)</span>;
                <span style="color: rgb(0, 0, 255);">$data</span> = <a href="http://www.php.net/array"><span style="color: rgb(0, 0, 102);">array</span></a><span style="color: rgb(102, 204, 102);">(</span>
                    <span style="color: rgb(255, 0, 0);">&quot;field1&quot;</span> =&gt; <span style="color: rgb(0, 0, 255);">$record</span><span style="color: rgb(102, 204, 102);">[</span><span style="color: rgb(204, 102, 204);">0</span><span style="color: rgb(102, 204, 102);">]</span>,
                    <span style="color: rgb(255, 0, 0);">&quot;field2&quot;</span> =&gt; <span style="color: rgb(0, 0, 255);">$record</span><span style="color: rgb(102, 204, 102);">[</span><span style="color: rgb(204, 102, 204);">1</span><span style="color: rgb(102, 204, 102);">]</span>
                <span style="color: rgb(102, 204, 102);">)</span>;
                <span style="color: rgb(0, 0, 255);">$this</span>-&gt;<span style="color: rgb(0, 102, 0);">create</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(0, 0, 255);">$data</span><span style="color: rgb(102, 204, 102);">)</span>;
                <span style="color: rgb(0, 0, 255);">$this</span>-&gt;<span style="color: rgb(0, 102, 0);">save</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(102, 204, 102);">)</span>;
            <span style="color: rgb(102, 204, 102);">}</span>
            <span style="color: rgb(0, 0, 255);">$this</span>-&gt;<span style="color: rgb(0, 102, 0);">commit</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(102, 204, 102);">)</span>;
        <span style="color: rgb(102, 204, 102);">}</span> catch<span style="color: rgb(102, 204, 102);">(</span>Exception <span style="color: rgb(0, 0, 255);">$e</span><span style="color: rgb(102, 204, 102);">)</span> <span style="color: rgb(102, 204, 102);">{</span>
            <span style="color: rgb(0, 0, 255);">$this</span>-&gt;<span style="color: rgb(0, 102, 0);">rollback</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(102, 204, 102);">)</span>;
        <span style="color: rgb(102, 204, 102);">}</span>
    <span style="color: rgb(102, 204, 102);">}</span>
&nbsp;</pre>
<p>モデルに定義したloadFromCSVメソッドは上記の通りです。ファイルをfile関数で読み込み，各行をsplitで分割してフィールドにセットしています。MySQLにはファイルからデータをインポートするSQL文もあるので，それを使おうかとも思ったのですが，CakePHPの機能で実装しました。</p>
<p>大変な処理かと思ったのですが，わりと簡単に実現できました。</p>]]>
        
    </content>
</entry>

<entry>
    <title>本番サーバに配置でハマる</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2008/12/post-1.html" />
    <id>tag:hisashi.heteml.jp,2008:/php//2.69</id>

    <published>2008-12-02T08:35:42Z</published>
    <updated>2009-07-03T06:46:12Z</updated>

    <summary>本番サーバに置いてみると，いろいろとハマりました。Options FollowSymLinksってなんだろ。</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<p>作ったCakePHPアプリをサーバに設置する段階でハマりました。セキュリティを考えて，ファイルの位置などをちゃんと公開フォルダ以外に置くようにして配置。</p>
<p>最初，うまく動かない。DBを作るの忘れてた・・・・作った。</p>
<p>やっぱりうまく動かない。phpの設定を見るとmysqlのモジュールが入っていない。PHPを再コンパイルした。</p>
<p>やっぱりうまく動かない。</p>
<p>普通にLamppが入っているとか，yumでインストールされたapache+mysql+phpではなく，ベンダーさんが必要な機能だけをインストールしたWebサーバなので，どこがわるいのかよくわからない。</p>
<p>どうもうまくmod_rewriteが動作していない模様。mod_rewriteが入っていないのかと思ったがちゃんと入っているし。</p>
<p>エラーログを見てみると。やっぱり</p>
<pre>
&quot;RewriteRule directive is forbidden&quot;
</pre>
<p>というのが残っています。これでググってみると，</p>
<p><a href="http://peta.okechan.net/blog/archives/tag/cakephp">日曜研究室</a>さんの記事を発見。記事に従ってhttpd.confに</p>
<pre>
Options FollowSymLinks
</pre>
<p>を追加したら動作するようになりました。</p>
<h2>文字化け</h2>
<p>動いたはいいんですが，Windowsでの開発環境では全然文字化けしなかったのに，サーバに配置したらとたんに文字化けしました。(T-T)</p>
<p>そういえば，と自分が書いた<a href="http://php.sunvisor.net/2007/11/cakephp.html">過去のエントリ</a>を参照。config/database.phpに</p>
<pre>
'encoding' =&gt; 'utf8',
</pre>
<p>を追加したら化けなくなりました。自分のブログが役立った。<br />
<br />
&nbsp;</p>]]>
        <![CDATA[<h3>追記</h3>
<p>Options FollowSymLinksについてしらべてみました。</p>
<p>どうも，これが設定されていないと，rewriteをhttpd.confに指定している分にはいいですが，rewriteの設定を.htaccessで指定したときにうまく動かない。ということのようです。ということは，CakePHPの動作には必須な設定ではないのでしょうか。Apacheのバージョンによっても動作が違ったりしそうな気もします。もうちょっと調べてみます。</p>
<p>この件にはさらに後日談が....。Options None をOptions FollowSymLinksに変更したのではなくて，元々
</p>
<pre>
Options ExecCGI
</pre>
という記述があったところに，
<pre>
Options ExecCGI
Options FollowSymLinks
</pre>
<p>と追加したのですが，これがバカでした。Optionsを2行に分けて書いてしまうと1行目の設定は無視されてしまうのです。これで他のCGIが動かなくなってしまいました。（ごめんなさい）</p>
<pre>
Options ExecCGI FollowSymLinks
</pre>
正しくはこう書かなきゃ行けません。(´･ω･`)


]]>
    </content>
</entry>

<entry>
    <title>CakePHP1.2で再開</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2008/12/cakephp12.html" />
    <id>tag:hisashi.heteml.jp,2008:/php//2.68</id>

    <published>2008-12-02T05:47:11Z</published>
    <updated>2009-06-06T05:45:51Z</updated>

    <summary>CakePHPの勉強を1.2で再開。フォームの日付入力とVendor関数について知った。</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<p>昨年の暮れから今年の初めにかけて勉強していたPHPも，仕事で他の言語でのプログラミングが続くと，手つかずになってしまっていました。今回，ある案件をむりやりPHPで開発することとして，CakePHPの勉強を再開しました。勉強をサボっている間にCakePHPの1.2がBetaからRCになっていましたので，もうこれからは1.2かと重い，1.2で勉強をすることにしました。参考書は右にならんでいる三冊の本。1.2については「徹底入門」や「ポケットリファレンス」が役立ちます。しかし1.2もどんどん細かな仕様が変わっているようですので，これらの書籍の記述通りでない部分も多くあり，結構ハマりました。</p>
<h2>日付入力フォームの月表示</h2>
<p>フォームで日付入力をする場合に</p>
<pre>
$form-&gt;dateTime('date');
とか，
$form-&gt;input('date');   // dateが日付項目の場合
</pre>
<p>を使いますが，月のコンボボックスがJuryなどと英字表記されてしまいます。これを数字表記に変更する対応策が，「徹底入門」にも「ポケットリファレンス」にも載っています。いずれも違う方法ですが，ウラワザ的なやり方をする必要があるように書かれています。RC3では，オプションにmonthNamesというのがあり，それをfalseにしてやると月の選択肢は数字になります。</p>
<pre>
echo $form-&gt;input('start_date', array('dateFormat'=&gt;'YMD', 'timeFormat'=&gt;24,'monthNames'=&gt;false));
</pre>
<p>このようにするだけです。ちなみに「ポケットリファレンス」のFormHelperのところには，inputメソッドの記述がありません。ですがbakeの生成コードを見ていると基本的にはこれを使うのが1.2流な感じがします。その点「徹底入門」ではしっかりと解説されています。</p>
<h2>Vendor()関数</h2>
<p>どちらの本にもVendor関数を使って，Vendorsディレクトリのライブラリを読み込むと書いていますが，RC3ではこれは通用しないみたいです。App::importを使用するように変更になったようです。</p>
<p><a target="_blank" href="http://cakephp.jp/modules/newbb/viewtopic.php?post_id=2009&amp;topic_id=1023&amp;forum=3">[1.2において、vendor()が利用できなくなります]</a></p>]]>
        
    </content>
</entry>

<entry>
    <title>アプリケーション独自の設定情報(Configureクラス)</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2008/01/configure.html" />
    <id>tag:hisashi.heteml.jp,2008:/php//2.67</id>

    <published>2008-01-17T07:38:09Z</published>
    <updated>2009-06-06T05:45:51Z</updated>

    <summary>CakePHPフレームワークを使用したアプリケーションにおいて，アプリケーション独自の設定情報を持ちたい場合があります。CakePHPではそのための便利なクラスが用意されていました。それがConfigureクラスです。</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<p>CakePHPフレームワークを使用したアプリケーションにおいて，アプリケーション独自の設定情報を持ちたい場合があります。CakePHPではそのための便利なクラスが用意されていました。それがConfigureクラスです。</p>
<h2>参考サイト</h2>
<p><a href="http://www.j4f.jp/blog/archives/20071202/127">http://www.j4f.jp/blog/archives/20071202/127</a></p>
<p><a href="http://cricava.com/blogs/index.php?blog=6&amp;title=using_configure_on_your_cakephp_applicat&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1">http://cricava.com/blogs/index.php?blog=6&amp;title=using_configure_on_your_cakephp_applicat&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1</a></p>
<h2>Configureクラスの利用の仕方</h2>
<p>appフォルダのconfigフォルダに任意の名前で設定ファイルを作成します。</p>
<pre class="php"><span style="font-weight: bold; color: #000000">&lt;?php</span>
    <span style="color: #0000ff">$config</span><span style="color: #66cc66">[</span><span style="color: #ff0000">'Auth'</span><span style="color: #66cc66">]</span> = <a href="http://www.php.net/array"><span style="color: #000066">array</span></a><span style="color: #66cc66">(</span>
        <span style="color: #ff0000">'use_ldap'</span> =&gt; <span style="font-weight: bold; color: #000000">true</span>,
        <span style="color: #ff0000">'auto_regist'</span> =&gt; <span style="font-weight: bold; color: #000000">false</span>
    <span style="color: #66cc66">)</span>;
    <span style="color: #0000ff">$config</span><span style="color: #66cc66">[</span><span style="color: #ff0000">'Network'</span><span style="color: #66cc66">]</span> = <a href="http://www.php.net/array"><span style="color: #000066">array</span></a><span style="color: #66cc66">(</span>
        <span style="color: #ff0000">'ip'</span> =&gt; <span style="color: #ff0000">'192.168.1.1'</span>,
        <span style="color: #ff0000">'host'</span> =&gt; <span style="color: #ff0000">'server1.hogo.com'</span>
    <span style="color: #66cc66">)</span>;
<span style="font-weight: bold; color: #000000">?&gt;</span>
&nbsp;</pre>
<p>こんな感じで連想配列で設定情報を書いていきます。これを例えばmyconf.phpという名前で保存します。</p>
<p>app/config/bootstrap.phpに，</p>
<pre class="php">
Configure::<span style="color: #006600">load</span><span style="color: #66cc66">(</span><span style="color: #ff0000">'myconf'</span><span style="color: #66cc66">)</span>;
&nbsp;</pre>
<p>&nbsp;という行を追加すると，設定ファイルを起動時に読み込んでくれます。コードの中で設定情報を参照するには，</p>
<pre class="php"><span style="color: #0000ff">$ldap_mode</span> = Configure::<span style="color: #006600">read</span><span style="color: #66cc66">(</span><span style="color: #ff0000">'Auth.use_ldap'</span><span style="color: #66cc66">)</span>;
&nbsp;</pre>
<p>のようにします。</p>]]>
        
    </content>
</entry>

<entry>
    <title>FedoraでPHPの環境を構築</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2008/01/fedoraphp.html" />
    <id>tag:hisashi.heteml.jp,2008:/php//2.66</id>

    <published>2008-01-10T02:11:25Z</published>
    <updated>2009-06-06T05:45:51Z</updated>

    <summary>Fedora 8でPHP+MySQLのサーバーを構築してみます。</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<p>Linuxでの動作確認のための環境を構築したくてFedora 8 をLive-CDからインストールしました。Live-CDからインストールしたのは，旧いサーバーでDVDドライブがついていなかったからです。色々と設定をして再起動してみると外部からSSHで入れない。なぜかと調べてみたらネットワークが停止状態になっていました。「コンピュータの起動時にデバイスを起動」にチェックが入っているのに再起動してみると状態が「休止中」になってしまう。なぜだか原因がわからなかったが，networkデーモンが起動していないためだったようです。</p>
<p>システム &gt; 管理 &gt; サービスで，「network」にチェックを入れたら，ちゃんど起動時にデバイスが起動するようになりました。やれやれ，変なところで躓いてしまいました。このサーバーにPHPやMySQLをインストールしてみようと思います。</p>
<h2>まずはXAMPP for Linux</h2>
<p>XAMPPのLinux版をインストールすれば，Windowsの時のように簡単に環境を構築できそうですので，それをやってみます。</p>
<p>xamppのLinux版(僕の場合はxampp-linux-1.6.5a.tar.gz)を入手し/optに展開します。</p>
<pre>
$ su -<br /># cd ~sunvisor<br /># tar xvfz xampp-linux-1.5.3a.tar.gz -C /opt</pre>
<p>そしてサービスを起動する</p>
<pre>
# /opt/lampp/lampp start</pre>
<p>とても簡単にLAMPP環境を構築できました。何もしていないのと同じなくらい簡単です。</p>
<h2>個別にインストール</h2>
<p>今回のはLinuxでの動作確認をするための動作確認サーバーなので，これでも良いのですが，本番サーバーでは，稼働しているApacheサーバーにPHPやMySQLを入れるということも考えられます。また，XAMPPだとFedoraのサービスの管理とは全く別な部分で動作しますので，Fedoraのサービス管理方法で管理できません。そこで次にFedoraにパッケージを入れてLAMPP環境を作ってみます。</p>
<p>まずは，LAMPPサービスを止めてアンインストールします。アンインストールはインストールしたフォルダを削除するだけです。</p>
<pre>
# /etc/lampp/lampp stop<br />Stopping XAMPP for Linux 1.6.5a...<br />XAMPP: Stopping Apache with SSL...<br />XAMPP: Stopping MySQL...<br />XAMPP: Stopping ProFTPD...<br />XAMPP stopped.<br /># rm -rf /opt/lampp</pre>
<p>LiveCDからインストールしたFedora8にはapache 2.0がインストール済みですので，MySQLとPHPをインストールします。Linuxのセットアップをするのは数年ぶりですが，今はyumというツールを使うのですね。これはアップデートも管理できるとても便利なツールのようです。そのツールでmysql関連のパッケージにどんなものがあるかを表示させました。</p>
<pre>
# yum list &quot;mysql*&quot;<br />Available Packages<br />MySQL-python.i386&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.2.2-4.fc8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fedora<br />mysql.i386&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.0.45-6.fc8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; updates<br />mysql++.i386&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.3.2-2.fc8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fedora<br /><br />（中略）<br /><br />mysql-query-browser.i386&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.0r12-4.fc8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; updates<br />mysql-server.i386&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.0.45-6.fc8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; updates<br />mysql-test.i386&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.0.45-6.fc8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; updates</pre>
<p>沢山あります。どれを入れればよいのでしょうか。特にmysql.i386とmysql-server.i386のどちら？どちらも？・・・しかしこれはとりあえずmysql-serverをインストールすればよいようです。</p>
<pre>
# yum -y install mysql-server</pre>
<p>こうすると，yumは依存情報を調べて必要なパッケージをインストールしてくれるのです。インストール後に確認してみると次のようになっています。ちゃんと入っていそうですね。</p>
<pre>
# yum list installed &quot;mysql*&quot;<br />Installed Packages<br />mysql.i386&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.0.45-6.fc8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; installed<br />mysql-libs.i386&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.0.45-6.fc8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; installed<br />mysql-server.i386&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.0.45-6.fc8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; installed</pre>
<p>こうしてパッケージでインストールすると，FedoraのGNOMEのサービスの画面にmysqldが表示される他，コマンドラインでのサービスの起動・再起動も他のサービスと同じようにserviceコマンドで行うことができます。</p>
<p>次にphpのインストールですが，さらにパッケージ数が多く何を入れたものやら・・・という感じです。とりあえず自分にとって必要そうなものを入れます。</p>
<pre>
# yum -y install php php-mbstring php-mysql php-mssql php-ldap phpMyAdmin</pre>
<p>mysqlやmssql，ldapのモジュールに加えてついでにphpMyAdminも入れました。</p>
<p>phpMyAdminは，そのままでは外部からのアクセスができませんので，/etc/httpd/conf.d/phpMyAdmin.confを修正します。次の例では192.168.1.0/24のセグメントからのアクセスを許可しています。</p>
<pre>
&lt;Directory /usr/share/phpMyAdmin/&gt;<br />&nbsp;&nbsp; order deny,allow<br />&nbsp;&nbsp; deny from all<br />&nbsp;&nbsp; allow from 192.168.1.0/24&nbsp; &lt;-- この行を追加<br />&nbsp;&nbsp; allow from 127.0.0.1<br />&lt;/Directory&gt;</pre>
<p>&nbsp;</p>]]>
        
    </content>
</entry>

<entry>
    <title>認証(authentication)の研究(2) - Active Directory</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2007/12/authentication2---active-directory.html" />
    <id>tag:hisashi.heteml.jp,2007:/php//2.65</id>

    <published>2007-12-27T01:30:00Z</published>
    <updated>2009-06-06T05:45:51Z</updated>

    <summary>Active Directory(以降AD)サーバにldap関数を使って接続する...</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<p>Active Directory(以降AD)サーバにldap関数を使って接続するときには，いくつか注意すべき点があります。</p>
<h2><font color="#000000">uidではなくsAMAccountNameを使う</font></h2>
<p><a href="http://php.sunvisor.net/2007/12/authentication1.html"><font color="#000000">認証(authentication)の研究(1)</font></a>で紹介したpsychicの記事にあるfindAll関数では$attribute引数の初期値に'uid'という値が使われています。。Linux+OpenLDAPで運用されているLDAPサーバーの場合は，アカウント名を示す属性はuidなのですが，ADのLDAPディレクトリの場合にはこの属性はありません。ADで同様な意味を持つ属性は，sAMAccountNameです。cnが使えそうに思うかもしれませんが，これは使えません。ADのサーバー上でウィザードを使ってユーザーを新規作成した場合には，cnには姓名がセットされてしまうからです。相手がADサーバーの場合はsAMAccountNameを使います。</p>
<h2>パスワードが空だとldap_bindはtrueを返す</h2>
<p>次に，これはちょっとハマったのですが，ldap_bind関数でADに接続するとき，パスワードが空欄の場合はldap_bindは一応成功してしまうという点に注意が必要です。そんな場合はldap_bindの戻り値にtrueが返ってきますが，それ以降のldapに対する処理ldap_searchなどは失敗します。ldap_bindを使ってユーザー名とパスワードの組み合わせが正しいかどうか認証をする場合には，ldap_bindで認証する前に空のパスワードの場合をはじいておかなければいけません。</p>
<h2>AD認証の手順</h2>
<p>ADは匿名bindを許しませんので，認証手順としては次のようになります。</p>
<ol>
    <li>ユーザー名とパスワードをチェックしていずれかが空欄の場合は認証失敗とします。</li>
    <li>bind用のユーザー名とパスワードでADにbindします。ldap_bind</li>
    <li>ADのsAMAccount属性を検索して与えられたユーザー名があるかどうか調べます。ldap_search</li>
    <li>あった場合は，そのアカウントのdnを調べます。ldap_search, ldap_first_entry, ldap_getdn</li>
    <li>dnとパスワードでldapにバインドしてみます。ldap_bind</li>
</ol>
<p>これらの処理が通れば，ADにより認証されたということになります。</p>
<h2>基本的な疑問</h2>
<p>ここまでの実験をいろいろやっていまして，一つ疑問に思うことがあります。CakePHPではcore.phpで定義されているDEBUG定数の値，画面へのデバッグ情報の表示を制御していますが，ldap_bindで認証処理を行うと，認証できなかった場合にかならずエラーが表示されてしまうので，うまく認証できなかった場合の動作確認がちゃんとできないんですよね。DEBUG定数に優先するようなエラー処理を書くことってできないのでしょうか。これって基本的なことで，とても恥ずかしい諮問かもしれません。</p>]]>
        
    </content>
</entry>

<entry>
    <title>認証(authentication)の研究(1)</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2007/12/authentication1.html" />
    <id>tag:hisashi.heteml.jp,2007:/php//2.64</id>

    <published>2007-12-17T03:02:00Z</published>
    <updated>2009-06-06T05:45:51Z</updated>

    <summary>Webアプリを作る上では避けられないのがユーザー認証です。その認証についてLDAPも含めて研究します。今回はその第1回。&quot;LDAP Models in CakePHP&quot;を紹介します。</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<p>Webアプリを作る上では避けられないのがユーザー認証です。アプリケーションを利用できる人を制限したり，人によって利用できる機能を制限したりするためにはユーザー認証は必須になります。CakePHPのリファレンスガイドの付録Bには</p>
<p style="margin-left: 40px">現在のところ私たちは，ユーザ認証システムはアプリケーションごとに仕様が異なると考えています。あるものはハッシュでパスワードを暗号化，別のものは LDAP 認証などという具合，そしてほぼすべてのアプリケーションの User モデルについて，少しずつ違いがある，といったことがあります。それで今のところは，あなた次第，ということにしておきます。</p>
<p>とあります。そういろいろな仕様があると思います。僕の開発するアプリケーションで必要となる認証方法は，DBにユーザー情報を持っておいて，それでログインするというものと，LDAPサーバー（Windows Server 2003 のActive Directory）の認証とを組み合わせたものです。</p>
<ol>
    <li>ユーザー情報はMySQLのテーブルに持つ</li>
    <li>DB認証のパスワードはハッシュで暗号化して保存する</li>
    <li>DB認証のパスワードが空の場合はLDAPで認証する</li>
    <li>DBにユーザー情報がない場合LDAPで認証できたらDBにユーザー情報を自動作成できる</li>
</ol>
<p>このような仕様のユーザー認証を作成するのを目標にしたいと思います。</p>
<h2>XAMPPでLDAPを利用できるようにする</h2>
<p>最初に開発環境でLDAPが利用できるようにする必要があります。xamppでLDAPを利用できるようにするためには，php.iniの変更が必要です。コマンドラインのためには，c:\xampp\php\php.iniを，Apacheのためにはc:\xampp\apache\bin\php.iniを編集します。</p>
<pre>
;extension=php_ldap.dll</pre>
<p>エディタで上記の行を検索して，この行のコメントを外して保存します。Apacheを再起動します。</p>
<h1>LDAP Models in CakePHP</h1>
<p><a href="http://bakery.cakephp.org/articles/view/ldap-models-in-cakephp">http://bakery.cakephp.org/articles/view/ldap-models-in-cakephp</a> にpsychicことJohn David Anderson氏が書いている記事が大変参考になりましたのでその概要を日本語で書いてみます。</p>
<h2>序</h2>
<p>多くの組織では今日クライアントや従業員の情報を保存するのにLDAPを利用しています。このチュートリアルは，アプリケーションからCakePHPのModelとしてそのデータを利用する方法を紹介します。</p>
<h2>L is for Lightweight</h2>
<p>それほどLDAPに詳しくない場合でも，LDAPへの接続・問い合わせ・データの取得にはどうしたらようかを理解する助けになるいくつかのポイントがあります。LDAPは本当にかなり軽量です，そしてその動作の基本を理解することは，大いにためになるでしょう。<br />
LDAPはツリー状の構造に保存されます。ツリーの中でノードを特定するには親ノードを特定する構文を使います。LDAPツリーのルートは，通常，，「cn=cakephp，cn=org」のように収容されるドメイン名にちなんで名付けられてます。次のような表現は</p>
<pre>
ou=People,cn=example,cn=com </pre>
<p>LDAPツリーのルートにある，&quot;People&quot;というOU(organizatinal unit)をあらわします。</p>
<p>LDAPには多くのタイプのエントリーがありますが，LDAPツリーの最も一般的な用途の一つは個人情報を保存することです。個人レコードをLDAPサーバに問い合わせたとき，そのレコードはツリー形式で返ります。PHPでは，ネストした配列で返ります。</p>
<h2>D is for Down and Dirty</h2>
<p>はじめにテーブルを使用しないCakePHPモデルを作成します。そのためにはModelクラスの$useTableプロパティを使います。また，LDAPの接続設定を定義するいくつかのクラス変数を宣言します。</p>
<pre class="php"><span style="font-weight: bold; color: #000000">&lt;?php</span>  
<span style="font-weight: bold; color: #000000">class</span> LdapUser <span style="font-weight: bold; color: #000000">extends</span> AppModel 
<span style="color: #66cc66">{</span> 
    <span style="font-weight: bold; color: #000000">var</span> <span style="color: #0000ff">$name</span> = <span style="color: #ff0000">'LdapUser'</span>; 
    <span style="font-weight: bold; color: #000000">var</span> <span style="color: #0000ff">$useTable</span> = <span style="font-weight: bold; color: #000000">false</span>; 
&nbsp;
    <span style="font-weight: bold; color: #000000">var</span> <span style="color: #0000ff">$host</span>       = <span style="color: #ff0000">'ldap.example.com'</span>; 
    <span style="font-weight: bold; color: #000000">var</span> <span style="color: #0000ff">$port</span>       = <span style="color: #cc66cc">389</span>; 
    <span style="font-weight: bold; color: #000000">var</span> <span style="color: #0000ff">$baseDn</span> = <span style="color: #ff0000">'dc=example,dc=com'</span>; 
    <span style="font-weight: bold; color: #000000">var</span> <span style="color: #0000ff">$user</span>       = <span style="color: #ff0000">'cn=admin,dc=example,dc=com'</span>; 
    <span style="font-weight: bold; color: #000000">var</span> <span style="color: #0000ff">$pass</span>       = <span style="color: #ff0000">'password'</span>; 
&nbsp;
    <span style="font-weight: bold; color: #000000">var</span> <span style="color: #0000ff">$ds</span>; 
<span style="color: #66cc66">}</span> 
<span style="font-weight: bold; color: #000000">?&gt;</span></pre>
<p>LDAPに詳しくない人のために，これらのセッティングについて説明させてください。hostとportは，そのまんまです。baseDnは，LDAPツリーのルートがどこにあるかを指定します。baseDNを一般公開していないサーバーの場合は，管理者に確かめる必要があります。<br />
$userと$passは，ログインに必要な認証情報です。$ds変数は，接続したLDAPサーバーへのリンクを保存します。</p>
<p>次に，ModelがCakePHPによってロードされるときにLDAPサーバーに接続するようにコンストラクタを修正する必要があります。</p>
<p>&nbsp;</p>
<pre class="php"><span style="font-weight: bold; color: #000000">&lt;?php</span>  
<span style="color: #808080; font-style: italic">//ldap_user.php (partial) </span>
&nbsp;
<span style="font-weight: bold; color: #000000">function</span> __construct<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span> 
<span style="color: #66cc66">{</span> 
    parent::__construct<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span>; 
    <span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">ds</span> = ldap_connect<span style="color: #66cc66">(</span><span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">host</span>, <span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">port</span><span style="color: #66cc66">)</span>; 
    ldap_set_option<span style="color: #66cc66">(</span><span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">ds</span>, LDAP_OPT_PROTOCOL_VERSION, <span style="color: #cc66cc">3</span><span style="color: #66cc66">)</span>; 
    ldap_bind<span style="color: #66cc66">(</span><span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">ds</span>, <span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">user</span>, <span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">pass</span><span style="color: #66cc66">)</span>; 
<span style="color: #66cc66">}</span> 
&nbsp;
<span style="font-weight: bold; color: #000000">function</span> __destruct<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span> 
<span style="color: #66cc66">{</span> 
    ldap_close<span style="color: #66cc66">(</span><span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">ds</span><span style="color: #66cc66">)</span>; 
<span style="color: #66cc66">}</span> 
<span style="font-weight: bold; color: #000000">?&gt;</span></pre>
<h2>A is for Application</h2>
<p>セットアップが完了した今，Modelに2，3のアプリケーションに役立つ関数を作成することができます。最初の業務予定は，多分，一定の条件によってデータを取ってくる関数を作成することでしょう。私が作成した最初のものは，ある属性の値に基づくレコードのセットを返すfindAll()関数でした。</p>
<p>&nbsp;</p>
<pre class="php"><span style="font-weight: bold; color: #000000">&lt;?php</span>  
<span style="font-weight: bold; color: #000000">function</span> findAll<span style="color: #66cc66">(</span><span style="color: #0000ff">$attribute</span> = <span style="color: #ff0000">'uid'</span>, <span style="color: #0000ff">$value</span> = <span style="color: #ff0000">'*'</span>, <span style="color: #0000ff">$baseDn</span> = <span style="color: #ff0000">'ou=People,dc=example,dc=com'</span><span style="color: #66cc66">)</span> 
<span style="color: #66cc66">{</span> 
    <span style="color: #0000ff">$r</span> = ldap_search<span style="color: #66cc66">(</span><span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">ds</span>, <span style="color: #0000ff">$baseDn</span>, <span style="color: #0000ff">$attribute</span> . <span style="color: #ff0000">'='</span> . <span style="color: #0000ff">$value</span><span style="color: #66cc66">)</span>; 
&nbsp;
    <span style="color: #b1b100">if</span> <span style="color: #66cc66">(</span><span style="color: #0000ff">$r</span><span style="color: #66cc66">)</span> 
    <span style="color: #66cc66">{</span> 
        <span style="color: #808080; font-style: italic">//if the result contains entries with surnames, </span>
        <span style="color: #808080; font-style: italic">//sort by surname: </span>
        ldap_sort<span style="color: #66cc66">(</span><span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">ds</span>, <span style="color: #0000ff">$r</span>, <span style="color: #ff0000">&quot;sn&quot;</span><span style="color: #66cc66">)</span>; 
&nbsp;
        <span style="color: #b1b100">return</span> ldap_get_entries<span style="color: #66cc66">(</span><span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">ds</span>, <span style="color: #0000ff">$r</span><span style="color: #66cc66">)</span>; 
    <span style="color: #66cc66">}</span> 
<span style="color: #66cc66">}</span> 
<span style="font-weight: bold; color: #000000">?&gt;</span></pre>
<p>この関数はデフォルトでは与えられたユーザ名と値に基づくレコードセット(&quot;People&quot;というOU下のLDAPツリー上にあるものすべて)をとって来ます。またレコードの姓(sn)によってソートされて返されます。<br />
コントローラでは，多くのやり方で利用できます，:</p>
<p>&nbsp;</p>
<pre class="php"><span style="font-weight: bold; color: #000000">&lt;?php</span>  
<span style="color: #808080; font-style: italic">//Get all users: </span>
<span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">LdapUser</span>-&gt;<span style="color: #006600">findAll</span><span style="color: #66cc66">(</span><span style="color: #ff0000">'uid'</span>, <span style="color: #ff0000">'*'</span><span style="color: #66cc66">)</span>; 
&nbsp;
<span style="color: #808080; font-style: italic">//Get users from a specific group inside the 'People' group: </span>
<span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">LdapUser</span>-&gt;<span style="color: #006600">findAll</span><span style="color: #66cc66">(</span><span style="color: #ff0000">'uid'</span>, <span style="color: #ff0000">'*'</span>, <span style="color: #ff0000">'ou=Client Company,ou=People,cn=example,cn=com'</span><span style="color: #66cc66">)</span>; 
&nbsp;
<span style="color: #808080; font-style: italic">//Get a specific user: </span>
<span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">LdapUser</span>-&gt;<span style="color: #006600">findAll</span><span style="color: #66cc66">(</span><span style="color: #ff0000">'uid'</span>, <span style="color: #ff0000">'jsmith'</span><span style="color: #66cc66">)</span>; 
<span style="font-weight: bold; color: #000000">?&gt;</span></pre>
<p>もう一つの使い勝手の良い関数は auth()関数です。<br />
これは特にイントラネットアプリケーションで便利です。ユーザーはたぶん既にLDAPをメールなどのサービスの認証に使用しています。新しいCakePHPによるイントラネットアプリケーションを使うのにそれらと同じユーザ名とパスワードとを使わない手はありません。<br />
この関数はコンポーネントかコントローラにあるべきかもしれませんが，ModelにはLDAP接続情報が既にありますので，私は認証関数をこのModelクラスに置くことにしました。</p>
<p>注：認証をする際には，セキュアな（SSL）LDAP接続をするために異なるポートで接続させたいかもしれません。</p>
<p>&nbsp;</p>
<pre class="php"><span style="font-weight: bold; color: #000000">&lt;?php</span>  
<span style="font-weight: bold; color: #000000">function</span> auth<span style="color: #66cc66">(</span><span style="color: #0000ff">$uid</span>, <span style="color: #0000ff">$password</span><span style="color: #66cc66">)</span> 
<span style="color: #66cc66">{</span> 
    <span style="color: #0000ff">$result</span> = <span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">findAll</span><span style="color: #66cc66">(</span><span style="color: #ff0000">'uid'</span>, <span style="color: #0000ff">$uid</span><span style="color: #66cc66">)</span>; 
&nbsp;
    <span style="color: #b1b100">if</span><span style="color: #66cc66">(</span><span style="color: #0000ff">$result</span><span style="color: #66cc66">[</span><span style="color: #cc66cc">0</span><span style="color: #66cc66">]</span><span style="color: #66cc66">)</span> 
    <span style="color: #66cc66">{</span> 
        <span style="color: #b1b100">if</span> <span style="color: #66cc66">(</span>ldap_bind<span style="color: #66cc66">(</span><span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">ds</span>, <span style="color: #0000ff">$result</span><span style="color: #66cc66">[</span><span style="color: #cc66cc">0</span><span style="color: #66cc66">]</span><span style="color: #66cc66">[</span><span style="color: #ff0000">'dn'</span><span style="color: #66cc66">]</span>, <span style="color: #0000ff">$password</span><span style="color: #66cc66">)</span><span style="color: #66cc66">)</span> 
            <span style="color: #66cc66">{</span> 
                <span style="color: #b1b100">return</span> <span style="font-weight: bold; color: #000000">true</span>; 
            <span style="color: #66cc66">}</span> 
            <span style="color: #b1b100">else</span> 
            <span style="color: #66cc66">{</span> 
                <span style="color: #b1b100">return</span> <span style="font-weight: bold; color: #000000">false</span>; 
            <span style="color: #66cc66">}</span> 
    <span style="color: #66cc66">}</span> 
    <span style="color: #b1b100">else</span> 
    <span style="color: #66cc66">{</span> 
        <span style="color: #b1b100">return</span> <span style="font-weight: bold; color: #000000">false</span>; 
    <span style="color: #66cc66">}</span> 
<span style="color: #66cc66">}</span> 
<span style="font-weight: bold; color: #000000">?&gt;</span></pre>
<p>簡単ですね。ユーザーを見つけるのにfindAll()関数を使います。このユーザ情報はLDAPサーバがユーザを特定するのに使用するDN(またはdistinguished name)を含んでいます。このステップを取る理由は，Bobのログイン情報を'dn=Bob Smith,ou=MyCompany,dc=example,dc=com'と持つより'bobsmith'と持った方が簡単だからです。</p>
<p>コントローラでこれを利用するのは次のように簡単です。</p>
<pre class="php"><span style="color: #0000ff">$this</span>-&gt;<span style="color: #006600">LdapUser</span>-&gt;<span style="color: #006600">auth</span><span style="color: #66cc66">(</span><span style="color: #0000ff">$u</span>, <span style="color: #0000ff">$p</span><span style="color: #66cc66">)</span>;</pre>
<h1>Active Directoryの利用<br />
&nbsp;</h1>
<p>psychicが提供してくれた情報で，CakePHPの中にうまくLDAPを取り込めそうだと言うことがわかりました。しかし僕のようにActive DirectoryをLDAPサーバーとして利用する場合には，このままではうまく動かない部分があります。その点については次回で研究します。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]>
        
    </content>
</entry>

<entry>
    <title>Menuの研究</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2007/12/menu.html" />
    <id>tag:hisashi.heteml.jp,2007:/php//2.63</id>

    <published>2007-12-11T23:56:55Z</published>
    <updated>2009-06-06T05:45:51Z</updated>

    <summary>ほぼすべてのWebアプリケーションに必要と思われるのは，メニューの機能です。クールなメニューを私のアプリケーションでも使えるようになりたいということで研究してみました。</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
        <category term="Ajax" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="css" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="html" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<p>Webアプリケーションを作るのに欠かせない部品についてちょっと考えてみます。以前カレンダーヘルパーを作りましたが，これは必須な機能であるワケじゃありません。オマケ的なものです。ほぼすべてのWebアプリケーションに必要と思われるのは，メニューの機能です。企業のサイトやYahoo!などのポータルを見ても，画面のヘッダの後などにはタブ形式のメニューがあり，画面の左側にはナビゲーション形式のメニューがあります。これらを私のアプリケーションでも使えるようになりたいということで研究してみました。</p>
<h2>&nbsp;メニューのhtml的な構造</h2>
<p>カラフルだったりクールだったりするタブ形式に見えているメニューも，ナビゲーションに表示されているメニューも，現在のメニューのトレンドでは&lt;ul&gt;&lt;li&gt;タグで表記されています。cssでスタイルが設定されていなければ次のような表示になります。</p>
<ul>
    <li>メニュー1 </li>
    <li>メニュー2 </li>
    <li>メニュー3 </li>
</ul>
<p>このそれぞれの&lt;li&gt;タグの中身に&lt;a&gt;タグでリンクをつけたものがメニューとなります。</p>
<pre class="html4strict"><span style="COLOR: #009900"><a href="http://december.com/html/4/element/ul.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;ul&gt;</span></a></span>
    <span style="COLOR: #009900"><a href="http://december.com/html/4/element/li.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;li&gt;</span></a></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/a.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;a</span></a> <span style="COLOR: #000066">href</span>=<span style="COLOR: #ff0000">&quot;/hoge/menu1&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;<font face="Arial">メニュー1</font></span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/a&gt;</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/li&gt;</span></span>
    <span style="COLOR: #009900"><a href="http://december.com/html/4/element/li.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;li&gt;</span></a></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/a.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;a</span></a> <span style="COLOR: #000066">href</span>=<span style="COLOR: #ff0000">&quot;/hoge/menu2&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;<font face="Arial">メニュー2</font></span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/a&gt;</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/li&gt;</span></span>
    <span style="COLOR: #009900"><a href="http://december.com/html/4/element/li.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;li&gt;</span></a></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/a.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;a</span></a> <span style="COLOR: #000066">href</span>=<span style="COLOR: #ff0000">&quot;/hoge/menu3&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;<font face="Arial">メニュー3</font></span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/a&gt;</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/li&gt;</span></span>
<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/ul&gt;</span></span>
&nbsp;</pre>
<p>そのリンクをAjaxLinkにしたならば，Ajaxを使ったメニューのできあがりです。ごらんのようにhtmlベースでは非常に簡単なものです。ただこれだけだと上記の例のようにそっけないメニューですから，クールなメニューにするにはこれに色々とスパイスを加えていく必要があります。</p>
<h2>CSS</h2>
<p>最初のスパイスはcssです。cssによってこれらのメニューを格好良く見せます。メニュー全体のデザインを決めるためには，ulタグにidまたはclass属性を設定して，その属性に対してcssを定義します。cssを設定することで，タブ形式のように画面の横方向に広がるメニューにすることもできます。html側では，class属性などを指定するだけで，他の部分はすべてcssにお任せします。</p>
<p>またメニューとして利用する場合には，どのメニュー項目がアクティブであるかを画面上で表現（メニューの色を変えるとかタブの形を変えるとか）しなければなりません。この場合もアクティブなメニュー項目のliタグにclass属性を指定することで対応できます。</p>
<pre class="html4strict"><span style="COLOR: #009900"><a href="http://december.com/html/4/element/ul.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;ul</span></a> <span style="COLOR: #000066">class</span>=<span style="COLOR: #ff0000">&quot;tab_menu&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;</span></span>
    <span style="COLOR: #009900"><a href="http://december.com/html/4/element/li.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;li&gt;</span></a></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/a.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;a</span></a> <span style="COLOR: #000066">href</span>=<span style="COLOR: #ff0000">&quot;/hoge/menu1&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;<font face="Arial">メニュー1</font></span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/a&gt;</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/li&gt;</span></span>
    <span style="COLOR: #009900"><a href="http://december.com/html/4/element/li.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;li</span></a> <span style="COLOR: #000066">class</span>=<span style="COLOR: #ff0000">&quot;active&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;</span></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/a.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;a</span></a> <span style="COLOR: #000066">href</span>=<span style="COLOR: #ff0000">&quot;/hoge/menu2&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;<font face="Arial">メニュー2</font></span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/a&gt;</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/li&gt;</span></span>
    <span style="COLOR: #009900"><a href="http://december.com/html/4/element/li.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;li&gt;</span></a></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/a.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;a</span></a> <span style="COLOR: #000066">href</span>=<span style="COLOR: #ff0000">&quot;/hoge/menu3&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;<font face="Arial">メニュー3</font></span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/a&gt;</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/li&gt;</span></span>
<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/ul&gt;</span></span>
&nbsp;</pre>
<p>一行目ではulタグにtab_menuというclass属性を指定しています。またメニュー2のliタグにactiveというclass属性をつけて，このメニューが選択されていることを示しています。<font face="Arial">このhtmlに対してcssを定義します</font>。</p>
<pre class="css"><ol><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">ul<span style="COLOR: #6666ff">.tab_menu</span> <span style="COLOR: #66cc66">{</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">margin</span>: <span style="COLOR: #933">0</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">padding</span>: <span style="COLOR: #933">0</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">list-style-type</span>: <span style="COLOR: #993333">none</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #66cc66">}</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">ul<span style="COLOR: #6666ff">.tab_menu</span> li <span style="COLOR: #66cc66">{</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">margin</span>: <span style="COLOR: #933">0</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">display</span>: <span style="COLOR: #993333">inline</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #66cc66">}</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">ul<span style="COLOR: #6666ff">.tab_menu</span> li a <span style="COLOR: #66cc66">{</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">border</span>: <span style="COLOR: #933">1px</span> <span style="COLOR: #993333">solid</span> <span style="COLOR: #cc00cc">#cccccc</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">margin</span>: <span style="COLOR: #933">0</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">padding</span>: <span style="COLOR: #933">5px</span> <span style="COLOR: #933">10px</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">text-align</span>: <span style="COLOR: #993333">center</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">text-decoration</span>: <span style="COLOR: #993333">none</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">float</span>: <span style="FONT-WEIGHT: bold; COLOR: #000000">left</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">background-color</span>: <span style="COLOR: #cc00cc">#cccccc</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #66cc66">}</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">ul<span style="COLOR: #6666ff">.tab_menu</span> li a<span style="COLOR: #3333ff">:hover</span> <span style="COLOR: #66cc66">{</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">border-color</span>: <span style="COLOR: #cc00cc">#ffffcc</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #66cc66">}</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">ul<span style="COLOR: #6666ff">.tab_menu</span> li<span style="COLOR: #6666ff">.active</span> a <span style="COLOR: #66cc66">{</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">border-color</span>: <span style="COLOR: #cc00cc">#ffffcc</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  <span style="FONT-WEIGHT: bold; COLOR: #000000">background-color</span>: <span style="COLOR: #cc00cc">#ffffcc</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #66cc66">}</span></div></li></ol></pre>
<p><font face="Arial">tab_menuというクラスのulタグとそれに従属するタグに対してスタイルを設定しています。このcssでは，さほどクールなものにはなりませんが，必要最低限の装飾を定義しています。</font></p>
<ol>
    <li><font face="Arial">4行目ではリストの先頭に表示される中黒を表示させないようにしています。</font> </li>
    <li><font face="Arial">8行目ではタブ形式メニューと言うことで，リストを横方向に表示させています。</font> </li>
    <li><font face="Arial">10～18行目，個々のメニュー項目の書式は，liタグの部分ではなくその内部のaタグに対して設定しています。</font> </li>
    <li><font face="Arial">19～20行目のブロックは個々のメニュー項目にマウスカーソルが重なったときに境界線色を変更しています。</font> </li>
    <li><font face="Arial">22～25で設定していいるのは，liに対してactiveというclass属性が設定されている場合の書式です。これにより選択状態のメニューの色が変わります。</font> </li>
</ol>
<p><font face="Arial">これで，一応の見栄えを設定することができました。ここまでできれば背景画像などを用意することでクールなメニューに仕上げることは簡単です。しかし，選択されたメニュー項目はactiveというclass属性を設定されているものですが，メニューがクリックされたときに，li項目のclass属性を変更するしくみを作らないと，メニューをクリックしたのにメニューが切り替わらないことになります。それを実現するためにJavaScriptを使います。</font><font face="Arial"></font> </p>
<h2>JavaScript</h2>
<p>メニューが選択された時点で，選択されているメニューが変更になります。通常のリンクの場合は，変更になった先のページでそのメニューのclass属性をactiveに設定してやればいいのですが，Ajaxで画面描画をしている場合にはメニュー部分のページ遷移は発生しませんので，ページ内でメニューの表示を変更してやる必要があります。そこでJavaScriptを使用します。次のようなスクリプトを書いてみました。</p>
<pre class="javascript"><ol><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="FONT-WEIGHT: bold; COLOR: #003366">function</span> changeMenu<span style="COLOR: #66cc66">(</span>obj<span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    <span style="FONT-WEIGHT: bold; COLOR: #003366">var</span> ul = obj.<span style="COLOR: #006600">parentNode</span>.<span style="COLOR: #006600">parentNode</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    <span style="FONT-WEIGHT: bold; COLOR: #003366">var</span> lis = ul.<span style="COLOR: #006600">childNodes</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    <span style="FONT-WEIGHT: bold; COLOR: #003366">var</span> i=<span style="COLOR: #cc0000">0</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    <span style="FONT-WEIGHT: bold; COLOR: #000066">for</span><span style="COLOR: #66cc66">(</span>i <span style="FONT-WEIGHT: bold; COLOR: #000066">in</span> lis<span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">        lis<span style="COLOR: #66cc66">[</span>i<span style="COLOR: #66cc66">]</span>.<span style="COLOR: #006600">className</span> = <span style="COLOR: #3366cc">''</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    <span style="COLOR: #66cc66">}</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    obj.<span style="COLOR: #006600">parentNode</span>.<span style="COLOR: #006600">className</span> = <span style="COLOR: #3366cc">'active'</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #66cc66">}</span>   </div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">&nbsp;</div></li></ol></pre>
<p>このスクリプトをすべてのメニューの中の&lt;a&gt;タグのonclickから呼び出すようにします。</p>
<pre class="html4strict"><span style="COLOR: #009900"><a href="http://december.com/html/4/element/li.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;li&gt;</span></a></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/a.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;a</span></a> <span style="COLOR: #000066">href</span>=<span style="COLOR: #ff0000">&quot;/hoge/menu1&quot;</span> <span style="COLOR: #000066">onclick</span>=<span style="COLOR: #ff0000">&quot;changeMenu(this)&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;メニュー1</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/a&gt;</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/li&gt;</span></span>
&nbsp;</pre>
<p>前述のように，選択されているメニューのliタグにはactiveというclassを設定することになっています。</p>
<ol>
    <li>2行目，引数で渡されるobjは，&lt;a&gt;タグですので，その親の親が&lt;ul&gt;タグになります。 </li>
    <li>3行目，その子ノードがliタグです。その集合を得ます。 </li>
    <li>5～7行目，liタグのclass属性を一旦全てクリアします。 </li>
    <li>8行目，クリックされたメニューのliタグにacitiveというclass属性を設定します。 </li>
</ol>
<p>&nbsp;これで選択されたメニュー項目を変更することができるようになりました。</p>
<h2>再びヘルパー作成</h2>
<p>これまで，いろんなソースを引用しましたが，全部PHPではありませんね。(^_^;　そろそろPHPのコードを書かなきゃいけません。</p>
<p>ここで作成方法を学んだメニューをCakePHPの中でそのまま利用することはできますが，せっかくですので，これをまたヘルパーにしたいと思います。ヘルパーにすることで非常に簡単に，またソースもわかりやすくメニューを構築することができるようになります。</p>
<p>クラス名&nbsp;　<font face="Arial">SvMenuHelper</font></p>
<h3>メソッド menuInit</h3>
<p>前述のメニュー項目を切り替えるためのスクリプトを記述したhtmlソースを返します。このメソッドが呼び出されていない状態では，menuメソッドやajaxMenuメソッドではメニュー項目を切り替える処理は出力されません。</p>
<p><strong>引数</strong></p>
<ul>
    <li>$scriptName　スクリプトの名前 </li>
</ul>
<h3>メソッド menu</h3>
<p>通常のリンクを持ったメニューのhtmlソースを返します。</p>
<p><strong>引数</strong></p>
<ul>
    <li>$menuList　メニュー表示配列。メニューをあらわす次の形式の配列を渡します。 </li>
</ul>
<pre class="php"><a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span>
    <a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span>
         <span style="COLOR: #ff0000">'title'</span>=&gt;<span style="COLOR: #ff0000">'表示文字列'</span>,
         <span style="COLOR: #ff0000">'url'</span>=&gt;<span style="COLOR: #ff0000">'リンク先URL'</span>,
     <span style="COLOR: #66cc66">)</span>
 <span style="COLOR: #66cc66">)</span></pre>
<ul>
    <li>$default　デフォルトで選択状態になるメニューのindex番号 </li>
    <li><font face="Arial">$options　&lt;a&gt;タグに設定するhtmlオプション</font> </li>
    <li>$class　ulタグに設定するclass属性名 </li>
    <li>$confirm　$html-&gt;linkの$confirmと同じ </li>
    <li>$escapeTitle　$html-&gt;linkの$escapeTitleと同じ </li>
</ul>
<p>通常のリンクを持ったメニューや，Ajaxリンクを持ったメニューを簡単利用できるようにします。</p>
<h3>&nbsp;メソッド　ajaxMenu</h3>
<p>Ajaxリンクを持ったメニューのhtmlソースを返します。</p>
<p><strong>引数</strong></p>
<ul>
    <li>$menuList　メニュー表示配列。menuメソッドと同じ形式です。 </li>
    <li>$default　デフォルトで選択状態になるメニューのindex番号 </li>
    <li>$class　ulタグに設定するclass属性名 </li>
    <li>$opttions&nbsp; <font face="Arial">ajaxのオプション</font> </li>
    <li>$confirm　$ajax-&gt;linkの$confirmと同じ </li>
    <li>$escapeTitle　$ajax-&gt;linkの$escapeTitleと同じ </li>
</ul>
<p>$optionsは$ajax-&gt;linkを使うときと同じように使います。例えば，ajaxMenuをクリックしたときにある&lt;div&gt;要素にupdateをかけるには，$optionsに'update'=&gt;'target_div_id'を追加してコールします。</p>
<p>$defaultがちゃんとセットされている場合には，$defaultで指定したメニューがクリックされたのと同じ処理をページ表示時にも処理します。</p>
<h2>SvMenuHelperの使用方法</h2>
<p>&nbsp;SvMenuHelperを利用したviewのサンプルを下記に示します。</p>
<pre class="php"><ol><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;?php</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #0000ff">$menus</span> = <a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    <a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'title'</span>=&gt;<span style="COLOR: #ff0000">'<font face="Arial">ファイル</font>'</span>, <span style="COLOR: #ff0000">'url'</span>=&gt;<span style="COLOR: #ff0000">'/acal/menu/file'</span><span style="COLOR: #66cc66">)</span>,</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    <a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'title'</span>=&gt;<span style="COLOR: #ff0000">'<font face="Arial">編集</font>'</span>,     <span style="COLOR: #ff0000">'url'</span>=&gt;<span style="COLOR: #ff0000">'/acal/menu/edit'</span><span style="COLOR: #66cc66">)</span>,</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    <a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'title'</span>=&gt;<span style="COLOR: #ff0000">'表示'</span>,     <span style="COLOR: #ff0000">'url'</span>=&gt;<span style="COLOR: #ff0000">'/acal/menu/view'</span><span style="COLOR: #66cc66">)</span>,</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    <a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'title'</span>=&gt;<span style="COLOR: #ff0000">'検索'</span>,     <span style="COLOR: #ff0000">'url'</span>=&gt;<span style="COLOR: #ff0000">'/acal/menu/search'</span><span style="COLOR: #66cc66">)</span>,</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    <a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'title'</span>=&gt;<span style="COLOR: #ff0000">'ヘルプ'</span>,   <span style="COLOR: #ff0000">'url'</span>=&gt;<span style="COLOR: #ff0000">'/acal/menu/help'</span><span style="COLOR: #66cc66">)</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #66cc66">)</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><a href="http://www.php.net/echo"><span style="COLOR: #000066">echo</span></a> <span style="COLOR: #0000ff">$svMenu</span>-&gt;<span style="COLOR: #006600">ajaxMenuInit</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">&quot;changeMenu&quot;</span><span style="COLOR: #66cc66">)</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="FONT-WEIGHT: bold; COLOR: #000000">?&gt;</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">&lt;div id=<span style="COLOR: #ff0000">&quot;menu&quot;</span>&gt;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    &lt;div id=<span style="COLOR: #ff0000">&quot;menu_inner&quot;</span>&gt;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">        <span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;?php</span> </div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">        <span style="COLOR: #0000ff">$opt</span> = <a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">            <span style="COLOR: #ff0000">'update'</span>=&gt;<span style="COLOR: #ff0000">'main_inner'</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">        <span style="COLOR: #66cc66">)</span>;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">        <a href="http://www.php.net/echo"><span style="COLOR: #000066">echo</span></a> <span style="COLOR: #0000ff">$svMenu</span>-&gt;<span style="COLOR: #006600">ajaxMenu</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$menus</span>, <span style="COLOR: #cc66cc">0</span>, <span style="COLOR: #ff0000">&quot;tab_menu&quot;</span>, <span style="COLOR: #0000ff">$opt</span><span style="COLOR: #66cc66">)</span>; </div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">        <span style="FONT-WEIGHT: bold; COLOR: #000000">?&gt;</span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    &lt;/div&gt;&lt;!-- menu_inner --&gt;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">&lt;/div&gt;&lt;!-- menu --&gt;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">&lt;div id=<span style="COLOR: #ff0000">&quot;main&quot;</span>&gt;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    &lt;div id=<span style="COLOR: #ff0000">&quot;main_inner&quot;</span>&gt;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    &lt;/div&gt;&lt;!-- main_inner --&gt;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">&lt;/div&gt;&lt;!-- main --&gt;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">&nbsp;</div></li></ol></pre>
<ol>
    <li>2～8行目，メニュー表示配列を用意しています。 </li>
    <li>9行目，メニューの選択状態更新用のスクリプトを出力しています。 </li>
    <li>14～16行目，メニューがクリックされたときに更新されるdiv要素を&quot;main_inner&quot;であると指定しています。 </li>
    <li>17行目，Ajaxを利用したメニューを出力しています。 </li>
</ol>
<p>これにより出力されたhtmlのコードは次のようになります。（少々整形してあります）</p>
<pre class="html4strict"><ol><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #009900"><a href="http://december.com/html/4/element/script.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;script</span></a> <span style="COLOR: #000066">type</span>=<span style="COLOR: #ff0000">&quot;text/javascript&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;</span></span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  function changeMenu(obj){</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    var ul = obj.parentNode.parentNode;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    var lis = ul.childNodes;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    var i=0;</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    for(i in lis){</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">      lis[i].className = '';</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    }</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    obj.parentNode.className = 'active';</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">  }	</div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/script&gt;</span></span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #009900"><a href="http://december.com/html/4/element/div.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;div</span></a> <span style="COLOR: #000066">id</span>=<span style="COLOR: #ff0000">&quot;menu&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;</span></span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #009900"><font color="#000000">  </font><a href="http://december.com/html/4/element/div.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;div</span></a> <span style="COLOR: #000066">id</span>=<span style="COLOR: #ff0000">&quot;menu_inner&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;</span></span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">    <span style="COLOR: #009900"><a href="http://december.com/html/4/element/script.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;script</span></a> <span style="COLOR: #000066">type</span>=<span style="COLOR: #ff0000">&quot;text/javascript&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;</span></span>Event.observe(window, 'load', function(event) { new Ajax.Updater('main_inner','/cake/schedule/acal/menu/file', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'main_inner']}) }, false);<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/script&gt;</span></span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #009900">    <a href="http://december.com/html/4/element/ul.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;ul</span></a> <span style="COLOR: #000066">class</span> = <span style="COLOR: #ff0000">&quot;tab_menu&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;</span></span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">      <span style="COLOR: #009900"><a href="http://december.com/html/4/element/li.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;li</span></a> <span style="COLOR: #000066">class</span> = <span style="COLOR: #ff0000">&quot;active&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;</span></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/a.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;a</span></a> <span style="COLOR: #000066">href</span>=<span style="COLOR: #ff0000">&quot;/cake/schedule/acal/menu/file&quot;</span>  <span style="COLOR: #000066">onclick</span>=<span style="COLOR: #ff0000">&quot;changeMenu(this);  event.returnValue = false; return false;&quot;</span> <span style="COLOR: #000066">id</span>=<span style="COLOR: #ff0000">&quot;link17663&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;ファイル</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/a&gt;</span></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/script.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;script</span></a> <span style="COLOR: #000066">type</span>=<span style="COLOR: #ff0000">&quot;text/javascript&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;</span></span>Event.observe('link17663', 'click', function(event) { new Ajax.Updater('main_inner','/cake/schedule/acal/menu/file', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'main_inner']}) }, false);<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/script&gt;</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/li&gt;</span></span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">      <span style="COLOR: #009900"><a href="http://december.com/html/4/element/li.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;li&gt;</span></a></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/a.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;a</span></a> <span style="COLOR: #000066">href</span>=<span style="COLOR: #ff0000">&quot;/cake/schedule/acal/menu/edit&quot;</span>  <span style="COLOR: #000066">onclick</span>=<span style="COLOR: #ff0000">&quot;changeMenu(this);  event.returnValue = false; return false;&quot;</span> <span style="COLOR: #000066">id</span>=<span style="COLOR: #ff0000">&quot;link17100&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;編集</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/a&gt;</span></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/script.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;script</span></a> <span style="COLOR: #000066">type</span>=<span style="COLOR: #ff0000">&quot;text/javascript&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;</span></span>Event.observe('link17100', 'click', function(event) { new Ajax.Updater('main_inner','/cake/schedule/acal/menu/edit', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'main_inner']}) }, false);<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/script&gt;</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/li&gt;</span></span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">      <span style="COLOR: #009900"><a href="http://december.com/html/4/element/li.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;li&gt;</span></a></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/a.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;a</span></a> <span style="COLOR: #000066">href</span>=<span style="COLOR: #ff0000">&quot;/cake/schedule/acal/menu/view&quot;</span>  <span style="COLOR: #000066">onclick</span>=<span style="COLOR: #ff0000">&quot;changeMenu(this);  event.returnValue = false; return false;&quot;</span> <span style="COLOR: #000066">id</span>=<span style="COLOR: #ff0000">&quot;link18709&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;表示</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/a&gt;</span></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/script.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;script</span></a> <span style="COLOR: #000066">type</span>=<span style="COLOR: #ff0000">&quot;text/javascript&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;</span></span>Event.observe('link18709', 'click', function(event) { new Ajax.Updater('main_inner','/cake/schedule/acal/menu/view', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'main_inner']}) }, false);<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/script&gt;</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/li&gt;</span></span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">      <span style="COLOR: #009900"><a href="http://december.com/html/4/element/li.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;li&gt;</span></a></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/a.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;a</span></a> <span style="COLOR: #000066">href</span>=<span style="COLOR: #ff0000">&quot;/cake/schedule/acal/menu/search&quot;</span>  <span style="COLOR: #000066">onclick</span>=<span style="COLOR: #ff0000">&quot;changeMenu(this);  event.returnValue = false; return false;&quot;</span> <span style="COLOR: #000066">id</span>=<span style="COLOR: #ff0000">&quot;link13354&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;検索</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/a&gt;</span></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/script.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;script</span></a> <span style="COLOR: #000066">type</span>=<span style="COLOR: #ff0000">&quot;text/javascript&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;</span></span>Event.observe('link13354', 'click', function(event) { new Ajax.Updater('main_inner','/cake/schedule/acal/menu/search', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'main_inner']}) }, false);<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/script&gt;</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/li&gt;</span></span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace">      <span style="COLOR: #009900"><a href="http://december.com/html/4/element/li.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;li&gt;</span></a></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/a.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;a</span></a> <span style="COLOR: #000066">href</span>=<span style="COLOR: #ff0000">&quot;/cake/schedule/acal/menu/help&quot;</span>  <span style="COLOR: #000066">onclick</span>=<span style="COLOR: #ff0000">&quot;changeMenu(this);  event.returnValue = false; return false;&quot;</span> <span style="COLOR: #000066">id</span>=<span style="COLOR: #ff0000">&quot;link12827&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;ヘルプ</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/a&gt;</span></span><span style="COLOR: #009900"><a href="http://december.com/html/4/element/script.html"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;script</span></a> <span style="COLOR: #000066">type</span>=<span style="COLOR: #ff0000">&quot;text/javascript&quot;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">&gt;</span></span>Event.observe('link12827', 'click', function(event) { new Ajax.Updater('main_inner','/cake/schedule/acal/menu/help', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'main_inner']}) }, false);<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/script&gt;</span></span><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/li&gt;</span></span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">    &lt;/ul&gt;</span></span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">  &lt;/div&gt;</span></span><span style="COLOR: #009900"><span style="COLOR: #808080; FONT-STYLE: italic">&lt;!-- menu_inner --&gt;</span></span></div></li><li style="FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New', Courier, monospace"><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;/div&gt;</span></span><span style="COLOR: #009900"><span style="COLOR: #808080; FONT-STYLE: italic">&lt;!-- menu --&gt;</span></span>&nbsp;</div></li></ol></pre>
<p>&nbsp;14行目は，ページ表示時に$defaultでセットされたメニュー項目のurlでdiv項目が表示されるコードです。これがないとメニューが表示されてもdiv要素の中は空っぽな状態でページが表示されてしまいます。</p>
<p><img alt="" border="1" src="http://php.sunvisor.net/images/pic1212-1.png" /></p>
<p>表示されたメニューのスナップショットです。こんな感じになります。</p>
<h2>SvMenuHelperのソース</h2>
<pre class="php"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;?php</span>
<span style="COLOR: #808080; FONT-STYLE: italic">/**
 * SvMenuHelper 
 * 
 * <font face="Arial">メニュー表示ヘルパー</font>
 *
 * @author Sunvisor
 */</span>
<span style="FONT-WEIGHT: bold; COLOR: #000000">class</span> SvMenuHelper <span style="FONT-WEIGHT: bold; COLOR: #000000">extends</span> Helper <span style="COLOR: #66cc66">{</span>
    <span style="FONT-WEIGHT: bold; COLOR: #000000">var</span> <span style="COLOR: #0000ff">$helpers</span> = <a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'Html'</span>, <span style="COLOR: #ff0000">'Ajax'</span>, <span style="COLOR: #ff0000">'Javascript'</span><span style="COLOR: #66cc66">)</span>;
    <span style="FONT-WEIGHT: bold; COLOR: #000000">var</span> <span style="COLOR: #0000ff">$scriptName</span> = <span style="FONT-WEIGHT: bold; COLOR: #000000">null</span>;
    <span style="FONT-WEIGHT: bold; COLOR: #000000">var</span> <span style="COLOR: #0000ff">$activeClassName</span> = <span style="COLOR: #ff0000">'active'</span>;
    <span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> menuInit<span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$scritpName</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">scriptName</span> = <span style="COLOR: #0000ff">$scritpName</span>;
        <span style="COLOR: #0000ff">$ac</span> = <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">activeClassName</span>;
        <span style="COLOR: #0000ff">$result</span> = <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">Javascript</span>-&gt;<span style="COLOR: #006600">codeBlock</span><span style="COLOR: #66cc66">(</span>
            <span style="COLOR: #ff0000">&quot;<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>function $scritpName(obj){<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>.
            <span style="COLOR: #ff0000">&quot;   var ul = obj.parentNode.parentNode;<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>.
            <span style="COLOR: #ff0000">&quot;   var lis = ul.childNodes;<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>.
            <span style="COLOR: #ff0000">&quot;   var i=0;<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>.
            <span style="COLOR: #ff0000">&quot;   for(i in lis){<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>.
            <span style="COLOR: #ff0000">&quot;       lis[i].className = '';<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>.
            <span style="COLOR: #ff0000">&quot;   }<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>.
            <span style="COLOR: #ff0000">&quot;   obj.parentNode.className = '$ac';<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>.
            <span style="COLOR: #ff0000">&quot;}  <span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>
        <span style="COLOR: #66cc66">)</span>.<span style="COLOR: #ff0000">&quot;<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>;
        <span style="COLOR: #b1b100">return</span> <span style="COLOR: #0000ff">$result</span>;
    <span style="COLOR: #66cc66">}</span>
    <span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> menu<span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$menuList</span>, <span style="COLOR: #0000ff">$default</span>=<span style="COLOR: #cc66cc">0</span>, <span style="COLOR: #0000ff">$options</span>=<a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>, <span style="COLOR: #0000ff">$class</span> = <span style="FONT-WEIGHT: bold; COLOR: #000000">null</span>, <span style="COLOR: #0000ff">$confirm</span> = <span style="FONT-WEIGHT: bold; COLOR: #000000">null</span>, <span style="COLOR: #0000ff">$escapeTitle</span> = <span style="FONT-WEIGHT: bold; COLOR: #000000">true</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
        <span style="COLOR: #b1b100">if</span><span style="COLOR: #66cc66">(</span><a href="http://www.php.net/isset"><span style="COLOR: #000066">isset</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">scriptName</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
            <span style="COLOR: #b1b100">if</span> <span style="COLOR: #66cc66">(</span>!<a href="http://www.php.net/isset"><span style="COLOR: #000066">isset</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$options</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'onclick'</span><span style="COLOR: #66cc66">]</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
                <span style="COLOR: #0000ff">$options</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'onclick'</span><span style="COLOR: #66cc66">]</span> = <span style="COLOR: #ff0000">''</span>;
            <span style="COLOR: #66cc66">}</span>
            <span style="COLOR: #0000ff">$options</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'onclick'</span><span style="COLOR: #66cc66">]</span> .= <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">scriptName</span>.<span style="COLOR: #ff0000">&quot;(this); &quot;</span>;
        <span style="COLOR: #66cc66">}</span>
        <span style="COLOR: #b1b100">if</span><span style="COLOR: #66cc66">(</span><a href="http://www.php.net/isset"><span style="COLOR: #000066">isset</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$class</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>
            <span style="COLOR: #0000ff">$c</span> = <span style="COLOR: #ff0000">' class = &quot;'</span>.<span style="COLOR: #0000ff">$class</span>.<span style="COLOR: #ff0000">'&quot;'</span>;
        <span style="COLOR: #b1b100">else</span>
            <span style="COLOR: #0000ff">$c</span> = <span style="COLOR: #ff0000">''</span>;
        <span style="COLOR: #0000ff">$result</span> = <span style="COLOR: #ff0000">&quot;&lt;ul$c&gt;<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>;
        <span style="COLOR: #b1b100">foreach</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$menuList</span> <span style="COLOR: #b1b100">as</span> <span style="COLOR: #0000ff">$index</span> =&gt; <span style="COLOR: #0000ff">$menuValue</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
            <span style="COLOR: #0000ff">$t</span> = <span style="COLOR: #0000ff">$menuValue</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'title'</span><span style="COLOR: #66cc66">]</span>;
            <span style="COLOR: #0000ff">$u</span> = <span style="COLOR: #0000ff">$menuValue</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'url'</span><span style="COLOR: #66cc66">]</span>;
            <span style="COLOR: #b1b100">if</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$default</span>==<span style="COLOR: #0000ff">$index</span><span style="COLOR: #66cc66">)</span>
                <span style="COLOR: #0000ff">$c</span> = <span style="COLOR: #ff0000">' class = &quot;'</span>.<span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">activeClassName</span>.<span style="COLOR: #ff0000">'&quot;'</span>;
            <span style="COLOR: #b1b100">else</span>
                <span style="COLOR: #0000ff">$c</span> = <span style="COLOR: #ff0000">''</span>;
            <span style="COLOR: #0000ff">$result</span> .= <span style="COLOR: #ff0000">&quot;  &lt;li$c&gt;&quot;</span>;
            <span style="COLOR: #0000ff">$result</span> .= <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">Html</span>-&gt;<span style="COLOR: #006600">link</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$t</span>, <span style="COLOR: #0000ff">$u</span>, <span style="COLOR: #0000ff">$options</span>, <span style="COLOR: #0000ff">$confirm</span>, <span style="COLOR: #0000ff">$escapeTitle</span><span style="COLOR: #66cc66">)</span>;
            <span style="COLOR: #0000ff">$result</span> .= <span style="COLOR: #ff0000">&quot;&lt;/li&gt;<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>;           
        <span style="COLOR: #66cc66">}</span>
        <span style="COLOR: #0000ff">$result</span> .= <span style="COLOR: #ff0000">&quot;&lt;/ul&gt;&quot;</span>;
        <span style="COLOR: #b1b100">return</span> <span style="COLOR: #0000ff">$result</span>; 
    <span style="COLOR: #66cc66">}</span>
    <span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> ajaxMenu<span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$menuList</span>, <span style="COLOR: #0000ff">$default</span>=<span style="COLOR: #cc66cc">0</span>, <span style="COLOR: #0000ff">$class</span> = <span style="FONT-WEIGHT: bold; COLOR: #000000">null</span>, <span style="COLOR: #0000ff">$options</span>=<a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>, <span style="COLOR: #0000ff">$confirm</span> = <span style="FONT-WEIGHT: bold; COLOR: #000000">null</span>, <span style="COLOR: #0000ff">$escapeTitle</span> = <span style="FONT-WEIGHT: bold; COLOR: #000000">true</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
        <span style="COLOR: #b1b100">if</span><span style="COLOR: #66cc66">(</span><a href="http://www.php.net/isset"><span style="COLOR: #000066">isset</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">scriptName</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
            <span style="COLOR: #b1b100">if</span> <span style="COLOR: #66cc66">(</span>!<a href="http://www.php.net/isset"><span style="COLOR: #000066">isset</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$options</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'onclick'</span><span style="COLOR: #66cc66">]</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
                <span style="COLOR: #0000ff">$options</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'onclick'</span><span style="COLOR: #66cc66">]</span> = <span style="COLOR: #ff0000">''</span>;
            <span style="COLOR: #66cc66">}</span>
            <span style="COLOR: #0000ff">$options</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'onclick'</span><span style="COLOR: #66cc66">]</span> .= <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">scriptName</span>.<span style="COLOR: #ff0000">&quot;(this); &quot;</span>;
        <span style="COLOR: #66cc66">}</span>
        <span style="COLOR: #b1b100">if</span><span style="COLOR: #66cc66">(</span><a href="http://www.php.net/isset"><span style="COLOR: #000066">isset</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$menuList</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #0000ff">$default</span><span style="COLOR: #66cc66">]</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
            <span style="COLOR: #0000ff">$opt</span> = <span style="COLOR: #0000ff">$options</span>;
            <span style="COLOR: #0000ff">$opt</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'url'</span><span style="COLOR: #66cc66">]</span> = <span style="COLOR: #0000ff">$menuList</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #0000ff">$default</span><span style="COLOR: #66cc66">]</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'url'</span><span style="COLOR: #66cc66">]</span>;
            <a href="http://www.php.net/echo"><span style="COLOR: #000066">echo</span></a> <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">Javascript</span>-&gt;<span style="COLOR: #006600">event</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'window'</span>,<span style="COLOR: #ff0000">'load'</span>, <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">Ajax</span>-&gt;<span style="COLOR: #006600">remoteFunction</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$opt</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>.<span style="COLOR: #ff0000">&quot;<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>;
        <span style="COLOR: #66cc66">}</span>
        <span style="COLOR: #b1b100">if</span><span style="COLOR: #66cc66">(</span><a href="http://www.php.net/isset"><span style="COLOR: #000066">isset</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$class</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>
            <span style="COLOR: #0000ff">$c</span> = <span style="COLOR: #ff0000">' class = &quot;'</span>.<span style="COLOR: #0000ff">$class</span>.<span style="COLOR: #ff0000">'&quot;'</span>;
        <span style="COLOR: #b1b100">else</span>
            <span style="COLOR: #0000ff">$c</span> = <span style="COLOR: #ff0000">''</span>;
        <span style="COLOR: #0000ff">$result</span> = <span style="COLOR: #ff0000">&quot;&lt;ul$c&gt;<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>;
        <span style="COLOR: #b1b100">foreach</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$menuList</span> <span style="COLOR: #b1b100">as</span> <span style="COLOR: #0000ff">$index</span> =&gt; <span style="COLOR: #0000ff">$menuValue</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
            <span style="COLOR: #0000ff">$t</span> = <span style="COLOR: #0000ff">$menuValue</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'title'</span><span style="COLOR: #66cc66">]</span>;
            <span style="COLOR: #0000ff">$u</span> = <span style="COLOR: #0000ff">$menuValue</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'url'</span><span style="COLOR: #66cc66">]</span>;
            <span style="COLOR: #808080; FONT-STYLE: italic">// li%u306E%u30AF%u30E9%u30B9%u540D -&gt; $c</span>
            <span style="COLOR: #b1b100">if</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$default</span>==<span style="COLOR: #0000ff">$index</span><span style="COLOR: #66cc66">)</span>
                <span style="COLOR: #0000ff">$c</span> = <span style="COLOR: #ff0000">' class = &quot;'</span>.<span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">activeClassName</span>.<span style="COLOR: #ff0000">'&quot;'</span>;
            <span style="COLOR: #b1b100">else</span>
                <span style="COLOR: #0000ff">$c</span> = <span style="COLOR: #ff0000">''</span>;
            <span style="COLOR: #0000ff">$result</span> .= <span style="COLOR: #ff0000">&quot;  &lt;li$c&gt;&quot;</span>;
            <span style="COLOR: #0000ff">$result</span> .= <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">Ajax</span>-&gt;<span style="COLOR: #006600">link</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$t</span>, <span style="COLOR: #0000ff">$u</span>, <span style="COLOR: #0000ff">$options</span>, <span style="COLOR: #0000ff">$confirm</span>, <span style="COLOR: #0000ff">$escapeTitle</span><span style="COLOR: #66cc66">)</span>;
            <span style="COLOR: #0000ff">$result</span> .= <span style="COLOR: #ff0000">&quot;&lt;/li&gt;<span style="FONT-WEIGHT: bold; COLOR: #000099">\n</span>&quot;</span>;           
        <span style="COLOR: #66cc66">}</span>
        <span style="COLOR: #0000ff">$result</span> .= <span style="COLOR: #ff0000">&quot;&lt;/ul&gt;&quot;</span>;
        <span style="COLOR: #b1b100">return</span> <span style="COLOR: #0000ff">$result</span>; 
    <span style="COLOR: #66cc66">}</span>
<span style="COLOR: #66cc66">}</span>
<span style="FONT-WEIGHT: bold; COLOR: #000000">?&gt;</span></pre>
<p>&nbsp;</p>]]>
        
    </content>
</entry>

<entry>
    <title>Ajaxにトライ</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2007/12/ajax.html" />
    <id>tag:hisashi.heteml.jp,2007:/php//2.62</id>

    <published>2007-12-05T07:09:20Z</published>
    <updated>2009-06-06T05:45:51Z</updated>

    <summary>カレンダーヘルパーと組み合わせてAjaxを使ってみたいと思い挑戦です。</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
        <category term="Ajax" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<h2>prototype.jsとscript.aculo.usを配置</h2>
<p><font face="Arial"><a href="http://script.aculo.us/downloads">http://script.aculo.us/downloads</a>&nbsp;からscript.aculo.usの最新版をダウンロード。僕の場合は，<font face="Arial">scriptaculous-js-1.8.0.zipをダウンロードしました。解凍したらlibフォルダの中の<font face="Arial">prototype.jsと，</font></font></font>srcフォルダにあるすべてのjsファイルを，appフォルダのwebapp/jsフォルダにコピーしました。</p>
<h2>$ajax-&gt;linkを使ってみる</h2>
<p>$ajax-&gt;linkを使って，カレンダーを翌月前月と切り替えることをやってみます。カレンダーに前月・翌月のリンクをつけて，クリックされると前月・翌月の間レンダーが表示されるというのをajaxで実現しようというわけです。前月・翌月という風に相対的に変わって行くと言うことは，現在表示されている年月を保存しなければ成りません。それらはセッションに保存することにしました。</p>
<pre class="php">    <span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> _saveData<span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$field</span>, <span style="COLOR: #0000ff">$data</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">Session</span>-&gt;<span style="COLOR: #006600">write</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$field</span>, <span style="COLOR: #0000ff">$data</span><span style="COLOR: #66cc66">)</span>;
    <span style="COLOR: #66cc66">}</span>
    <span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> _loadData<span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$field</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
        <span style="COLOR: #b1b100">return</span> <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">Session</span>-&gt;<span style="COLOR: #006600">read</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$field</span><span style="COLOR: #66cc66">)</span>;
    <span style="COLOR: #66cc66">}</span>
    <span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> index<span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
        <span style="COLOR: #0000ff">$this</span>-&gt;_saveData<span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'year'</span>, <a href="http://www.php.net/date"><span style="COLOR: #000066">date</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'Y'</span>, <a href="http://www.php.net/time"><span style="COLOR: #000066">time</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #0000ff">$this</span>-&gt;_saveData<span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'month'</span>, <a href="http://www.php.net/date"><span style="COLOR: #000066">date</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'n'</span>, <a href="http://www.php.net/time"><span style="COLOR: #000066">time</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">set</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'year'</span>, <span style="COLOR: #0000ff">$this</span>-&gt;_loadData<span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'year'</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">set</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'month'</span>, <span style="COLOR: #0000ff">$this</span>-&gt;_loadData<span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'month'</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>;     
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">layout</span> = <span style="COLOR: #ff0000">'default'</span>;
    <span style="COLOR: #66cc66">}</span>
&nbsp;</pre>
<p>indexが最初にページを表示させるメソッドです。年と月をセッションに保存してからビューにそれらを渡して表示しています。&nbsp;</p>
<pre class="php">&lt;div&gt;
<span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;?php</span>
    <span style="COLOR: #0000ff">$opt</span> = <a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span>
        <span style="COLOR: #ff0000">'update'</span>=&gt;<span style="COLOR: #ff0000">'calendar'</span>,
        <span style="COLOR: #ff0000">'loading'</span>=&gt;<span style="COLOR: #ff0000">&quot;Element.hide('calendar')&quot;</span>,
        <span style="COLOR: #ff0000">'complete'</span>=&gt;<span style="COLOR: #ff0000">&quot;Effect.Appear('calendar',{duration: 1.0})&quot;</span>
        <span style="COLOR: #66cc66">)</span>;
    <a href="http://www.php.net/echo"><span style="COLOR: #000066">echo</span></a> <span style="COLOR: #0000ff">$ajax</span>-&gt;<span style="COLOR: #006600">link</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'前月'</span>, <span style="COLOR: #ff0000">'prev'</span>, <span style="COLOR: #0000ff">$opt</span>, <span style="FONT-WEIGHT: bold; COLOR: #000000">null</span>, <span style="FONT-WEIGHT: bold; COLOR: #000000">false</span><span style="COLOR: #66cc66">)</span>;
    <a href="http://www.php.net/echo"><span style="COLOR: #000066">echo</span></a> <span style="COLOR: #ff0000">' | '</span>;
    <a href="http://www.php.net/echo"><span style="COLOR: #000066">echo</span></a> <span style="COLOR: #0000ff">$ajax</span>-&gt;<span style="COLOR: #006600">link</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'翌月'</span>, <span style="COLOR: #ff0000">'next'</span>, <span style="COLOR: #0000ff">$opt</span>, <span style="FONT-WEIGHT: bold; COLOR: #000000">null</span>, <span style="FONT-WEIGHT: bold; COLOR: #000000">false</span><span style="COLOR: #66cc66">)</span>;
<span style="FONT-WEIGHT: bold; COLOR: #000000">?&gt;</span>
&lt;/div&gt;
&lt;div id=<span style="COLOR: #ff0000">&quot;calendar&quot;</span>&gt;
<span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;?php</span> <span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">showCalendar</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$year</span>, <span style="COLOR: #0000ff">$month</span><span style="COLOR: #66cc66">)</span>; <span style="FONT-WEIGHT: bold; COLOR: #000000">?&gt;</span>
&lt;/div&gt;
&nbsp;
&nbsp;</pre>
<p>index.thtmlの中身です。$ajax-&gt;linkで交信用のメソッドを呼び出しています。ついでにEffectをかけてみました。Effectでは前のカレンダーをフェードアウトさせるのもやってみたかったのですが，loadingのところで，Effect.Fadeを指定するとフェードアウトはするものの，次にフェードインしても直後にマッシロケに戻ってしまいます。どうしたら望んだ動作になるのかわかりません。まだajaxの使い方がわかっていませんね要勉強です。</p>
<pre class="php">    <span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> <a href="http://www.php.net/prev"><span style="COLOR: #000066">prev</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">addMonth</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #cc66cc">-1</span><span style="COLOR: #66cc66">)</span>;
    <span style="COLOR: #66cc66">}</span>
    <span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> <a href="http://www.php.net/next"><span style="COLOR: #000066">next</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">addMonth</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #cc66cc">1</span><span style="COLOR: #66cc66">)</span>;
    <span style="COLOR: #66cc66">}</span>
    <span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> addMonth<span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$value</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">layout</span> = <span style="COLOR: #ff0000">'ajax'</span>;
        <span style="COLOR: #0000ff">$year</span> = <span style="COLOR: #0000ff">$this</span>-&gt;_loadData<span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'year'</span><span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #0000ff">$month</span> = <span style="COLOR: #0000ff">$this</span>-&gt;_loadData<span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'month'</span><span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #0000ff">$d</span> = <a href="http://www.php.net/mktime"><span style="COLOR: #000066">mktime</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #cc66cc">0</span>,<span style="COLOR: #cc66cc">0</span>,<span style="COLOR: #cc66cc">0</span>, <span style="COLOR: #0000ff">$month</span> <span style="COLOR: #0000ff">$value</span>, <span style="COLOR: #cc66cc">1</span>, <span style="COLOR: #0000ff">$year</span><span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #0000ff">$this</span>-&gt;_saveData<span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'year'</span>, <a href="http://www.php.net/date"><span style="COLOR: #000066">date</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'Y'</span>, <span style="COLOR: #0000ff">$d</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #0000ff">$this</span>-&gt;_saveData<span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'month'</span>, <a href="http://www.php.net/date"><span style="COLOR: #000066">date</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'n'</span>, <span style="COLOR: #0000ff">$d</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">set</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'year'</span>, <span style="COLOR: #0000ff">$this</span>-&gt;_loadData<span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'year'</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">set</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'month'</span>, <span style="COLOR: #0000ff">$this</span>-&gt;_loadData<span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'month'</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>;     
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">render</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'view'</span><span style="COLOR: #66cc66">)</span>;
    <span style="COLOR: #66cc66">}</span>
&nbsp;
&nbsp;</pre>
<p>prevとnextが$ajax-&gt;linkから呼ばれてカレンダーを表示するメソッドです。その本体はaddMonthです。prevやnextメソッドがなくても，$ajax-&gt;linkのurlでaddMonth/1などとしてもよいですね。addMonthメソッドではview.thtmlを表示しています（最終行）。そのview.thtmlはたった一行です。</p>
<pre class="php"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;?php</span> <span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">showCalendar</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$year</span>,<span style="COLOR: #0000ff">$month</span><span style="COLOR: #66cc66">)</span>;?&gt;</pre>
<p class="php">これで表示されるのが次のような画面。翌月・前月をクリックするとカレンダーが変化します。ajaxしているって感じで良いです。</p>
<p class="php"><img alt="" border="1" src="http://php.sunvisor.net/images/pic1205-1.png" /></p>
<h2>$ajax-&gt;observeFormを使ってみる</h2>
<p>observeFormはフォームを監視して変化があった場合に，アクションを起こすものです。画面上のフォームで年・月を変更するとカレンダーが変わるというのを狙ってみます。index2というメソッド名にしてみます。</p>
<pre class="php">    <span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> index2<span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">set</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'year'</span>, <a href="http://www.php.net/date"><span style="COLOR: #000066">date</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'Y'</span>, <a href="http://www.php.net/time"><span style="COLOR: #000066">time</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">set</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'month'</span>, <a href="http://www.php.net/date"><span style="COLOR: #000066">date</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'n'</span>, <a href="http://www.php.net/time"><span style="COLOR: #000066">time</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>;
    <span style="COLOR: #66cc66">}</span>
&nbsp;</pre>
<p>次がindex2.thtmlです。</p>
<pre class="php">&lt;form id=<span style="COLOR: #ff0000">&quot;ajform&quot;</span>&gt;
&lt;input type=<span style="COLOR: #ff0000">&quot;text&quot;</span> name=<span style="COLOR: #ff0000">&quot;year&quot;</span> value=<span style="COLOR: #ff0000">&quot;&lt;?php echo $year;?&gt;&quot;</span> size=<span style="COLOR: #ff0000">&quot;4&quot;</span> style=<span style="COLOR: #ff0000">&quot;{display: inline}&quot;</span>&gt;
&lt;label style=<span style="COLOR: #ff0000">&quot;{display: inline}&quot;</span>&gt;%u5E74&lt;/label&gt;
&lt;input type=<span style="COLOR: #ff0000">&quot;text&quot;</span> name=<span style="COLOR: #ff0000">&quot;month&quot;</span> value=<span style="COLOR: #ff0000">&quot;&lt;?php echo $month;?&gt;&quot;</span> size=<span style="COLOR: #ff0000">&quot;2&quot;</span> style=<span style="COLOR: #ff0000">&quot;{display: inline}&quot;</span>&gt;
&lt;label style=<span style="COLOR: #ff0000">&quot;{display: inline}&quot;</span>&gt;%u6708&lt;/label&gt;
&lt;/form&gt;
<span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;?php</span>
<span style="COLOR: #0000ff">$opt</span> = <a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span>
    <span style="COLOR: #ff0000">'frequency'</span>=&gt;<span style="COLOR: #ff0000">'1'</span>,
    <span style="COLOR: #ff0000">'update'</span>=&gt;<span style="COLOR: #ff0000">'calendar'</span>,
    <span style="COLOR: #ff0000">'url'</span>=&gt;<span style="COLOR: #ff0000">'view'</span>
<span style="COLOR: #66cc66">)</span>;
<a href="http://www.php.net/echo"><span style="COLOR: #000066">echo</span></a> <span style="COLOR: #0000ff">$ajax</span>-&gt;<span style="COLOR: #006600">observeForm</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">&quot;ajform&quot;</span>, <span style="COLOR: #0000ff">$opt</span><span style="COLOR: #66cc66">)</span>;
<span style="FONT-WEIGHT: bold; COLOR: #000000">?&gt;</span>
&lt;div id=<span style="COLOR: #ff0000">&quot;calendar&quot;</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">class</span>=<span style="COLOR: #ff0000">&quot;mydiv2&quot;</span>&gt;
<span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;?php</span> <span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">showCalendar</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$year</span>, <span style="COLOR: #0000ff">$month</span><span style="COLOR: #66cc66">)</span>; <span style="FONT-WEIGHT: bold; COLOR: #000000">?&gt;</span>
&lt;/div&gt;
&nbsp;
&nbsp;</pre>
<p>フォームにはsubmitボタンもありませんが，テキストボックスの年・月を変更するとobserveFormがそれを監視して，viewメソッドを呼び出します。</p>
<pre class="php">    <span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> view<span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">{</span>
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">layout</span> = <span style="COLOR: #ff0000">'ajax'</span>;
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">set</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'year'</span>, <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">params</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'form'</span><span style="COLOR: #66cc66">]</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'year'</span><span style="COLOR: #66cc66">]</span><span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">set</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'month'</span>, <span style="COLOR: #0000ff">$this</span>-&gt;<span style="COLOR: #006600">params</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'form'</span><span style="COLOR: #66cc66">]</span><span style="COLOR: #66cc66">[</span><span style="COLOR: #ff0000">'month'</span><span style="COLOR: #66cc66">]</span><span style="COLOR: #66cc66">)</span>;
    <span style="COLOR: #66cc66">}</span>
&nbsp;</pre>
<p>viewメソッドでは，params配列から年・月を取り出し，viewに渡しています。viewは先ほどのものと同じです。</p>
<p><img alt="" border="1" src="http://php.sunvisor.net/images/pic1205-2.png" /></p>
<p>年と月のテキストボックスを変更するとたちまちカレンダーが変化します。13月とかやっても表示されるのは愛嬌です。実際にはSelectTagを使ったりすることになりそうです。</p>
<h2>Helperの作法について</h2>
<p>昨日ポストしたエントリーでカレンダーヘルパーを発表してみたのですが，なんとCakePHP User's in Japanのフォーラムで紹介していただけました。ありがとうございました。しかし，あとから考えるとどうもこのHelperは作法に則っていないのではないかと不安になっています。CakePHPのHelperのメソッドはみな文字列を返すのみで，それを出力させるにはビューの中でechoしてやるようになっていますよね。僕の作ったカレンダーヘルパーは，メソッドを呼ぶだけでechoされちゃうんですね。ここは他のHelperのように文字列を返すようにするべきなのでしょうか。</p>]]>
        
    </content>
</entry>

<entry>
    <title>Helperを作ってみる</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2007/12/helper.html" />
    <id>tag:hisashi.heteml.jp,2007:/php//2.61</id>

    <published>2007-12-04T05:53:06Z</published>
    <updated>2009-06-06T05:45:51Z</updated>

    <summary>CakePHPでカレンダーを表示させるHelperを作成しました。</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<p>ここまでPHPやCakePHPを勉強してきましたが，コードらしいコードを全然書いていません。これではいけない。そろそろ準備段階を終えてPHPでコーディングしなければと思い立ち，一つ書いてみました。</p>
<p>書いたのは，カレンダーを表示するHelperです。最初にコーディングするのがHelperというのも，変わり者っぽいですが，CakePHPよりもPHPになれる意味合いが強いです。</p>
<h2>カレンダーヘルパー(CalendarHelpher)の仕様</h2>
<ol>
    <li>横一列に1週間が表示される普通に市販されているようなカレンダーを一月分表示することができる </li>
    <li>祝祭日を判断し休日のセルの書式を変更できる </li>
    <li>祝祭日や登録したスケジュールをセルの中に表示できる </li>
    <li>カレンダーの大きさは大中小の3段階を選択できる </li>
    <li>cssを変更することで表示書式を自由に変更できる </li>
</ol>
<p>とおよそこのような機能を持つHelperです。&nbsp;</p>
<p><a href="http://php.sunvisor.net/lib/calendar.zip">ソースをダウンロードする</a>（バグだらけの可能性があります）</p>
<h2>使用法</h2>
<p>ダウンロードしたファイルを解凍して出てきたcalendar.phpをappフォルダのviews/helpersフォルダにコピーします。</p>
<p>同じくcalendar.cssをappフォルダのwebroot/cssにコピーします。</p>
<p>controllerで$helpersの中にCalendarを加えます。</p>
<pre class="php"><span style="FONT-WEIGHT: bold; COLOR: #000000">var</span> <span style="COLOR: #0000ff">$helpers</span> = <a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'Html'</span>,<span style="COLOR: #ff0000">'Calendar'</span><span style="COLOR: #66cc66">)</span>;</pre>
<p>cssを有効にするために，layoutまたは表示するthtmlファイルでcssファイルを読み出す記述をします。</p>
<pre class="php"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;?php</span> <a href="http://www.php.net/echo"><span style="COLOR: #000066">echo</span></a> <span style="COLOR: #0000ff">$html</span>-&gt;<span style="COLOR: #006600">css</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'calendar'</span><span style="COLOR: #66cc66">)</span>;?&gt;</pre>
<p>カレンダーを表示するビューには，</p>
<pre class="php"><span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">showCalendar</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #cc66cc">2008</span>, <span style="COLOR: #cc66cc">5</span><span style="COLOR: #66cc66">)</span>;&nbsp;</pre>
<p>とするとカレンダーが表示されます。カレンダーの大きさを変えたい場合はsetTableSizeメソッドで変更してからshowCalendarを呼び出します。サイズの初期値はmです。</p>
<pre class="php"><span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">setTableSize</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'m'</span><span style="COLOR: #66cc66">)</span>;	<span style="COLOR: #808080; FONT-STYLE: italic">// <font face="Arial">標準のサイズ</font></span>
<span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">setTableSize</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'s'</span><span style="COLOR: #66cc66">)</span>;	<span style="COLOR: #808080; FONT-STYLE: italic">// <font face="Arial">小さいサイズ</font></span>
<span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">setTableSize</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'l'</span><span style="COLOR: #66cc66">)</span>;	<span style="COLOR: #808080; FONT-STYLE: italic">// <font face="Arial">大きいサイズ</font></span>&nbsp;</pre>
<p>&nbsp;カレンダーに祝祭日やスケジュールを表示するにはフラグを設定します。</p>
<pre class="php"><span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">showSaijitsu</span> = <span style="FONT-WEIGHT: bold; COLOR: #000000">true</span>;	<span style="COLOR: #808080; FONT-STYLE: italic">// 祝祭日を表示します</span>
<span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">showSchedule</span> = <span style="FONT-WEIGHT: bold; COLOR: #000000">true</span>;	<span style="COLOR: #808080; FONT-STYLE: italic">// スケジュールを表示します</span></pre>
<p>スケジュールは，addScheduleメソッドで登録します。</p>
<pre class="php"><span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">addSchedule</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$year</span>,<span style="COLOR: #cc66cc">1</span>,<span style="COLOR: #cc66cc">7</span>,<span style="COLOR: #ff0000">'新年会'</span><span style="COLOR: #66cc66">)</span>;</pre>
<p>このような感じです。次のようなthtmlを記述して表示させますと</p>
<pre class="php"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;?php</span>
	<span style="COLOR: #0000ff">$year</span> = <span style="COLOR: #cc66cc">2008</span>;
	<a href="http://www.php.net/echo"><span style="COLOR: #000066">echo</span></a> <span style="COLOR: #ff0000">&quot;&lt;h2&gt;$year <font face="Arial">年のカレンダー</font>&lt;/h2&gt;&quot;</span>;
	<span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">showSaijitsu</span> = <span style="FONT-WEIGHT: bold; COLOR: #000000">true</span>; 
	<span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">showSchedule</span> = <span style="FONT-WEIGHT: bold; COLOR: #000000">true</span>;
	<span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">setTableSize</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'s'</span><span style="COLOR: #66cc66">)</span>;
	<span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">addSchedule</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$year</span>,<span style="COLOR: #cc66cc">1</span>,<span style="COLOR: #cc66cc">7</span>,<span style="COLOR: #ff0000">'<font face="Arial">新年会</font>'</span><span style="COLOR: #66cc66">)</span>; 
	<span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">addSchedule</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$year</span>,<span style="COLOR: #cc66cc">1</span>,<span style="COLOR: #cc66cc">15</span>,<span style="COLOR: #ff0000">'<font face="Arial">ミーティング</font>'</span><span style="COLOR: #66cc66">)</span>; 
	<span style="COLOR: #0000ff">$calendar</span>-&gt;<span style="COLOR: #006600">showCalendar</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #0000ff">$year</span>,1<span style="COLOR: #66cc66">)</span>;
<span style="FONT-WEIGHT: bold; COLOR: #000000">?&gt;</span></pre>
<p>次のようなカレンダーが表示されます。</p>
<p><img alt="" border="1" src="http://php.sunvisor.net/images/pic1204-1.png" /></p>
<p>サイズをsにして，祝祭日などを表示させないようにすると次のように小さくシンプルになります。</p>
<p><img alt="" border="1" src="http://php.sunvisor.net/images/pic1204-2.png" /></p>
<p>書式については，calendar.cssというcssファイルを作りました。このcssを編集することでカレンダーのデザインを自分好みに変更できます。</p>
<h2>作ってみて</h2>
<p>第○月曜日とか振替休日とか春分・秋分の日にも対応していますので結構便利に使えると思います。もともとはVBAで作成していた万年カレンダーをPHPに移植してみました。PHPのイロハもまだな僕にとっては，何かある度にオンラインマニュアルやらGoogleの世話になりました。制御構造文ひとつの書き方にしても，試行錯誤の繰り返しでした。しかしテスト用のviewファイルにコーディングしたり，それをまとめてHelperに仕上げることでPHPでのコーディングに少しは慣れることができたように思います。</p>]]>
        
    </content>
</entry>

<entry>
    <title>複数のappフォルダ</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2007/11/app.html" />
    <id>tag:hisashi.heteml.jp,2007:/php//2.60</id>

    <published>2007-11-28T01:44:51Z</published>
    <updated>2009-06-06T05:45:51Z</updated>

    <summary>CakePHPではappフォルダを複数は位置して複数のアプリケーションが実行できるとのことですので，その設定方法を考えてみました。</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<p>以前にEclipseとPDTの環境を作ることを調べたときに，MilkyJoeが書いていた次の文章がずっと気になっていました。</p>
<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<p>I follow the Cake convention of storing all my CakePHP projects in the Cake root directory (making a copy of /app, renaming it, and changing the constant APP_DIR in /app/webroot/index.php to the name of my directory). You should probably follow this convention as well.</p>
</blockquote>
<p>appフォルダのコピーを作成してリネームするとういのがCakeの慣例だと言っています。僕はこれまではappフォルダの内容を直接さわっていましたが，是非その慣例には従いたいものです。いろいろと実験が終わったので，再度Cake開発環境を再構築することにしましたので，複数のappフォルダを持った場合の動きについて調べてみました。</p>
<p><img alt="" border="1" src="http://php.sunvisor.net/images/pic1128-1.png" /></p>
<p>図のようなフォルダ構成で，scheduleというフォルダがappフォルダのコピーになります。これでどのURLにアクセスしたらのアプリケーションが実行されるのかを調べてみます。appフォルダ，scheduleフォルダのそれぞれの viwes/layouts フォルダに default.thtml を配置し，そのタイトル部分を変更することでどのフォルダのアプリケーションが実行されているのかを判断しました。</p>
<pre>http://localhost/cake/app/</pre>
<p>では当然ながらappフォルダのアプリケーションが実行されました。ですから，</p>
<pre>http://localhost/cake/schedule/</pre>
<p>ではscheduleフォルダのアプリケーションが実行されます。</p>
<pre>http://localhost/cake/</pre>
<p>の場合は，appフォルダのアプリケーションが実行されます。これはルートフォルダにある.htaccessが次のようになっているためです。&nbsp;</p>
<pre class="apache">&lt;IfModule mod_rewrite.c&gt;
   <span style="COLOR: #00007f">RewriteEngine</span> <span style="COLOR: #0000ff">on</span>
   <span style="COLOR: #00007f">RewriteRule</span>    ^$ app/webroot/    <span style="COLOR: #66cc66">[</span>L<span style="COLOR: #66cc66">]</span>
   <span style="COLOR: #00007f">RewriteRule</span>    <span style="COLOR: #66cc66">(</span>.*<span style="COLOR: #66cc66">)</span> app/webroot/$<span style="COLOR: #ff0000">1</span> <span style="COLOR: #66cc66">[</span>L<span style="COLOR: #66cc66">]</span>
&lt;/IfModule&gt;</pre>
<p>ルートフォルダへのアクセスは，app/webrootに回されますから，app/webrootにあるindex.phpが実行されるわけです。<br />
appフォルダ（あるいはscheduluフォルダ）にある.htaccessは次のようになっています。このフォルダにもindex.phpがあるのですが，rewriteが効いている限り実行されないと思います。</p>
<pre class="apache">&lt;IfModule mod_rewrite.c&gt;
    <span style="COLOR: #00007f">RewriteEngine</span> <span style="COLOR: #0000ff">on</span>
    <span style="COLOR: #00007f">RewriteRule</span>    ^$    webroot/    <span style="COLOR: #66cc66">[</span>L<span style="COLOR: #66cc66">]</span>
    <span style="COLOR: #00007f">RewriteRule</span>    <span style="COLOR: #66cc66">(</span>.*<span style="COLOR: #66cc66">)</span> webroot/$<span style="COLOR: #ff0000">1</span>    <span style="COLOR: #66cc66">[</span>L<span style="COLOR: #66cc66">]</span>
&lt;/IfModule&gt;</pre>
<p>ここでは現在のフォルダ下のwebrootにあるindex.phpが実行されます。</p>
<p>ちなみに，冒頭で引用した文章でMilkyJoeは，APP_DIR in /app/webroot/index.php の中のAPP_DIR定数を変更しろと書いていますが，その部分のコードはwebrootにあるindex.phpでは</p>
<pre class="php">    <span style="COLOR: #b1b100">if</span> <span style="COLOR: #66cc66">(</span>!<a href="http://www.php.net/defined"><span style="COLOR: #000066">defined</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'APP_DIR'</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
        <span style="COLOR: #808080; FONT-STYLE: italic">//define('APP_DIR', 'DIRECTORY NAME OF APPLICATION';</span>
        <a href="http://www.php.net/define"><span style="COLOR: #000066">define</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'APP_DIR'</span>, <a href="http://www.php.net/basename"><span style="COLOR: #000066">basename</span></a><span style="COLOR: #66cc66">(</span><a href="http://www.php.net/dirname"><span style="COLOR: #000066">dirname</span></a><span style="COLOR: #66cc66">(</span><a href="http://www.php.net/dirname"><span style="COLOR: #000066">dirname</span></a><span style="COLOR: #66cc66">(</span><span style="FONT-WEIGHT: bold; COLOR: #000000">__FILE__</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>;

</pre>
<p>と，index.phpの場所からAPP_DIRを設定するようになっているので，webrootがappフォルダの下にある限り書き換える必要はありません。公開環境ではこういうところを色々と設定する必要があるでしょう。</p>
<p>開発環境で複数のアプリを開発するときには，appフォルダをコピーしてリネームすれば，動作させるにはそのフォルダ名までURLで指定してやればOKだということがわかりました。</p>
<h2>EclipseのWorkspaceについて</h2>
<p>以前のエントリ「<a href="http://php.sunvisor.net/2007/11/post_2.html">すべてのインストールメモ</a>」にて，</p>
<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<p dir="ltr" style="MARGIN-RIGHT: 0px">Eclipseを起動したときに「Select workspace」と表示されます。MilkyJoeによれば，ここではwebサイトのドキュメントルート（C:\xampp\htdocs）を指定するのがよいと言っています。実はこれ僕としてはC:\xampp\htdocs\cakeを指定した方が楽なような気がします。そこであえてMilkyJoeに逆らって設定してみます。</p>
</blockquote>
<p dir="ltr" style="MARGIN-RIGHT: 0px">としました。結果的にこれで困ることはないようです。僕の場合はドキュメントルートの下にcakeフォルダを作りそこにCakePHP1.18を入れ，cake12フォルダには1.2を入れています。それらの間を切り替えるにはWorkspaceを変更しています。それが面倒な場合は，MilkyJoeの言うようにドキュメントルートをWorkspaceにする方がいいでしょう。</p>
<p><br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>続・CakePHPと文字化け</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2007/11/cakephp-3.html" />
    <id>tag:hisashi.heteml.jp,2007:/php//2.59</id>

    <published>2007-11-22T00:40:23Z</published>
    <updated>2009-06-06T05:45:50Z</updated>

    <summary>CakePHPによる文字化けについて，解決編です。</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<p>過去のエントリ <a href="http://php.sunvisor.net/2007/11/cakephp.html">CakePHPと文字化け</a> において</p>
<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<p>なんだか，いろいろなことをやり過ぎて，本当はしなくても良いことまでやったのかもしれません。またdbに記録する文字コード体系と，表示の文字コード体系が違うものではいけないのかなど，不明な点が多くあります。文字コードについては今後も研究課題にしたいと思います。</p>
</blockquote>
<p>と研究課題にすることにしたのですが，今回文字化け解消の方法を再度実験してみました。MySQLの4.1以降では文字コードの自動変換機能が実装され，逆にそのために文字化けに悩まされることが多くなったとの情報を得ました。また，PHPの文字コードの扱いについても色々と調べてみました。</p>
<p><strong>参考サイト</strong></p>
<ul>
    <li><a target="_new" href="http://dev.mysql.com/doc/refman/5.1/ja/connector-j-reference-charsets.html">MySQLリファレンス - 24.4.4.4. 文字セットと Unicode の使用</a> </li>
    <li><a target="_new" href="http://itpro.nikkeibp.co.jp/article/COLUMN/20070614/274802/?P=1&amp;ST=oss">&nbsp;【MySQLウォッチ】第36回 文字化けのメカニズム</a> ITPro </li>
    <li><a title="ＰＨＰの文字化けを本気で解決する" href="http://hain.jp/index.php/tech-j/2007/02/13/%EF%BC%B0%EF%BC%A8%EF%BC%B0%E3%81%AE%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91">ＰＨＰの文字化けを本気で解決する</a>&nbsp;ぎじゅっやさん </li>
</ul>
<h2>サイトで使用するエンコードを決定する</h2>
<p>CakePHPシステムの中でどの<u>エンコード</u>を使用するのかを決定します。MySQLのテーブルにどのエンコードでデータが格納されているかは，この際あまり問題ではないようです。サイト内で利用されているエンコードと，MySQLに接続するときのクライアント文字セットが一致していればいいようです。今回はこのテストをするに当たり，文字セットがEUC-JP，Shift-JIS，UTF-8の3種類のフィールドを持つテーブルを作って，そのテーブルにデータの追加，編集を行うCakePHPコントローラを作成してテストしました。</p>
<h3>ファイルのエンコードを揃える</h3>
<p>特にビューファイル（default.thtmlを含むthtmlファイル）に日本語を含む場合のファイルのエンコードはすべて<u>決定したエンコード</u>を使用します。Eclipseを使用している場合は，ワークスペースのエンコードを指定しておきます。 （Eclipseではeuc-jpとかは指定できないみたいですが）</p>
<p>これがばらばらですと，ビューの表示内容が部分的に（あるいは全体に）文字化けしたりします。</p>
<h3>レイアウトでエンコードを指定する</h3>
<p>dafault.thmlなどのLayoutファイルではhead部分に$html-&gt;chasetメソッドを使って<u>決定したエンコード</u>を指定します。 </p>
<pre class="php"><span style="FONT-WEIGHT: bold; COLOR: #000000">&lt;?php</span> <a href="http://www.php.net/echo"><span style="COLOR: #000066">echo</span></a> <span style="COLOR: #0000ff">$html</span>-&gt;<span style="COLOR: #006600">charset</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">&quot;utf-8&quot;</span><span style="COLOR: #66cc66">)</span>;?&gt;</pre>
<p class="php">ページのエンコードをこのようにちゃんと指定していれば，ブラウザがエンコードを間違えることもありません。</p>
<h3>データベースのクライアント・エンコードを指定する</h3>
<p>MySQLのSET NAMES でクライアントのエンコードをサイトのエンコードと一致させる必要があります。CakePHPではdatabase.phpに，encodingオプションを追加することでエンコードをセットすることができます。この機能を使って<u>決定したエンコード</u>を指定します。&nbsp; </p>
<pre class="php">    <span style="FONT-WEIGHT: bold; COLOR: #000000">var</span> <span style="COLOR: #0000ff">$default</span> = <a href="http://www.php.net/array"><span style="COLOR: #000066">array</span></a><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">'driver'</span> =&gt; <span style="COLOR: #ff0000">'mysql'</span>,
                                <span style="COLOR: #ff0000">'connect'</span> =&gt; <span style="COLOR: #ff0000">'mysql_connect'</span>,
                                <span style="COLOR: #ff0000">'host'</span> =&gt; <span style="COLOR: #ff0000">'localhost'</span>,
                                <span style="COLOR: #ff0000">'login'</span> =&gt; <span style="COLOR: #ff0000">'root'</span>,
                                <span style="COLOR: #ff0000">'password'</span> =&gt; <span style="COLOR: #ff0000">''</span>,
                                <span style="COLOR: #ff0000">'database'</span> =&gt; <span style="COLOR: #ff0000">'encodetest'</span>,
                                <span style="COLOR: #ff0000">'encoding'</span> =&gt; <span style="COLOR: #ff0000">'utf8'</span>,
                                <span style="COLOR: #ff0000">'prefix'</span> =&gt; <span style="COLOR: #ff0000">''</span><span style="COLOR: #66cc66">)</span>;
&nbsp;</pre>
<p>ここで指定するエンコードの表記方法は，MySQLの文字セット名です。EUC-JPはujis，shift-jisはsjis，utf-8はutf8となります。僕は，ここで間違ってutf-8と指定して文字化けが解消せずにハマりました。(&acute;･&omega;･`)　バカですた。</p>
<p>しかし，<font face="Arial"><a href="http://blog.ohgaki.net/index.php/yohgaki/2007/08/22/set_namesa_mcb_asc">SET NAMESは禁止</a>というような話も聞くのですが，CakePHPではこれを使っているような気がするのですが，いいのかな。</font></p>
<h2>とりあえず結論</h2>
<p>これら3つのエンコードを揃えておけば文字化けはしないようです。EUC-JPとUTF-8で確認しました。Shift-JISではチェックしていませんが，いけるんと違いますやろか。ただし僕はEclipseを使っている関係で，サイトのエンコードはUTF-8がお勧めだと思っています。php.iniやmy.cnfはインストールしたときのまま何もさわっていませんが，文字化けせずに使用できています。</p>]]>
        
    </content>
</entry>

<entry>
    <title>MS-SQLへの接続</title>
    <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2007/11/ms-sql.html" />
    <id>tag:hisashi.heteml.jp,2007:/php//2.58</id>

    <published>2007-11-19T04:32:49Z</published>
    <updated>2009-06-06T05:45:50Z</updated>

    <summary>MS-SQLへの接続ができるようになりました。ちょっとハマりました。</summary>
    <author>
        <name>Sunvisor</name>
        <uri>http://php.sunvisor.net/mt/mt-cp.cgi?__mode=view&amp;blog_id=2&amp;id=1</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://php.sunvisor.net/">
        <![CDATA[<p><a href="http://php.sunvisor.net/2007/11/post_1.html">CakePHPのしくみ など</a>において，</p>
<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<p>業務で使っているRDBMSがMSSQLなのでそれに接続するテストをやってみようと思いました。<a target="_new" href="http://d.hatena.ne.jp/cvyan/20070115">CakePHP データベースにMSSQLを使うには</a> というページを発見。このリンクには非常に簡単に繋がるという風に書いてあるのですが，僕の環境ではうまくつながりません。今後の研究課題です。 </p>
</blockquote>
<p dir="ltr">と書きましたが，この件について再度挑戦してみました。</p>
<p>mssql_connect関数にてエラーが発生していました。そこでCakePHPの問題と切り分けるために，単独でmssql_connect関数による接続を実験してみました。するとサーバ名を変えても何をしてもエラーになって繋がりませんでした。これはCakePHPの問題ではないと思いましたので，いろいろとググった結果，ntwdblib.dllというDLLのバージョンが古い場合にうまく繋がらないとの記述を見つけました。この件については，次のサイトが非常に詳しく解説してくださっています。</p>
<p><a target="_new" href="http://arch.st.wakwak.ne.jp/ms/httpd/php5_sqlserver_express.html">PHP5 with SQLServer2005Express</a></p>
<p>自分のPCの中のこのDLLを検索してみると，c:\xampp\phpやc:\xampp\apache\binにあるntwdblib.dllのバージョンは，2000.2.8.0で「古い」ものでした。最新版のxamppなのに・・・・。そこで，c:\windows\system32にあるDLLのバージョンを調べてみると2000.80.194.0で，これはOKなんだそうです。（面白いことに古いバージョンのファイルの方がタイムスタンプが最近のものになっていました）</p>
<p>そこで古いやつ二つの上に新しいのをコピーしました。（本当は古いDLLを削除するだけでよかったみたいですが）</p>
<p>するとちゃんとMS-SQLに接続できるようになりました。CakePHPに戻ってdatabase.phpにMS-SQLの設定をして見てもちゃんと接続できることがわかりました。</p>]]>
        
    </content>
</entry>

</feed>
