28
28
* @package Zend_Form
29
29
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
30
30
* @license http://framework.zend.com/license/new-bsd New BSD License
31
* @version $Id: Form.php 20096 2010-01-06 02:05:09Z bkarwin $
31
* @version $Id: Form.php 21924 2010-04-17 11:55:50Z alab $
33
33
class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
842
842
public function setName($name)
844
844
$name = $this->filterName($name);
845
if (('0' !== $name) && empty($name)) {
845
if ('' === (string)$name) {
846
846
require_once 'Zend/Form/Exception.php';
847
847
throw new Zend_Form_Exception('Invalid name provided; must contain only valid variable characters and be non-empty');
1227
1227
public function setDefaults(array $defaults)
1231
if ($this->isArray()) {
1232
$eBelongTo = $this->getElementsBelongTo();
1233
$defaults = $this->_dissolveArrayValue($defaults, $eBelongTo);
1229
1235
foreach ($this->getElements() as $name => $element) {
1230
if (array_key_exists($name, $defaults)) {
1231
$this->setDefault($name, $defaults[$name]);
1237
if (($belongsTo = $element->getBelongsTo()) !== $eBelongTo) {
1238
$check = $this->_dissolveArrayValue($defaults, $belongsTo);
1240
if (array_key_exists($name, $check)) {
1241
$this->setDefault($name, $check[$name]);
1242
$defaults = $this->_dissolveArrayUnsetKey($defaults, $belongsTo, $name);
1234
1245
foreach ($this->getSubForms() as $name => $form) {
1235
if (array_key_exists($name, $defaults)) {
1246
if (!$form->isArray() && array_key_exists($name, $defaults)) {
1236
1247
$form->setDefaults($defaults[$name]);
1238
1249
$form->setDefaults($defaults);
1298
1309
public function getValues($suppressArrayNotation = false)
1300
1311
$values = array();
1314
if ($this->isArray()) {
1315
$eBelongTo = $this->getElementsBelongTo();
1301
1318
foreach ($this->getElements() as $key => $element) {
1302
1319
if (!$element->getIgnore()) {
1303
$values[$key] = $element->getValue();
1321
if (($belongsTo = $element->getBelongsTo()) !== $eBelongTo) {
1322
if ('' !== (string)$belongsTo) {
1323
$key = $belongsTo . '[' . $key . ']';
1326
$merge = $this->_attachToArray($element->getValue(), $key);
1327
$values = array_merge_recursive($values, $merge);
1306
1330
foreach ($this->getSubForms() as $key => $subForm) {
1307
$fValues = $this->_attachToArray($subForm->getValues(true), $subForm->getElementsBelongTo());
1308
$values = array_merge($values, $fValues);
1332
if (!$subForm->isArray()) {
1333
$merge[$key] = $subForm->getValues();
1335
$merge = $this->_attachToArray($subForm->getValues(true),
1336
$subForm->getElementsBelongTo());
1338
$values = array_merge_recursive($values, $merge);
1311
1341
if (!$suppressArrayNotation && $this->isArray()) {
1323
1353
* values to persist them.
1325
1355
* @param array $data
1356
* @param bool $suppressArrayNotation
1326
1357
* @return array
1328
public function getValidValues($data)
1359
public function getValidValues($data, $suppressArrayNotation = false)
1330
1361
$values = array();
1364
if ($this->isArray()) {
1365
$eBelongTo = $this->getElementsBelongTo();
1366
$data = $this->_dissolveArrayValue($data, $eBelongTo);
1331
1369
foreach ($this->getElements() as $key => $element) {
1332
if (isset($data[$key])) {
1333
if($element->isValid($data[$key], $data)) {
1334
$values[$key] = $element->getValue();
1371
if (($belongsTo = $element->getBelongsTo()) !== $eBelongTo) {
1372
$check = $this->_dissolveArrayValue($data, $belongsTo);
1374
if (isset($check[$key])) {
1375
if($element->isValid($check[$key], $context)) {
1377
if ($belongsTo !== $eBelongTo && '' !== (string)$belongsTo) {
1378
$key = $belongsTo . '[' . $key . ']';
1380
$merge = $this->_attachToArray($element->getValue(), $key);
1381
$values = array_merge_recursive($values, $merge);
1383
$data = $this->_dissolveArrayUnsetKey($data, $belongsTo, $key);
1338
1386
foreach ($this->getSubForms() as $key => $form) {
1339
if (isset($data[$key])) {
1340
$values[$key] = $form->getValidValues($data[$key]);
1388
if (isset($data[$key]) && !$form->isArray()) {
1389
$tmp = $form->getValidValues($data[$key]);
1391
$merge[$key] = $tmp;
1394
$tmp = $form->getValidValues($data, true);
1396
$merge = $this->_attachToArray($tmp, $form->getElementsBelongTo());
1399
$values = array_merge_recursive($values, $merge);
1401
if (!$suppressArrayNotation && $this->isArray() && !empty($values)) {
1402
$values = $this->_attachToArray($values, $this->getElementsBelongTo());
1344
1405
return $values;
2050
* Given an array, an optional arrayPath and a key this method
2051
* dissolves the arrayPath and unsets the key within the array
2054
* @param array $array
2055
* @param string|null $arrayPath
2056
* @param string $key
2059
protected function _dissolveArrayUnsetKey($array, $arrayPath, $key)
2062
$path = trim(strtr((string)$arrayPath, array('[' => '/', ']' => '')), '/');
2063
$segs = ('' !== $path) ? explode('/', $path) : array();
2065
foreach ($segs as $seg) {
2066
if (!array_key_exists($seg, (array)$unset)) {
2069
$unset =& $unset[$seg];
2071
if (array_key_exists($key, (array)$unset)) {
2072
unset($unset[$key]);
1989
2078
* Converts given arrayPath to an array and attaches given value at the end of it.
1991
2080
* @param mixed $value The value to attach
2026
2115
$translator = $this->getTranslator();
2029
2119
if ($this->isArray()) {
2030
$data = $this->_dissolveArrayValue($data, $this->getElementsBelongTo());
2120
$eBelongTo = $this->getElementsBelongTo();
2121
$data = $this->_dissolveArrayValue($data, $eBelongTo);
2033
2124
foreach ($this->getElements() as $key => $element) {
2034
$element->setTranslator($translator);
2035
if (!isset($data[$key])) {
2036
$valid = $element->isValid(null, $data) && $valid;
2125
if (null !== $translator && !$element->hasTranslator()) {
2126
$element->setTranslator($translator);
2129
if (($belongsTo = $element->getBelongsTo()) !== $eBelongTo) {
2130
$check = $this->_dissolveArrayValue($data, $belongsTo);
2132
if (!isset($check[$key])) {
2133
$valid = $element->isValid(null, $context) && $valid;
2038
$valid = $element->isValid($data[$key], $data) && $valid;
2135
$valid = $element->isValid($check[$key], $context) && $valid;
2136
$data = $this->_dissolveArrayUnsetKey($data, $belongsTo, $key);
2041
2139
foreach ($this->getSubForms() as $key => $form) {
2042
$form->setTranslator($translator);
2043
if (isset($data[$key])) {
2140
if (null !== $translator && !$form->hasTranslator()) {
2141
$form->setTranslator($translator);
2143
if (isset($data[$key]) && !$form->isArray()) {
2044
2144
$valid = $form->isValid($data[$key]) && $valid;
2046
2146
$valid = $form->isValid($data) && $valid;
2068
2168
public function isValidPartial(array $data)
2070
2172
if ($this->isArray()) {
2071
$data = $this->_dissolveArrayValue($data, $this->getElementsBelongTo());
2173
$eBelongTo = $this->getElementsBelongTo();
2174
$data = $this->_dissolveArrayValue($data, $eBelongTo);
2074
$translator = $this->getTranslator();
2076
$validatedSubForms = array();
2177
$translator = $this->getTranslator();
2078
foreach ($data as $key => $value) {
2079
if (null !== ($element = $this->getElement($key))) {
2080
if (null !== $translator) {
2181
foreach ($this->getElements() as $key => $element) {
2183
if (($belongsTo = $element->getBelongsTo()) !== $eBelongTo) {
2184
$check = $this->_dissolveArrayValue($data, $belongsTo);
2186
if (isset($check[$key])) {
2187
if (null !== $translator && !$element->hasTranslator()) {
2081
2188
$element->setTranslator($translator);
2083
$valid = $element->isValid($value, $data) && $valid;
2084
} elseif (null !== ($subForm = $this->getSubForm($key))) {
2085
if (null !== $translator) {
2086
$subForm->setTranslator($translator);
2088
$valid = $subForm->isValidPartial($data[$key]) && $valid;
2089
$validatedSubForms[] = $key;
2190
$valid = $element->isValid($check[$key], $context) && $valid;
2191
$data = $this->_dissolveArrayUnsetKey($data, $belongsTo, $key);
2092
foreach ($this->getSubForms() as $key => $subForm) {
2093
if (!in_array($key, $validatedSubForms)) {
2094
if (null !== $translator) {
2095
$subForm->setTranslator($translator);
2098
$valid = $subForm->isValidPartial($data) && $valid;
2194
foreach ($this->getSubForms() as $key => $form) {
2195
if (null !== $translator && !$form->hasTranslator()) {
2196
$form->setTranslator($translator);
2198
if (isset($data[$key]) && !$form->isArray()) {
2199
$valid = $form->isValidPartial($data[$key]) && $valid;
2201
$valid = $form->isValidPartial($data) && $valid;
2254
2357
* @param string $name
2255
2358
* @return array
2257
public function getErrors($name = null)
2360
public function getErrors($name = null, $suppressArrayNotation = false)
2259
2362
$errors = array();
2260
if ((null !== $name) && isset($this->_elements[$name])) {
2261
$errors = $this->getElement($name)->getErrors();
2262
} elseif ((null !== $name) && isset($this->_subForms[$name])) {
2263
$errors = $this->getSubForm($name)->getErrors();
2265
foreach ($this->_elements as $key => $element) {
2266
$errors[$key] = $element->getErrors();
2268
foreach ($this->getSubForms() as $key => $subForm) {
2269
$fErrors = $this->_attachToArray($subForm->getErrors(), $subForm->getElementsBelongTo());
2270
$errors = array_merge($errors, $fErrors);
2363
if (null !== $name) {
2364
if (isset($this->_elements[$name])) {
2365
return $this->getElement($name)->getErrors();
2366
} else if (isset($this->_subForms[$name])) {
2367
return $this->getSubForm($name)->getErrors(null, true);
2371
foreach ($this->_elements as $key => $element) {
2372
$errors[$key] = $element->getErrors();
2374
foreach ($this->getSubForms() as $key => $subForm) {
2376
if (!$subForm->isArray()) {
2377
$merge[$key] = $subForm->getErrors();
2379
$merge = $this->_attachToArray($subForm->getErrors(null, true),
2380
$subForm->getElementsBelongTo());
2382
$errors = array_merge_recursive($errors, $merge);
2385
if (!$suppressArrayNotation && $this->isArray()) {
2386
$errors = $this->_attachToArray($errors, $this->getElementsBelongTo());
2273
2389
return $errors;
2283
2399
public function getMessages($name = null, $suppressArrayNotation = false)
2285
if ((null !== $name) && isset($this->_elements[$name])) {
2286
return $this->getElement($name)->getMessages();
2289
if ((null !== $name) && isset($this->_subForms[$name])) {
2290
return $this->getSubForm($name)->getMessages(null, true);
2293
$arrayKeys = array();
2294
foreach ($this->getSubForms() as $key => $subForm) {
2295
$array = $this->_getArrayName($subForm->getElementsBelongTo());
2296
if (!empty($array)) {
2297
if ($name == $array) {
2298
return $subForm->getMessages(null, true);
2401
if (null !== $name) {
2402
if (isset($this->_elements[$name])) {
2403
return $this->getElement($name)->getMessages();
2404
} else if (isset($this->_subForms[$name])) {
2405
return $this->getSubForm($name)->getMessages(null, true);
2407
foreach ($this->getSubForms() as $key => $subForm) {
2408
if ($subForm->isArray()) {
2409
$belongTo = $subForm->getElementsBelongTo();
2410
if ($name == $this->_getArrayName($belongTo)) {
2411
return $subForm->getMessages(null, true);
2300
$arrayKeys[$key] = $subForm->getElementsBelongTo();
2318
2431
foreach ($this->getSubForms() as $key => $subForm) {
2319
$fMessages = $subForm->getMessages(null, true);
2320
if (!empty($fMessages)) {
2321
if (array_key_exists($key, $arrayKeys)) {
2322
$fMessages = $this->_attachToArray($fMessages, $arrayKeys[$key]);
2323
$messages = array_merge($messages, $fMessages);
2432
$merge = $subForm->getMessages(null, true);
2433
if (!empty($merge)) {
2434
if (!$subForm->isArray()) {
2435
$merge = array($key => $merge);
2325
$messages[$key] = $fMessages;
2437
$merge = $this->_attachToArray($merge,
2438
$subForm->getElementsBelongTo());
2440
$messages = array_merge_recursive($messages, $merge);
2740
2854
return $this->_translator;
2858
* Does this form have its own specific translator?
2862
public function hasTranslator()
2864
return (bool)$this->_translator;
2744
2868
* Get global default translator object