/**
  * 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;
 }
Esempio n. 2
0
 /**
  * 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'));
 }