トップ  > symfony  > フォーム  > 記事

No.982 フォームをカスタマイズする


◆フォームからフィールドを削除するにはこれらの設定を解除するだけです:
// lib/form/doctrine/JobeetJobForm.class.php
class JobeetJobForm extends BaseJobeetJobForm
{
  public function configure()
  {
    unset(
      $this['created_at'], $this['updated_at'],
      $this['expires_at'], $this['is_activated']
    );
  }
}

フィールドの設定を解除することはフィールドウィジェットとバリデータの両方が削除されることを意味します。

◆バリデートにセット
// lib/form/doctrine/JobeetJobForm.class.php
public function configure()
{
  // ...
 
  $this->validatorSchema['email'] = new sfValidatorEmail();
}
// lib/form/doctrine/JobeetJobForm.class.php
public function configure()
{
  // ...
 
  $this->validatorSchema['email'] = new sfValidatorAnd(array(
    $this->validatorSchema['email'],
    new sfValidatorEmail(),
  ));
}
◆選択肢の設定

最初に、JobeetJobTableで利用可能な値を定義しましょう:

// lib/model/doctrine/JobeetJobTable.class.php
class JobeetJobTable extends Doctrine_Table
{
  static public $types = array(
    'full-time' => 'Full time',
    'part-time' => 'Part time',
    'freelance' => 'Freelance',
  );
 
  public function getTypes()
  {
    return self::$types;
  }
 
  // ...
}

typeウィジェットに対してsfWidgetFormChoiceを使います:

$this->widgetSchema['type'] = new sfWidgetFormChoice(array(
  'choices'  => Doctrine::getTable('JobeetJob')->getTypes(),
  'expanded' => true,
));

sfWidgetFormChoiceは 異なるウィジェット設定オプション(expandedmultiple)でレンダリングできる ~選択ウィジェット~を表します:

  • ドロップダウンリスト(<select>): array('multiple' => false, 'expanded' => false)
  • ドロップダウンボックス(<select multiple="multiple">): array('multiple' => true, 'expanded' => false)
  • ラジオボタンのリスト: array('multiple' => false, 'expanded' => true)
  • チェックボックスのリスト: array('multiple' => true, 'expanded' => true)
◆いろいろ

有効ではない値を誰も投稿できないと考えるとしても、 ハッカーはcurlもしくは Firefox Web Developer Toolbarのようなツールを利用してウィジェットの選択を簡単に回避できます。 利用可能な選択を制限するためにバリデータを変更しましょう:

$this->validatorSchema['type'] = new sfValidatorChoice(array(
  'choices' => array_keys(Doctrine::getTable('JobeetJob')->getTypes()),
));

logoカラムは求人に関連したロゴのファイル名を保存するので、 ウィジェットを~ファイル入力~タグに変更する必要があります:

$this->widgetSchema['logo'] = new sfWidgetFormInputFile(array(
  'label' => 'Company logo',
));

それぞれのフィールドに対して、symfonyは~ラベル~ (レンダリングされた<label>タグに使われる) を自動的に生成します。これはlabelオプションで変更できます。

ウィジェット配列のsetLabels()メソッドで バッチのラベルを変更することもできます:

$this->widgetSchema->setLabels(array(
  'category_id'    => 'Category',
  'is_public'      => 'Public?',
  'how_to_apply'   => 'How to apply?',
));

デフォルトのバリデータを変更する必要もあります:

$this->validatorSchema['logo'] = new sfValidatorFile(array(
  'required'   => false,
  'path'       => sfConfig::get('sf_upload_dir').'/jobs',
  'mime_types' => 'web_images',
));

sfValidatorFileはたくさんのことをこなすのでとても面白いです:

  • アップロードされたファイルがウェブフォーマットであることをバリデートする(mime_types)
  • ファイルをユニークな名前にリネームする
  • Stores the file in the given path
  • 生成された名前でlogoカラムを更新する
◆フォームクラスの例
// lib/form/doctrine/JobeetJobForm.class.php
class JobeetJobForm extends BaseJobeetJobForm
{
  public function configure()
  {
    unset(
      $this['created_at'], $this['updated_at'],
      $this['expires_at'], $this['is_activated']
    );
 
    $this->validatorSchema['email'] = new sfValidatorEmail();
 
    $this->widgetSchema['type'] = new sfWidgetFormChoice(array(
      'choices'  => Doctrine::getTable('JobeetJob')->getTypes(),
      'expanded' => true,
    ));
    $this->validatorSchema['type'] = new sfValidatorChoice(array(
      'choices' => array_keys(Doctrine::getTable('JobeetJob')->getTypes()),
    ));
 
    $this->widgetSchema['logo'] = new sfWidgetFormInputFile(array(
      'label' => 'Company logo',
    ));
 
    $this->widgetSchema->setLabels(array(
      'category_id'    => 'Category',
      'is_public'      => 'Public?',
      'how_to_apply'   => 'How to apply?',
    ));
 
    $this->validatorSchema['logo'] = new sfValidatorFile(array(
      'required'   => false,
      'path'       => sfConfig::get('sf_upload_dir').'/jobs',
      'mime_types' => 'web_images',
    ));
 
    $this->widgetSchema->setHelp('is_public', 'Whether the job can also be published on affiliate websites or not.');
  }
}




引用元

更新:2009/06/02 09:34 カテゴリ: symfony  > フォーム ▲トップ

FuelPHP

Mac

フロントエンド開発

web開発

プロマネ

マネタイズ

プレゼン

webサービス運用

webサービス

Linux

サーバ管理

MySQL

ソース・開発

svn・git

PHP

HTML・CSS

JavaScript

ツール, ライブラリ

ビジネス

テンプレート

負荷・チューニング

Windows

メール

メール・手紙文例

CodeIgniter

オブジェクト指向

UI・フロントエンド

cloud

マークアップ・テキスト

Flash

デザイン

DBその他

Ruby

PostgreSQL

ユーティリティ・ソフト

Firefox

ハードウェア

Google

symfony

OpenPNE全般

OpenPNE2

Hack(賢コツ)

OpenPNE3

リンク

個人開発

その他

未確認

KVS

ubuntu

Android

負荷試験

オープンソース

社会

便利ツール

マネー

Twig

食品宅配

WEB設計

オーディオ

一般常識

アプリ開発

Python

サイトマップ

うずら技術ブログ

たませんSNS

rss2.0