Symfony内でWordPressのテンプレート関数を適用

Symfony

多くのWebアプリケーションの製作現場では、アプリケーションとなるシステムはフレームワーク等を用いて開発し、広告となるホームページはWordpress等のCMSツールを使う機会は多くあります。

この記事ではSymfony内でWordpressのヘッダー、フッターの呼出関数を実行する方法を説明します。

開発環境

環境は以下の通りになります。

OSCentOS 6.4
PHP5.3.3
WordPress2.6.0

設定

WordPressの関数は基本的にテンプレートファイルで使用するので、Symfonyのレイアウトファイルを以下のように編集します。

app/frontend/templates/layout.php
<?php
require_once('/var/www/html/www.ssl-market.com/wp-load.php');
get_header();
?>

<?php echo $sf_data->getRaw('sf_content') ?>

<?php get_footer() ?>

wp-load.php は、Wordpressのファイルになります。
直接読み込めるようにパスを指定します。

制限事項

WordPressのヘッダーを適用する為、元々Symfonyにあったヘッダーの設定は反映されません。

反映されないSymfony関数の一部

  • include_http_metas
  • include_metas
  • include_title

Symfonyでリソースの読み込みをする場合

リソースの読み込みを行う場合は、layout.phpに直接記載するか、又はテンプレートファイル毎に以下の宣言を追記します。

スタイルを読み込み <?php use_stylesheet('main.css') ?>
スクリプトを読み込み
<?php use_javascript('script.js') ?>

フォーム利用時の文字化け

Symfonyアプリケーション内にWordpressの関数をが利用できるようにした状態で入力フォームの値検証(バリデーション)で文字化けが発生しました。

apps/frontend/modules/モジュール名/validate/入力後のアクション名.yml
fillin:
  enabled:  false # 入力値保持フラグ
methods:  [post] 
fields:
・・・省略

WordPressとSymfonyの文字コードは全てUTF-8になっていますが、Symfonyのコアライブラリを調べた結果、PHPのDOMモジュールのバグに依存する事が判明しました。

文字化け回避方法

この文字化けはPOSTされた値の受け渡しで影響する為、Validate.ymlの入力値の保持設定である fillinを無効にする事で回避できますが、入力値が引継がれない為、現代のフォームとして成り立ちません。

対策方法

この問題はSymfonyコアライブリのフォームにて発火しているので、POSTした値を上書きするフィルターを追加して対応します。

フィルターの設定

filter.ymlに以下を追記します。

apps/frontend/config/filter.yml
・・・省略
parameter_filter:
  class: myParameterFilter
・・・省略

クラスの作成

myParameterFilterクラスを作成します。

lib/filter/myParameterFilter.class.php
<?php
class myParameterFilter extends sfFilter
{
  public function execute($filterChain)
  {
    if ($this->isFirstCall()) {
      $args = (Array)$this->getContext()->getRequest()->getParameterHolder()->getAll();
      foreach ($args as $k => $v){
        $this->getContext()->getRequest()->setParameter($k , $v);
      }
    }
    $filterChain->execute();
  }
}

上記ソースコードを見てわかる通りパラメータを全て、setParameterにて上書きします。

キャッシュの初期化

filter.yml及び作成したクラスファイルを反映させる為、ターミナル上で以下コマンドを実行するか、cacheディレクトリ内を削除します。

$ symfony cc

確認

ブラウザから文字化けが発生していない事を確認して完了

課題

今回行った対策では、filter.ymlが適用されるモジュール全てに対しパラメータを強制的に上書をしてしまいSymfonyアプリケーション本来の機能を正しく使用する面で考えると推奨されない対応方法となります。

Validate.ymlにて値保持を無効にしているにも関わらず保持する処理を入れること自体、矛盾していますが、最終的にはフォームの入力値保持の設定の確認及び、入力値検証が実行された場合のみフィルターを有効できればと課題を残す形で終了します。

コメント

タイトルとURLをコピーしました