• []
  • []
  •  
  • del.icio.us 
  •  
  • Yahoo!֥åޡϿ 

symfonyで入力フォームを作る

PHP 求人 募集 Symfony CakePHP Smarty Ruby on Rails

symfonyでお問い合わせページ作成 概要

プロジェクト、アプリケーション、モジュールまで作成できたら
次は実装作業をガシガシとやっていく。
アプリケーションが大きくなっていけば、
データベースは必須になるわけだが、
今回は簡単なお問い合わせページなので、
データベースなしでやってみようと思う。
これはsymfonyの本来のやりかたではないため、
参考にはならないかもしれないが。

基本仕様は

機能アクション詳細
入力ページindex名前,メールアドレス,問い合わせ内容
入力確認confirm入力した内容を確認し、問題が在れば修正ページへ、無ければ完了ページへ
入力完了end入力内容をメールで送信
入力処理do各種投稿内容処理

入力ページの詳細仕様は

項目フォーム名属性詳細
名前nameinput text必須入力
メールアドレスmailinput text必須入力、メールアドレス形式。
問い合わせ内容inquirytextarea必須入力
確認 - input submit -

確認ページの詳細仕様は

項目フォーム名属性詳細
名前nameinput hidden必須入力
メールアドレスmailinput hidden必須入力、メールアドレス形式。
問い合わせ内容inquiryinput hidden必須入力
修正fixinput submit -
投稿 - input submit -

といった具合。

各名称は

カテゴリ名称
projectmyproject
applicationmyapp
moduleinquiry

とする。

なお、以下の説明はsymfonyプロジェクト作成の続きで進めている想定なので、
まだの人は目を通しておいてください。

symfonyでお問い合わせページ作成

基本設定

使用するアプリケーションの基本設定をしておく

システム基本設定

apps/myapp/config/setting.yml に以下の記述を追加

all:
  .settings:
    escaping_strategy: both
    escaping_method:   ESC_ENTITIES

ビュー基本設定

apps/myapp/config/view.yml に

all:
  stylesheets:    [main, /sf/sf_default/css/screen]

を追加

キャッシュのクリア

設定ファイルを変更しても、
キャッシュされているので反映されません。
そこで、キャッシュクリアを実行します。

$ symfony clear-cache

モジュール作成

お問い合わせ機能のモジュールを作成する

$ symfony init-module myapp inquiry 

アクション、ビューを作成

お問い合わせフォーム用の入力ページ、および完了ページを作成します。 アクション
apps/myapp/modules/inquiry/actions/actions.class.php

class inquiryActions extends sfActions
{
  public function executeIndex()
  {
  }
 
  public function executeEnd()
  {
  }
 
  public function executeDo()
  {
      switch( $this->getRequestParameter("act") )
      {
          case "index":
            $this->redirect("/inquiry/end");
          default:
            $this->forward("inquiry", "index");
              break;
      }
  }
}

フォーム定義 apps/myapp/modules/inquiry/validate/do.yml

methods:         [post]

fields:
  name:
    required:    no
      msg:       名前が入力されていません。

  mail:
    required:    no
      msg:       メールアドレスが入力されていません

  inquiry:
    required:    no
      msg:       問い合わせ内容が入力されていません

入力画面ビュー
apps/myapp/modules/inquiry/templates/indexSuccess.php

<div class="sfTContainer">
  <a href="http://www.symfony-project.com/">
   <img alt="" class="sfTLogo" src="/sf/sf_default/images/sfTLogo.png"
 height="39" width="186" /></a>  
  <div class="sfTMessageContainer sfTAlert"> 
    <div class="sfTMessageWrap">
      <h1><?= link_to('お問い合わせフォーム', '@homepage') ?></h1>
      <h5>簡単なお問い合わせフォーム</h5>
 
     </div>
  </div>
  <dl class="sfTMessageInfo">
    <dt>お問い合わせ</dt>
    <dd>
<?php use_helper('Validation') ?>         
<?= form_tag('inquiry/do') ?>
  <?= input_hidden_tag('act', 'index') ?>
  名前:<br /><?= form_error('name') ?>
    <?= input_tag('name', $sf_params->get('name')) ?><br />
  メールアドレス:<br /><?= form_error('mail') ?>
    <?= input_tag('mail', $sf_params->get('mail')) ?><br />
  問い合わせ内容:<br /><?= form_error('inquiry') ?>
    <?= textarea_tag('inquiry', $sf_params->get('inquiry')) ?><br />
<?= submit_tag('確認') ?>
</form>
     </dd>
  </dl>
 
</div>

完了画面ビュー
apps/myapp/modules/inquiry/templates/endSuccess.php

<div class="sfTContainer">
  <a href="http://www.symfony-project.com/">
    <img alt="" class="sfTLogo" src="/sf/sf_default/images/sfTLogo.png"
     height="39" width="186" /></a>  
  <div class="sfTMessageContainer sfTAlert"> 
    <div class="sfTMessageWrap">
      <h1><?= link_to('お問い合わせフォーム', '@homepage') ?></h1>
      <h5>簡単なお問い合わせフォーム</h5>
 
     </div>
  </div>
  <dl class="sfTMessageInfo">
    <dt>お問い合わせ完了</dt>
    <dd>
      お問い合せありがとうございました
<?= link_to('戻る', 'inquiry/index') ?>
     </dd>
  </dl>
 
</div>

ウェブからアクセスする。

http://dozo.matrix.jp/index.php/inquiry

問い合せフォーム
お問い合わせフォーム

問い合わせ完了
問い合わせ完了

symfony 単体(ユニット)・機能テストするへ続く

symfonyでお問い合わせページ解説

escaping_strategyとescaping_method

setting.ymlにescaping_strategyとescaping_methodというパラメータを設定した。
これは出力をすべてエスケープするのが目的である。
全部にhtmlspecialcharsが掛かったと思って貰えばよい。

理由はもちろんXSS対策。
例えば入力値に”<script>alert('hoge');</script>“とされると、
次のページでポップアップが表示されてしまう。

セキュリティの対策アプローチは最初は強めにして、
必要なところで弱めるようにする。
なのでアプリケーション全体をエスケープする設定にしておき、
HTMLを扱う局所的な部分の時のみエスケープを外す。 弱くした部分はセキュリティテストを十分行うこと。

エスケープ無しデータがそのまま必要な場合は

<?=  $sf_data->getRaw('test'); ?>

とする。

http_metasのContent-Type

海外ソフトの悪い癖…と言うべきか。 文字コードの扱いがぞんざいなことが多い。 我々マルチバイト言語を扱うものとしては そのあたりをしっかりキチンと定義しておかなければならない。

Content-typeはHTMLのmetaタグに追加するものだが、
これを定義しないと出力は文字コードがブラウザまかせになってしまう。
セキュリティ的にもNGなので、
キチンと定義しておく。

symfony 単体(ユニット)・機能テストするへ続く


framework/symfony/入力フォーム.txt · 最終更新: 2007/06/28 01:28 by dozo