Source of file SerialisedDBField.php
Size: 4,133 Bytes - Last Modified: 2021-12-23T10:56:38+00:00
/var/www/docs.ssmods.com/process/src/code/SerialisedDBField.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 | <?php namespace UncleCheese\SerialisedDBFields; use \Text; use \DBField; use \FormField; use \ArrayLib; use \ArrayList; /** * Class SerialisedDBField * @package UncleCheese\SerialisedDBFields */ abstract class SerialisedDBField extends Text { /** * @var array */ protected $unserialisedData; /** * @var UncleCheese\SerialisedDBFields\SerialisedDBFieldParser */ protected $parser; /** * @var FormField */ protected $editorField; /** * SerialisedDBField constructor. * @param null $name * @param null $unserialisedData */ public function __construct($name = null, $unserialisedData = null) { $this->unserialisedData = $unserialisedData; parent::__construct($name); } /** * @param $field * @return bool */ public function hasField($field) { $data = $this->getUnserialisedData(); return isset($data[$field]); } /** * @param $field * @return mixed */ public function getField($field) { return $this->obj($field); } /** * @param $fieldName * @param null $arguments * @param bool $forceReturnedObject * @param bool $cache * @param null $cacheName * @return null */ public function obj($fieldName, $arguments = null, $forceReturnedObject = true, $cache = false, $cacheName = null) { $data = $this->getFieldFromData($fieldName); if ($data === null) { return null; } if (is_array($data)) { if (ArrayLib::is_associative($data)) { $newField = static::create($this->name, $data); $newField->setValue($this->getValue()); } else { $newField = ArrayList::create(); foreach ($data as $item) { $newField->push( static::create($this->name, $item) ); } } return $newField; } $this->$fieldName = $this->getCastingHint($data); return parent::obj($fieldName, $arguments, $forceReturnedObject, $cache, $cacheName); } /** * @param null $title * @param null $params * @return FormField */ public function scaffoldFormField($title = null, $params = null) { return $this->editorField ->setName($this->name) ->setTitle($title); } /** * @param SerialisedDBFieldParser $parser */ public function setParser(SerialisedDBFieldParser $parser) { $this->parser = $parser; } /** * @param FormField $field */ public function setEditor(FormField $field) { $this->editorField = $field; } /** * @return null */ public function getUnserialisedData() { if ($this->unserialisedData) { return $this->unserialisedData; } return $this->unserialisedData = $this->parser->parse($this->getValue()); } /** * @return bool */ public function scalarValueOnly() { return false; } /** * @param $field * @return null */ protected function getFieldFromData($field) { $data = $this->getUnserialisedData(); if (!isset($data[$field])) { return null; } return $data[$field]; } /** * Parses the field value for a casting hint, e.g. * <code> * Price: Currency|20.00 * </code> * @param string $fieldValue * @return DBField|string */ protected function getCastingHint($fieldValue) { $pos = strpos($fieldValue, '|'); $dbField = null; if($pos !== false) { $hint = trim(substr($fieldValue, 0, $pos)); $value = substr($fieldValue, $pos+1); if(is_subclass_of($hint, 'DBField')) { $dbField = DBField::create_field($hint, $value); } $this->extend('updateCastingHint', $dbField, $hint, $value); } return $dbField ?: $fieldValue; } } |