diff --git a/composer.json b/composer.json index 819a125..9afa69f 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "nette/di": "^3.0", "nette/utils": "^3.0 | ^4.0", "nette/application": "*", - "adt/base-query": "^1.7" + "adt/doctrine-components": "^2.9" }, "autoload": { "psr-4": { diff --git a/src/Components/AjaxSelect/DI/AjaxSelectExtension.php b/src/Components/AjaxSelect/DI/AjaxSelectExtension.php index e625e63..449ceb4 100644 --- a/src/Components/AjaxSelect/DI/AjaxSelectExtension.php +++ b/src/Components/AjaxSelect/DI/AjaxSelectExtension.php @@ -160,7 +160,9 @@ public static function register(\Nette\DI\Container $container, $globalConfig) { // if $items are not array of values, we have received query object if ($items instanceof \ADT\BaseQuery\BaseQuery) { - AjaxSelect\Traits\OrByIdFilterTrait::applyOrByIdFilter($config, $container, $name, $items); + if ($items instanceof AjaxSelect\Interfaces\OrdByIdFilterInterface) { + $items->applyOrByIdFilter($config, $container, $name); + } if ($items->callSelectPairsAuto()) { $items->selectPairs(); diff --git a/src/Components/AjaxSelect/Entities/AbstractEntity.php b/src/Components/AjaxSelect/Entities/AbstractEntity.php index f189e99..d6a8ada 100644 --- a/src/Components/AjaxSelect/Entities/AbstractEntity.php +++ b/src/Components/AjaxSelect/Entities/AbstractEntity.php @@ -3,17 +3,22 @@ namespace ADT\Components\AjaxSelect\Entities; use ADT\Components\AjaxSelect; +use ADT\DoctrineComponents\QueryObject; use Nette\Application\UI\Presenter; use Nette\SmartObject; -abstract class AbstractEntity { - +abstract class AbstractEntity +{ use SmartObject; const DATA_ATTRIBUTE_NAME = 'data-adt-ajax-select'; - const OPTION_QUERY = 'q'; + public abstract function formatValues($values): array; + public abstract function hydrateValues($values): array; + + protected abstract function createQueryObject(): QueryObject; + /** @var string */ protected $name; @@ -69,9 +74,13 @@ public function areValidValues(array $values) { $query = $this->createQueryObject() ->byId($values); - $this->filterQueryObject($query); + if (method_exists($this, 'filterQueryObject')) { + $this->filterQueryObject($query); + } - AjaxSelect\Traits\OrByIdFilterTrait::applyOrByIdFilter($this->config, $form, $control->getName(), $query); + if ($query instanceof AjaxSelect\Interfaces\OrdByIdFilterInterface) { + $query->applyOrByIdFilter($this->config, $form, $control->getName()); + } foreach ($query->fetch() as $row) { // pouze selectnuté jsou validní @@ -105,18 +114,9 @@ public function findValues($limit) { ->applyPaging(0, $limit) ->toArray(); - return array_map(function ($row) { - return $row->getId(); - }, $rows); + return $rows; } - /** - * @internal - * @param array $values - * @return array List of items. - */ - public abstract function formatValues($values); - /** * @internal * @param array $values @@ -140,16 +140,6 @@ public function formatJsonValues($values) { return $result; } - /** - * @return \ADT\BaseQuery\BaseQuery freshly created QO without filters - */ - protected abstract function createQueryObject(); - - /** - * @param \ADT\BaseQuery\BaseQuery $query - */ - protected abstract function filterQueryObject($query); - /** * @param string $option * @param mixed $value diff --git a/src/Components/AjaxSelect/Interfaces/OrByIdFilterInterface.php b/src/Components/AjaxSelect/Interfaces/OrByIdFilterInterface.php new file mode 100644 index 0000000..cd49ac3 --- /dev/null +++ b/src/Components/AjaxSelect/Interfaces/OrByIdFilterInterface.php @@ -0,0 +1,9 @@ +getAjaxEntity()->formatValues($validValues); + $validItems = $this->getAjaxEntity()->formatValues($this->getAjaxEntity()->hydrateValues($validValues)); // add to list of valid values $this->setItems($this->getItems() + $validItems); diff --git a/src/Components/AjaxSelect/Traits/OrByIdFilterTrait.php b/src/Components/AjaxSelect/Traits/OrByIdFilterTrait.php index e3821b0..4e0969a 100644 --- a/src/Components/AjaxSelect/Traits/OrByIdFilterTrait.php +++ b/src/Components/AjaxSelect/Traits/OrByIdFilterTrait.php @@ -4,15 +4,11 @@ use ADT\Components\AjaxSelect; -trait OrByIdFilterTrait { +trait OrByIdFilterTrait +{ + public abstract function orById($id): static; - /** - * @param array $config - * @param \Nette\Forms\Container $form - * @param string $attributeName - * @param \ADT\BaseQuery\BaseQuery $query - */ - public static function applyOrByIdFilter(array $config, \Nette\Forms\Container $form, string $attributeName, \ADT\BaseQuery\BaseQuery $query) + public function applyOrByIdFilter(array $config, \Nette\Forms\Container $form, string $attributeName) { // if orByIdFilter is active and it is entity form, the value, which is set in entity->inputName is included in items. if ($config[AjaxSelect\DI\AjaxSelectExtension::CONFIG_OR_BY_ID_FILTER] && method_exists($form, 'getEntity') && !empty($form->getEntity())) { @@ -24,9 +20,8 @@ public static function applyOrByIdFilter(array $config, \Nette\Forms\Container $ } if (!empty($defaultValue)) { - $query->orById($defaultValue); + $this->orById($defaultValue); } } } - }