Как написать собственный класс строки (расширяет Zend_Db_Table_Row) для класса Db_Table в Zend Framework - PullRequest
0 голосов
/ 14 августа 2010

У меня есть отдельные классы db_table для книг , book_sections и пользователей (конечные пользователи системы).в таблица книг имеет столбцы для book_title , section_id (book_section), data_entered_user_id (кто ввел информацию о книге),

перейдите по этому URL, чтобы увидеть изображение (я не могу публиковать изображения, потому что я новичок в stackoverflow) img685.imageshack.us/img685/9978/70932283.png

в бэкэнд системы я добавил форму для редактирования существующей книги (получить идентификатор книги из параметра GET и заполнить соответствующие данные в форме).Форма имеет элементы для book_title , book_section и data_entered_user .

, чтобы получить захватывающие данные книги для "редактирования формы книги" I присоединитьсяbook_section и пользовательские таблицы с таблицей book для получения book_section_name и username (of data_entered_user: только для чтения - отображение на боковой панели)

перейдите по этому URL, чтобы увидеть изображение (I 'я не могу публиковать изображения, потому что я новичок в 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. получить данные из метода getBookData () класса App_Model_Book
  2. Если данные формы действительны после отправки отредактированных данных, сохраните данные с помощью метода updateBookData () в классе App_Model_Book

, но я увидел, что если я создал пользовательский Db_Table_Row(расширяет Zend_Db_Table_Row)ss для таблицы книг с book_section_name и data_entered_user_name Я могу использовать его для получения существующих данных книги и сохранения после редактирования данных книги без создания нового класса Book (db_table) и без вызова updateBookData ()чтобы сохранить обновленные данные . Но я не знаю, какой код я должен написать в пользовательском классе Db_Table_Row (расширяет Zend_Db_Table_Row) .

Я думаю, вы понимаете мою проблемув простом

как написать пользовательский класс db_table_row для создания пользовательской строки с формой данных 2 соединенных таблицы для перкулярного класса db_table?

Я новичок в Zend Framewok и StackOverflow.прости меня, если ты перепутал мой первый вопрос.

Еще раз спасибо.

1 Ответ

3 голосов
/ 19 августа 2010

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();
...