<?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,2008://2</id>
   <updated>2008-12-12T08:06:50Z</updated>
   <subtitle>DelphiでC/Sプログラムを書いていたSunvisorがPHPに挑戦する課程を綴るブログ。はたしてWebアプリを作れるようになるのでしょうか。</subtitle>
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.35</generator>

<entry>
   <title>A5:SQLのER図にCakePHP仕様のテーブルを追加するスクリプト</title>
   <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2008/12/a5s.html" />
   <id>tag:php.sunvisor.net,2008://2.72</id>
   
   <published>2008-12-12T03:53:53Z</published>
   <updated>2008-12-12T08:06:50Z</updated>
   
   <summary>「徹底入門」でもおすすめになっていますが，ER図やSQL文がかけるデータベースツ...</summary>
   <author>
      <name></name>
      
   </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:php.sunvisor.net,2008://2.71</id>
   
   <published>2008-12-09T05:38:10Z</published>
   <updated>2008-12-09T06:26:51Z</updated>
   
   <summary>CakePHP1.2をインストールした後，cake.phpを使ってプロジェクトを作成する手順のメモです。</summary>
   <author>
      <name></name>
      
   </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:php.sunvisor.net,2008://2.70</id>
   
   <published>2008-12-03T05:17:06Z</published>
   <updated>2008-12-09T06:26:08Z</updated>
   
   <summary>サーバのテーブルに，CakePHP経由でアップロードしたCSVファイルをインポートする必要がありましたので，その処理を作ってみました。CSVファイルをサーバにアップロードし，そのファイルをDBにインポートするという手順になろうかと思います。</summary>
   <author>
      <name></name>
      
   </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_3.html" />
   <id>tag:php.sunvisor.net,2008://2.69</id>
   
   <published>2008-12-02T08:35:42Z</published>
   <updated>2008-12-09T06:25:32Z</updated>
   
   <summary>本番サーバに置いてみると，いろいろとハマりました。Options FollowSymLinksってなんだろ。</summary>
   <author>
      <name></name>
      
   </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>]]>
   </content>
</entry>
<entry>
   <title>CakePHP1.2で再開</title>
   <link rel="alternate" type="text/html" href="http://php.sunvisor.net/2008/12/cakephp12.html" />
   <id>tag:php.sunvisor.net,2008://2.68</id>
   
   <published>2008-12-02T05:47:11Z</published>
   <updated>2008-12-09T06:24:49Z</updated>
   
   <summary>CakePHPの勉強を1.2で再開。フォームの日付入力とVendor関数について知った。</summary>
   <author>
      <name></name>
      
   </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:php.sunvisor.net,2008://2.67</id>
   
   <published>2008-01-17T07:38:09Z</published>
   <updated>2008-01-17T07:52:55Z</updated>
   
   <summary>CakePHPフレームワークを使用したアプリケーションにおいて，アプリケーション独自の設定情報を持ちたい場合があります。CakePHPではそのための便利なクラスが用意されていました。それがConfigureクラスです。</summary>
   <author>
      <name></name>
      
   </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:php.sunvisor.net,2008://2.66</id>
   
   <published>2008-01-10T02:11:25Z</published>
   <updated>2008-01-10T02:59:18Z</updated>
   
   <summary>Fedora 8でPHP+MySQLのサーバーを構築してみます。</summary>
   <author>
      <name></name>
      
   </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/active_dir.html" />
   <id>tag:php.sunvisor.net,2007://2.65</id>
   
   <published>2007-12-27T01:30:00Z</published>
   <updated>2007-12-27T02:17:04Z</updated>
   
   <summary>Active Directory(以降AD)サーバにldap関数を使って接続する...</summary>
   <author>
      <name></name>
      
   </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:php.sunvisor.net,2007://2.64</id>
   
   <published>2007-12-17T03:02:00Z</published>
   <updated>2007-12-17T03:18:48Z</updated>
   
   <summary>Webアプリを作る上では避けられないのがユーザー認証です。その認証についてLDAPも含めて研究します。今回はその第1回。&quot;LDAP Models in CakePHP&quot;を紹介します。</summary>
   <author>
      <name></name>
      
   </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:php.sunvisor.net,2007://2.62</id>
   
   <published>2007-12-11T23:56:55Z</published>
   <updated>2007-12-12T14:05:53Z</updated>
   
   <summary>ほぼすべてのWebアプリケーションに必要と思われるのは，メニューの機能です。クールなメニューを私のアプリケーションでも使えるようになりたいということで研究してみました。</summary>
   <author>
      <name></name>
      
   </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</spa