GRDDL用のprofileを作成してみました。XHTMLの基本的な要素や属性をRDF/XMLに変換できます。
たとえばhreflang属性やcite属性などのメタ情報をRDF/XML形式へ変換します。
また、このprofileへのコメントはこの記事のコメント欄にお寄せください。
GRDDL用のprofileを作成してみました。XHTMLの基本的な要素や属性をRDF/XMLに変換できます。
たとえばhreflang属性やcite属性などのメタ情報をRDF/XML形式へ変換します。
また、このprofileへのコメントはこの記事のコメント欄にお寄せください。
CakePHP2.0-devがリリースされましたが、そのシステム要件がなんとPHP5.2.6以上。正直言うと要件が高すぎる。
CakePHP2.0からはPHP4のサポートは打ち切ると言われていたがそれは良いと思う。ただ現状CakePHP1.3でもPHP4に対応しているのにCakePHP2.0からはPHP5.2.6以上というのは何とも一足飛びのような気がしないでも無い。
有料のホスティングサービスを利用している方たちには余り問題にならないかもしれないが、自分のように無料のホスティングサービスを転々としている身としては、不安が募る。無料でしかもPHP5.2.6以上のサーバーなんてあるのだろうか。PHP5が使用できるのは珍しくないのだが、バージョンせいぜい5.0や5.1.4(現在使用しているサーバーは5.2.3)などでPHP5.2.6以上は残念ながら見たことが無い。
こういったことを考えると出来る限りCakePHP1.3を長くサポートしてほしい。CakePHP2.0の正規版がリリースされしばらくしたらCakePHP1.3のサポートを打ち切るのではなく、PHP5.3がデフォルトスタンダードになるくらいまでサポートを希望したいところ。
それにしてもCakePHP2.0の波に乗れない人たちはCodeIgniterへの移住が加速しそうな予感。
オンライン上でXSLT変換できるサービスをW3Cが提供していた。
XHTMLなどから特定の部分を抜き出し、他のフォーマットへ変換するなどの利用が考えられる。自分が用意すればいいのはXSLTだけというのもポイントだと思う。
ところで前々から気になっていたXSLT 2.0を調べてみたのだが、日本語情報が少ない。現状はまだまだ1.0が基本かな?
CakePHPでSimplePieを扱ってGoogle NewsのFeedを取得してみようと思い、まずダウンロードし中に含まれているsimplepie.incファイルを\vendorsファイル内置いた後、以下のようなコードを書いてみました。PHPのバージョンは5.3、SimplePieのバージョンは1.2、CakePHPのバージョンは1.2.6
まずはコントローラーの作成。モデルは使用しない。\app\controllers\feeds_controller.phpに保存
<?php
class FeedsController extends AppController {
var $name = 'Feeds';
var $uses = array();
App::import('Vendor', 'SimplePie', array('file' => 'simplepie.inc'));
$SimplePie = new SimplePie();
$SimplePie->set_cache_location(CACHE);
$SimplePie->set_cache_duration(3600);
$SimplePie->feed_url = 'http://news.google.com/news?hl=en&ned=us&ie=UTF-8&oe=UTF-8&output=rss&q=Wii';
$SimplePie->set_input_encoding('UTF-8');
$SimplePie->set_output_encoding();
$SimplePie->init();
$SimplePie->handle_content_type();
$this->set(array('feed' => $SimplePie));
}
}
?>
次はビューの作成。テスト用なので簡潔に。\app\views\feeds\index.ctpに保存。
<ul>
<?php foreach($feed->get_items() as $item) : ?>
<li>
<?php echo $html->link($item->get_title(), $item->get_link()); ?>
<?php echo $item->get_link(); ?>
</li>
<?php endforeach; ?>
</ul>
実際に/Feeds/indexにアクセスし無事表示され万事うまくいったかと思いきや、リンクをクリックしてみると以下のようなメッセージが表示されてしまう。
表示中のページから無効な URL にリダイレクトしようとしています。
このページにリダイレクトしないようにする場合は、前のページに戻ってください。
URLが無効ということはGoogle NewsのFeed自体が壊れているのかと、実際にWebブラウザでhttp://news.google.com/news?hl=en&ned=us&ie=UTF-8&oe=UTF-8&output=rss&q=WiiへアクセスしてURLを確かめるも何もおかしいとこはない。むしろ個別の記事へ普通にアクセスできる。
となるとSimplePieになにかあるのかと調べてみると、URL処理において不可解な部分が。たとえばAtomのatom:entry内のatom:linkのURLではhttp://news.google.com/news/url?fd=R&sa=T&url=http%3A%2F%2Fwww.examiner.com%2Fx-13000-NY-Wii-Examiner~y2010m2d13-Nintendo-Wii-games-lead-video-game-sales&usg=AFQjCNHUHrzx3QhGmyLDiDlQ5IJjx8l8tgとなっているがSimplePieを通して表示したURLはhttp://news.google.com/news/url?fd%3DR%26sa%3DT%26url%3Dhttp://www.examiner.com/x-13000-NY-Wii-Examiner~y2010m2d13-Nintendo-Wii-games-lead-video-game-sales%26usg%3DAFQjCNHUHrzx3QhGmyLDiDlQ5IJjx8l8tgとなっている。明らかに無駄にURLエンコードが行われている。
simplepie.incのコードを追って行くとreplace_invalid_with_pct_encodingがURLのencodeをしている模様。
どうもライブラリの根幹の部分みたいなので下手に変更するのも気が引ける。早く修正してほしい限り。代わりにXML_Feed_Parserでも使用してみるかな。
いまやBlogなどで当たり前のFeed。もちろんFeedと一言にいってもその規格は複数ありRSS1.0 RSS2.0 Atom0.3 Atom1.0などです。
もちろん複数の違う規格のFeedから同じように情報を取得するのはなかなか骨の折れる作業になることでしょう。しかしながら、マッシュアップ系のサイトなどを利用すれば簡単に規格統一したFeedを利用できるかもしれません。
ところで複数の規格のFeedを使用するにしても、また使用しないにしてもCakePHPではどのようなFeed取得ライブラリが使えそうか以下にリストアップしておきます。先に言っておきますがMagpieRSSは使用できません。以前どうにか使用できないものかと試行錯誤しましたがだめでした。その時のCakePHPのバージョンは1.2だったはず。
自分がよさそうだなと思ってのは以上の三つ。このほかにも多数のライブラリが(CakePHPで動作するかは知りませんが)存在するでしょうし、単一の規格のみを使用するのであればSimpleXMLやCakePHPのXMLライブラリを使用してもよいでしょう。
CakePHP1.3の詳しい情報が載っています。英語の移行ガイドを日本語に翻訳したようです。英語が苦手な自分にとってはうれしい限り。
一寸読んで見たのですが1.2とぜんぜん違うという感じを受けました。たとえばJavascriptHelperとAjaxHelperの廃止などなど。
しかしながら、やはりバージョンアップということなのでより便利になっているところもあるようです、たとえばCacheHelper。いままではクエリ文字列毎にキャッシュすることは出来なかったのですが、1.3からは可能になるようです。検索フォームなどではどうしてもクエリ文字列を使用しなければならなかったのでこれは本当にうれしい。
ところでCakePHP1.3はまだベータなんですよね。早く安定版でないかな。
いつも使用しているサーバでいきなりページが表示されなくなった。どうしたものかと思い、\app\config\core.phpのdebugを2に変更しページを除いてみると以下のようなエラーメッセージが。
Fatal error: Call to undefined function sqlite_popen()
一瞬「えっ…」という困惑に陥る。PHP5からはSQLiteに対応したはずなのにsqlite_popen関数が存在しないと言われてしまう。
いったいこれはどういうことだろう。早速調べてみるとありました。
PHPでSQLiteを使ってみる。 - WADS blog @はてな
どうやらPHP5.1.0以降は手動で有効にしなければ使用できないとの事。以前は利用できていたのに急に利用できなくなったのはきっと、サーバーのPHPをアップデートしたからでしょう。
それにしても困ったな。CakePHP1.2.5時点ではまだsqlite関数を多様に使用しPDOなんてまた夢のまた夢。PHP5のみ対応と表明しているCakePHP2.0になれば換わるのかもしれませんが、それも遠く感じる。
以前にYoutube Api DataSourceを作成してみたのだが、今度は認証(特にClientLogin)機能を追加してみたくなり、いろいろ試したのだが認証の仕方がさっぱり分からない。
結局Zend Frameworkを使うとYouTube Data APIは勿論、認証回りも簡単に出来るそうなので試してみることに。
まずはZend Frameworkをダウンロード。今回はMinimalではなくFullをダウンロードしました。バージョンは1.9.7
ZendFrameworkとリネームしてC:\xampp\htdocs\に設置。include_pathを通さなきゃいけないようなので、C:\xampp\htdocs\.htaccessに以下のコードを追加。
<IfModule mod_php5.c>
php_value include_path "C:\xampp\htdocs\ZendFramework\library"
</IfModule>
適当なファイルに以下のようなコードを記述。ためしに特定のユーザーがアップロードした動画を取得してみる。
<?php
require_once('C:\xampp\htdocs\ZendFramework\library\Zend\Loader.php');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Gdata_YouTube');
$client = Zend_Gdata_ClientLogin::getHttpClient('username', 'password', 'youtube', null, 'MySource');
$yt = new Zend_Gdata_YouTube($client);
$a = $yt->getVideoFeed('http://gdata.youtube.com/feeds/api/users/default/uploads?v=2');
echo $a->title;
foreach ($a as $videoEntry) {
echo $videoEntry->title;
}
?>
試してみたところちゃんと認証されている。
ところでZend Frameworkから帰ってくる値はオブジェクトが基本のようだ。配列が中心のCakePHPとは根本的に違うらしい。そのままではDataSourceで利用できそうにもないし、かといって配列に変換する関数も用意されていないようだ。
Set::reverse関数を利用してもうまくいかない為どうしたものか。
echo $a->getXML();
上のようにgetXML関数を利用するとXMLの内容が返ってくるため、あまりいい方法ではないがCakePHPで再度解析するしかないかな。
CakePHPを使い始めてからOut of Memoryの警告をよく受けるのでmemory_limitの数値を増やしてみた。サーバはXAMPP Windows 1.7.2
C:\xampp\php\php.iniの458行目辺りにmemory_limitがあるのでそれを修正。
memory_limit = 128M
どれくらい増やしていいのか分からなかったので、とりあえず二倍に。
memory_limit = 256M
これでOut of Memoryは表示されなくなったが、根本原因はこの低スペックPC。買い替えも検討しなければ。
初めて本格的な独自のヘルパーを作成してみました。その名もListHelper。機能はTreeHelperと一緒で配列をツリー形式にして返すという代物。名前をTreeHelperとしても良かったのですがTreeHelperという名前のヘルパーはもう存在しややこしくなるので、ほかにいい名前が思い浮かばなかったのでListHelperとしてみました。
TreeHelperとの違いはTreeHelperはTreeBehavior形式の配列のみにしか使用できませんが、このヘルパーは一般的な配列などにも使用できます。特にXMLやJSONなどの非定型多次元配列に力を発揮すると思います。
Download
PHP5.3 CakePHP1.2.5で正常に動作することを確認。
まだまだCakePHP勉強の身なので非効率なコードや、エラーなどがあるかもしれません。その時はコメント頂けると幸いです。
generate(array $list, array $option = array(), array $elementOption = array())
| $option['url'] | デフォルトのURLを配列で指定します。 |
|---|---|
| $option['key'] | リンクで使用するキーを指定します。デフォルトではidキーを使用します。 |
| $option['title'] | リストのタイトルをキーで指定します。デフォルトではtitleキーを使用します。 |
| $option['children'] | 子要素のキーを指定します。デフォルトではitemキーを使用します。 |
| $option['hierarchical'] | URLを階層化するか指定します。デフォルトではfalseで階層化しません。 |
| $option['match'] | マッチする内容を指定します。デフォルトではfalseでどれにもマッチしません。 |
| $option['option'] | その階層のみに使用するオプションのキーを指定します。 |
| $option['elementOption'] | その階層のみに使用するエレメントオプションのキーを指定します。 |
| $elementOption['attributes'] | リストの属性を指定します。 |
|---|---|
| $elementOption['itemAttributes'] | li要素の属性を指定します。 |
| $elementOption['linkAttributes'] | a要素の属性を指定します。また、update属性を指定するとAjaxHelperを使用します。 |
| $elementOption['tag'] | リストのタグを指定します。デフォルトはul要素です。 |
| $elementOption['odd'] | 奇数の時のクラス属性を指定します。 |
| $elementOption['even'] | 偶数の時のクラス属性を指定します。 |
<?php
$a = array(
'id' => 1,
'title' => 'Feed',
'item' => array(
array(
'id' => 2,
'title' => 'Cereal',
'item' => array(
array(
'id' => 4,
'title' => 'Rice'
),
array(
'id' => 5,
'title' => 'Wheat'
),
array(
'id' => 6,
'title' => 'Corn'
)
)
),
array(
'id' => 3,
'title' => 'Vegetable',
'item' => array(
'id' => 7,
'title' => 'Tomato'
)
),
array(
'id' => 8,
'title' => 'Fruit'
)
)
);
echo $list->generate($a, array(
'url' => array('controller' => 'posts', 'action' => 'view', 'language' => 'ja')
));
/* 上記の内容を出力すると以下のようになります。
<ul>
<li><a href="/CakePHP/videos/posts/view/1/language:ja">Feed</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/2/language:ja">Cereal</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/4/language:ja">Rice</a></li>
<li><a href="/CakePHP/videos/posts/view/5/language:ja">Wheat</a></li>
<li><a href="/CakePHP/videos/posts/view/6/language:ja">Corn</a></li>
</ul>
</li>
<li><a href="/CakePHP/videos/posts/view/3/language:ja">Vegetable</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/7/language:ja">Tomato</a></li>
</ul>
</li>
<li><a href="/CakePHP/videos/posts/view/8/language:ja">Fruit</a></li>
</ul>
</li>
</ul>
*/
echo $list->generate($a, array(
'url' => array('controller' => 'posts', 'action' => 'view', 'language' => 'ja'),
'key' => 'title',
));
/* 上記の内容を出力すると以下のようになります。
<ul>
<li><a href="/CakePHP/videos/posts/view/Feed/language:ja">Feed</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/Cereal/language:ja">Cereal</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/Rice/language:ja">Rice</a></li>
<li><a href="/CakePHP/videos/posts/view/Wheat/language:ja">Wheat</a></li>
<li><a href="/CakePHP/videos/posts/view/Corn/language:ja">Corn</a></li>
</ul>
</li>
<li><a href="/CakePHP/videos/posts/view/Vegetable/language:ja">Vegetable</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/Tomato/language:ja">Tomato</a></li>
</ul>
</li>
<li><a href="/CakePHP/videos/posts/view/Fruit/language:ja">Fruit</a></li>
</ul>
</li>
</ul>
*/
echo $list->generate($a, array(
'url' => array('controller' => 'posts', 'action' => 'view', 'language' => 'ja'),
'key' => 'title',
'hierarchical' => true
));
/* 上記の内容を出力すると以下のようになります。
<ul>
<li><a href="/CakePHP/videos/posts/view/Feed/language:ja">Feed</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/Feed/Cereal/language:ja">Cereal</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/Feed/Cereal/Rice/language:ja">Rice</a></li>
<li><a href="/CakePHP/videos/posts/view/Feed/Cereal/Wheat/language:ja">Wheat</a></li>
<li><a href="/CakePHP/videos/posts/view/Feed/Cereal/Corn/language:ja">Corn</a></li>
</ul>
</li>
<li><a href="/CakePHP/videos/posts/view/Feed/Vegetable/language:ja">Vegetable</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/Feed/Vegetable/Tomato/language:ja">Tomato</a></li>
</ul>
</li>
<li><a href="/CakePHP/videos/posts/view/Feed/Fruit/language:ja">Fruit</a></li>
</ul>
</li>
</ul>
*/
echo $list->generate($a, array(
'url' => array('controller' => 'posts', 'action' => 'view', 'language' => 'ja'),
'key' => 'title',
'match' => 'Tomato'
));
/* 上記の内容を出力すると以下のようになります。
<ul>
<li><a href="/CakePHP/videos/posts/view/Feed/language:ja">Feed</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/Cereal/language:ja">Cereal</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/Rice/language:ja">Rice</a></li>
<li><a href="/CakePHP/videos/posts/view/Wheat/language:ja">Wheat</a></li>
<li><a href="/CakePHP/videos/posts/view/Corn/language:ja">Corn</a></li>
</ul>
</li>
<li><a href="/CakePHP/videos/posts/view/Vegetable/language:ja">Vegetable</a>
<ul>
<li class="current"><a href="/CakePHP/videos/posts/view/Tomato/language:ja">Tomato</a></li>
</ul>
</li>
<li><a href="/CakePHP/videos/posts/view/Fruit/language:ja">Fruit</a></li>
</ul>
</li>
</ul>
*/
echo $list->generate($a, array(
'url' => array('controller' => 'posts', 'action' => 'view', 'language' => 'ja'),
'key' => 'title',
'hierarchical' => true,
'match' => array('Feed', 'Vegetable', 'Tomato')
));
/* 上記の内容を出力すると以下のようになります。
<ul>
<li><a href="/CakePHP/videos/posts/view/Feed/language:ja">Feed</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/Feed/Cereal/language:ja">Cereal</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/Feed/Cereal/Rice/language:ja">Rice</a></li>
<li><a href="/CakePHP/videos/posts/view/Feed/Cereal/Wheat/language:ja">Wheat</a></li>
<li><a href="/CakePHP/videos/posts/view/Feed/Cereal/Corn/language:ja">Corn</a></li>
</ul>
</li>
<li><a href="/CakePHP/videos/posts/view/Feed/Vegetable/language:ja">Vegetable</a>
<ul>
<li class="current"><a href="/CakePHP/videos/posts/view/Feed/Vegetable/Tomato/language:ja">Tomato</a></li>
</ul>
</li>
<li><a href="/CakePHP/videos/posts/view/Feed/Fruit/language:ja">Fruit</a></li>
</ul>
</li>
</ul>
*/
echo $list->generate($a, array(
'url' => array('controller' => 'posts', 'action' => 'view', 'language' => 'ja')
),
array(
'attributes' => array('class' => 'list'),
'itemAttributes' => array('class' => 'item'),
'linkAttributes' => array('class' => 'link'),
'tag' => 'ol'
));
/* 上記の内容を出力すると以下のようになります。
<ol class="list">
<li class="item"><a href="/CakePHP/videos/posts/view/1/language:ja" class="link">Feed</a>
<ol class="list">
<li class="item"><a href="/CakePHP/videos/posts/view/2/language:ja" class="link">Cereal</a>
<ol class="list">
<li class="item"><a href="/CakePHP/videos/posts/view/4/language:ja" class="link">Rice</a></li>
<li class="item"><a href="/CakePHP/videos/posts/view/5/language:ja" class="link">Wheat</a></li>
<li class="item"><a href="/CakePHP/videos/posts/view/6/language:ja" class="link">Corn</a></li>
</ol>
</li>
<li class="item"><a href="/CakePHP/videos/posts/view/3/language:ja" class="link">Vegetable</a>
<ol class="list">
<li class="item"><a href="/CakePHP/videos/posts/view/7/language:ja" class="link">Tomato</a></li>
</ol>
</li>
<li class="item"><a href="/CakePHP/videos/posts/view/8/language:ja" class="link">Fruit</a></li>
</ol>
</li>
</ol>
*/
echo $list->generate($a, array(
'url' => array('controller' => 'posts', 'action' => 'view', 'language' => 'ja')
),
array(
'odd' => 'odd',
'even' => 'even'
));
/* 上記の内容を出力すると以下のようになります。
<ul>
<li class="odd"><a href="/CakePHP/videos/posts/view/1/language:ja">Feed</a>
<ul>
<li class="odd"><a href="/CakePHP/videos/posts/view/2/language:ja">Cereal</a>
<ul>
<li class="odd"><a href="/CakePHP/videos/posts/view/4/language:ja">Rice</a></li>
<li class="even"><a href="/CakePHP/videos/posts/view/5/language:ja">Wheat</a></li>
<li class="odd"><a href="/CakePHP/videos/posts/view/6/language:ja">Corn</a></li>
</ul>
</li>
<li class="even"><a href="/CakePHP/videos/posts/view/3/language:ja">Vegetable</a>
<ul>
<li class="odd"><a href="/CakePHP/videos/posts/view/7/language:ja">Tomato</a></li>
</ul>
</li>
<li class="odd"><a href="/CakePHP/videos/posts/view/8/language:ja">Fruit</a></li>
</ul>
</li>
</ul>
*/
echo $list->generate($a, array(
'url' => array('controller' => 'posts', 'action' => 'view', 'language' => 'ja')
),
array(
'linkAttributes' => array('update' => 'box')
));
/* 上記の内容を出力すると以下のようになります。
<ul><li><a href="/CakePHP/videos/posts/view/1/language:ja" id="link35929167" onclick=" event.returnValue = false; return false;">Feed</a><script type="text/javascript">
//<![CDATA[
Event.observe('link35929167', 'click', function(event) { new Ajax.Updater('box','/CakePHP/videos/posts/view/1/language:ja', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'box']}) }, false);
//]]>
</script><ul><li><a href="/CakePHP/videos/posts/view/2/language:ja" id="link499612740" onclick=" event.returnValue = false; return false;">Cereal</a><script type="text/javascript">
//<![CDATA[
Event.observe('link499612740', 'click', function(event) { new Ajax.Updater('box','/CakePHP/videos/posts/view/2/language:ja', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'box']}) }, false);
//]]>
</script><ul><li><a href="/CakePHP/videos/posts/view/4/language:ja" id="link1423519192" onclick=" event.returnValue = false; return false;">Rice</a><script type="text/javascript">
//<![CDATA[
Event.observe('link1423519192', 'click', function(event) { new Ajax.Updater('box','/CakePHP/videos/posts/view/4/language:ja', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'box']}) }, false);
//]]>
</script></li><li><a href="/CakePHP/videos/posts/view/5/language:ja" id="link827218413" onclick=" event.returnValue = false; return false;">Wheat</a><script type="text/javascript">
//<![CDATA[
Event.observe('link827218413', 'click', function(event) { new Ajax.Updater('box','/CakePHP/videos/posts/view/5/language:ja', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'box']}) }, false);
//]]>
</script></li><li><a href="/CakePHP/videos/posts/view/6/language:ja" id="link2023816438" onclick=" event.returnValue = false; return false;">Corn</a><script type="text/javascript">
//<![CDATA[
Event.observe('link2023816438', 'click', function(event) { new Ajax.Updater('box','/CakePHP/videos/posts/view/6/language:ja', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'box']}) }, false);
//]]>
</script></li></ul></li><li><a href="/CakePHP/videos/posts/view/3/language:ja" id="link72221752" onclick=" event.returnValue = false; return false;">Vegetable</a><script type="text/javascript">
//<![CDATA[
Event.observe('link72221752', 'click', function(event) { new Ajax.Updater('box','/CakePHP/videos/posts/view/3/language:ja', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'box']}) }, false);
//]]>
</script><ul><li><a href="/CakePHP/videos/posts/view/7/language:ja" id="link327376002" onclick=" event.returnValue = false; return false;">Tomato</a><script type="text/javascript">
//<![CDATA[
Event.observe('link327376002', 'click', function(event) { new Ajax.Updater('box','/CakePHP/videos/posts/view/7/language:ja', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'box']}) }, false);
//]]>
</script></li></ul></li><li><a href="/CakePHP/videos/posts/view/8/language:ja" id="link1417328617" onclick=" event.returnValue = false; return false;">Fruit</a><script type="text/javascript">
//<![CDATA[
Event.observe('link1417328617', 'click', function(event) { new Ajax.Updater('box','/CakePHP/videos/posts/view/8/language:ja', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'box']}) }, false);
//]]>
</script></li></ul></li></ul>
*/
$a = array(
'id' => 1,
'title' => 'Feed',
'item' => array(
array(
'id' => 2,
'title' => 'Cereal',
'elementOption' => array(
'itemAttributes' => array('title' => 'test'),
'linkAttributes' => array('rel' => 'test'),
),
'option' => array('url' => array('controller' => 'posts', 'action' => 'index')),
'item' => array(
array(
'id' => 4,
'title' => 'Rice'
),
array(
'id' => 5,
'title' => 'Wheat'
),
array(
'id' => 6,
'title' => 'Corn'
)
)
),
array(
'id' => 3,
'title' => 'Vegetable',
'item' => array(
'id' => 7,
'title' => 'Tomato'
)
),
array(
'id' => 8,
'title' => 'Fruit'
)
)
);
echo $list->generate($a, array(
'url' => array('controller' => 'posts', 'action' => 'view', 'language' => 'ja'),
'option' => 'option',
'elementOption' => 'elementOption'
));
/* 上記の内容を出力すると以下のようになります。
<ul>
<li><a href="/CakePHP/videos/posts/view/1/language:ja">Feed</a>
<ul>
<li title="test"><a href="/CakePHP/videos/posts/index/2" rel="test">Cereal</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/4/language:ja">Rice</a></li>
<li><a href="/CakePHP/videos/posts/view/5/language:ja">Wheat</a></li>
<li><a href="/CakePHP/videos/posts/view/6/language:ja">Corn</a></li>
</ul>
</li>
<li><a href="/CakePHP/videos/posts/view/3/language:ja">Vegetable</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/7/language:ja">Tomato</a></li>
</ul>
</li>
<li><a href="/CakePHP/videos/posts/view/8/language:ja">Fruit</a></li>
</ul>
</li>
</ul>
*/
$a = array(
0 => array(
'Category' => array(
'id' => 1,
'parent_id' => null,
'lft' => 1,
'rght' => 30,
'name' => 'カテゴリ',
),
'children' => array(
0 => array(
'Category' => array(
'id' => 2,
'parent_id' => 1,
'lft' => 2,
'rght' => 15,
'name' => '楽しみ',
),
'children' => array()
)
)
)
);
echo $list->generate($a, array(
'url' => array('controller' => 'posts', 'action' => 'view', 'language' => 'ja'),
'key' => 'Category.id',
'title' => 'Category.name',
'children' => 'children'
));
/* 上記の内容を出力すると以下のようになります。
<ul>
<li><a href="/CakePHP/videos/posts/view/1/language:ja">カテゴリ</a>
<ul>
<li><a href="/CakePHP/videos/posts/view/2/language:ja">楽しみ</a></li>
</ul>
</li>
</ul>
*/
$a = array(
'id' => 1,
'title' => 'Feed',
'item' => array(
array(
'id' => 2,
'title' => 'Cereal',
'item' => array(
array(
'id' => 4,
'title' => 'Rice',
'elementOption' => array(
'itemAttributes' => array('title' => 'test'),
'linkAttributes' => array('rel' => 'test'),
),
'option' => array(
'url' => array('controller' => 'posts', 'action' => 'index'),
'hierarchical' => true
),
),
array(
'id' => 5,
'title' => 'Wheat'
),
array(
'id' => 6,
'title' => 'Corn'
)
)
),
array(
'id' => 3,
'title' => 'Vegetable',
'item' => array(
'id' => 7,
'title' => 'Tomato'
)
),
array(
'id' => null,
'title' => 'Fruit'
)
)
);
echo $list->generate($a, array(
'url' => array('controller' => 'posts', 'action' => 'view', 'language' => 'ja'),
'option' => 'option',
'match' => null,
'elementOption' => 'elementOption'
),
array(
'odd' => 'odd',
'even' => 'even',
'itemAttributes' => array('class' => 'li'),
));
/* 上記の内容を出力すると以下のようになります。
<ul>
<li class="li odd"><a href="/CakePHP/videos/posts/view/1/language:ja">Feed</a>
<ul>
<li class="li odd"><a href="/CakePHP/videos/posts/view/2/language:ja">Cereal</a>
<ul>
<li title="test" class="li odd"><a href="/CakePHP/videos/posts/index/1/2/4" rel="test">Rice</a></li>
<li class="li even"><a href="/CakePHP/videos/posts/view/5/language:ja">Wheat</a></li>
<li class="li odd"><a href="/CakePHP/videos/posts/view/6/language:ja">Corn</a></li>
</ul>
</li>
<li class="li even"><a href="/CakePHP/videos/posts/view/3/language:ja">Vegetable</a>
<ul>
<li class="li odd"><a href="/CakePHP/videos/posts/view/7/language:ja">Tomato</a></li>
</ul>
</li>
<li class="li odd current"><a href="/CakePHP/videos/posts/view/language:ja">Fruit</a></li>
</ul>
</li>
</ul>
*/
?>
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |