diff --git a/demos/form-control/tree-item-selector.php b/demos/form-control/tree-item-selector.php index 6b14cf9cfd..1baf3a9e8e 100644 --- a/demos/form-control/tree-item-selector.php +++ b/demos/form-control/tree-item-selector.php @@ -69,10 +69,15 @@ return new JsToast('Selected: ' . $pathFromIdFx($items, $value)); }); +$model = new File($app->db); +$control = $form->addControl('tree2', [Form\Control\TreeItemSelector::class, 'allowMultiple' => false, 'caption' => 'Selection from tree in Atk4/Model:', 'parentIdField' => $model->fieldName()->parent_folder_id]); +$control->setModel($model); + $form->onSubmit(function (Form $form) use ($app) { $response = [ 'multiple' => $form->model->get('tree'), 'single' => $form->model->get('tree1'), + 'model' => $form->model->get('tree2'), ]; $view = new Message('Items: '); diff --git a/src/Form/Control/TreeItemSelector.php b/src/Form/Control/TreeItemSelector.php index 29e97ba84c..4d94feeaec 100644 --- a/src/Form/Control/TreeItemSelector.php +++ b/src/Form/Control/TreeItemSelector.php @@ -4,6 +4,7 @@ namespace Atk4\Ui\Form\Control; +use Atk4\Data\Model; use Atk4\Ui\Form; use Atk4\Ui\HtmlTemplate; use Atk4\Ui\Js\Jquery; @@ -39,6 +40,9 @@ class TreeItemSelector extends Form\Control */ public $loaderCssName = 'atk-tree-loader'; + /** @var string The field name which includes the parent node's id. */ + public $parentIdField = 'parent_id'; + /** @var bool Allow multiple selection or just one. */ public $allowMultiple = true; @@ -102,6 +106,36 @@ public function onItem(\Closure $fx): void }, ['data' => 'value']); } + /** + * @param mixed $parentId + */ + protected function addNodes(Model $model, $parentId = null): array + { + $result = []; + + $nodeModel = (clone $model)->addCondition($this->parentIdField, $parentId); + + foreach ($nodeModel as $node) { + if ($node->get($this->parentIdField) === $parentId) { + $newNode = []; + $newNode['name'] = $node->getTitle(); + $newNode['id'] = $node->getId(); + $newNode['parent_id'] = $node->get($this->parentIdField); + $newNode['nodes'] = $this->addNodes($model, $node->getId()); + $result[] = $newNode; + } + } + + return $result; + } + + public function setModel(Model $model): void + { + parent::setModel($model); + + $this->treeItems = $this->addNodes($model); + } + /** * Returns tag. *