atk4 расширенный фигня?


У меня есть следующие таблицы:

-- -----------------------------------------------------

-- Table `product`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `product` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `productName` VARCHAR(255) NULL ,
  `s7location` VARCHAR(255) NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------

-- Table `pages`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `pages` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `productID` INT NULL ,
  `pageName` VARCHAR(255) NOT NULL ,
  `isBlank` TINYINT(1) NULL ,
  `pageOrder` INT(11) NULL ,
  `s7page` INT(11) NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `productID` (`productID` ASC) ,
  CONSTRAINT `productID`
    FOREIGN KEY (`productID` )
    REFERENCES `product` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------

-- Table `field`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `field` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `pagesID` INT NULL ,
  `fieldName` VARCHAR(255) NOT NULL ,
  `fieldType` VARCHAR(255) NOT NULL ,
  `fieldDefaultValue` VARCHAR(255) NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `id` (`pagesID` ASC) ,
  CONSTRAINT `pagesID`
    FOREIGN KEY (`pagesID` )
    REFERENCES `pages` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

Я заставил CRUD работать над таблицей "product".

//addproduct.php
class page_addproduct extends Page {
    function init(){
        parent::init();

        $crud=$this->add('CRUD')->setModel('Product');

    }
}

Это работает. но мне нужно сделать так, чтобы при создании нового продукта он в основном позволял мне добавлять новые строки в страницы и таблицы полей.

Например, продукты в таблицах-это печатный продукт (например, поздравительная открытка), который должен отображать несколько страниц. Страница 1 может содержать 2 текстовых поля, которые можно настроить, Страница 2 может содержать 3 текстовых поля, ползунок для определите размер текста и раскрывающийся список для выбора цвета, а Страница 3 может содержать пять текстовых полей, которые можно настроить. Все три страницы (и все элементы формы, 12 в данном примере) связаны с 1 продуктом.

Итак, когда я создаю продукт, могу ли я добавить кнопку для создания страницы для этого продукта, а затем внутри страницы я могу добавить кнопку для добавления нового поля элемента формы?

Я все еще немного новичок в этом, поэтому моя структура БД может быть не идеальной. я был бы признателен за любые предложения и обратная связь! Может ли кто-то указать мне на некоторую информацию, учебники, документацию, идеи, предложения о том, как я могу это реализовать?

1 3

1 ответ:

Обычно вы не можете добавить страницу, если у вас нет существующего продукта. Обычно мы решаем эту проблему с помощью поля состояния. Добавьте это в вашу модель продукта:

$this->addField('state')->enum(array('active','draft'))->defaultValue('draft'); 

Также создайте его в SQL. Кроме того, обычно хорошо описывать отношения, поэтому добавьте это в свою модель продукта:

$this->hasMany('Page','productID');

Далее вам нужно будет изменить действие при добавлении новой записи. Вы можете сделать это легко, расширив класс crud:

class MyCRUD extends CRUD {
    function formSubmitSuccess(){
        if($_GET['id']) return parent::formSubmitSuccess(); // edit ->save

        // add ->save handled here
        $this->js()->univ()->location($this->api->url('./details',
          array('id'=>$this->form->model->id)))->execute();
    }
}

И заменив добавить('фигня') с('MyCRUD'). Следующий, если вы есть разместив CRUD на странице " mypage "вам нужно будет создать"mypage/details". После успешного сохранения нового продукта ваш новый метод перенаправит пользователя на эту новую страницу, и он также передаст productID.

На этой новой странице вы должны иметь

$m=$this->add('Model_Product')->load($_GET['id']); // makes sure ID is valid
$this->api->stickyGET('id');  // configures page to carry id= value along
$crud=$this->add('CRUD');
$crud->setModel($m->ref('Page'));

Здесь будет отображаться CRUD, который автоматически редактирует страницы этого конкретного продукта. Единственное, чего вам сейчас не хватает, - это кнопки "Назад".

if($crud->grid){
    if($crud->grid->addButton('Save')->isClicked()){
        // AJAX action on button click

        $m->set('status','active')->save(); // update status of current product
        $this->js()->univ()->location($this->api->url('..'))->execute();
        // redirect back to parent page
    }

    // You might want a cancel button too
    $crud->grid->addButton('Cacel')->js('click')
         ->univ()->location($this->api->url('..'));

    // no AJAX, simple javascript action.
}

Чтобы закончить все красиво, вернитесь на исходную страницу и добавьте состояние. Вам не нужно создавать новую модель, если вы не хотите, может быть так:

// on my page
$this->add('MyCRUD')->setModel('Product')->addCondition('state','active');

Таким образом, ваш основной CRUD не будет отображать записи, которые являются неполными. Ваша база данных может накапливать черновики записей, которые вы можете удалить время от времени. Если что-то здесь не работает, опубликуйте свой проект на Github и поделитесь им с нашей группой разработчиков Agile Toolkit, некоторые из нас, безусловно, реализуют это для вас.

Бонус:

Возможно, вы захотите изменить существующий продукт. страницы? Проще всего было бы иметь расширитель в основной сетке crud:

$crud=$this->add('MyCRUD');
$crud->setModel('Product')->addCondition('state','active');
$crud->addColumn('expander','details'); // will expand into page mypage/details and will automatically pass ID.
Это решение не является идеальным на 100%, но, учитывая характер веб-приложений и их зависимость от SQL, это отличный способ управлять вашими данными.