3

次のテーブルがあります。

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

-- 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 を取得しました。

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

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

    }
}

これは機能します。しかし、新しい製品が作成されたときに、基本的にページとフィールド テーブルに新しい行を追加できるようにする必要があります。

たとえば、テーブル内の製品は、レンダリングするページが複数ある印刷製品 (グリーティング カードなど) です。ページ 1 にはカスタマイズ可能な 2 つのテキスト フィールドがあり、ページ 2 には 3 つのテキスト フィールド、テキスト サイズを定義するスライダー、および色を選択するドロップダウン リストがあり、ページ 3 にはすべてカスタマイズ可能な 5 つのテキスト フィールドがあります。 . 3 つのページすべて (およびすべてのフォーム要素、この例では 12 個) が 1 つの製品に関連付けられています。

製品を作成するときに、その製品のページを作成するためのボタンを追加して、ページ内に新しいフォーム要素フィールドを追加するためのボタンを追加できますか?

私はまだこれに慣れていないので、私のデータベース構造は理想的ではないかもしれません。提案やフィードバックをいただければ幸いです。これを実装する方法について、情報、チュートリアル、ドキュメント、アイデア、提案を教えてもらえますか?

4

1 に答える 1

2

通常、既存の商品がない限り、ページを追加することはできません。通常、この問題は状態フィールドで解決します。これを製品モデルに追加します。

$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();
    }
}

add('CRUD') を add('MyCRUD') に置き換えます。次に、ページ「mypage」に CRUD を配置する場合は、「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 でプロジェクトを公開し、アジャイル ツールキット開発グループと共有してください。

ボーナス:

既存の製品ページをどのように編集すればよいですか? 最も簡単なのは、メイン 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% 理想的ではありませんが、Web アプリケーションの特性と SQL への依存を考慮すると、データを管理する優れた方法です。

于 2012-06-08T22:38:44.693 に答える