BUG cache the cacheKey in TreeDropdownField, so it doesn't need to query for it multiple times in the same request

This commit is contained in:
Christopher Joe 2017-10-16 15:10:05 +13:00 committed by Damian Mooyman
parent 3e9dc5c7d2
commit 076d7d78c6

View File

@ -8,6 +8,7 @@ use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert; use SilverStripe\Core\Convert;
use SilverStripe\ORM\DataList; use SilverStripe\ORM\DataList;
use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\Hierarchy\Hierarchy; use SilverStripe\ORM\Hierarchy\Hierarchy;
use SilverStripe\ORM\Hierarchy\MarkedSet; use SilverStripe\ORM\Hierarchy\MarkedSet;
use SilverStripe\View\ViewableData; use SilverStripe\View\ViewableData;
@ -195,13 +196,18 @@ class TreeDropdownField extends FormField
* @var array * @var array
*/ */
protected $searchExpanded = []; protected $searchExpanded = [];
/** /**
* Show full path for selected options, only applies for single select * Show full path for selected options, only applies for single select
* @var bool * @var bool
*/ */
protected $showSelectedPath = false; protected $showSelectedPath = false;
/**
* @var array
*/
protected static $cacheKeyCache = [];
/** /**
* CAVEAT: for search to work properly $labelField must be a database field, * CAVEAT: for search to work properly $labelField must be a database field,
* or you need to setSearchFunction. * or you need to setSearchFunction.
@ -605,7 +611,7 @@ class TreeDropdownField extends FormField
$callback = $this->getDisableFunction(); $callback = $this->getDisableFunction();
return $callback && call_user_func($callback, $node); return $callback && call_user_func($callback, $node);
} }
/** /**
* Attributes to be given for this field type * Attributes to be given for this field type
* @return array * @return array
@ -618,11 +624,11 @@ class TreeDropdownField extends FormField
'data-schema' => json_encode($this->getSchemaData()), 'data-schema' => json_encode($this->getSchemaData()),
'data-state' => json_encode($this->getSchemaState()), 'data-state' => json_encode($this->getSchemaState()),
); );
$attributes = array_merge($attributes, $this->attributes); $attributes = array_merge($attributes, $this->attributes);
$this->extend('updateAttributes', $attributes); $this->extend('updateAttributes', $attributes);
return $attributes; return $attributes;
} }
@ -858,15 +864,14 @@ class TreeDropdownField extends FormField
/** @var Hierarchy|DataObject $record */ /** @var Hierarchy|DataObject $record */
$record = $this->Value() ? $this->objectForKey($this->Value()) : null; $record = $this->Value() ? $this->objectForKey($this->Value()) : null;
// Ensure cache is keyed by last modified date of the underlying list $data['data']['cacheKey'] = $this->getCacheKey();
$data['data']['cacheKey'] = DataList::create($this->getSourceObject())->max('LastEdited');
$data['data']['showSelectedPath'] = $this->getShowSelectedPath(); $data['data']['showSelectedPath'] = $this->getShowSelectedPath();
if ($record) { if ($record) {
$titlePath = ''; $titlePath = '';
if ($this->getShowSelectedPath()) { if ($this->getShowSelectedPath()) {
$ancestors = $record->getAncestors(true)->reverse(); $ancestors = $record->getAncestors(true)->reverse();
foreach ($ancestors as $parent) { foreach ($ancestors as $parent) {
$title = $parent->obj($this->getTitleField())->getValue(); $title = $parent->obj($this->getTitleField())->getValue();
$titlePath .= $title .'/'; $titlePath .= $title .'/';
@ -883,6 +888,21 @@ class TreeDropdownField extends FormField
return $data; return $data;
} }
/**
* Ensure cache is keyed by last modified datetime of the underlying list.
* Caches the key for the respective underlying list types, since it doesn't need to query again.
*
* @return DBDatetime
*/
protected function getCacheKey()
{
$target = $this->getSourceObject();
if (!isset(self::$cacheKeyCache[$target])) {
self::$cacheKeyCache[$target] = DataList::create($target)->max('LastEdited');
}
return self::$cacheKeyCache[$target];
}
public function getSchemaDataDefaults() public function getSchemaDataDefaults()
{ {
$data = parent::getSchemaDataDefaults(); $data = parent::getSchemaDataDefaults();
@ -947,7 +967,7 @@ class TreeDropdownField extends FormField
); );
return $emptyString; return $emptyString;
} }
/** /**
* @return bool * @return bool
*/ */
@ -955,7 +975,7 @@ class TreeDropdownField extends FormField
{ {
return $this->showSelectedPath; return $this->showSelectedPath;
} }
/** /**
* @param bool $showSelectedPath * @param bool $showSelectedPath
* @return TreeDropdownField * @return TreeDropdownField