a-blog cmsには、エントリー同士を手動で関連付ける機能があります。
関連エントリー機能 | エントリーのカスタマイズ | カスタマイズtips | a-blog cms 制作者向け情報
しかし、デフォルトの状態では以下の制限があります。
- 関連付けの対象となるのは同じブログ内のエントリーのみ
- 関連付けたエントリーの一覧には「ブログ名」「公開日」が表示されない
実際の構築では、ブログ間の似たようなタイトルのエントリーを関連付けるケースが求められるため(講師紹介と授業・製品情報と事例など)、使い勝手が今ひとつです。
これを冒頭の画像のようにカスタマイズする方法を紹介します。
実装する場合の注意
ブログ名・日付の表示は、a-blog cmsのコアファイルを上書きします。バージョンアップの際に間違って削除しないよう、修正箇所を必ず資料などで保管・共有してください。
バージョン2.6.1.4で動作を確認していますが、今後のバージョンで不具合が発生する可能性もあります。PHPの基礎知識がない方の修正はお勧めしません。
1. 関連記事の候補で全ブログを対象とする
まず、関連記事の候補リストに全ブログのエントリーがヒットするようにします。これはa-blog cmsのドキュメントでも公開されている推薦のカスタマイズです。
特定の複数のブログのみを対象とすることはできません。管理者ではないブログも含め、すべてのブログのエントリーが対象となることにご注意ください。
オートコンプリート用のテンプレートを作成する
以下のファイルをエディタで開きます。なければ作成してください。
/themes/使用するテーマ/admin/module/field.html
ファイル冒頭に以下のスクリプトを追加して更新します。
<script type="text/javascript">
ACMS.Ready(function(){
ACMS.Config.Admin.argGuidance.Admin_Entry_Autocomplete = ['bid', 'uid', 'cid', 'keyword', 'tag', 'field_', 'start', 'end'];
})
</script>
次に、以下のファイルを使用中するテーマの同一の階層に複製し、エディタで開いてください。
/themes/system/ajax/edit/autocomplete.json
1行目の開始タグにモジュールIDを付与して、保存してください。ここでは「autocomplete_custom」としていますがわかりやすい名前で構いません。
<!-- BEGIN_MODULE Admin_Entry_Autocomplete id="autocomplete_custom" -->
オートコンプリート用のモジュールIDを作成する
管理ページの「モジュールID」画面で、Admin_Entry_Autocompleteモジュールの定義を新規作成してください。識別名を「autocomplete_custom」として、設定は以下の通りにします。
- グローバル「下の階層のブログが利用することを許可する」にチェックを入れる
- 引数「ブログ」:親ブログを選択する
- 引数「キーワード」:チェックを入れる
- 階層「下階層のブログも含める」を選択する
2. ブログ名・公開日を表示できるようにする
以下の3箇所の修正が必要となります。
- データの表示関連を定義しているPHPファイル
- 編集画面のテンプレート
- オートコンプリートのテンプレート(前項のファイル)
データの表示関連を定義しているPHPファイルを編集する
以下のファイルをエディタで開いてください。これはa-blog cmsのコアファイルです。必ずバックアップを取ってください。
/php/ACMS/get.php
「buildRelatedEntries」で検索すると、840行目あたりに関数があります。
下にスクロールしていくと以下のコードがあるので、
$vars = array(
'related.eid' => $eid,
// 中略
), false),
以下のように「ブログ名」「公開日」を取得できるように修正してください。
$vars = array(
'related.eid' => $eid,
// 中略
'related.blogName' => ACMS_RAM::blogName($bid),
'related.datetime' => $row['entry_datetime'],
), false),
編集画面のテンプレートを修正する
以下のファイルを使用中するテーマの同一の階層に複製し、エディタで開いてください。
このテンプレートはバージョンアップの影響を受けやすいため、バージョンアップでも慎重に差分を確認してください。
/themes/system/admin/entry/edit.html
「categoryName.length」で検索すると26-34行目あたりに以下のコードが見付かります。ここは、エントリーの保存前に動的に処理している関連エントリーリストのテンプレートです。
<td>
<input type="hidden" name="related[]" value="<%- id %>">
<%- title %>
<% if ( categoryName.length > 0 ) { %>
/ <span class="acms-admin-icon-category acms-admin-icon-mute acms-admin-margin-right-mini"></span><%- categoryName %>
<% } %>
</td>
これを以下の通り編集してください(ブログ名と公開日が追加されています)。
<td>
<input type="hidden" name="related[]" value="<%- id %>">
<%- title %>
<% if ( blogName.length > 0 ) { %>
/ <span class="acms-admin-icon-blog acms-admin-icon-mute acms-admin-margin-right-mini"></span><%- blogName %>
<% } %>
<% if ( categoryName.length > 0 ) { %>
<span class="acms-admin-icon-category acms-admin-icon-mute acms-admin-margin-right-mini"></span><%- categoryName %>
<% } %>
<% if ( datetime.length > 0 ) { %>
<span class="acms-admin-icon-time acms-admin-icon-mute acms-admin-margin-right-mini"></span><%- datetime %>
<% } %>
</td>
続いて「{related.eid}」で検索すると以下のコードが見付かります。ここは、エントリーの保存後に静的に処理している関連エントリーリストのテンプレートです。
<tr class="js-related_entry_item sortable-item">
<td class="acms-admin-table-nowrap item-handle"><i class="acms-admin-icon-sort"></i></td>
<td>
<input type="hidden" name="related[]" value="{related.eid}">
{related.title}<!-- BEGIN_IF [{related.categoryName}/nem] --> / <span class="acms-admin-icon-category acms-admin-icon-mute acms-admin-margin-right-mini"></span>{related.categoryName}<!-- END_IF -->
</td>
<td class="acms-admin-table-nowrap">
<input type="button" class="js-related_entry_remove acms-admin-btn-admin acms-admin-btn-admin-danger" value="<!--T-->削除<!--/T-->" />
</td>
<td class="acms-admin-table-nowrap">
<a href="{related.url}" class="acms-admin-btn-admin" target="_blank"><!--T-->確認<!--/T--></a>
</td>
</tr><!-- END related:loop -->
これを以下の通り編集、更新してください(ブログ名と公開日が追加されています)。
<tr class="js-related_entry_item sortable-item">
<td class="acms-admin-table-nowrap item-handle"><i class="acms-admin-icon-sort"></i></td>
<td>
<input type="hidden" name="related[]" value="{related.eid}">
{related.title}<!-- BEGIN_IF [{related.blogName}/nem] --> / <span class="acms-admin-icon-blog acms-admin-icon-mute acms-admin-margin-right-mini"></span>{related.blogName}<!-- END_IF --><!-- BEGIN_IF [{related.categoryName}/nem] --> <span class="acms-admin-icon-category acms-admin-icon-mute acms-admin-margin-right-mini"></span>{related.categoryName}<!-- END_IF --><!-- BEGIN_IF [{related.datetime}/nem] --> / <span class="acms-admin-icon-time acms-admin-icon-mute acms-admin-margin-right-mini"></span>{related.datetime}[date('Y/m/d H:i')]<!-- END_IF -->
</td>
<td class="acms-admin-table-nowrap">
<input type="button" class="js-related_entry_remove acms-admin-btn-admin acms-admin-btn-admin-danger" value="<!--T-->削除<!--/T-->" />
</td>
<td class="acms-admin-table-nowrap">
<a href="{related.url}" class="acms-admin-btn-admin" target="_blank"><!--T-->確認<!--/T--></a>
</td>
</tr><!-- END related:loop -->
オートコンプリートのテンプレートを編集する
前項のオートコンプリート用のファイルを、再度エディタで開いてください。
/themes/system/ajax/edit/autocomplete.json
デフォルトでは以下の通りとなっていますが、
"label": "<!-- BEGIN categoryField -->({fieldCategoryName})<!-- END categoryField -->{title}",
"value": "<!-- BEGIN categoryField -->({fieldCategoryName})<!-- END categoryField -->{title}",
"title": "{title}",
"id": {eid},
"url": "{url}",
"datetime": "{date#Y}/{date#m}/{date#d} {date#H}:{date#i}",
"categoryName": "<!-- BEGIN categoryField -->{fieldCategoryName}<!-- END categoryField -->"
以下のように修正・更新してください(ブログ名を追加します)。
"label": "(<!-- BEGIN blog -->{blogName}<!-- END blog --><!-- BEGIN categoryField -->|{fieldCategoryName}<!-- END categoryField -->){title}",
"value": "(<!-- BEGIN blog -->{blogName}<!-- END blog --><!-- BEGIN categoryField -->|{fieldCategoryName}<!-- END categoryField -->){title}",
"title": "{title}",
"id": {eid},
"url": "{url}",
"datetime": "{date#Y}/{date#m}/{date#d} {date#H}:{date#i}",
"blogName": "<!-- BEGIN blog -->{blogName}<!-- END blog -->",
"categoryName": "<!-- BEGIN categoryField -->{fieldCategoryName}<!-- END categoryField -->"
最後に、関連エントリーがすべてのブログのエントリーを対象とするか、正しく動作するかを確認してください。