Entry_BodyモジュールでRSSファイルを作成する

a-blog cms では、/themes/system/rss2.xml が用意されており、特に意識しなくてもルート直下にRSSファイルが生成されます。他のテンプレートファイルと同様、お使いのテーマに複製してカスタマイズすることも可能です。このファイルには Feed_Rss2モジュールが使用されています。しかし、Feed_Rss2モジュールでは変数等が限られています。このエントリーでは、Entry_Bodyモジュールを使用したよりきめ細かいRSSファイルの実装について説明します。

Entry_Bodyモジュールを使うとできるようになること

  • カスタムフィールドの値を出す
  • RSS にメイン画像のURLを出す
  • タグの値を出す
  • エントリー日時だけでなく、更新日時を出す
  • Entry_TagRelationalモジュールなどで関連エントリーを出す

例えば多言語サイトで言語ごとのタイトルをカスタムフィールドで作成している場合、各ニュースサイトに最適化したソースを出したい場合などに便利です。

ソースの例

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><!-- BEGIN_MODULE Entry_Body id="rss" -->
    <channel>
        <title>%{ROOT_BLOG_NAME}</title>
        <link>%{HOME_URL}</link>
        <description>%{META_DESCRIPTION}</description>
        <language>ja</language>
        <copyright>(C) %{ROOT_BLOG_NAME}</copyright>
        <lastBuildDate>%{r}</lastBuildDate><!-- BEGIN entry:loop -->
        <item>
            <title>{title}[raw|striptags]</title>
            <link>{permalink}</link>
            <guid isPermaLink="true">{permalink}</guid>
            <description>{summary}[raw|striptags]</description>
            <!-- BEGIN mainImage --><!-- BEGIN_IF [{path}/nem/] --><media:content url="<!-- BEGIN_IF [{image@type}/eq/media] -->%{HTTP_MEDIA_ARCHIVES_DIR}{path}<!-- ELSE -->%{HTTP_ARCHIVES_DIR}{path}<!-- END_IF -->" media="image" /><!-- END_IF --><!-- END mainImage -->
            <content:encoded>
            <![CDATA[
            @include("/include/unit.html")
            ]]>
            </content:encoded>
            <pubDate>{date#r}</pubDate>
            <lastPubDate>{udate#r}</lastPubDate>
            <!-- BEGIN tag:veil --><!-- BEGIN tag:loop --><tags>{name}[raw]></tags><!-- END tag:loop -->
            <!-- END tag:veil --><!-- BEGIN category:veil --><!-- BEGIN category:loop --><category>{name}[raw]></category><!-- END category:loop --><!-- END category:veil -->
        </item><!-- END entry:loop -->
    </channel><!-- END_MODULE Entry_Body -->
</rss>

ポイントは下記の通りです。

  • channelタグの外側を Entry_Bodyモジュールで囲い、モジュールIDを rss としています。
  • lastBuildDate にはグローバル変数 %{r} を使って RFC 5322 形式でフォーマットされた現在の日付を出しています。a-blog cms ではこのように、phpのdate関数フォーマットに指定出来る日付の書式がそのままグローバル変数として使えます。
  • itemタグの外側を entry:loop で囲っています。
  • description には summary を出しています。
  • content:encoded には unit.html をインクルードしています。調整が必要な場合は unit-rss.html 等のファイルを作成してインクルードしてください。
  • media:content にメイン画像のパスを出力しています。
  • content:encoded, media:content を扱う場合には rssタグにそれぞれ 名前空間の指定が必要になります。詳しくはフィードに関する技術的な要件を参考にしてください。

Entry_TagRelationalモジュールなどで関連エントリーを出す場合についてはここでは説明を省きますが、エスケープが必要になることに注意してください。

モジュールIDの設定例


表示設定

条件設定

モジュールIDの設定のポイントは、下記の通りです。

  • 表示設定ではカテゴリー表示順を「現在のカテゴリーのみ」としてカテゴリを1つだけ出すようにしています。ページャー等不要なもののチェックを外しています。
  • 条件設定ではお知らせカテゴリーに絞り込み、引数のフィールドに entry_meta_rss/em を設定して、「RSSに表示しない」にチェックの入っているエントリーを出力しないようにしています。

最後に

もちろん、これらのソースや設定は一例にすぎません。a-blog cms ではこのように、RSSファイルを生成するからといって、必ずFeed_Rss2モジュールを使用しなければならないということはありません。目的に沿ったソースを生成できるモジュールであれば、何を使ってもかまわないのです。実装の際に参考にしていただければ幸いです。

フォームの編集権限を変更する

config.system.yaml に1行追記し、フォームの編集権限を変更できます。この機能はVer.2.11から利用可能です。

フォームの編集権限は管理者または編集者を選択できます。初期値は編集者以上になっています。



項目 選択肢 初期値
form_admin_authority administrator | editor editor

Shoping Cart拡張アプリ アップデートのお知らせ 2024年4月


この記事では、ShoppingCart 拡張アプリ について、2024年4月30日にリリースした  Ver. 2.2.2, Ver. 2.2.3 の内容について紹介いたします。

現在お困りの問題に該当する項目がありましたら、お早めにバージョンアップのご検討をお願いいたします。

Ver. 2.2.3 のリリースノート

Fixed

  • fix: Ver. 2.2.2 より管理画面でPHPエラーが発生する問題の修正

Ver. 2.2.2 のリリースノート

Features

  • 監査ログ対応
  • feat: Square 連携のクレジットカード決済機能でメモをカスタマイズできる機能を追加(square-note)
  • feat: PHP8.3対応

Fixed

  • Square SDKをVer. 34.0.1.20240118 へアップデート(pnp.iniがを読み込む権限がない場合でもPHPエラーがでないように修正)
  • fix: カート内商品情報を更新すると、表示順が更新順(降順)になってしまう問題の修正
  • fix: 購入時に在庫数が足りないことが原因でエラーが発生した場合の表示を改善
  • a-blog cms Ver. 3.1.7で実装されたallow_dangerous_tagの対応
  • support PSR12
  • POSTによる注文フォームへのアクセスからだと、購入ができない問題を修正
  • fix: サブディレクトリへのインストール時にSquareのWebhook APIが動作しない問題の修正
  • fix: 購入フォームで、決済方法を送信しない場合PHPエラーが出る問題の修正
  • ECテーマの軽微な不具合修正
  • インストーラーのテンプレートを a-blog cms Ver. 3.1.14 のUI変更に対応

主なリリースノート内容

ShoppingCart 拡張アプリ Ver. 2.2.2 の内容について一部紹介いたします。

feat: PHP8.3対応

Ver. 2.2.2より、PHPバージョン 8.3 の環境で動作することを確認しています。

より新しいバージョンの PHP を利用することで、パフォーマンスやセキュリティ的にも改善が期待できます。

是非 PHP 8.2 や、PHP 8.3 の環境で ShoppingCart 拡張アプリをご利用ください。

Square SDKをVer. 34.0.1.20240118 へアップデート(pnp.iniがを読み込む権限がない場合でもPHPエラーがでないように修正)

Square SDK を Ver. 34.0.1.20240118 へアップデートいたしました。

以前のバージョンでは、Square SDK の問題で、pnp.iniがを読み込む権限がない場合、PHPエラーが発生してしまっていました。

これにより、Xserver で Xアクセラレータ Ver. 2 を利用していた場合、Square 連携で不具合が発生しておりました。

Square SDK をアップデートすることで、pnp.iniがを読み込む権限がない場合でも、PHPエラーが発生することなく、正常に動作するようになり、Xserver で Xアクセラレータ Ver. 2 を利用している場合でも Square 連携できるようになっております。

最後に

該当する問題がありましたら、お早めにバージョンアップのご検討をお願いいたします。また、迅速にご報告いただいたユーザーの皆さま、誠にありがとうございました。

今後もご報告いただいた内容に対して真摯に受け止め修正と改善を行ってまいります。 今後ともどうぞよろしくお願いいたします。

モジュールフィールドを使って管理画面からカスタムフィールドグループの初期値を編集可能にする

a-blog cms においてなんらかの値を管理画面から編集可能にしたい場合は、モジュールフィールドが役立つことが多いです。このエントリーでは、カスタムフィールドグループの初期値を編集可能にするやり方を例に説明しますが、モジュールフィールドでのコンテンツ編集は他の場面でも使えるTipsなので、ぜひ参考にしてみてください。

まずは静的にカスタムフィールドの初期値を設定

カスタムフィールドに初期値を設定することは実は簡単で、カスタムフィールドメーカーで作成したソースのうち、ループの外にある新規追加部分のvalueに値を入れれば良いだけです。下記のソースはエントリーに複数のイベント情報を登録する場合の例です。

<h2 class="acms-admin-admin-title2">イベント情報</h2>
<table class="js-fieldgroup-sortable adminTable acms-admin-table-admin-edit">
  <thead class="acms-admin-hide-sp">
    <tr>
      <th class="acms-admin-table-left acms-admin-admin-config-table-item-handle"> </th>
      <th class="acms-admin-table-left">日付</th>
      <th class="acms-admin-table-left">開始時刻</th>
      <th class="acms-admin-table-left">終了時刻</th>
      <th class="acms-admin-table-left">会場</th>
      <th class="acms-admin-table-left acms-admin-admin-config-table-action">削除</th>
    </tr>
  </thead>
  <tbody>
    <!-- BEGIN group_event:loop -->
    <tr class="sortable-item">
      <td class="item-handle acms-admin-table-nowrap">
        <i class="acms-admin-icon-sort"></i>
      </td>
      <td>
        <input type="text" name="event_date[]" value="{event_date}" class="acms-admin-form-width-full js-datepicker2" />
      </td>
      <td>
        <input type="text" name="event_start_time[]" value="{event_start_time}" class="acms-admin-form-width-full" />
      </td>
      <td>
        <input type="text" name="event_end_time[]" value="{event_end_time}" class="acms-admin-form-width-full" />
      </td>
      <td>
        <input type="text" name="event_venue[]" value="{event_venue}" class="acms-admin-form-width-full" />
      </td>
      <td class="acms-admin-table-nowrap">
        <input type="button" class="item-delete acms-admin-btn-admin acms-admin-btn-admin-danger" value="削除" />
      </td>
    </tr>
    <!-- END group_event:loop -->
    <tr class="sortable-item item-template">
      <td class="item-handle acms-admin-table-nowrap">
        <i class="acms-admin-icon-sort"></i>
      </td>
      <td>
        <input type="text" name="event_date[]" value="" class="acms-admin-form-width-full js-datepicker2" />
      </td>
      <td>
        <input type="text" name="event_start_time[]" value="10:00" class="acms-admin-form-width-full" />
      </td>
      <td>
        <input type="text" name="event_end_time[]" value="12:00" class="acms-admin-form-width-full" />
      </td>
      <td>
        <input type="text" name="event_venue[]" value="ベースキャンプ名古屋" class="acms-admin-form-width-full" />
      </td>
      <td class="acms-admin-table-nowrap">
        <input type="button" class="item-delete acms-admin-btn-admin acms-admin-btn-admin-danger" value="削除" />
      </td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <td colSpan="6">
        <input type="button" class="item-insert acms-admin-btn-admin" value="追加" />
      </td>
    </tr>
  </tfoot>
</table>
<input type="hidden" name="@group_event[]" value="event_date" />
<input type="hidden" name="field[]" value="event_date" />
<input type="hidden" name="@group_event[]" value="event_start_time" />
<input type="hidden" name="field[]" value="event_start_time" />
<input type="hidden" name="@group_event[]" value="event_end_time" />
<input type="hidden" name="field[]" value="event_end_time" />
<input type="hidden" name="@group_event[]" value="event_venue" />
<input type="hidden" name="field[]" value="event_venue" />
<input type="hidden" name="field[]" value="@group_event" />

カスタムフィールドメーカーで生成したソースから変更したのは、下記の部分のみです。

  • ループの外にある event_start_time[]、event_end_time[]、event_venue[]の value属性に初期値を設定
  • event_date[] で組み込みJSで日付選択カレンダーを表示するため js-datepicker2 を class属性に設定

このソースで表示されるエントリー編集画面の UI は下図のようになります。



モジュールIDを管理画面から作成

次にこの初期値を管理画面から編集できるようにするため、モジュールIDを作成します。



モジュール モジュールフィールド 
モジュールID MF_event_default_value
名前 イベントエントリーCFGの初期値設定

モジュールIDのカスタム設定

MF_event_default_value モジュールのカスタム設定用のテンプレートに次のように記述します。

<table class="acms-admin-table-admin-edit">
  <tr>
    <th>開始時刻の初期値</th>
    <td>
      <input type="text" name="start_time_default" value="{start_time_default}" class="acms-admin-form-width-full" />
      <input type="hidden" name="field[]" value="start_time_default" />
    </td>
  </tr>
  <tr>
    <th>終了時刻の初期値</th>
    <td>
      <input type="text" name="end_time_default" value="{end_time_default}" class="acms-admin-form-width-full" />
      <input type="hidden" name="field[]" value="end_time_default" />
    </td>
  </tr>
  <tr>
    <th>会場の初期値</th>
    <td>
      <input type="text" name="venue_default" value="{venue_default}" class="acms-admin-form-width-full" />
      <input type="hidden" name="field[]" value="venue_default" />
    </td>
  </tr>
</table>

MF_event_default_value モジュールのカスタム設定で下図のように入力して保存します。



モジュールフィールドで設定した初期値をエントリーのカスタムフィールドグループに反映する

次に、最初に示したエントリーのカスタムフィールドグループの初期値に上で設定した値を反映します。テンプレートのループの外の部分を次のように改変します。この部分にはエントリーの変数はなく、モジュールフィールドの変数のみなので、エスケープは不要です。

<!-- 前略 -->
<tr class="sortable-item item-template">
  <!-- BEGIN_MODULE Module_Field id="MF_event_default_value" -->
  <td class="item-handle acms-admin-table-nowrap">
    <i class="acms-admin-icon-sort"></i>
  </td>
  <td>
    <input type="text" name="event_date[]" value="" class="acms-admin-form-width-full js-datepicker2" />
  </td>
  <td>
    <input type="text" name="event_start_time[]" value="{start_time_default}" class="acms-admin-form-width-full" />
  </td>
  <td>
    <input type="text" name="event_end_time[]" value="{end_time_default}" class="acms-admin-form-width-full" />
  </td>
  <td>
    <input type="text" name="event_venue[]" value="{venue_default}" class="acms-admin-form-width-full" />
  </td>
  <td class="acms-admin-table-nowrap">
    <input type="button" class="item-delete acms-admin-btn-admin acms-admin-btn-admin-danger" value="削除" />
  </td>
  <!-- END_MODULE Module_Field -->
</tr>
<!-- 後略 -->

エントリー編集画面から初期値編集のモーダルを表示できるようにする

また、tfoot の部分を下記のようにすることでエントリー編集画面から初期値モーダルを表示できるようになります。このようにしておくことで初期値を編集できる機能があること自体を、更新者が忘れてしまうようなことがなくなります。

<!-- 前略 -->
<tfoot>
  <tr>
    <td colSpan="6">
      <input type="button" class="item-insert acms-admin-btn-admin" value="追加" />
      <!-- BEGIN_MODULE Module_Field id="MF_event_default_value" -->
      <!-- BEGIN_MODULE Touch_SessionWithAdministration -->
      <!-- BEGIN module_setting --><p class="acms-admin-margin-top-mini"><a href="%{HTTP_ROOT}bid/{admin_module_bid}/admin/module_edit/?mid={admin_module_mid}&edit=update#acms_box2" class="js-dialog-btn js-link_no_rewrite acms-admin-btn"><span class="acms-admin-margin-right-mini acms-admin-icon-control-edit"></span>初期値を編集</a></p><!-- END module_setting -->
      <!-- END_MODULE Touch_SessionWithAdministration -->
      <!-- END_MODULE Module_Field -->
    </td>
  </tr>
</tfoot>
<!-- 後略 -->

初期値があらかじめ表示され、「初期値を編集」ボタンが追加されたエントリーカスタムフィールドグループ


以上、エントリーのカスタムフィールドグループの初期値をモジュールフィールドで設定する実装をご紹介しました。モジュールフィールドを使った値の設定には他にも応用が効きますので、ぜひご活用ください。