[CakePHP3] URLヘルパーやHTMLヘルパーのlinkメソッドでページ内リンク

CakePHPのUrlヘルパー、あるいはHtmlヘルパーのlinkメソッドは、特定アクションへのリンクを華麗に作ってくれます。

が、ちょっと変わったことをしようとすると、突然どうやるの??のオンパレードです。

今回はURLの後ろに#つけて特定のidの箇所に飛ぶ、いわゆるページ内リンクをどうやるの?ってなって、できたのでメモ。


スポンサーリンク

1.Urlヘルパーの使い方

Urlヘルパーはタグ無しで単純にURLを組み立ててくれるヘルパーです。テンプレートで使うよりは、他のヘルパーから利用される用途の方が多いイメージです。

1-1.基本

何をもとにURLを作るか?というのはありますが、とあるコントローラのとあるアクションへのURLを作る場合は以下の感じです。

$this->Url->build([
    "controller" => "Users",
    "action" => "view"
]);

これでUsersのViewに飛びます。作られるURLは/users/viewです。

viewに飛ぶならidいるだろJK!って場合、URL引数をつけるには次のように書きます。例としてid=1に飛びたい場合。

$this->Url->build([
    "controller" => "Users",
    "action" => "view",
    1 //←ここにid指定
]);

これでUsersのViewのid=1に飛びます(viewアクションの引数にidを設定していれば)。作られるURLは/users/view/1です。もちろん変数も使えます。

1-2.ページ内リンク

では本題。UsersコントローラのViewアクションのテンプレートには<article id=”userdetail”>って書いてあるところがあって、私はここに飛びたいんです。という場合。

$this->Url->build([
    "controller" => "Users",
    "action" => "view",
    "#" => "userdetail" //←これ
]);

これで、/users/view#userdetailというURLが作られます。

2.Htmlヘルパーのlinkメソッドの使い方

Htmlヘルパーはその名の通りHTMLタグを作ってくれるヘルパーで、中でもlinkメソッドはaタグを作ってくれるメソッドです。とてもよく使います。

2-1.基本

URLヘルパーのときと同じく、UsersのViewに対するリンクを作る場合、以下のように書きます。

$this->Html->link("詳細", [
    "controller" => "Users",
    "action" => "view"
]);

これで<a href=”[cakeルートからのパス]/users/view”>詳細</a>というタグが出力されます。

URL引数を追加したい場合は、以下の通り。

$this->Html->link("詳細", [
    "controller" => "Users",
    "action" => "view",
    1 //←ここに引数を指定
]);

出力されるタグは<a href=”[cakeルートからのパス]/users/view/1″>詳細</a>です。

タグを作るんだから、属性も指定したいじゃない。ということもあると思います。例えばtarget=”_blank”を設定したい場合はこうなります。

$this->Html->link("詳細", [
    "controller" => "Users",
    "action" => "view"
],
[
    "target" => "_blank"
]);

これで<a href=”[cakeルートからのパス]/users/view” taget=”_blank”>詳細</a>というタグが出力されます。

2-2.linkメソッドの第2引数はUrlヘルパーに飛んでいる

Urlヘルパーの書き方とほぼ一緒だな??と気になってHtmlヘルパーの中身を見てみると、linkメソッドはこう書かれていました。

public function link($title, $url = null, array $options = [])
{
    $escapeTitle = true;
    if ($url !== null) {
        $url = $this->Url->build($url);
    } else {
        $url = $this->Url->build($title);
        $title = htmlspecialchars_decode($url, ENT_QUOTES);
        $title = h(urldecode($title));
        $escapeTitle = false;
    }
・・・以下略

linkメソッドの第2引数はポイッとUrlヘルパーに放り込まれているんですね。

link(表示文字列, href属性の中身(Urlヘルパーへ), その他の属性)

と、いうことみたいです。

2-3.ページ内リンク

linkメソッドの第2引数はUrlヘルパーに送られてhref属性を作る。ということは、ページ内リンクを貼りたいときはこう書けばOKです。

$this->Html->link("詳細", [
    "controller" => "Users",
    "action" => "view",
    "#" => "userdetail"
]);

これで<a href=”[cakeルートからのパス]/users/view#userdetail”>詳細</a>というタグが出力されます。いやはや便利。

この投稿の投稿者は おさみ です。ブックマーク用 パーマリンク

スポンサーリンク