/** * link_to_option_selectable() * 動的な条件判断をclosureで指定して、条件の結果に基づいてオプションを設定するlink_to * * @param string $text リンクを設定する文字列 * @param string $path リンク先ページのパス * @param closure $compare_function 条件判断関数(true/falseを返す) * @param mixed $default_options 条件に関わらず設定するオプション * @param mixed $true_options 条件が成立した場合に設定するオプション * @param mixed $false_options 条件が成立しない場合に設定するオプション * @return string リンクタグ */ function link_to_option_selectable($text, $path, $compare_function = null, $default_options = null, $true_options = null, $false_options = null) { // オプションが何も指定されていない場合、自動でtitle属性を設定する if (!is_array($default_options) || !count($default_options)) { $default_options = array('title' => $text); } $result = 0; if (is_callable($compare_function)) { if (call_user_func_array($compare_function, array($path))) { // 条件が成立 $result = 1; } } else { // 条件判断関数がない $result = 2; } switch ($result) { // 条件が成立しない場合 case 0: if (is_array($false_options)) { $default_options = array_merge($default_options, $false_options); } break; // 条件が成立した場合 // 条件が成立した場合 case 1: if (is_array($true_options)) { $default_options = array_merge($default_options, $true_options); } break; default: // 何もしない } return link_to_page($text, $path, $default_options); }
<div>ブログ</div> <div class="main_title_en">Blogs Information</div> </h2> <ul class="list_main"> <?php foreach ($blog_pages as $page) { ?> <li><img src="<?php echo public_path('images/list_arrow_orange.png'); ?> " alt="" /> <?php echo $page->getFormattedFirstCommitted(); ?> <?php echo link_to_page($page->getTitle(), $page->getPath()); ?> </li> <?php } ?> </ul> </div> <!-- end .article --> </div> <!-- end #main_content --> <div id="side_2" class="side">
$t->diag('url_for_page()'); $t->is(url_for_page('/test'), '/module/action/test', '第1階層ページ名'); $t->is(url_for_page('test'), '/module/action/test', '第1階層、先頭のスラッシュは自動付与'); $t->is(url_for_page(''), '/module/action/', '空の場合はトップURL(スラッシュ付)'); $t->is(url_for_page('/'), '/module/action/', 'ルート'); $t->is(url_for_page('/test/'), '/module/action/test/', '第1階層 末尾スラッシュ'); $t->is(url_for_page('/test/foo'), '/module/action/test/foo', '第2階層ページ名'); $t->is(url_for_page('/test/foo/'), '/module/action/test/foo/', '第2階層スラッシュ付'); $t->is(url_for_page('/test//foo'), '/module/action/test/foo', '途中の連続スラッシュは自動削除'); // link_to_page() $t->diag('link_to_page() URL生成部分はurl_for_page()に依存'); $t->is(link_to_page('foo', '/test'), '<a href="/module/action/test">foo</a>', '第1階層ページ名'); $t->is(link_to_page('foo', '/test/foo'), '<a href="/module/action/test/foo">foo</a>', '第2階層ページ名'); $t->is(link_to_page('foo', '/test/foo/'), '<a href="/module/action/test/foo/">foo</a>', '第2階層スラッシュ付'); $t->is(link_to_page('foo', '/test//foo'), '<a href="/module/action/test/foo">foo</a>', '途中の連続スラッシュは自動削除'); $t->is(link_to_page('foo', '/test', array('class' => 'bar')), '<a class="bar" href="/module/action/test">foo</a>', 'link_toのオプションはそのまま有効'); // link_to_option_selectable() $t->diag('link_to_option_selectable() リンクタグ生成はlink_to_page()に依存'); $test_function_true = function ($param) { return true; }; $test_function_false = function ($param) { return false; }; $t->is(link_to_option_selectable('foo', '/test', $test_function_true, array(), array('opt' => '1'), array('opt' => '0')), '<a title="foo" opt="1" href="/module/action/test">foo</a>', '条件true時は、true時オプションが適用される'); $t->is(link_to_option_selectable('foo', '/test', $test_function_false, array(), array('opt' => '1'), array('opt' => '0')), '<a title="foo" opt="0" href="/module/action/test">foo</a>', '条件false時は、false時オプションが適用される'); $t->is(link_to_option_selectable('foo', '/test', $test_function_true, array('defopt' => 'default'), array('opt' => '1'), array('opt' => '0')), '<a defopt="default" opt="1" href="/module/action/test">foo</a>', 'デフォルトオプションとマージされる'); $t->is(link_to_option_selectable('foo', '/test', $test_function_true, array('opt' => 'default'), array('opt' => '1'), array('opt' => '0')), '<a opt="1" href="/module/action/test">foo</a>', 'デフォルトオプションとマージされる(上書き)'); $t->is(link_to_option_selectable('foo', '/test', null, array('opt' => 'default'), array('opt' => '1'), array('opt' => '0')), '<a opt="default" href="/module/action/test">foo</a>', '比較関数がない場合はデフォルトオプションのみ有効'); // renderIndexItem() $t->diag('renderIndexItem() 内部でrenderIndexItemList()を呼び出す');