1

booksbook_sections、およびユーザー(システムエンドユーザー)用に個別の db_table クラスがあります。book テーブルには、book_titlesection_id (book_section) 、data_entered_user_id (本の情報を入力した人) のがあります。

画像を見るにはこの URL にアクセスしてください (stackoverflow を初めて使用するため、画像の投稿は許可されていません) img685.imageshack.us/img685/9978/70932283.png

システムのバックエンドで、既存の本を編集するためのフォームを追加しました(GET パラメータから本の ID を取得し、関連データをフォームに入力します)。form には、book_titlebook_section、およびdata_entered_userの要素があります。

エキサイティングな本のデータを取得して「本の編集フォーム」にする book_section と user テーブルを bookテーブルと結合して、 book_section_name と usernameを取得します(data_entered_user: read only- サイドバーに表示)

画像を見るにはこの URL にアクセスしてください (stackoverflow を初めて使用するため、画像の投稿は許可されていません) img155.imageshack.us/img155/2947/66239915.jpg

クラス App_Model_Book で Zend_Db_Table_Abstract を拡張します

public function getBookData($id){
     $select = $this->select();
    $select->setIntegrityCheck(false);
    $select->from('book', array('id','section_id','data_entered_user_id',...));
    $select->joinInner('section','book.section_id = section.id',array('section_name' =>'section.name' ));
    $select->joinInner(array('date_entered_user' => 'user'),'book.date_entered_user_id = date_entered_user.id',array('date_entered_user_name' =>'date_entered_user.user_name' ));
    $select->where("book.id = ?",$id);
    return $this->fetchRow($select);
}

public function updateBookData($id,$title,$section_id,...)
{
   $existingRow = $this->fetchRow($this->select()->where('id=?',$id));
   $existingRow->title = $title;
   $existingRow->section_id = $section_id;
   //....
   $existingRow->save();
}

Admin_BookController -> editAction() で

$editForm = new Admin_Form_EditBook();
$id = $this->_getParam('id', false);
$bookTable = new App_Model_Book();
$book_data = $bookTable ->getBookData($id);
//set values on form to print on form when edit book
$editForm->book_title->setValue($book_data->title);
$editForm->book_section->setValue($book_data->section_name);
//........
//If form data valid
if($this->getRequest()->isPost() && $editForm->isValid($_POST)){
$bookTable = new App_Model_Book();
$bookTable ->updateBookData(
$id,
//get data from submitted form
$editForm->getValue('title'),
//....
);

既存の本を編集するとき

  1. App_Model_Book クラスの getBookData() メソッドからデータを取得します
  2. 編集データ送信後、フォームデータが有効な場合はApp_Model_BookクラスのupdateBookData()メソッドでデータ保存

しかし、book_section_name と data_entered_user_nameを使用してブック テーブルのカスタム Db_Table_Row(Zend_Db_Table_Row を拡張) クラスを作成した場合、それを使用して既存のブック データを取得し、新しい Book(db_table) クラスを作成せずに updateBookData を呼び出さずにブック データを編集した後に保存できることがわかりました。 () 更新されたデータを保存します。しかし、カスタム Db_Table_Row(extends Zend_Db_Table_Row) class にどのコードを記述すればよいかわかりません。

私の問題を簡単に理解できると思います

カスタム db_table_row クラスを作成して、特定の db_table クラスのデータ フォーム 2 結合テーブルを含むカスタム行を作成する方法は?

zend framewok と stackoverflow は初めてです。あなたが私の最初の質問と混同していたら、私を許してください.

再度、感謝します。

4

1 に答える 1

3

1) db_table クラスで、行クラスを含むフィールドを作成します。次に例を示します。

protected $_rowClass  = 'App_Model_Db_Books_Row';

親テーブルの参照マップを追加します。

protected $_referenceMap = array(
    'Section' => array(
        'columns'           => 'sectionId',
        'refTableClass'     => 'App_Model_Db_Sections',
        'refColumns'        => 'id'
    ),
    'User' => array(
        'columns'           => 'userId',
        'refTableClass'     => 'App_Model_Db_Users',
        'refColumns'        => 'id'
    )
);

2) 行クラスで、親テーブルの変数を定義する必要があります。

protected $section;
protected $user;

そのような場合、「load」というメソッドを作成します。

public function load()
{
    $this->section = $this->findParentRow('App_Model_Db_Sections');
    $this->user = $this->findParentRow('App_Model_Db_Users');
}

そしてコンストラクターで私はこのメソッドを呼び出します:

public function __construct(array $config = array())
{
    parent::__construct($config);
    $this->load();
}

後の結果として:

$book_data = $bookTable ->getBookData($id);

たとえば、参照テーブルからデータにアクセスできます。

$book_data->section->name = "Book Section";
$book_data->section->save();
于 2010-08-19T12:51:22.840 に答える