From bf60a699a5cc9bad7d2534330aeb5c42b4262c95 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Fri, 28 Sep 2018 12:31:23 +1200 Subject: [PATCH 1/2] Add extension points for ModelAdmin search API --- src/Forms/GridField/GridFieldFilterHeader.php | 84 ++++++++++++++++--- 1 file changed, 72 insertions(+), 12 deletions(-) diff --git a/src/Forms/GridField/GridFieldFilterHeader.php b/src/Forms/GridField/GridFieldFilterHeader.php index 207c3f633..733bd2289 100755 --- a/src/Forms/GridField/GridFieldFilterHeader.php +++ b/src/Forms/GridField/GridFieldFilterHeader.php @@ -43,6 +43,26 @@ class GridFieldFilterHeader implements GridField_URLHandler, GridField_HTMLProvi */ public $useLegacyFilterHeader = false; + /** + * @var \SilverStripe\ORM\Search\SearchContext + */ + protected $searchContext = null; + + /** + * @var Form + */ + protected $searchForm = null; + + /** + * @var callable + */ + protected $updateSearchContext = null; + + /** + * @var callable + */ + protected $updateSearchForm = null; + /** * @inheritDoc */ @@ -55,10 +75,16 @@ class GridFieldFilterHeader implements GridField_URLHandler, GridField_HTMLProvi /** * @param bool $useLegacy + * @param callable|null $updateSearchForm This will be removed in 5.0 */ - public function __construct($useLegacy = false) - { + public function __construct( + $useLegacy = false, + callable $updateSearchContext = null, + callable $updateSearchForm = null + ) { $this->useLegacyFilterHeader = $useLegacy; + $this->updateSearchContextCallback = $updateSearchContext; + $this->updateSearchFormCallback = $updateSearchForm; } /** @@ -208,9 +234,15 @@ class GridFieldFilterHeader implements GridField_URLHandler, GridField_HTMLProvi */ public function getSearchContext(GridField $gridField) { - $context = singleton($gridField->getModelClass())->getDefaultSearchContext(); + if (!$this->searchContext) { + $this->searchContext = singleton($gridField->getModelClass())->getDefaultSearchContext(); - return $context; + if ($this->updateSearchContextCallback) { + call_user_func($this->updateSearchContextCallback, $this->searchContext); + } + } + + return $this->searchContext; } /** @@ -228,6 +260,9 @@ class GridFieldFilterHeader implements GridField_URLHandler, GridField_HTMLProvi if (array_key_exists($gridField->getName(), $params)) { $params = $params[$gridField->getName()]; } + if ($context->getSearchParams()) { + $params = array_merge($context->getSearchParams(), $params); + } $context->setSearchParams($params); $searchField = $context->getSearchFields()->first(); @@ -257,19 +292,22 @@ class GridFieldFilterHeader implements GridField_URLHandler, GridField_HTMLProvi } /** - * Returns the search form schema for the component + * Returns the search form for the component * - * @param GridField $gridfield - * @return HTTPResponse + * @param GridField $gridField + * @return Form|null */ - public function getSearchFormSchema(GridField $gridField) + public function getSearchForm(GridField $gridField) { $searchContext = $this->getSearchContext($gridField); $searchFields = $searchContext->getSearchFields(); - // If there are no filterable fields, return a 400 response if ($searchFields->count() === 0) { - return new HTTPResponse(_t(__CLASS__ . '.SearchFormFaliure', 'No search form could be generated'), 400); + return null; + } + + if ($this->searchForm) { + return $this->searchForm; } // Append a prefix to search field names to prevent conflicts with other fields in the search form @@ -296,7 +334,7 @@ class GridFieldFilterHeader implements GridField_URLHandler, GridField_HTMLProvi $field->addExtraClass('stacked'); } - $form = new Form( + $this->searchForm = $form = new Form( $gridField, "SearchForm", $searchFields, @@ -307,7 +345,29 @@ class GridFieldFilterHeader implements GridField_URLHandler, GridField_HTMLProvi $form->setFormAction($gridField->Link()); $form->addExtraClass('cms-search-form form--no-dividers'); $form->disableSecurityToken(); // This form is not tied to session so we disable this - $form->loadDataFrom($gridField->getRequest()->getVars()); + $form->loadDataFrom($searchContext->getSearchParams()); + + if ($this->updateSearchFormCallback) { + call_user_func($this->updateSearchFormCallback, $form); + } + + return $this->searchForm; + } + + /** + * Returns the search form schema for the component + * + * @param GridField $gridfield + * @return HTTPResponse + */ + public function getSearchFormSchema(GridField $gridField) + { + $form = $this->getSearchForm($gridField); + + // If there are no filterable fields, return a 400 response + if (!$form) { + return new HTTPResponse(_t(__CLASS__ . '.SearchFormFaliure', 'No search form could be generated'), 400); + } $parts = $gridField->getRequest()->getHeader(LeftAndMain::SCHEMA_HEADER); $schemaID = $gridField->getRequest()->getURL(); From cb2b9498fb33bd57a19ba6a7ceed6d3fbc976d70 Mon Sep 17 00:00:00 2001 From: Robbie Averill Date: Fri, 28 Sep 2018 10:38:56 +0200 Subject: [PATCH 2/2] API Deprecate updateSearchContextCallback and updateSearchFormCallback --- src/Forms/GridField/GridFieldFilterHeader.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Forms/GridField/GridFieldFilterHeader.php b/src/Forms/GridField/GridFieldFilterHeader.php index 733bd2289..fd3dd8ea9 100755 --- a/src/Forms/GridField/GridFieldFilterHeader.php +++ b/src/Forms/GridField/GridFieldFilterHeader.php @@ -38,7 +38,7 @@ class GridFieldFilterHeader implements GridField_URLHandler, GridField_HTMLProvi * Indicates that this component should revert to displaying it's legacy * table header style rather than the react driven search box * - * @deprecated 5.0 + * @deprecated 4.3.0:5.0.0 Will be removed in 5.0 * @var bool */ public $useLegacyFilterHeader = false; @@ -55,13 +55,15 @@ class GridFieldFilterHeader implements GridField_URLHandler, GridField_HTMLProvi /** * @var callable + * @deprecated 4.3.0:5.0.0 Will be removed in 5.0 */ - protected $updateSearchContext = null; + protected $updateSearchContextCallback = null; /** * @var callable + * @deprecated 4.3.0:5.0.0 Will be removed in 5.0 */ - protected $updateSearchForm = null; + protected $updateSearchFormCallback = null; /** * @inheritDoc @@ -75,6 +77,7 @@ class GridFieldFilterHeader implements GridField_URLHandler, GridField_HTMLProvi /** * @param bool $useLegacy + * @param callable|null $updateSearchContext This will be removed in 5.0 * @param callable|null $updateSearchForm This will be removed in 5.0 */ public function __construct(