a-blog cms PHP API Reference

TemplateRenderer
in package
uses FieldTrait

メールテンプレート(ファイル経路・文字列直接入力)の描画を担う。

Twig(tpl_twig 有効時)→ 既存 ACMS テンプレートパイプライン、の2段で処理する。 「描画」に責務を限定し、送信(Engine)とは分離する(Symfony の Mailer/Mime/BodyRenderer 分割と同型)。

Table of Contents

Methods

getMailTxt()  : string
メールテンプレートの解決
getMailTxtFromTxt()  : string
文字列直接入力 (フォームの件名・本文など運営者の管理画面入力) からメール本文を組み立てる。
buildFieldTrait()  : array<string|int, mixed>|null
フィールドを連想配列として組み立て
resolveTemplateUrlsTrait()  : array<string|int, mixed>
toStructured の出力に対し、path フィールドの URL 解決と html フィールドの 絶対化(テンプレート出力固有)を適用する。
buildMailTwigContext()  : array<string, mixed>
Field を Twig コンテキスト辞書に組み立てる。
mailTwig()  : Twig
メール用 Twig サービスをサービスコンテナから取得する。
renderAcmsMailPipeline()  : string
メールテキストを既存の ACMS テンプレートパイプラインで組み立てる。
renderMailTwigIfEnabled()  : string
メールテンプレ文字列を指定の Twig サービスで評価する (Twig → ACMS の 2 段の 1 段目)。
resolveTemplateUrlsInGroupRowTrait()  : array<string|int, mixed>
グループ内の 1 行に含まれるマルチ項目(連想配列構造)に対して URL 解決を適用。
resolveTemplateUrlsInMultiEntryTrait()  : array<string|int, mixed>
マルチ項目フィールドエントリ('value'/'array' を持つ)に対して URL 解決を適用。

Methods

getMailTxt()

メールテンプレートの解決

public getMailTxt(string $path, Field $field[, string|null $charset = null ]) : string
Parameters
$path : string
$field : Field
$charset : string|null = null
Return values
string

getMailTxtFromTxt()

文字列直接入力 (フォームの件名・本文など運営者の管理画面入力) からメール本文を組み立てる。

public getMailTxtFromTxt(string $txt, Field $field) : string

tpl_twig 有効時はサンドボックス専用の Twig サービス (template.mail.twig.sandboxed) で評価してから ACMS パイプラインへ渡す。ファイル経路 (self::getMailTxt()) と同じく 「self::renderMailTwigIfEnabled() → self::renderAcmsMailPipeline()」の 2 段で処理する。

Parameters
$txt : string
$field : Field
Return values
string

buildFieldTrait()

フィールドを連想配列として組み立て

protected buildFieldTrait(Field|Field_Validation $field[, string|null $scp = null ]) : array<string|int, mixed>|null
Parameters
$field : Field|Field_Validation
$scp : string|null = null

子フィールドとして再帰したときの名前(takeover キーの prefix に使う)

Return values
array<string|int, mixed>|null —

フィールドが空の場合は null

resolveTemplateUrlsTrait()

toStructured の出力に対し、path フィールドの URL 解決と html フィールドの 絶対化(テンプレート出力固有)を適用する。

protected resolveTemplateUrlsTrait(array<string|int, mixed> $data, Field|Field_Validation $field) : array<string|int, mixed>
  • マルチ項目フィールド (['value' => {...}, 'array' => [...]]) の中の path / html
  • グループ内マルチ項目(連番キーの行配列の中の各 baseName)の path / html

単一値フィールドや、グループ内単一値フィールドには URL 解決を適用しない(旧挙動)。

Parameters
$data : array<string|int, mixed>
$field : Field|Field_Validation
Return values
array<string|int, mixed>

buildMailTwigContext()

Field を Twig コンテキスト辞書に組み立てる。

private buildMailTwigContext(Field|null $field) : array<string, mixed>

公開側 V2 モジュール / API と同じ FieldTrait::buildFieldTrait() で構造化するため、 Twig からは {{ name.value }} / {{ name.array }} や、メディアフィールドの {{ photo.value.path }} など公開側と同じ形でアクセスできる。Field オブジェクトは渡さず、 すべて連想配列に展開されるためサンドボックス (メソッド・プロパティアクセス禁止) とも整合する。

takeover (Field 全体の acmsSerialize) はメール本文に露出すると情報漏えいになるため除外する。

Parameters
$field : Field|null

受け取り側のシグネチャ統一のため null を許容する。null のときは空辞書を返す。

Return values
array<string, mixed>

mailTwig()

メール用 Twig サービスをサービスコンテナから取得する。

private mailTwig("template.mail.twig"|"template.mail.twig.sandboxed" $key) : Twig

