前回作成したZend_TagをZend_Tag_Cloudに突っ込むとそのまんまタグクラウドになるよ、というわかりやすいクラスです。
ただオプションがわかりにくいです。
とりあえず試してみましょう。
出力は以下のようになります。
まずZend_Tag_Cloud::setItemList()にZend_Tag_ItemListをそのまま突っ込みますが、それだけで実質完成です。
中身は二段階になっており、CloudDecoratorで全体の表示を、TagDecoratorが個別のアイテム表示を司っています。
Zend_Tag_Cloud::getCloudDecoratorおよびZend_Tag_Cloud::getTagDecoratorで各レンダラを取得でき、それぞれのオプションを変更することが可能です。
Zend_Tag_Cloud::setCloudDecoratorおよびZend_Tag_Cloud::setTagDecoratorでレンダラ自体を変更可能です。
が、デフォルトだとCloudDecoratorにはHtmlCloud、TagDecoratorにはHtmlTagしか用意されていないので、自力でレンダラを作成しないかぎり指定する意味はありません。
Zend_Tag_Cloud::getCloudDecorator()->setHtmlTagsでタグクラウド全体を包むタグ、Zend_Tag_Cloud::getTagDecorator()->setHtmlTagsで各アイテムを包むタグを指定できます。
デフォルトだと<ul><li>になってしまうので、使いやすい<div><span>に変えておくといいかもしれません。
値を配列として突っ込むと、各タグの属性として設定されます。
例では手っ取り早くstyleとかやってますが、普通はclassを指定します。
Zend_Tag_Cloud::getTagDecorator()->setMinFontSize、setMaxFontSize、setFontSizeUnitでタグクラウドの文字サイズを変更できます。
例では最低値が100%、最大値が400%となっています。
setFontSizeUnitには%以外にpx、em、inなんかを設定することができます。
さて、上記例ではZend_Tag_ItemList::spreadWeightValuesが無くなっているわけですが、どうやらこの指定を行ってもZend_Tag_Cloudには反映されないようです。
前回のように級数的なフォントサイズ設定を行おうとしても無視されてしまい、単純な比例になってしまいます。
ちょっとこれはバグ(機能未実装)な気がしますね。
spreadWeightValuesを反映させたい場合、いったんZend_Tag_Item->getParam('weightValue')でspreadWeightValuesを反映した値を取得し、再度weightに代入し直すという手順が必要なようです。
ちなみにZend_Tag_Item作成時にparam→urlにURLを突っ込んでいますが、これがあると<a href>の値に反映されます。
無いと<a href="">になってしまってタグクラウドの意味が無くなるので指定しておきましょう。
/から始まると絶対パスで、無しだと現在のURLからの相対パスになります。
以上でとりあえずタグクラウドはできましたが、見た目的には単に<div><span>が並んでいるだけです。
平面的にプロットしたりうにうに動いたりするような時々見かける本格的なタグクラウドはZend_Tag_Cloudだけでは作れません。
正直そっちのほうがライブラリで処理してほしい機能のような気がしますが、そっちはJavaScriptにでも任せるってことで。
ただオプションがわかりにくいです。
とりあえず試してみましょう。
<?php
//require
require_once('Zend/Tag/Cloud.php');
require_once('Zend/Tag/ItemList.php');
//アイテムリスト
$list = new Zend_Tag_ItemList();
//アイテムをアイテムリストに投入
$list[] = new Zend_Tag_Item(array('title' => '紅莉栖', 'weight' => 45, 'params' => array('url' => '/kurisu')));
$list[] = new Zend_Tag_Item(array('title' => 'まゆり', 'weight' => 45, 'params' => array('url' => '/mayuri')));
$list[] = new Zend_Tag_Item(array('title' => 'るか', 'weight' => 44, 'params' => array('url' => '/rukako')));
$list[] = new Zend_Tag_Item(array('title' => '鈴羽', 'weight' => 51, 'params' => array('url' => '/suzuha')));
$list[] = new Zend_Tag_Item(array('title' => 'フェイリス', 'weight' => 43, 'params' => array('url' => '/faris')));
$list[] = new Zend_Tag_Item(array('title' => '萌郁', 'weight' => 54, 'params' => array('url' => '/moeka')));
$list[] = new Zend_Tag_Item(array('title' => '綯', 'weight' => 31, 'params' => array('url' => '/nae')));
$list[] = new Zend_Tag_Item(array('title' => '倫太郎', 'weight' => 59, 'params' => array('url' => '/kyouma')));
$list[] = new Zend_Tag_Item(array('title' => '至', 'weight' => 98, 'params' => array('url' => '/daru')));
//タグクラウド
$cloud = new Zend_Tag_Cloud();
$cloud->setItemList($list);
//クラウドデコーダ、タグデコーダの選択
$cloud->setCloudDecorator('HtmlCloud');
$cloud->setTagDecorator('HtmlTag');
//タグを変更
$cloud->getCloudDecorator()->setHtmlTags(array('div'));
$cloud->getTagDecorator()->setHtmlTags(array('span'=>array('style'=>'border:1px solid green;')));
//文字サイズを指定
$cloud->getTagDecorator()->setMinFontSize(100);
$cloud->getTagDecorator()->setMaxFontSize(400);
$cloud->getTagDecorator()->setFontSizeUnit('%');
//表示
print($cloud);
出力は以下のようになります。
まずZend_Tag_Cloud::setItemList()にZend_Tag_ItemListをそのまま突っ込みますが、それだけで実質完成です。
中身は二段階になっており、CloudDecoratorで全体の表示を、TagDecoratorが個別のアイテム表示を司っています。
Zend_Tag_Cloud::getCloudDecoratorおよびZend_Tag_Cloud::getTagDecoratorで各レンダラを取得でき、それぞれのオプションを変更することが可能です。
Zend_Tag_Cloud::setCloudDecoratorおよびZend_Tag_Cloud::setTagDecoratorでレンダラ自体を変更可能です。
が、デフォルトだとCloudDecoratorにはHtmlCloud、TagDecoratorにはHtmlTagしか用意されていないので、自力でレンダラを作成しないかぎり指定する意味はありません。
Zend_Tag_Cloud::getCloudDecorator()->setHtmlTagsでタグクラウド全体を包むタグ、Zend_Tag_Cloud::getTagDecorator()->setHtmlTagsで各アイテムを包むタグを指定できます。
デフォルトだと<ul><li>になってしまうので、使いやすい<div><span>に変えておくといいかもしれません。
値を配列として突っ込むと、各タグの属性として設定されます。
例では手っ取り早くstyleとかやってますが、普通はclassを指定します。
Zend_Tag_Cloud::getTagDecorator()->setMinFontSize、setMaxFontSize、setFontSizeUnitでタグクラウドの文字サイズを変更できます。
例では最低値が100%、最大値が400%となっています。
setFontSizeUnitには%以外にpx、em、inなんかを設定することができます。
さて、上記例ではZend_Tag_ItemList::spreadWeightValuesが無くなっているわけですが、どうやらこの指定を行ってもZend_Tag_Cloudには反映されないようです。
前回のように級数的なフォントサイズ設定を行おうとしても無視されてしまい、単純な比例になってしまいます。
ちょっとこれはバグ(機能未実装)な気がしますね。
spreadWeightValuesを反映させたい場合、いったんZend_Tag_Item->getParam('weightValue')でspreadWeightValuesを反映した値を取得し、再度weightに代入し直すという手順が必要なようです。
ちなみにZend_Tag_Item作成時にparam→urlにURLを突っ込んでいますが、これがあると<a href>の値に反映されます。
無いと<a href="">になってしまってタグクラウドの意味が無くなるので指定しておきましょう。
/から始まると絶対パスで、無しだと現在のURLからの相対パスになります。
以上でとりあえずタグクラウドはできましたが、見た目的には単に<div><span>が並んでいるだけです。
平面的にプロットしたりうにうに動いたりするような時々見かける本格的なタグクラウドはZend_Tag_Cloudだけでは作れません。
正直そっちのほうがライブラリで処理してほしい機能のような気がしますが、そっちはJavaScriptにでも任せるってことで。
PR
トラックバック
トラックバックURL: