Как настроить автоматическое увеличение поля в форме на основе идентификатора первичного ключа?
Я новичок в Agiletoolkit и все еще изучаю веревки. Вот мой вопрос:
У меня есть обычный CRUD для управления работой.
$this->add('CRUD')->setModel('Job');
Модель содержит поле "job_number", которое должно автоматически заполняться на странице "Добавить": N762, N763 и т. Д.
Это можно сделать в модели или на странице addjob, вызываемой из таблицы CRUD?
Кто-нибудь может дать мне очень простой пример кода?
Спасибо
2 ответа
Я считаю, что это должно быть сделано на уровне модели. Это в основном не имеет ничего общего с уровнем просмотра.
Если это поле job_number строго связано с ID, то вы даже можете сделать его в качестве поля выражения в модели и даже не сохранять его в базе данных. Например, job_number = id + 100.
Но если вы действительно хотите сохранить его в базе данных, то вам, вероятно, следует сделать следующее:
1) в модели создайте job_number как обычное поле с типом ('number'), но с ->system(true) или ->editable(false) в зависимости от того, где вы хотите увидеть это поле (форма, сетка);
2) в метод инициализации модели добавьте ловушку afterInsert.
function init(){
parent::init();
// ... your field definitions here
// add afterInsert hook
$this->addHook('afterInsert',array($this,'afterInsert'));
}
3) в модели создать метод
function afterInsert($m,$new_id){ // <-- new_id is ID of newly inserted record
$m->load($new_id);
$m['job_number'] = $new_id + 100; // <-- your function here
$m->save();
}
or maybe you can even write it simpler - not sure
function afterInsert($m,$new_id){ // <-- new_id is ID of newly inserted record
$this->set('job_number',$new_id + 100); // <-- your function here
$this->save();
}
Это должно работать, но я не проверял это. Просто пишу здесь на лету.
Попробуйте, и если вам нужна дополнительная помощь, просто дайте нам знать. Также вы можете присоединиться к IRC-каналу ATK4 и задать свои вопросы напрямую.
Нечто подобное должно ответить на ваш вопрос:
в модели init:
$this->addField("job_no")
->defaultValue("N" . $this->dsql()->del("fields")->field(
$this->dsql()->expr("max(id) + 1"), "nr"
)->getOne());
Не проверено, хотя.