Добавление addCondition () в форму с полями из других таблиц - PullRequest
0 голосов
/ 02 апреля 2019

Я не знаю синтаксис для доступа к "CurrentTable.ForeignKey" и "OtherTable.PrimaryKey" в операторе $ model-> addCondition ().

Это фрагмент моего кода, который работает: $mm = new SYSPC_MODEL($this->app->db,['title_field'=>'MODEL_NAME']); $mm->addCondition('MODEL_NAME', 'LIKE', 'DESK%');

Вместо простого поиска MODEL_NAME, такого как 'DESK%', я хотел бы отобразить только значения FK_MODEL_id, которые существуют в таблице SYSPC_MODEL для того же FK_OS_ID, что и значение FK_OS_ID текущей записи.Таким образом, в SQL у нас должно быть что-то вроде: SELECT SYSPC_MODEL.MODEL_NAME WHERE ( DHCP_PC.FK_OS_ID = SYSPC_MODEL.id )

Чтобы упростить понимание контекста, я максимально сократил свой код:

<?php
include_once ('../include/config.php');
require '../vendor/autoload.php';

class SYSPC_OS  extends \atk4\data\Model {
    public $table = 'SYSPC_OS';
    function init() {
        parent::init();
        $this->addFields([ ['OS_NAME',         'required'=>true, 'caption'=>'Identifiant d\'OS'],
                            ['OS_DESCRIPTION', 'required'=>true, 'caption'=>'Description d\'OS']
                        ]);
    }
}     // End of class SYSPC_OS

class SYSPC_MODEL  extends \atk4\data\Model {
    public $table = 'SYSPC_MODEL';
    function init() {
        parent::init();
        $this->addFields([ ['MODEL_NAME',     'caption'=>'Nom du modele'],
                            ['MODEL_BASE_RPM', 'caption'=>'Rpm de base']
                        ]);
        $this->hasOne('FK_OS_id',[new SYSPC_OS(),'ui'=>['visible'=>false]])->addField('OS_NAME','OS_NAME');
    }
}     // End of class SYSPC_MODEL

class DHCP_PC  extends \atk4\data\Model {
    public $table = 'DHCP_PC';
    function init() {
        parent::init();
        $this->addFields([  ['PCNAME',      'required'=>true, 'caption'=>'Nom du pc']
                        ]);
        $this->hasOne('FK_OS_ID',['required'=>true,new SYSPC_OS(),'ui'=>['visible'=>false]])->addField('OS_NAME','OS_NAME');
        $this->setOrder('PCNAME','asc');
        $this->hasOne('FK_MODEL_id',['required'=>true,new SYSPC_MODEL(),'ui'=>['visible'=>false]])->addField('MODEL_NAME','MODEL_NAME');
    }
}      // End of class DHCP_PC

class PcForm extends \atk4\ui\Form {
    function setModel($m, $fields = null) {
        $PcWidth = 'three';
        parent::setModel($m, false);
        $gr = $this->addGroup('PC name');
        $gr->addField('PCNAME',['required'=>true,'caption'=>'Nom du pc']);
        $gr = $this->addGroup('OS');
        $mm2 = new SYSPC_OS($this->app->db,['title_field'=>'OS_NAME']);
        $gr->addField('FK_OS_ID',['width'=>$PcWidth],['DropDown'])->setModel($mm2);

        $gr = $this->addGroup('Modèle');
        $mm = new SYSPC_MODEL($this->app->db,['title_field'=>'MODEL_NAME']);
        $mm->addCondition('MODEL_NAME', 'LIKE', 'DESK%');  // Works fine but I would like to display only the FK_MODEL_id values 
                                                            // which exist in the SYSPC_MODEL table for the same FK_OS_ID 
                                                            // than the current record FK_OS_ID value :
                                                            // SELECT SYSPC_MODEL.MODEL_NAME WHERE ( DHCP_PC.FK_OS_ID = SYSPC_MODEL.id )
        $gr->addField('FK_MODEL_id', ['width'=>$PcWidth], ['DropDown'])->setModel($mm);
        return $this->model;
    }
}     // End of class PcForm

$app = new \atk4\ui\App();
$app->title = 'Gestion des PC';
$app->initLayout($app->stickyGET('layout') ?: 'Admin');
$app->db = new \atk4\data\Persistence_SQL(
    "pgsql:host=".$GLOBALS['dbhost'].";dbname=".$GLOBALS['dbname'],
    $GLOBALS['dbuser'],
    $GLOBALS['dbpass']
);
$g = $app->add(['CRUD', 'formDefault'=>new PcForm()]);
$g->setIpp([10, 25, 50, 100]);
$g->setModel(new DHCP_PC($app->db),['PCNAME', 'OS_NAME', 'MODEL_NAME']);
?>

Ответы [ 3 ]

0 голосов
/ 02 апреля 2019

В качестве альтернативы вы можете использовать что-то кроме выпадающего списка, вот пример пользовательского интерфейса:

https://ui.agiletoolkit.org/demos/multitable.php

Выбор значения в первом столбце сужает параметры в следующем.У вас может быть скрытое поле внутри формы, где вы можете указать окончательное значение.

0 голосов
/ 05 апреля 2019


Спасибо за вашу поддержку, но у меня все еще есть некоторые вопросы.
Вопрос 1: Я нашел "addRelatedEntity" и "relEntity", но я не нашел описания этих команд.Это существует?Это возможное решение для моей проблемы?
Вопрос 2. Можно ли выполнить «Поиск» в другой таблице, и если да, то как?
Вопрос 3. Если «Поиск» не является решением, как сделатьобъединение (с фильтрацией в предложении where) внутри модели?
Вопрос 4: Если объединение не является решением, возможно ли использовать DSQL внутри модели?
Вопрос 5: Или у вас есть пример DSQL(с самодельным соединением между несколькими таблицами), связанное с CRUD?

0 голосов
/ 02 апреля 2019

Пожалуйста, посмотрите на https://github.com/atk4/ui/pull/551 - это может быть то, что вы ищете.

Пример здесь: https://ui.agiletoolkit.org/demos/autocomplete.php

Документы: https://agile -ui.readthedocs.io/en/latest/autocomplete.html?highlight=lookup#lookup-field

$form = $app->add(new \atk4\ui\Form(['segment']));
$form->add(['Label', 'Add city', 'top attached'], 'AboveFields');

$l = $form->addField('city',['Lookup']);

// will restraint possible city value in droddown base on country and/or language.
$l->addFilter('country', 'Country');
$l->addFilter('language', 'Lang');

//make sure country and language belong to your model.
$l->setModel(new City($db));
...