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

时间:2012-10-20 13:52:01

标签: php frameworks atk4

有很多关于将表单中的字段设置为只读的帖子,但似乎没有任何内容覆盖hasOne()字段。我希望编辑属于给定班级的学生(注册)列表。该课程适用于特定科目,例如数学,并存储一段时间和最大数量的学生。在编辑注册时,我希望只读取课程详细信息,同时通过CRUD编辑属于该课程的学生。我可以通过为每个字段调用display()来设置模型的原生字段(例如https://groups.google.com/forum/?fromgroups=#!topic/agile-toolkit-devel/v2xVYsRqFpY),但我找不到设置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_Class中,表单将主题ID显示为文本而不是' name'这个主题。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在模型中尝试:

$this->hasOne('Subject'); // will create 'subject' and 'subject_id' fields
$this->getElement('subject')
    ->editable(true)
    ->display(array('form'=>'readonly'));

hasOne创建两个字段。解除引用的字段(不带_id)是一个计算字段,默认情况下从表单中排除。通过设置'editable',您可以将其返回到表单中(通过计算事件)并设置display属性。或者你可以这样做:

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

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