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

related_entry.jpg

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

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

データの表示関連を定義している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 -->"

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.