version 3.0アップグレードガイド

PowerCMS X ver.3.0では非常にたくさんの新機能が追加されているとともに、ライブラリの管理方法が一部変更になりました。ver.3.0へのアップグレードについてまとめます。

アップグレード前にはデータベースとソースファイル一式のバックアップを必ずお願いします。

1. 通常のアップグレード手順でソースの上書きと管理画面でのアップグレード

  • サーバーへのアップロード、ソース一式の上書き
  • 管理者としてログインし、管理画面からスキーマ及びプラグインのアップグレード

2. composerを利用したライブラリのインストール

一部のプラグインが利用するモジュールについて、これまでPowerCMS Xのパッケージに同梱していたものの一部を composer経由のインストールに変更しています。対象のプラグイン・ライブラリは以下の通りです。

  • SimplifiedJapanese プラグインの PHPWord
  • AuthTwilio プラグインの twilio/sdk

また、新プラグイン「AWS_S3」「AWS_CloudFront」では、AWS SDK for PHP (aws/aws-sdk-php) をcomposerを利用してインストールする必要があります。

予め、環境変数「composer_autoload」に vendor/autoload.php へのパスを指定しておいてください。

{
    "require": {
        "phpoffice/phpword": "dev-master",
        "twilio/sdk": "dev-main"
    }
}
$ composer update
$ composer require aws/aws-sdk-php

3. RESTful APIの利用

https://example.com/powercmsx/api/ 配下のリクエストを https://example.com/powercmsx/api/index.php に渡すように設定します。パスはカスタマイズ可能です。その場合はindex.php内のパスを環境にあわせて書き換えてください。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
</IfModule>

その後、利用するモデル、利用するスコープで「APIを有効化」にチェックを入れて設定を保存してください。

4. 新しいテンプレートエンジンの利用

PowerCMS X ver.3.0のテンプレートエンジン PAML3では、タグデリミタのカスタマイズによって、Mustache, Twig, Smartyライクな記述が可能になり、変数のスコープの指定やタグ属性への配列やハッシュの指定が簡単になるなど多数の変更があり、一部 if文の評価結果や値の取得結果が従来と異なる可能性があるため、デフォルトでは従来バージョンが利用されるようになっています。環境変数の指定によって新しいバージョンを選択できるようになります。

新しいテンプレートエンジンを利用するには環境変数「paml_version」に「3」を指定、タグデリミタで他のテンプレートエンジンライクな記述を利用するためには「tag_delimiter」にMustache, Twig, Smartyのいずれかを指定します(※paml_versionは管理画面の環境変数では設定できません)。

        "paml_version" : 3,
        "tag_delimiter" : "Mustache",
  • tag_delimiter指定のある時も、標準の記法(MTタグ)は利用できます。
  • MTタグと他の記法を同一のテンプレート内で混在させることはできません。
  • MTタグがテンプレート内にあるとき、常に MTタグが優先されます。
  • Mustache, Twig, Smartyと完全な互換性はなく、if・elseif・unlessタグのtestモディファイアを除き、式などは利用できません。

新たにサポートされたタグ及び新機能を追加したファンクション・タグ

  • let : ローカル変数をセット
  • set : グローバル変数をセット
  • extends : テンプレートの継承をサポート
  • convert2linkurl : URLを公開URL(S3やCloudFrontのURLなど)に置換
  • fileput : ファイルの書き込み
  • unlink : ファイルの削除
  • fetch : URLもしくはローカルファイルの取得(HTTPヘッダなどを指定可能に)
  • objecttojson : オブジェクトをJSON文字列に変換(RESTful APIの返却するJSONと同じフォーマットになりました)
  • objecttoresource : RESTful APIの返却する配列と同等の変数をセット

新たにサポートされたタグ及び新機能を追加したグローバル・モディファイア

  • let : ローカル変数をセット
  • set : グローバル変数をセット
  • assign : グローバル変数をセット
  • add_mtime : ファイルのタイムスタンプをパラメタに追加
  • format_name : 日付関係のタグについて'rfc822'のような名前を指定可能に
  • scope : 変数セット関係のタグについて変数のスコープを指定可能に

新たにサポートされたテンプレート記法

tag_delimiter : "Twig"

{% let entries.0.title="記事タイトル0" %}
{% let entries.0.text="記事本文0" %}
{% let entries.1.title="記事タイトル1" %}
{% let entries.1.text="記事本文1" %}

{% for entry in entries %}
  {{ entry.title }}
  {{ entry.text }}
{% endfor %}
  • Twig互換モードでは set(setvartemplate相当)、let(setvartemplate scope="local"相当)ブロック・タグが利用できます。
  • 式は利用できません。
  • モディファイアの指定はパイプ「|」ではなくスペースとなります(タグ内に「=」を含まない場合はパイプが利用できます)。
  • 自動エスケープはデフォルトでは無効です。$ctx->autoescape = true; とすることで有効化されますが、PowerCMS Xは自動エスケープをサポートしません。

tag_delimiter : "Mustache"

{{let entries.0.title="記事タイトル0"}}
{{let entries.0.text="記事本文0"}}
{{let entries.1.title="記事タイトル1"}}
{{let entries.1.text="記事本文1"}}

{{#foreach entries as entry}}
  {{entry.title}}
  {{entry.text}}
{{/foreach}}
  • Mustache互換モードでは set(setvartemplate相当)、let(setvartemplate scope="local"相当)ブロック・タグが利用できます。
  • 式は利用できません。
  • モディファイアの指定はパイプ「|」ではなくスペースとなります(タグ内に「=」を含まない場合はパイプが利用できます)。
  • 自動エスケープはデフォルトでは無効です。$ctx->autoescape = true; とすることで有効化されますが、PowerCMS Xは自動エスケープをサポートしません。

tag_delimiter : "Smarty"

{let entries.0.title="記事タイトル0"}
{let entries.0.text="記事本文0"}
{let entries.1.title="記事タイトル1"}
{let entries.1.text="記事本文1"}

{foreach entries as entry}
  {$entry.title}
  {$entry.text}
{{/foreach}}
  • Smarty互換モードでは capture(setvartemplate相当)ブロック・タグが利用できます。
  • 式は利用できません。
  • モディファイアの指定はパイプ「|」ではなくスペースとなります(タグ内に「=」を含まない場合はパイプが利用できます)。

デフォルトの記述方法

<mt:let entries.0.title="記事タイトル0">
<mt:let entries.0.text="記事本文0">
<mt:let entries.1.title="記事タイトル1">
<mt:let entries.1.text="記事本文1">

<mt:for entry in entries>
  <mt:var name="entry.title">
  <mt:var name="entry.text">
</mt:for>

もしくは

<mt:foreach entries as entry>
  <mt:var name="entry.title">
  <mt:var name="entry.text">
</mt:foreach>