From 690f0cc7934bd51355c30acb8b61a2e806838568 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Mon, 17 Sep 2018 18:18:40 +1200 Subject: [PATCH] BUG Fix for $source left null BUG Fix missing imports Semver compatible setSource() --- src/TagField.php | 57 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/src/TagField.php b/src/TagField.php index 986ed4e..7d83062 100644 --- a/src/TagField.php +++ b/src/TagField.php @@ -2,15 +2,18 @@ namespace SilverStripe\TagField; +use Exception; use SilverStripe\Control\Controller; use SilverStripe\Control\HTTPRequest; use SilverStripe\Control\HTTPResponse; use SilverStripe\Core\Injector\Injector; use SilverStripe\Forms\DropdownField; +use SilverStripe\Forms\Validator; use SilverStripe\ORM\ArrayList; use SilverStripe\ORM\DataList; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DataObjectInterface; +use SilverStripe\ORM\Relation; use SilverStripe\ORM\SS_List; use SilverStripe\View\ArrayData; use SilverStripe\View\Requirements; @@ -67,11 +70,10 @@ class TagField extends DropdownField * @param null|DataList $value * @param string $titleField */ - public function __construct($name, $title = '', $source = [], $value = null, $titleField = 'Title') + public function __construct($name, $title = '', $source = null, $value = null, $titleField = 'Title') { - $this->setSourceList($source); $this->setTitleField($titleField); - parent::__construct($name, $title, [], $value); + parent::__construct($name, $title, $source, $value); } /** @@ -175,7 +177,9 @@ class TagField extends DropdownField } /** - * Get the DataList source. The 4.x upgrade for SelectField::setSource starts to convert this to an array + * Get the DataList source. The 4.x upgrade for SelectField::setSource starts to convert this to an array. + * If empty use getSource() for array version + * * @return DataList */ public function getSourceList() @@ -185,7 +189,8 @@ class TagField extends DropdownField /** * Set the model class name for tags - * @param DataList $className + * + * @param DataList $sourceList * @return self */ public function setSourceList($sourceList) @@ -322,11 +327,29 @@ class TagField extends DropdownField public function getSource() { if (is_null($this->source)) { - $this->setSource($this->getSourceList()); + $this->source = $this->getListMap($this->getSourceList()); } return $this->source; } + /** + * Intercept DataList source + * + * @param mixed $source + * @return $this + */ + public function setSource($source) + { + // When setting a datalist force internal list to null + if ($source instanceof DataList) { + $this->source = null; + $this->setSourceList($source); + } else { + parent::setSource($source); + } + return $this; + } + /** * {@inheritdoc} */ @@ -342,7 +365,8 @@ class TagField extends DropdownField } /** - * {@inheritdoc} + * @param DataObject|DataObjectInterface $record DataObject to save data into + * @throws Exception */ public function saveInto(DataObjectInterface $record) { @@ -350,8 +374,9 @@ class TagField extends DropdownField $name = $this->getName(); $titleField = $this->getTitleField(); - $source = $this->getSource(); $values = $this->Value(); + + /** @var Relation $relation */ $relation = $record->$name(); $ids = array(); @@ -384,13 +409,16 @@ class TagField extends DropdownField * Get or create tag with the given value * * @param string $term - * @return DataObject + * @return DataObject|false */ protected function getOrCreateTag($term) { // Check if existing record can be found - /** @var DataList $source */ $source = $this->getSourceList(); + if (!$source) { + return false; + } + $titleField = $this->getTitleField(); $record = $source ->filter($titleField, $term) @@ -436,10 +464,10 @@ class TagField extends DropdownField */ protected function getTags($term) { - /** - * @var array $source - */ $source = $this->getSourceList(); + if (!$source) { + return []; + } $titleField = $this->getTitleField(); @@ -476,10 +504,11 @@ class TagField extends DropdownField /** * Converts the field to a readonly variant. * - * @return TagField_Readonly + * @return ReadonlyTagField */ public function performReadonlyTransformation() { + /** @var ReadonlyTagField $copy */ $copy = $this->castedCopy(ReadonlyTagField::class); $copy->setSourceList($this->getSourceList()); return $copy;