Forum
J! JAPAN TOP
ようこそ, ゲスト
ユーザ名: パスワード: 自動ログイン

トピック: メニューアイテムの影響範囲

メニューアイテムの影響範囲 10 年 2 ヶ月 ago #867

  • Nori
  • Nori さんのアバター
  • Offline
  • Moderator
  • 投稿数: 29
  • カルマ: 0
こちらのスレッドからの移動しました
ところで、
$menu = $menus->getActive();
$menu_params = new JParameter( $menu->params );
でパラメータの値を取っていますが、
今回の用に、権限なしの記事にアクセスした場合に表示される「ログイン」ページのパラメータってどこから取ってくるんですかね?

# エイリアスをキーにActiveを決定してるのかな・・・
# エイリアス名を合わせて、ログインメニューアイテムを作っておけばそっちから取ってくる?
# でも、自動で表示される「ログイン」ページのエイリアスって何?
# つーか、自分でコードを追えと・・・
# ログインページに限らず、スタンダードセクションレイアウトのカテゴリリンクから表示されるカテゴリのページも、BLogレイアウトだったり、スタンダードだったりして、うまく制御できないんだよなぁ。
# たぶん、設定内容か、内部的なルールかがあると思うんだけど、よくわからない・・・・
# 愚痴を言う前に、自分でコー・・・

これもwikiとかには無いような気がしますが
基本はJoomla!1.0.xから変わって無いので・・・
まずメニューシステムの影響範囲を理解するには
基本設定にあるSEO 設定を全部 いいえ に設定して下さい。
するとmod_mainmenuやJoomla!が出力するURIにはURIパラメータItemidが付いてきます。
このIDがデータベース xxx_menu のPKであるIDになり管理画面ではメニューアイテム管理に出ている。アイテムIDになります。

このアイテムID(URIパラメータItemid)が同じならそのページは該当する。メニューアイテムのパラメータの影響を受けています。同時に割り当てテンプレートやモジュールの表示割り当ても

じゃぁアイテムID(URIパラメータItemid)が無いページは?
メニューアイテム管理にあるデフォルトのメニューアイテムのアイテムIDから影響を受けます。
最終編集: 10 年 2 ヶ月 ago : Nori.
ゲストの書き込みは許可されていません。

Re:メニューアイテムの影響範囲 10 年 2 ヶ月 ago #869

  • chum
  • chum さんのアバター
  • Offline
  • Senior Boarder
  • 投稿数: 72
  • 感謝を受け取りました 2
  • カルマ: 6
Noriさん
こんにちは
じゃぁアイテムID(URIパラメータItemid)が無いページは?
メニューアイテム管理にあるデフォルトのメニューアイテムのアイテムIDから影響を受けます。

ふんふん、なるほど。
と、思って試してみました。

テスト状況
・メニューアイテムは2つ(デフォのフロントページレイアウト、セクションスタンダード)
・フロントページに記事はない
・セクション、カテゴリ、記事はそれぞれ1つ

希望する結果
・セクションスタンダートから選択したカテゴリがBlog形式で表示されること。

実験結果
・カテゴリはスタンダードレイアウトになる・・・失敗


と、いうわけで悲しい状況だったのでコードを見ました。

セクションスタンダードレイアウトから自動で生成されるカテゴリリンクの付け方
  1. パラメータの取得先は、すでに存在するメニューアイテムから取得
  2. メニューアイテムの決定方法は、カテゴリ表示系のメニューアイテムでカテゴリIDが一致すること
  3. 上記で一致しない場合は、セクション表示系のメニューアイテムで、セクションIDが一致すること
  4. 上記が一致しないことはない(元のメニューアイテムがセクションスタンダードだから、必ず元のメニューアイテムがヒットする)

と、いうわけで、すでにそのカテゴリを表示するメニューアイテムがあればその設定が適用され、なければ、セクションのメニューアイテムの設定が優先されます。(メニュー取得のOrderが何かは不明・・ID順か?)

