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 |
}
|