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 ответ:
Обычно вы не можете добавить страницу, если у вас нет существующего продукта. Обычно мы решаем эту проблему с помощью поля состояния. Добавьте это в вашу модель продукта:
$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:
Это решение не является идеальным на 100%, но, учитывая характер веб-приложений и их зависимость от SQL, это отличный способ управлять вашими данными.$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.