source: trunk/library/Zend/Validate/Db/Abstract.php @ 5146

Revision 5146, 9.5 KB checked in by wmerlotto, 12 years ago (diff)

Ticket #2305 - Enviando alteracoes, desenvolvidas internamente na Prognus. Library: adicionando arquivos.

Line 
1<?php
2/**
3 * Zend Framework
4 *
5 * LICENSE
6 *
7 * This source file is subject to the new BSD license that is bundled
8 * with this package in the file LICENSE.txt.
9 * It is also available through the world-wide-web at this URL:
10 * http://framework.zend.com/license/new-bsd
11 * If you did not receive a copy of the license and are unable to
12 * obtain it through the world-wide-web, please send an email
13 * to license@zend.com so we can send you a copy immediately.
14 *
15 * @category   Zend
16 * @package    Zend_Validate
17 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
18 * @license    http://framework.zend.com/license/new-bsd     New BSD License
19 * @version    $Id: Abstract.php 23484 2010-12-10 03:57:59Z mjh_ca $
20 */
21
22/**
23 * @see Zend_Validate_Abstract
24 */
25require_once 'Zend/Validate/Abstract.php';
26
27/**
28 * Class for Database record validation
29 *
30 * @category   Zend
31 * @package    Zend_Validate
32 * @uses       Zend_Validate_Abstract
33 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
34 * @license    http://framework.zend.com/license/new-bsd     New BSD License
35 */
36abstract class Zend_Validate_Db_Abstract extends Zend_Validate_Abstract
37{
38    /**
39     * Error constants
40     */
41    const ERROR_NO_RECORD_FOUND = 'noRecordFound';
42    const ERROR_RECORD_FOUND    = 'recordFound';
43
44    /**
45     * @var array Message templates
46     */
47    protected $_messageTemplates = array(
48        self::ERROR_NO_RECORD_FOUND => "No record matching '%value%' was found",
49        self::ERROR_RECORD_FOUND    => "A record matching '%value%' was found",
50    );
51
52    /**
53     * @var string
54     */
55    protected $_schema = null;
56
57    /**
58     * @var string
59     */
60    protected $_table = '';
61
62    /**
63     * @var string
64     */
65    protected $_field = '';
66
67    /**
68     * @var mixed
69     */
70    protected $_exclude = null;
71
72    /**
73     * Database adapter to use. If null isValid() will use Zend_Db::getInstance instead
74     *
75     * @var unknown_type
76     */
77    protected $_adapter = null;
78
79    /**
80     * Select object to use. can be set, or will be auto-generated
81     * @var Zend_Db_Select
82     */
83    protected $_select;
84
85    /**
86     * Provides basic configuration for use with Zend_Validate_Db Validators
87     * Setting $exclude allows a single record to be excluded from matching.
88     * Exclude can either be a String containing a where clause, or an array with `field` and `value` keys
89     * to define the where clause added to the sql.
90     * A database adapter may optionally be supplied to avoid using the registered default adapter.
91     *
92     * The following option keys are supported:
93     * 'table'   => The database table to validate against
94     * 'schema'  => The schema keys
95     * 'field'   => The field to check for a match
96     * 'exclude' => An optional where clause or field/value pair to exclude from the query
97     * 'adapter' => An optional database adapter to use
98     *
99     * @param array|Zend_Config $options Options to use for this validator
100     */
101    public function __construct($options)
102    {
103        if ($options instanceof Zend_Db_Select) {
104            $this->setSelect($options);
105            return;
106        }
107        if ($options instanceof Zend_Config) {
108            $options = $options->toArray();
109        } else if (func_num_args() > 1) {
110            $options       = func_get_args();
111            $temp['table'] = array_shift($options);
112            $temp['field'] = array_shift($options);
113            if (!empty($options)) {
114                $temp['exclude'] = array_shift($options);
115            }
116
117            if (!empty($options)) {
118                $temp['adapter'] = array_shift($options);
119            }
120
121            $options = $temp;
122        }
123
124        if (!array_key_exists('table', $options) && !array_key_exists('schema', $options)) {
125            require_once 'Zend/Validate/Exception.php';
126            throw new Zend_Validate_Exception('Table or Schema option missing!');
127        }
128
129        if (!array_key_exists('field', $options)) {
130            require_once 'Zend/Validate/Exception.php';
131            throw new Zend_Validate_Exception('Field option missing!');
132        }
133
134        if (array_key_exists('adapter', $options)) {
135            $this->setAdapter($options['adapter']);
136        }
137
138        if (array_key_exists('exclude', $options)) {
139            $this->setExclude($options['exclude']);
140        }
141
142        $this->setField($options['field']);
143        if (array_key_exists('table', $options)) {
144            $this->setTable($options['table']);
145        }
146
147        if (array_key_exists('schema', $options)) {
148            $this->setSchema($options['schema']);
149        }
150    }
151
152    /**
153     * Returns the set adapter
154     *
155     * @return Zend_Db_Adapter
156     */
157    public function getAdapter()
158    {
159        /**
160         * Check for an adapter being defined. if not, fetch the default adapter.
161         */
162        if ($this->_adapter === null) {
163            $this->_adapter = Zend_Db_Table_Abstract::getDefaultAdapter();
164            if (null === $this->_adapter) {
165                require_once 'Zend/Validate/Exception.php';
166                throw new Zend_Validate_Exception('No database adapter present');
167            }
168        }
169        return $this->_adapter;
170    }
171
172    /**
173     * Sets a new database adapter
174     *
175     * @param  Zend_Db_Adapter_Abstract $adapter
176     * @return Zend_Validate_Db_Abstract
177     */
178    public function setAdapter($adapter)
179    {
180        if (!($adapter instanceof Zend_Db_Adapter_Abstract)) {
181            require_once 'Zend/Validate/Exception.php';
182            throw new Zend_Validate_Exception('Adapter option must be a database adapter!');
183        }
184
185        $this->_adapter = $adapter;
186        return $this;
187    }
188
189    /**
190     * Returns the set exclude clause
191     *
192     * @return string|array
193     */
194    public function getExclude()
195    {
196        return $this->_exclude;
197    }
198
199    /**
200     * Sets a new exclude clause
201     *
202     * @param string|array $exclude
203     * @return Zend_Validate_Db_Abstract
204     */
205    public function setExclude($exclude)
206    {
207        $this->_exclude = $exclude;
208        return $this;
209    }
210
211    /**
212     * Returns the set field
213     *
214     * @return string|array
215     */
216    public function getField()
217    {
218        return $this->_field;
219    }
220
221    /**
222     * Sets a new field
223     *
224     * @param string $field
225     * @return Zend_Validate_Db_Abstract
226     */
227    public function setField($field)
228    {
229        $this->_field = (string) $field;
230        return $this;
231    }
232
233    /**
234     * Returns the set table
235     *
236     * @return string
237     */
238    public function getTable()
239    {
240        return $this->_table;
241    }
242
243    /**
244     * Sets a new table
245     *
246     * @param string $table
247     * @return Zend_Validate_Db_Abstract
248     */
249    public function setTable($table)
250    {
251        $this->_table = (string) $table;
252        return $this;
253    }
254
255    /**
256     * Returns the set schema
257     *
258     * @return string
259     */
260    public function getSchema()
261    {
262        return $this->_schema;
263    }
264
265    /**
266     * Sets a new schema
267     *
268     * @param string $schema
269     * @return Zend_Validate_Db_Abstract
270     */
271    public function setSchema($schema)
272    {
273        $this->_schema = $schema;
274        return $this;
275    }
276
277    /**
278     * Sets the select object to be used by the validator
279     *
280     * @param Zend_Db_Select $select
281     * @return Zend_Validate_Db_Abstract
282     */
283    public function setSelect($select)
284    {
285        if (!$select instanceof Zend_Db_Select) {
286            throw new Zend_Validate_Exception('Select option must be a valid ' .
287                                              'Zend_Db_Select object');
288        }
289        $this->_select = $select;
290        return $this;
291    }
292
293    /**
294     * Gets the select object to be used by the validator.
295     * If no select object was supplied to the constructor,
296     * then it will auto-generate one from the given table,
297     * schema, field, and adapter options.
298     *
299     * @return Zend_Db_Select The Select object which will be used
300     */
301    public function getSelect()
302    {
303        if (null === $this->_select) {
304            $db = $this->getAdapter();
305            /**
306             * Build select object
307             */
308            $select = new Zend_Db_Select($db);
309            $select->from($this->_table, array($this->_field), $this->_schema);
310            if ($db->supportsParameters('named')) {
311                $select->where($db->quoteIdentifier($this->_field, true).' = :value'); // named
312            } else {
313                $select->where($db->quoteIdentifier($this->_field, true).' = ?'); // positional
314            }
315            if ($this->_exclude !== null) {
316                if (is_array($this->_exclude)) {
317                    $select->where(
318                          $db->quoteIdentifier($this->_exclude['field'], true) .
319                            ' != ?', $this->_exclude['value']
320                    );
321                } else {
322                    $select->where($this->_exclude);
323                }
324            }
325            $select->limit(1);
326            $this->_select = $select;
327        }
328        return $this->_select;
329    }
330
331    /**
332     * Run query and returns matches, or null if no matches are found.
333     *
334     * @param  String $value
335     * @return Array when matches are found.
336     */
337    protected function _query($value)
338    {
339        $select = $this->getSelect();
340        /**
341         * Run query
342         */
343        $result = $select->getAdapter()->fetchRow(
344            $select,
345            array('value' => $value), // this should work whether db supports positional or named params
346            Zend_Db::FETCH_ASSOC
347            );
348
349        return $result;
350    }
351}
Note: See TracBrowser for help on using the repository browser.