/** * This method attempts to call a setter. * * @access protected * @param string $scope the scope of the setter * @param string $field the name of the field * @param array $args the arguments to be passed * @return \Unicity\MappingService\Data\Field the aggregated field data * @throws \Unicity\Throwable\Parse\Exception indicates that there is a parsing * problem */ protected function __setter($scope, $field, $args) { $nodes = $this->resource->xpath("/translators/translator[@name='{$this->name}']/fields/field[@name='{$field}' and @scope='{$scope}']"); if (count($nodes) > 0) { $attributes = $nodes[0]->attributes(); $aggregated_field = $args[0]; if (isset($attributes['translation'])) { $translation = $this->__valueOf($attributes['translation']); $aggregated_field = $translation::factory($aggregated_field)->toModelFormat(); } $items = $nodes[0]->children(); foreach ($items as $item) { $attributes = $item->attributes(); if (!isset($attributes['name'])) { throw new Throwable\Parse\Exception('Unable to parse ":scope" method in translator.', array(':scope' => $scope)); } $name = $this->__valueOf($attributes['name']); if (isset($attributes['location'])) { $segments = explode('.', $this->__valueOf($attributes['location'])); if (count($segments) > 0) { $property = $this->models; foreach ($segments as $segment) { $property =& $property->{$segment}; } $property = $aggregated_field->getValue($name); } } } } return null; }
/** * This method returns the field for the specified data format. * * @access public * @static * @param MappingService\Data\Field $field the data field to store the items * @param Core\Data\XML $translation the translation to be parsed */ public static function translate(MappingService\Data\Field $field, Core\Data\XML $translation) { $format = $field->getFormatType()->__name(); $nodes = $translation->xpath("./Field[@Format='{$format}']"); if (!empty($nodes)) { $children = $nodes[0]->children(); if (count($children) > 0) { foreach ($children as $child) { $name = $child->getName(); if ($name == 'Item') { $attributes = $child->attributes(); if (isset($attributes['Name'])) { $key = Core\Data\XML::valueOf($attributes['Name']); $value = Core\Data\XML::valueOf($child[0]); if (isset($attributes['Type'])) { $type = Core\Data\XML::valueOf($attributes['Type']); if (!(is_string($type) && preg_match('/^(bool(ean)?|int(eger)?|float|string)$/i', $type))) { $type = 'string'; } settype($value, $type); } else { settype($value, 'string'); } $field->putItem($key, $value); } } } } } }