Development

/branches/1.3/lib/plugins/sfCompat10Plugin/lib/validator/sfValidatorManager.class.php

You must first sign up to be able to contribute.

root/branches/1.3/lib/plugins/sfCompat10Plugin/lib/validator/sfValidatorManager.class.php

Revision 23810, 7.4 kB (checked in by Kris.Wallsmith, 5 years ago)

[1.3] set svn:eol-style property to native and svn:keywords property to Id on all .php files

  • Property svn:mime-type set to text/x-php
  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
1 <?php
2
3 /*
4  * This file is part of the symfony package.
5  * (c) 2004-2006 Fabien Potencier <fabien.potencier@symfony-project.com>
6  * (c) 2004-2006 Sean Kerr <sean@code-box.org>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 /**
13  * sfValidatorManager provides management for request parameters and their
14  * associated validators.
15  *
16  * @package    symfony
17  * @subpackage validator
18  * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
19  * @author     Sean Kerr <sean@code-box.org>
20  * @version    SVN: $Id$
21  */
22 class sfValidatorManager
23 {
24   protected
25     $groups  = array(),
26     $names   = array(),
27     $request = null;
28
29   /**
30    * Class constructor.
31    *
32    * @see initialize()
33    */
34   public function __construct($context)
35   {
36     $this->initialize($context);
37   }
38
39   /**
40    * Initializes this validator manager.
41    *
42    * @param sfContext A sfContext instance
43    */
44   public function initialize($context)
45   {
46     $this->request = $context->getRequest();
47   }
48
49   /**
50    * Clears this validator manager so it can be reused.
51    */
52   public function clear()
53   {
54     $this->groups = null;
55     $this->groups = array();
56     $this->names  = null;
57     $this->names  = array();
58   }
59
60   /**
61    * Executes all validators and determine the validation status.
62    *
63    * @return bool true, if validation completed successfully, otherwise false
64    */
65   public function execute()
66   {
67     if (sfConfig::get('sf_logging_enabled'))
68     {
69       sfContext::getInstance()->getEventDispatcher()->notify(new sfEvent($this, 'application.log', array('Validation execution')));
70     }
71
72     $retval = true;
73
74     // loop through the names and start our validation
75     // if 1 or more groups exist, we'll have to do a second pass
76     $pass = 1;
77
78     while (true)
79     {
80       foreach ($this->names as $name => &$data)
81       {
82         if (isset($data['_is_parent']))
83         {
84           // this is a parent
85           foreach ($data as $subname => &$subdata)
86           {
87             if ($subname == '_is_parent')
88             {
89               // this isn't an actual index, but more of a flag
90               continue;
91             }
92
93             if ($subdata['validation_status'] == true && !$this->validate($subname, $subdata, $name))
94             {
95               // validation failed
96               $retval = false;
97             }
98           }
99         }
100         else
101         {
102           // single parameter
103           if ($data['validation_status'] == true && !$this->validate($name, $data, null))
104           {
105             // validation failed
106             $retval = false;
107           }
108         }
109       }
110
111       if (count($this->groups) == 0 || $pass == 2)
112       {
113         break;
114       }
115
116       // increase our pass indicator
117       ++$pass;
118     }
119
120     return $retval;
121   }
122
123   /**
124    * Registers a file or parameter.
125    *
126    * @param string  A file or parameter name
127    * @param bool    The required status
128    * @param string  A required error message
129    * @param string  A group name
130    * @param string  A parent array
131    */
132   public function registerName($name, $required = true, $message = 'Required', $parent = null, $group = null, $isFile = false)
133   {
134     // create the entry
135     $entry                      = array();
136     $entry['group']             = null;
137     $entry['is_file']           = $isFile;
138     $entry['required']          = $required;
139     $entry['required_msg']      = $message;
140     $entry['validation_status'] = true;
141     $entry['validators']        = array();
142
143     if ($parent != null)
144     {
145       // this parameter has a parent array
146       if (!isset($this->names[$parent]))
147       {
148         // create the parent array
149         $this->names[$parent] = array('_is_parent' => true);
150       }
151
152       // register this parameter
153       $this->names[$parent][$name] =& $entry;
154     }
155     else
156     {
157       // no parent
158
159       // register this parameter
160       $this->names[$name] =& $entry;
161     }
162
163     if ($group != null)
164     {
165       // set group
166       if (!isset($this->groups[$group]))
167       {
168         // create our group
169         $this->groups[$group] = array('_force' => false);
170       }
171
172       // add this file/parameter name to the group
173       $this->groups[$group][] = $name;
174
175       // add a reference back to the group array to the file/param array
176       $entry['group'] =& $this->groups[$group];
177     }
178   }
179
180   /**
181    * Registers a validator for a file or parameter.
182    *
183    * @param string    A file or parameter name
184    * @param Validator A validator implementation instance
185    * @param string    A parent array name
186    */
187   public function registerValidator($name, $validator, $parent = null)
188   {
189     if ($parent != null)
190     {
191       // this parameter has a parent
192       $this->names[$parent][$name]['validators'][] = $validator;
193     }
194     else
195     {
196       // no parent
197       $this->names[$name]['validators'][] = $validator;
198     }
199   }
200
201   /**
202    * Validates a file or parameter.
203    *
204    * @param string A file or parameter name
205    * @param array  Data associated with the file or parameter
206    * @param string A parent name
207    *
208    * @return bool true, if validation completes successfully, otherwise false
209    */
210   protected function validate(&$name, &$data, $parent)
211   {
212     // get defaults
213     $error     = null;
214     $errorName = null;
215     $force     = null !== $data['group'] ? $data['group']['_force'] : false;
216     $retval    = true;
217     $value     = null;
218
219     // get our parameter value
220     if ($parent == null)
221     {
222       // normal file/parameter
223       $errorName = $name;
224
225       if ($data['is_file'])
226       {
227         // file
228         $value = $this->request->getFile($name);
229       }
230       else
231       {
232         // parameter
233         $value = $this->request->getParameterHolder()->get($name);
234       }
235     }
236     else
237     {
238       // we have a parent
239       $errorName = $parent.'{'.$name.'}';
240
241       if ($data['is_file'])
242       {
243         // file
244         $parent = $this->request->getFile($parent.'['.$name.']');
245
246         if ($parent != null)
247         {
248           $value = $parent;
249         }
250       }
251       else
252       {
253         // parameter
254         $parent = $this->request->getParameterHolder()->get($parent);
255
256         if ($parent != null && isset($parent[$name]))
257         {
258           $value = $parent[$name];
259         }
260       }
261     }
262
263     // now for the dirty work
264     if (
265       ($data['is_file'] && !$value['name'])
266       ||
267       (!$data['is_file'] && (is_array($value) ? sfToolkit::isArrayValuesEmpty($value) : ($value === null || strlen($value) == 0)))
268     )
269     {
270       if ($data['required'] || $force)
271       {
272         // it's empty!
273         $error  = $data['required_msg'];
274         $retval = false;
275       }
276       else
277       {
278         // we don't have to validate it
279         $retval = true;
280       }
281     }
282     else
283     {
284       // time for the fun
285       $error = null;
286
287       // get group force status
288       if ($data['group'] != null)
289       {
290         // we set this because we do have a value for a parameter in this group
291         $data['group']['_force'] = true;
292       }
293
294       if (count($data['validators']) > 0)
295       {
296         // loop through our validators
297         foreach ($data['validators'] as $validator)
298         {
299           if (!$validator->execute($value, $error))
300           {
301             $retval = false;
302
303             break;
304           }
305         }
306       }
307     }
308
309     if (!$retval)
310     {
311       // set validation status
312       $data['validation_status'] = false;
313
314       // set the request error
315       $this->request->setError($errorName, $error);
316     }
317
318     return $retval;
319   }
320 }
321
Note: See TracBrowser for help on using the browser.