1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
<?php
namespace Tev\Field\Util;
use Exception;
use Tev\Field\Model\AbstractField,
Tev\Field\Factory as FieldFactory;
/**
* Utility object that provides access to a group of fields.
*
* Used internally by RepeaterField and similar to access each individual
* set of fields.
*/
class FieldGroup
{
/**
* Set of field data.
*
* @var array
*/
private $fields;
/**
* Set of field values
*
* @var string
*/
private $values;
/**
* Parent field.
*
* @var \Tev\Field\Model\AbstractField
*/
private $parent;
/**
* Field factory.
*
* @var \Tev\Field\Factory
*/
private $fieldFactory;
/**
* Cached field data (indexed by field key or name).
*
* @var array
*/
private $_fieldData;
/**
* Constructor.
*
* @param array $fields Set of field data
* @param array $values Set of field values
* @param \Tev\Field\Model\AbstractField $parent Parent field
* @param \Tev\Field\Factory $fieldFactory Field factory
* @return void
*/
public function __construct(array $fields,
array $values,
AbstractField $parent,
FieldFactory $fieldFactory)
{
$this->fields = $fields;
$this->values = $values;
$this->parent = $parent;
$this->fieldFactory = $fieldFactory;
$this->_fieldData = array();
}
/**
* Get a field from the group.
*
* @param string $field Field name or key
* @return \Tev\Field\Model\AbstractField Field object
*
* @throws \Exception If field does not exist
*/
public function field($field)
{
return $this->fieldFactory->createFromField(
$this->getFieldData($field),
$this->getFieldValue($field)
);
}
/**
* Get the parent of this field.
*
* @return \Tev\Field\Model\AbstractField
*/
public function parent()
{
return $this->parent;
}
/**
* Get field data by field name or key.
*
* @param string $field Field name or key
* @return array Field data
*
* @throws \Exception If field does not exist
*/
private function getFieldData($field)
{
if (!isset($this->_fieldData[$field])) {
foreach ($this->fields as $f) {
if (($f['key'] === $field) || ($f['name'] === $field)) {
$this->_fieldData[$field] = $f;
break;
}
}
}
if (isset($this->_fieldData[$field])) {
return $this->_fieldData[$field];
} else {
throw new Exception("Field $field does not exist");
}
}
/**
* Get field value by name or key.
*
* @param string $field Field name or key
* @return mixed Value or null if not set
*/
private function getFieldValue($field)
{
return isset($this->values[$field]) ? $this->values[$field] : null;
}
}