Обновление / удаление нескольких таблиц в AtK4 - PullRequest
2 голосов
/ 26 декабря 2011

Как можно добиться многостолового обновления / удаления в atk4?

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Вы можете использовать функции 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?

1 голос
/ 27 декабря 2011

Вы можете добавить связанные объекты на уровне модели:

https://stackoverflow.com/a/7466839/204819

Если это не вариант, вы всегда можете создавать собственные обработчики для кнопок «Редактировать» и «Удалить» и выполнять действия с использованием внутреннего ORM или даже на уровне модели.

...