同じ Twig クラスを設定違いで別キー登録している:

  • template.mail.twig … ファイル経路 (制作者)。フル機能・非サンドボックス
  • template.mail.twig.sandboxed … フォーム直接入力 (運営者)。サンドボックス
Parameters
$key : "template.mail.twig"|"template.mail.twig.sandboxed"

コンテナ登録キー

Return values
Twig

renderAcmsMailPipeline()

メールテキストを既存の ACMS テンプレートパイプラインで組み立てる。

private renderAcmsMailPipeline(string $txt, Field $field) : string

var ブロック展開 → template.acms → Field 変数差し込み → IF 展開、の順に通す。 Twig 評価は呼び出し側 (getMailTxt / getMailTxtFromTxt) の責務とし、 このメソッドでは一切行わない。これにより、ファイル経路 (getMailTxt) で Twig レンダ済みの 出力を再び Twig 評価してしまう二重レンダリング (= ユーザー入力フィールド値に含まれる {{ }} がサンドボックス非経由で評価される SSTI) を防ぐ。

Parameters
$txt : string
$field : Field
Return values
string

renderMailTwigIfEnabled()

メールテンプレ文字列を指定の Twig サービスで評価する (Twig → ACMS の 2 段の 1 段目)。

private renderMailTwigIfEnabled("template.mail.twig"|"template.mail.twig.sandboxed" $serviceKey, string $tpl, Field $field[, string|null $name = null ]) : string

評価トリガーは公開側テーマと同じく tpl_twig のみ (TwigPolicy::isEnabled())。無効時は Twig を 評価せず $tpl をそのまま返し、後段の ACMS パイプライン (self::renderAcmsMailPipeline()) だけで 処理する。内容推測やフラグでの分岐はしない。これにより getMailTxt (ファイル経路) / getMailTxtFromTxt (文字列直接入力) の双方が「renderMailTwigIfEnabled → renderAcmsMailPipeline」という 同一の流れになる。

信頼境界はサービスキーで切り替える: template.mail.twig はファイル経路 (制作者) のフル機能、 template.mail.twig.sandboxed はフォーム直接入力 (運営者) のサンドボックス評価で SSTI を防ぐ。 フィールド値 (フォーム送信値など) はコンテキストとして渡すだけで、Twig は 1 回しか実行しないため 送信者入力が Twig として再評価されることはない。

Twig 評価が失敗した場合は本文を空に倒さず、Twig 未評価の元テキストへフォールバックする。 「評価できなかったものは評価しない (リテラルのまま後段 ACMS パイプラインへ流す)」とすることで、 サイレントな本文・件名の欠落を防ぎつつ、未評価のため SSTI も生じない。

捕捉は Throwable とする。Twig はレンダリング中の例外を RuntimeException にラップするが、 テンプレートのコンパイル時や self::buildMailTwigContext() (Field 構造化) で \Error / \TypeError が出る経路もあり、\Exception だけではメール送信フローを fatal 終了させ得るため。

Parameters
$serviceKey : "template.mail.twig"|"template.mail.twig.sandboxed"

コンテナ登録キー

$tpl : string

評価するテンプレート文字列

$field : Field

Twig コンテキストの元になる Field

$name : string|null = null

レンダの論理名。autoescape が 'name' 戦略の経路 (template.mail.twig) では この拡張子で html / エスケープなしを判定するためファイル名を渡す。autoescape=false のサンドボックス 経路 (template.mail.twig.sandboxed) では論理名が autoescape に影響しないため null とし、 renderString の既定名に委ねる

Return values
string —

Twig 評価結果。tpl_twig 無効時・評価失敗時は Twig 未評価の $tpl

resolveTemplateUrlsInGroupRowTrait()

グループ内の 1 行に含まれるマルチ項目(連想配列構造)に対して URL 解決を適用。

private resolveTemplateUrlsInGroupRowTrait(array<string|int, mixed> $row, Field|Field_Validation $field) : array<string|int, mixed>

グループ内単一値は ['value' => x] の形なのでスキップ。 グループ内マルチ項目は ['alt' => x, 'path' => y, ...] の形。

Parameters
$row : array<string|int, mixed>
$field : Field|Field_Validation
Return values
array<string|int, mixed>

resolveTemplateUrlsInMultiEntryTrait()

マルチ項目フィールドエントリ('value'/'array' を持つ)に対して URL 解決を適用。

private resolveTemplateUrlsInMultiEntryTrait(array<string|int, mixed> $entry, string $baseName, Field|Field_Validation $field) : array<string|int, mixed>
Parameters
$entry : array<string|int, mixed>
$baseName : string
$field : Field|Field_Validation
Return values
array<string|int, mixed>

        
On this page

Search results