/** * Make a field type. * * @param array $parameters * @param StreamInterface $stream * @param null $entry * @return FieldType */ public function make(array $parameters, StreamInterface $stream = null, $entry = null) { /* @var EntryInterface $entry */ if ($stream && $entry instanceof EntryInterface && $entry->hasField(array_get($parameters, 'field'))) { $field = clone $entry->getFieldType(array_get($parameters, 'field')); $modifier = $field->getModifier(); $value = array_pull($parameters, 'value'); /* @var EntryInterface $entry */ $field->setValue(!is_null($value) ? $modifier->restore($value) : $entry->getAttribute($field->getField())); } elseif (is_object($entry)) { $field = $this->builder->build($parameters); $modifier = $field->getModifier(); $value = array_pull($parameters, 'value'); $field->setValue(!is_null($value) ? $modifier->restore($value) : $entry->{$field->getField()}); } else { $field = $this->builder->build($parameters); $modifier = $field->getModifier(); $field->setValue($modifier->restore(array_pull($parameters, 'value'))); } // Set the entry. $field->setEntry($entry); // Merge in rules and validators. $field->mergeRules(array_pull($parameters, 'rules', []))->mergeConfig(array_pull($parameters, 'config', []))->mergeMessages(array_pull($parameters, 'messages', []))->mergeValidators(array_pull($parameters, 'validators', [])); // Hydrate the field with parameters. $this->hydrator->hydrate($field, $parameters); return $field; }
/** * Get the field type. * * @param bool $fresh * @return FieldType|null * @throws \Exception */ public function getType($fresh = false) { if ($fresh === false && isset($this->cache['type'])) { return $this->cache['type']; } $type = $this->type; $field = $this->slug; $label = $this->name; $config = $this->config; if (!$type) { return $this->cache['type'] = null; } return $this->cache['type'] = self::$builder->build(compact('type', 'field', 'label', 'config')); }