グローバルメニューにページ内リンクを実装するには

funi > グローバルメニューにページ内リンクを実装するには @ 2018/8/22 9:48
いつもお世話になっております。

現在、グローバルメニューにページ内リンクを追加する方法を模索中です。
メニュー構成は以下の様な形にしたいと考えています。

イベント(/event)  ← 1階層目
┗ 関西方面(kansai)← 2階層目
  ┣ 京都(#Kyoto) ← 3階層目
  ┣ 大阪(#Osaka)
  ┗ 神戸(#Kobe)

3階層目をリンク(エイリアス)として2階層目以下に設置する方法しか思いつきません。
ただこの方法ですと、サイト内でも一度リンク元?を踏んでリンク先に遷移するため多用するのはユーザーにとっても負担になる気がします。

随時項目を増やして行きたいのでメニューを全て作りこむ以外で、3階層目をグローバルメニューに実装する方法としてもっと良い方法がないか、お知恵を拝借出来ればと思います。

何卒宜しくお願い致します。

■ BaserCMS Ver:3.0.6.1 〜 4.1.0.1
■ サーバー名:lolipop
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ、サブドメイン等
■ 利用しているDB:SQLite

seto > Re: グローバルメニューにページ内リンクを実装するには @ 2018/8/23 10:40
こんにちは

確認しました。
「リンク」だと、リンク自体のURLに遷移してから、「リンク先URL」に遷移しますね。

これを解決するには、直接リンク先URLに遷移するようにカスタマイズが必要です。

bc_sampleの場合は、以下のファイルが対象ファイルです。
theme/bc_sample/Elements/global_menu.php

「リンク」の「リンク先URL」を取得できるようなヘルパーが見つからなかったので、自分でDBから「リンク先URL」を取得する処理を実装する必要がありそうです。

実装方法など、不明な点がありましたらまたご質問ください。
funi > Re: グローバルメニューにページ内リンクを実装するには @ 2018/8/23 20:25
seto さま

ご返信頂きありがとうございます。

どこがリンク元を呼び出しているのか ContentLinks などを全文検索し調べ倒してみましたが
遷移は /lib/Baser/View/ContentLinks/view.php で指定されているためということしか理解できず挫折しました。

そこで根本的な解決を諦め、テンプレート&リンク先の連携?で処理しました。
2階層目以下にリンクを設定したいので、global_menu から呼び出されている contents_menu を編集
リンク元 へは/ContentFolder/id を指定(id:ページ内リンク先のidタグ名)
/theme/my_theme/Elements/contents_menu.php

if( $content['Content']['type'] == 'ContentLink') {
$urls = explode("/", $content['Content']['url'] );
$content['Content']['url'] = '/'.$urls[1].'/#'.$urls[2];
}

上記は、ContentFolder 直下のページ内のidを拾う形になっています。
それ以外の場合などは、とりあえず今は設定していません。(^^;)

これで解決とは言い難いため、もっとスマートな解決法があればご伝授頂ければ幸いです。
宜しくお願いします。

■ BaserCMS Ver:3.0.6.1 〜 4.1.0.1
■ サーバー名:lolipop
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ、サブドメイン等
■ 利用しているDB:SQLite

seto > Re: グローバルメニューにページ内リンクを実装するには @ 2018/8/24 10:40
こんにちは

funiさんが試されたように、URLを書き換えるのもありだと思います。

DBからURLを取得する場合は、以下のコードで実現できます。
<?php
if ($content['Content']['type'] == 'ContentLink') {
	$ContentLink = ClassRegistry::init('ContentLink');
	$content['Content']['url'] = $ContentLink->field('url',
		[
			'ContentLink.id' => $content['Content']['entity_id'],
		]
	);
}
?>
funi > Re: グローバルメニューにページ内リンクを実装するには @ 2018/8/25 2:23
seto さま

お返事頂きありがとうございます。
また、御礼が遅くなって申し訳ありません。

コードのご提示ありがとうございます。
テスト段階のためSQLiteを使用しており、DBの覗き方が良くわからず根本的な解決を諦めておりましたが、
おかげさまで無事にリンクを拾うことが出来ました。

夏バテと知恵熱?で少し寝込んでしまいましたが、これで元気になれました!!
本当にありがとうございました。


質問させて頂くことがまだまだあるかと思いますが、また宜しくお願い致します。

■ BaserCMS Ver:3.0.6.1 〜 4.1.0.1
■ サーバー名:lolipop
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ、サブドメイン等
■ 利用しているDB:SQLite

funi > Re: グローバルメニューにページ内リンクを実装するには @ 2018/8/25 17:10
setoさま

お世話になっております。

キャッシュを削除後にサイトを確認していたところ、グローバルメニューのページ内リンク(ご教授頂いたコード部分)で
リンク先の カテゴリ が page に変更されリンクエラーが起きるようになりました。
http://test.xxx.com/event/#01
http://test.xxx.com/page/#01

コード部分の $content['Content']['url'] の値を確認したところ、リンク先に指定した文字列のみが渡されていることがわかりました。

前述のurl書き換えを行なった際にも、階層が異なると処理が出来ないため配列の最終値のみを書き換えることが出来ないかと思いましたが、一定数ではない配列の最後尾を指定する方法がわからず挫折しました。

階層がどこであっても問題なく表示されるようにする良い方法はありませんでしょうか。
お知恵を拝借出来れば幸いです。

何卒宜しくお願いします。

■ BaserCMS Ver:3.0.6.1 〜 4.1.0.1
■ サーバー名:lolipop
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ、サブドメイン等
■ 利用しているDB:SQLite

funi > Re: グローバルメニューにページ内リンクを実装するには @ 2018/8/25 18:25
いつもお世話になっております。

配列の最終値のみを書き換える方法を思いついたので実装してみました

if ($content['Content']['type'] == 'ContentLink') {
$ContentLink = ClassRegistry::init('ContentLink');
$mylink = $ContentLink->field('url',
[
'ContentLink.id' => $content['Content']['entity_id'],
]
);
/* ここから */
$pageurl = explode("/", $content['Content']['url'] );
$myname = end($pageurl);
$liClass .= ' CLink';
$content['Content']['url']  = str_replace($myname, $mylink, $content['Content']['url']);
}


$mylink でDB上にあるリンク先を
$pageurl でリンク元(階層フォルダを含むリンク先を指定したページ)を
$myname でリンク元から階層フォルダを除いたものを指定し
str_replace でリンク元の最後の/から後の部分を$myname → $mylink に書き換え

と言う処理を行なってみました。
どこかに問題があったり、もっとスマートな方法があるかとは思いますが、
階層を移動しても問題なく動作しているようですので、取り急ぎご報告させて頂きました。

ご意見をお聞かせ頂ければ幸いです。

宜しくお願い致します。

<追記>
本来のContentLink 機能が必要な場合(外部に関連ページがあるなど)には、
例えば 上記の $myname が change を含む文字列だったら書き換え処理を行なうとかにしても良いかと思います。

■ BaserCMS Ver:3.0.6.1 〜 4.1.0.1
■ サーバー名:lolipop
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ、サブドメイン等
■ 利用しているDB:SQLite

seto > Re: グローバルメニューにページ内リンクを実装するには @ 2018/8/27 10:16
こんにちは

もしかして、「リンク先」に "#01" といった、ページ内リンクの部分のみ設定されていませんか?
それをhttpから記入するようにすると、解決できないでしょうか。
funi > Re: グローバルメニューにページ内リンクを実装するには @ 2018/8/27 13:58
setoさま

度々お手数をお掛けし申し訳ございません。
ページ内リンクのことしか頭になく、当たり前というか基本的なことを失念しておりました。
目から鱗!状態&お恥ずかしい限りです。

「setoさまにお教え頂いたコードとリンク先にURLアドレスを記入」で希望通りリンク先が表示されましたので
これで解決とさせて頂きたいと思います。

何度もお付き合い頂き本当にありがとうございました。

また、機会がありましたら宜しくお願いします。

■ BaserCMS Ver:3.0.6.1 〜 4.1.0.1
■ サーバー名:lolipop
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ、サブドメイン等
■ 利用しているDB:SQLite

ログイン
ユーザー名:
パスワード:


  新規登録 / パスワード紛失

検索

facebook
フォーラムで悩みが解決した場合など、よかったら「いいね!」をポチっとクリックしてください!質問の回答者や開発者の励みになります

フォーラムガイド


関連リンク

オンライン状況
31 人のユーザが現在オンラインです。 (30 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 31