Вы можете использовать функции beforeInsert, afterInsert, beforeDelete, afterDelete и beforeUpdate, afterUpdate для выполнения дополнительной обработки в базе данных. Например
использование распакованной установки ATK 4.1.3 в вашем webroot создает папку с именем agiletoolkit, которая в дальнейшем называется ATKHOME.
Создайте простую таблицу TASKTYPE в mysql с тремя полями (id, tasktype_desc и budget_code) и другую таблицу TASKTYPE_BUDGET только с id и budget_code.
Создайте две модели для таблиц в ATKHOME / lib / Model следующим образом (вам может потребоваться создать каталог Model, если он не существует)
class Model_TaskType extends Model_Table {
public $entity_code='tasktype';
public $table_alias='ty';
function defineFields(){
parent::defineFields();
$this->newField('id')
->mandatory(true);;
$this->newField('tasktype_desc')
->mandatory(true);
$this->newField('budget_code')
->mandatory(true);
}
public function afterInsert($new_id){
$ttb=$this->add('Model_TaskTypeBudget');
$ttb->set('id',$new_id)
->set('budget_code',$this->get('budget_code'));
$ttb->insert();
return $this;
}
public function beforeUpdate(&$data){
$ttb=$this->add('Model_TaskTypeBudget')->loadData($data['id']);
$ttb->set('budget_code', $data['budget_code']);
$ttb->update();
return $this;
}
public function beforeDelete(&$data){
$ttb=$this->add('Model_TaskTypeBudget')->loadData($data['id']);
$ttb->delete();
return $this;
}
}
Обратите внимание, что если вы используете innoDB и имеете внешние ключи, вы должны выполнить вставку и удаление в правильном порядке, например, если существует внешний ключ от TaskTypeBudget к TaskType по ID, то он должен использовать beforeDelete и afterInsert для предотвращения нарушений ограничений.
class Model_TaskTypeBudget extends Model_Table {
public $entity_code='tasktype_budget';
public $table_alias='tyb';
function defineFields(){
parent::defineFields();
$this->newField('id')
->mandatory(true);
$this->newField('budget_code')
->mandatory(true);
}
}
И страница в ATKHOME / страница, как это
class page_tasktype extends Page {
function init(){
parent::init();
$p=$this;
$tt=$this->add('Model_TaskType');
$crud=$p->add('CRUD');
$crud->setModel($tt, array('id','tasktype_desc', 'budget_code'));
if($crud->grid)
$crud->grid->addPaginator(10);
}
}
Примечание, также будьте осторожны, чтобы включить отверстие <? Тег php перед каждой строкой класса, но НЕ включает закрытие? > как это может вызвать ошибки в Ajax.
В ATKHOME / config-default.php измените имя пользователя и пароль подключения mysql от root / root до имени пользователя и пароля вашей базы данных mysql.
$config['dsn']='mysql://atktest:atktest@localhost/atktest';
и измените ATKHOME / lib / Frontend.php, чтобы раскомментировать строку 8, которая позволяет всем страницам подключаться к базе данных (вы также можете просто добавить на страницу строку $ this-> dbConnect ();)
class Frontend extends ApiFrontend {
function init(){
parent::init();
$this->dbConnect(); //uncommented
В том же Frontend.php вставьте следующую строку в строку 50, чтобы добавить кнопку в меню по умолчанию, чтобы добавить нашу новую страницу.
->addMenuItem('CRUD Test', 'tasktype')
Теперь перейдите в браузер и введите http://localhost/agiletoolkit и на первой странице нажмите CRUD Test. Добавление строк приведет к добавлению строки в TASKTYPE и строки с тем же идентификатором и кодом_бюджета для TASKTYPE_BUDGET. Редактирование budget_code будет отражено в обеих таблицах, а удаление строки удалит его из обеих таблиц.
Насколько аккуратно и просто, когда вы знаете, что функции предоставляются ATk4?