つまり、すでにBlogカテゴリレイアウトのメニューアイテムが作ってあれば、セクションスタンダードからカテゴリを選択した場合はBlog形式で表示されることになります。

が、じつは、Blog形式では表示されずスタンダード形式で表示されます。(一部のパラメータは適用されますです。)

セクションスタンダードで生成されるカテゴリへのURLは
/index.php?option=com_content&view=category&id=7:no-menu-gat&layout=blog&Itemid=59&layout=default

になり、layout=blog と layout=default とが2つのレイアウト形式が指定されるため、前の layout=blog が無効になります。

このURLの生成は、/components/com_content/views/section/view.html.php の96行目で
$category->link = JRoute::_(ContentHelperRoute::getCategoryRoute($category->slug, $category->section).'&layout=default');

となっていて、問答無用で &layout=default が付くようになっています。

リポジトリーをみたところ、リビジョン10588で &layout=default が追加されたようです。(このときの修正はこの部分だけ)

変更コメントが'See Changelog'だったので、同じリビジョンにふくまれたCHANGELOG.PHPを見たのですが、それらしい項目が見当たりませんでした。
(あやしいそうなバグレポートを2、3見たのですが違うようだし、全部チェックするのは面倒くさいし)

問題の対策としては、/components/com_content/views/section/view.html.php のなかから .'&layout=default' を削除すれば良いと思いますが、コアの部分なんで気が引けます。

他にセクションスタンダードから、Blogカテゴリに直接飛ばす方法って無いんでしょうかね・・・

Blog表示の記事の中にセクション名リンクを表示し、そのリンク先のセクションスタンダードから元の記事のカテゴリを選んでもBlog形式で表示されないのはちょっとアレなんで・・・
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Joomla!だいすき?ちょっとスキ?
ちゅんちゅん@Joomlaでポン
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
ゲストの書き込みは許可されていません。

Re:メニューアイテムの影響範囲 10 年 2 ヶ月 ago #874

  • Nori
  • Nori さんのアバター
  • Offline
  • Moderator
  • 投稿数: 29
  • カルマ: 0
こんにちは
調査ご苦労様です。

たぶんチケットは
これかな

メニューアイテムではスタンダードセクションレイアウト=>スタンダードカテゴリレイアウトとセクション Blog レイアウト=>Blogカテゴリレイアウトでと考えてるみたいです。
じゃぁアイテムID(URIパラメータItemid)が無いページは?
メニューアイテム管理にあるデフォルトのメニューアイテムのアイテムIDから影響を受けます。
これの説明が短すぎたみたいですね・・・
これを再現するなら
スタンダードセクションレイアウト=>スタンダードカテゴリレイアウト
=>スタンダード記事レイアウトへItemidが継承されます。
なのでメニューアイテムでスタンダードセクションレイアウトの子メニューアイテムにBlogカテゴリレイアウトを作るとこの問題が出ます。

