RSSフィードのリンク外れ、事と次第と解決方法

2011年10月14日 at 0:55

ページリストのほうは正しくリンクが張れてるのですが
RSSフィードのほうは、/concrete5/のディレクトリを二重にしてしまうため
リンクが外れてしまうという困った事態が起きました。


トップページのWhat'sNewのように、ニュース記事のタイトルを抜き出して
表示する方法をから説明させていただくと↓

(1)新規のページでブロック追加で「ページリスト」を追加する。
 (このページは、一般閲覧者から見えないところに作って置いておく。消してしまうと他ページに埋め込んであるRSSフィードがうまく表示されません)
(2)その際、「RSSフィードを入力する」の設定を「はい」にする
(3)いったん編集を終了(保存)させてページに出てきたRSSマークをクリックして
  出てきたXMLページのURLをコピー
(4)編集するページでブロック追加で「RSSフィード」を選び、先程のURLをペースト

上記のようにしてできたRSSフィードのタイトルをクリックすると
リンクがおかしくなっています。

ソースを見ると、
<div class="rssItem">
<div class="rssItemTitle">
<a
href="http://test.co.jp/concrete5/concrete5/index.php/company/whatsnew/news201101/"
>東京センター開設</a>
</div>
<div class="rssItemDate">20111年1月7日</div>

<div class="rssItemSummary">
.... </div>
</div>


こんな感じに、リンクアドレスが/concrete5/concrete5/と二重になってしまうのです。

これが、ページリストで出力された部分を見ると正常です。↓
<div class="ccm-page-list">
<h3 class="ccm-page-list-title"><a
href="/concrete5/index.php/company/whatsnew/news200908/">大阪オフィス開設</a></h3>
<div class="ccm-page-list-description">
</div>



<h3 class="ccm-page-list-title"><a
href="/concrete5/index.php/company/whatsnew/news201101/">東京センター開設</a></h3>
<div class="ccm-page-list-description">
</div>

<div class="ccm-page-list-rss-icon">
<a
href="/concrete5/index.php/tools/blocks/page_list/rss?bID=339&cID=139&arHandle=Main"
target="_blank"><img
src="/concrete5/concrete/blocks/page_list/rss.png" width="14"
height="14" /></a>
</div>
<link
href="http://test.co.jp/concrete5/index.php/tools/blocks/page_list/rss?bID=339&cID=139&arHandle=Main"
rel="alternate" type="application/rss+xml" title="news" />
</div>


解決方法↓
---




/concrete/blocks/page_list/tools/rss.phpの定義より抜粋
----
<rss version="2.0">
<channel>
<title><?php echo $controller->rssTitle?></title>
<link><?php echo BASE_URL.$rssUrl?></link>
<description><?php echo
$controller->rssDescription?></description>
<?php
for ($i = 0; $i < count($cArray); $i++ ) {
$cobj = $cArray[$i];
$title = $cobj->getCollectionName(); ?>
<item>
<title><?php echo
htmlspecialchars($title);?></title>
<link>
<?php echo
BASE_URL.DIR_REL.$nh->getLinkToCollection($cobj) ?>
</link>
----

concrete/helpers/navigation.phpの定義より抜粋
----
public function getLinkToCollection(&$cObj, $appendBaseURL =
false, $ignoreUrlRewriting = false) {
// basically returns a link to a collection, based on
whether or we have
// mod_rewrite enabled, and the collection has a path
$dispatcher = '';
if (!defined('URL_REWRITING_ALL') || URL_REWRITING_ALL
== false) {
if ((!URL_REWRITING) || $ignoreUrlRewriting) {
$dispatcher = '/' . DISPATCHER_FILENAME;
}
}
if ($cObj->getCollectionPath() != null) {
$link = DIR_REL . $dispatcher .
$cObj->getCollectionPath() . '/';
} else {
$_cID = ($cObj->getCollectionPointerID() > 0) ?
$cObj->getCollectionPointerOriginalID() : $cObj->getCollectionID();
$link = DIR_REL . '/' . DISPATCHER_FILENAME .
'?cID=' . $_cID;
}

if ($appendBaseURL) {
$link = BASE_URL . $link;
}
return $link;
}

----

getLinkToCollection 関数では DIR_REL が付く仕様になっているのにもかかわ
らず、
rss.phpでさらに DIR_REL を付けるために、ダブってしまっています。


どちらを直すべきなのかが問題ですが、
grep して見た限り、
concrete/blocks/date_nav/tools/rss.php
concrete/blocks/page_list/tools/blog_rss.php
concrete/blocks/page_list/tools/rss.php
だけがこの問題を抱えているようです。
よって、こちらのソースから DIR_REL を取り除きます。