a-blog cmsの関連エントリーの設定画面に「ブログ名」「公開日」を表示する

<img width="1190" alt="related_entry.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/21117/219eeb04-e9cd-1b91-0fec-ea0fbc3e77b1.jpeg">

a-blog cmsには、エントリー同士を手動で関連付ける機能があります。

[関連エントリー機能 | エントリーのカスタマイズ | カスタマイズtips | a-blog cms 制作者向け情報](https://developer.a-blogcms.jp/tips/entries/related-entries.html)

しかし、デフォルトの状態では以下の制限があります。

- 関連付けの対象となるのは同じブログ内のエントリーのみ
- 関連付けたエントリーの一覧には「ブログ名」「公開日」が表示されない

実際の構築では、ブログ間の似たようなタイトルのエントリーを関連付けるケースが求められるため（講師紹介と授業・製品情報と事例など）、使い勝手が今ひとつです。

これを冒頭の画像のようにカスタマイズする方法を紹介します。

## 実装する場合の注意

**ブログ名・日付の表示は、a-blog cmsのコアファイルを上書きします。**バージョンアップの際に間違って削除しないよう、修正箇所を必ず資料などで保管・共有してください。

バージョン2.6.1.4で動作を確認していますが、今後のバージョンで不具合が発生する可能性もあります。PHPの基礎知識がない方の修正はお勧めしません。

## 1. 関連記事の候補で全ブログを対象とする

まず、関連記事の候補リストに全ブログのエントリーがヒットするようにします。これはa-blog cmsのドキュメントでも公開されている推薦のカスタマイズです。

**特定の複数のブログのみを対象とすることはできません。管理者ではないブログも含め、すべてのブログのエントリーが対象となることにご注意ください。**

### オートコンプリート用のテンプレートを作成する

以下のファイルをエディタで開きます。なければ作成してください。

*/themes/使用するテーマ/admin/module/field.html*

ファイル冒頭に以下のスクリプトを追加して更新します。

```JavaScript:
<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箇所の修正が必要となります。

1. データの表示関連を定義しているPHPファイル
2. 編集画面のテンプレート
3. オートコンプリートのテンプレート（前項のファイル）

### データの表示関連を定義しているPHPファイルを編集する

以下のファイルをエディタで開いてください。**これはa-blog cmsのコアファイルです。必ずバックアップを取ってください。**

/php/ACMS/get.php

「buildRelatedEntries」で検索すると、840行目あたりに関数があります。
下にスクロールしていくと以下のコードがあるので、

```php
$vars   = array(
    'related.eid'           => $eid,

    // 中略

), false),
```

以下のように「ブログ名」「公開日」を取得できるように修正してください。

```php
$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行目あたりに以下のコードが見付かります。ここは、エントリーの保存前に動的に処理している関連エントリーリストのテンプレートです。

```html
<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>
```

これを以下の通り編集してください（ブログ名と公開日が追加されています）。

```html
<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}」で検索すると以下のコードが見付かります。ここは、エントリーの保存後に静的に処理している関連エントリーリストのテンプレートです。

```html
<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 -->
```

これを以下の通り編集、更新してください（ブログ名と公開日が追加されています）。

```html
<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 -->"
```

最後に、関連エントリーがすべてのブログのエントリーを対象とするか、正しく動作するかを確認してください。