Project

General

Profile

fix-unique-memberconfig.patch

Yuma Sakata, 2012-08-29 11:17

Download (5.48 KB)

View differences:

lib/form/doctrine/MemberConfigForm.class.php
81 81
    }
82 82
    $this->validatorSchema[$name] = opFormItemGenerator::generateValidator($config);
83 83

  
84
    if (!empty($config['IsConfirm'])) {
84
    if (!empty($config['IsUnique']))
85
    {
86
      $uniqueValidator = new sfValidatorCallback(array(
87
        'callback'    => array($this, 'isUnique'),
88
        'arguments'   => array('name' => $name),
89
        'empty_value' => $this->validatorSchema[$name]->getOption('empty_value'),
90
      ));
91

  
92
      $this->validatorSchema[$name] = new sfValidatorAnd(array(
93
        $this->validatorSchema[$name],
94
        $uniqueValidator,
95
      ), array(
96
        'required'      => $this->validatorSchema[$name]->getOption('required'),
97
        'empty_value'   => $this->validatorSchema[$name]->getOption('empty_value'),
98
        'halt_on_error' => true,
99
      ));
100
    }
101

  
102
    if (!empty($config['IsConfirm']))
103
    {
85 104
      $this->validatorSchema[$name.'_confirm'] = $this->validatorSchema[$name];
86 105
      $this->widgetSchema[$name.'_confirm'] = $this->widgetSchema[$name];
87 106
      $this->widgetSchema->setLabel($name.'_confirm', $config['Caption'].' (Confirm)');
88 107

  
89
      $this->mergePostValidator(new sfValidatorSchemaCompare($name, '==', $name.'_confirm'));
90
    }
91

  
92
    if (!empty($config['IsUnique'])) {
93
      $this->mergePostValidator(new sfValidatorCallback(array(
94
        'callback' => array($this, 'isUnique'),
108
      $this->mergePreValidator(new sfValidatorCallback(array(
109
        'callback'  => array($this, 'preValidateConfirmField'),
95 110
        'arguments' => array('name' => $name),
96 111
      )));
112
      $this->mergePostValidator(new sfValidatorCallback(array(
113
        'callback'  => array($this, 'postValidateConfirmField'),
114
        'arguments' => array('name' => $name, 'validator' => $this->validatorSchema[$name]),
115
      )));
97 116
    }
98 117

  
99 118
    if (!empty($config['Info']))
......
102 121
    }
103 122
  }
104 123

  
124
  /**
125
   * IsConfirm: true のフィールド用の Pre Validator
126
   *
127
   * 個別フィールドのバリデーターを一旦 sfValidatorPass に置き換え、
128
   * バリデーションは Post Validator でまとめておこなう
129
   */
130
  public function preValidateConfirmField($validator, $values, $arguments = array())
131
  {
132
    $name = $arguments['name'];
133

  
134
    // 入力フォーム画面に「必須項目マーク(*)」を表示するためバリデーション直前で変更する
135
    $this->validatorSchema[$name] = $this->validatorSchema[$name.'_confirm'] = new sfValidatorPass();
136

  
137
    return $values;
138
  }
139

  
140
  /**
141
   * IsConfirm: true のフィールド用の Post Validator
142
   *
143
   * 元フィールドと _confirm フィールドの個別バリデーションもこの中でおこない、
144
   * エラーにならなかった場合のみ両者を比較することで、エラーが重複して表示されるのを防ぐ
145
   */
146
  public function postValidateConfirmField($validator, $values, $arguments = array())
147
  {
148
    $name = $arguments['name'];
149
    $fieldValidator = $arguments['validator'];
150

  
151
    // バリデーションエラー時のフォーム画面に「必須項目マーク(*)」を表示するためバリデーターを元に戻す
152
    $this->validatorSchema[$name] = $this->validatorSchema[$name.'_confirm'] = $fieldValidator;
153

  
154
    // 元フィールドのバリデーション
155
    try
156
    {
157
      $values[$name] = $fieldValidator->clean($values[$name]);
158
    }
159
    catch (sfValidatorError $e)
160
    {
161
      throw new sfValidatorErrorSchema($validator, array($name => $e));
162
    }
163

  
164
    // _confirm フィールドのバリデーション
165
    try
166
    {
167
      $values[$name.'_confirm'] = $fieldValidator->clean($values[$name.'_confirm']);
168
    }
169
    catch (sfValidatorError $e)
170
    {
171
      // _confirm だけエラーになる場合、2つのフィールドの値は一致していないので、
172
      // sfValidatorSchemaCompare と同じ invalid エラーの例外を投げる
173
      throw new sfValidatorErrorSchema($validator, array($name.'_confirm' => new sfValidatorError($validator, 'invalid')));
174
    }
175

  
176
    // 2つのフィールドが共にエラーでない場合のみ値を比較する
177
    // validator の clean() は値を変更することがあるため、clean() 後の値を比較する
178
    $compareValidator = new sfValidatorSchemaCompare($name.'_confirm', '===', $name);
179
    $values = $compareValidator->clean($values);
180

  
181
    return $values;
182
  }
183

  
105 184
  public function isUnique($validator, $value, $arguments = array())
106 185
  {
107 186
    if (empty($arguments['name'])) {
......
109 188
    }
110 189

  
111 190
    $name = $arguments['name'];
112
    $data = Doctrine::getTable('MemberConfig')->retrieveByNameAndValue($name, $value[$name]);
191
    $data = Doctrine::getTable('MemberConfig')->retrieveByNameAndValue($name, $value);
113 192
    if (!$data || !$data->getMember()->getIsActive() || $data->getMember()->getId() == $this->member->getId()) {
114 193
      return $value;
115 194
    }