0

我发现 CRUD 和 hasOne() 存在问题,其中 $display_field 在“添加”表单中被忽略。如果引用的模型具有“名称”字段,则正确填充 CRUD 的“添加”表单中的下拉菜单。但是,如果 hasOne() 模型使用 $display_field 参数,我希望添加表单显示指定的字段,但事实并非如此。它只会显示引用模型的“name”字段或“id”,而不是 $display 指定的字段。但是,添加条目后,将使用正确的 $display_field 来显示条目。所以问题出在 Add 操作的某个地方。

例如:

作者

class Model_Author extends Model_Table {

public $table='author';

function init(){
  parent::init();
  $this->addField('long_name');
  $this->addField('DOB');

  }
}

class Model_Book extends Model_Table {

public $table='book';

function init(){
  parent::init();  

 $this->addField('title');
 $this->hasOne('Author', 'author_id', 'long_name');
 }

}

CRUD 页面。

class page_manager extends Page {

function init() {
parent::init();

$tabs=$this->add('Tabs');

$crud=$tabs->addTab('Book')->add('CRUD');
   } 
 }

当您选择添加按钮时,作者字段将显示作者表中作者的 ID 号。但是,在您添加 Book 条目后,正确的字段(即 long_name)用于显示现有条目。

干杯

4

1 回答 1

0

我确实经历了同样的行为,并同意期望 hasOne() 的第三个参数是显示字段应该覆盖模型 $title_field。

我隔离了原因并找到了改进的方法。打开文件 atk4/lib/Field/Reference.php 并在函数 getModel() 中添加行来设置显示字段,如下所示:

  function getModel(){
        if(!$this->model)$this->model=$this->add($this->model_name);
        if($this->display_field) $this->model->title_field=$this->display_field;
        return $this->model;
    }

在这里,它按您预期的方式工作,即 hasOne() 将决定在 CRUD 的 ADD 表单中显示哪个字段。但是,我无法监督任何副作用或可能在其他地方添加此 display_field。

于 2012-05-10T07:46:01.340 回答