Php 在表单中将hasOne()下拉字段设置为只读

Php 在表单中将hasOne()下拉字段设置为只读,php,frameworks,atk4,Php,Frameworks,Atk4,有很多帖子都是关于将表单中的字段设置为只读的,但似乎没有一篇文章涉及hasOne()字段。我想编辑一份属于某个班级的学生名单。该课程针对特定科目,例如数学,并存储时间段和最大学生人数。在编辑报名表时,我希望课堂详细信息是只读的,而属于课堂的学生可以通过CRUD进行编辑。我可以通过为每个字段(例如)调用display()来设置模型的本机字段,但是我找不到设置hasOne的方法 下面是我到目前为止的代码 主题模式 class Model_Subject extends Model_Table { p

有很多帖子都是关于将表单中的字段设置为只读的,但似乎没有一篇文章涉及hasOne()字段。我想编辑一份属于某个班级的学生名单。该课程针对特定科目,例如数学,并存储时间段和最大学生人数。在编辑报名表时,我希望课堂详细信息是只读的,而属于课堂的学生可以通过CRUD进行编辑。我可以通过为每个字段(例如)调用display()来设置模型的本机字段,但是我找不到设置hasOne的方法

下面是我到目前为止的代码

主题模式

class Model_Subject extends Model_Table {
public $table='subject';

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

        $this->addField('name');
        $this->addField('subject_code');
        $this->addField('semester');
        $this->addField('description');

}
}
类模型

class Model_Class extends Model_Table {
    public $table='class';

    function init(){
        parent::init();
        $this->hasOne('Subject');
        $this->addField('date_start')->type('date')->caption('Start');
        $this->addField('date_end')->type('date')->caption('End');
        $this->addField('max_students')->type('int');

        $this->hasMany('ClassHasStudent','class_idclass', 'idclass');
    }
}
学生模型

class Model_Student extends Model_Table {
    public $table='student';

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

        $this->hasMany('ClassJoinClassHasStudent');
        $this->addField('student_ID')->caption('Student ID');
        $this->addField('name')->caption('Name');

        $this->addExpression('number_classes')->set(
                $this->add('Model_ClassHasStudent')->addCondition('student_id',$this->_dsql()->getField('id'))->count()
        )->caption('Number of classes');
    }

}
链接表

class Model_ClassHasStudent extends Model_Table {
public $table='class_has_student';

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

    $this->hasOne('Class', 'class_id', 'id');
    $this->hasOne('Student');

    $this->addField('date_enrolled')->type('date');
    $this->addField('grade');

}
}
表格为:

$form=$this->add('MVCForm');
$classes=$this->add('Model_Class');

// $classes-> set hasOne Subject name field to read only.

$classes->getField('date_start')->display(array('form'=>'readonly'));
$classes->getField('date_end')->display(array('form'=>'readonly'));
$classes->getField('max_students')->display(array('form'=>'readonly'));

// Method from Romans.
$form->model->load($id);
$this->add('CRUD')->setModel($form->model->ref('ClassHasStudent'));

$form->addSubmit('Save');

$form->onSubmit( function($form){

    $form->update();
    return $form->js()->univ()->location($form->api->getDestinationURL(
            'managestudents',
            array('id'=>false)));

});
另外,如果我设置$this->hasOne('Subject')->readonly(true);在Model_类中,表单将主题id显示为文本,而不是主题的“名称”


感谢您的帮助。

在模型中尝试以下操作:

$this->hasOne('Subject'); // will create 'subject' and 'subject_id' fields
$this->getElement('subject')
    ->editable(true)
    ->display(array('form'=>'readonly'));
hasOne创建两个字段。取消引用字段(无_id)是一个计算字段,默认情况下从表单中排除。通过设置“可编辑”,您可以将其返回到表单中(通过计算事件),并设置显示属性。或者,您可以执行以下操作:

$forms->getElement('subject_id')->setAttr('disabled',true);

这仍将使用下拉列表,但它将被禁用。我不是100%肯定,但任何jQueriUI增强功能(如自动完成)都必须尊重disabled属性。

您使用的是哪个版本的ATK4?为什么使用MVCForm,我猜它是控制器而不是添加(表单)?您最好在谷歌群组主题中参与关于只读(以及可编辑、禁用、隐藏、系统等)字段的讨论。现在模型中的display(form=>readonly)和readonly(true)是两种不同的情况。我在模型readonly(true)中做了一些更改,但我们需要讨论如何正确地做到这一点。我看到罗马人最近想出了一些东西。很抱歉,今晚没有时间检查。我刚刚意识到display(数组('form'=>'readonly')有一个问题,在保存表单时,表中设置为display(数组('form'=>'readonly'))的字段将替换为NULL。这一点在讨论中已经提到。对不起,黑暗面,请阅读您的评论。我得到了最新的github版本。谢谢。是的,这是display(表单=>readonly)的一个问题。我的更改没有发布在github版本中,因为我们仍然在讨论如何处理这些字段类型/属性。