本当はメニューアイテムのパラメータで無いJoomla!内部間リンク部分は同コンポーネントのメニューアイテムがあればそのパラメータを追加、上書きするべきなのですが。(この場合はItemidが使用しているメニューアイテムの物になります

認識しているけど残してあるみたいなので
components/com_content/views/section/tmpl/default.php
このファイルをテンプレートで上書きして
<?php echo $category->link; ?>
これを
<?php echo JRoute::_(ContentHelperRoute::getCategoryRoute($category->slug, $category->section); ?>
変更すれば直ります
ゲストの書き込みは許可されていません。

Re:メニューアイテムの影響範囲 10 年 2 ヶ月 ago #881

  • chum
  • chum さんのアバター
  • Offline
  • Senior Boarder
  • 投稿数: 72
  • 感謝を受け取りました 2
  • カルマ: 6
Noriさん
こんにちは
components/com_content/views/section/tmpl/default.php
このファイルをテンプレートで上書き

あーなるほど、そうですね。ありがとうございます。

"JRoute::_(ContentHelperRoute"は便利そうですね。
これをうまく使えば、記事内に内部リンクを生成するプラグインが出来そうですね。
いままでは、記事内に直接URLを貼っていたので、何かのタイミングでリンク切れになるんじゃないかとビクビクしていましたが、これを使えばちょっとは安心して眠れそうです。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Joomla!だいすき?ちょっとスキ?
ちゅんちゅん@Joomlaでポン
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
ゲストの書き込みは許可されていません。

Re:メニューアイテムの影響範囲 10 年 2 ヶ月 ago #883

  • ヒユナ
  • ヒユナ さんのアバター
  • Offline
  • Fresh Boarder
  • 投稿数: 10
  • カルマ: 0
ご無沙汰しております。
先日教えていただいたコードを追加してみました。

まず、そのまま追加すると、ページタイトルはアドレスが、
ページ自体には「ログイン」とのみ表示され、ソースを見てみると
<div class="componentheading">
	ログイン</div>
<div width="700" align="center" style="margin-bottom:20px;">
しかありませんでした。

その後、ブラウザを再起動しログインページへアクセスすると、
HTTP 500 内部サーバーエラー
になりました。

頂いたコードの
$page_title =
部分を消すと、エラーにはならず
ページタイトルがURLの状態でページ本文が全て表示されました。

そこで、コードを以下のみ追加してみました。
<?php 
$doc = & JFactory::getDocument(); 
$page_title = 'testtest'
$doc->setTitle( $page_title ); 
?> 
すると、ページのタイトルは「testtest」と表示され、
ページ本文もちゃんと表示されたのですが、ソースに
<div class="componentheading">ログイン</div>
が残っていました。

ページのタイトルは「ログイン」のままでよいのですが、
ページ本文に「ログイン」と表示させたくない場合は別な方法があるのでしょうか?
(私の質問の書き方が分かりにくく、申し訳ないです)
よろしくお願いいたします。
ゲストの書き込みは許可されていません。

Re:メニューアイテムの影響範囲 10 年 2 ヶ月 ago #887

  • chum
  • chum さんのアバター
  • Offline
  • Senior Boarder
  • 投稿数: 72
  • 感謝を受け取りました 2
  • カルマ: 6
ヒユナさん
こんばんは

修正したソース(/templates/テンプレート名/html/com_user/login/default_login.php)の7行目あたりに
<p class="componentheading<?php echo $this->escape($this->params->get('pageclass_sfx')); ?>">
	<?php echo $this->escape($this->params->get('page_title')); ?>
</p>

とあるので、これを
<p class="componentheading">秘密の合言葉を入力しなさい、ただしオープンセサミとオープンソースはちょっと違います</p>

に変えてください。

ただし、これをやると、メニューアイテムでログインページを作った場合に、パラメータの設定が反映されなくなるので注意してください。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Joomla!だいすき?ちょっとスキ?
ちゅんちゅん@Joomlaでポン
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
ゲストの書き込みは許可されていません。

Re:メニューアイテムの影響範囲 10 年 2 ヶ月 ago #889

  • ヒユナ
  • ヒユナ さんのアバター
  • Offline
  • Fresh Boarder
  • 投稿数: 10
  • カルマ: 0
chum様、ありがとうございます。
教えていただいたコードを探してみたのですが、修正したソースにも
元のソース(/components/com_user/views/login/tmpl/default_login.php)
にも、
<p class="componentheading~
は存在しませんでした。

こちらの元のdefault_login.phpの中身は以下になっています。
<?php defined('_JEXEC') or die('Restricted access'); ?>
<?php if(JPluginHelper::isEnabled('authentication', 'openid')) :
		$lang = &JFactory::getLanguage();
		$lang->load( 'plg_authentication_openid', JPATH_ADMINISTRATOR );
		$langScript = 	'var JLanguage = {};'.
						' JLanguage.WHAT_IS_OPENID = \''.JText::_( 'WHAT_IS_OPENID' ).'\';'.
						' JLanguage.LOGIN_WITH_OPENID = \''.JText::_( 'LOGIN_WITH_OPENID' ).'\';'.
						' JLanguage.NORMAL_LOGIN = \''.JText::_( 'NORMAL_LOGIN' ).'\';'.
						' var comlogin = 1;';
		$document = &JFactory::getDocument();
		$document->addScriptDeclaration( $langScript );
		JHTML::_('script', 'openid.js');
endif; ?>
<form action="<?php echo JRoute::_( 'index.php', true, $this->params->get('usesecure')); ?>" method="post" name="com-login" id="com-form-login">
<table width="100%" border="0" align="center" cellpadding="4" cellspacing="0" class="contentpane<?php echo $this->escape($this->params->get('pageclass_sfx')); ?>">
<tr>
	<td colspan="2">
		<?php if ( $this->params->get( 'show_login_title' ) ) : ?>
		<div class="componentheading<?php echo $this->escape($this->params->get('pageclass_sfx')); ?>">
			<?php echo $this->params->get( 'header_login' ); ?>
		</div>
		<?php endif; ?>
		<div>
			<?php echo $this->image; ?>
			<?php if ( $this->params->get( 'description_login' ) ) : ?>
				<?php echo $this->params->get( 'description_login_text' ); ?>
				<br /><br />
			<?php endif; ?>
		</div>
	</td>
</tr>

</table>
<fieldset class="input">
	<p id="com-form-login-username">
		<label for="username"><?php echo JText::_('Username') ?></label><br />
		<input name="username" id="username" type="text" class="inputbox" alt="username" size="18" />
	</p>
	<p id="com-form-login-password">
		<label for="passwd"><?php echo JText::_('Password') ?></label><br />
		<input type="password" id="passwd" name="passwd" class="inputbox" size="18" alt="password" />
	</p>
	<?php if(JPluginHelper::isEnabled('system', 'remember')) : ?>
	<p id="com-form-login-remember">
		<label for="remember"><?php echo JText::_('Remember me') ?></label>
		<input type="checkbox" id="remember" name="remember" class="inputbox" value="yes" alt="Remember Me" />
	</p>
	<?php endif; ?>
	<input type="submit" name="Submit" class="button" value="<?php echo JText::_('LOGIN') ?>" />
</fieldset>
<ul>
	<li>
		<a href="<?php echo JRoute::_( 'index.php?option=com_user&view=reset' ); ?>">
		<?php echo JText::_('FORGOT_YOUR_PASSWORD'); ?></a>
	</li>
	<li>
		<a href="<?php echo JRoute::_( 'index.php?option=com_user&view=remind' ); ?>">
		<?php echo JText::_('FORGOT_YOUR_USERNAME'); ?></a>
	</li>
	<?php
	$usersConfig = &JComponentHelper::getParams( 'com_users' );
	if ($usersConfig->get('allowUserRegistration')) : ?>
	<li>
		<a href="<?php echo JRoute::_( 'index.php?option=com_user&view=register' ); ?>">
			<?php echo JText::_('REGISTER'); ?></a>
	</li>
	<?php endif; ?>
</ul>

	<input type="hidden" name="option" value="com_user" />
	<input type="hidden" name="task" value="login" />
	<input type="hidden" name="return" value="<?php echo $this->return; ?>" />
	<?php echo JHTML::_( 'form.token' ); ?>
</form>

「componentheading」という箇所はあったので試してみましたが、直接値を指定しても「ログイン」と出てしまいました。
Joomlaは現時点で最新の
Joomla! 1.5 (Joomla_1_5_14_in_Japanese) 2009-07-31
をインストールしてあります。

バージョンによって内容が違うのでしょうか?
なかなか解決できず申し訳ないです。
よろしくお願いいたします。
ゲストの書き込みは許可されていません。