2009-08-03 2 views
1

Я понимаю, что вы можете иметь класс. Пользователи расширяют Zend_Db_Table_Abstract и класс. Пользователь расширяет Zend_Db_Table_Row_Abstract, устанавливая свойство $ _rowClass для пользователей.Как создать новую строку без класса таблицы в Zend Framework?

Чтобы создать и сохранить новую строку, я только знаю, как сделать следующее:

$users = new Users() 
$user = $users->createRow(); 
$user->name = 'name'; 
$user->save(); 

Можете ли вы сказать мне, как я могу сделать follwing вместо этого?

$user = new User(); 
$user->name = 'name'; 
$user->save(); 

Как примечание стороны, я также рассматриваю пытаюсь использовать следующий синтаксис, чтобы получить конкретную строку:

$user = new User($userID); 

Учитывая, однако, что это не пытается создать новый пользователь, но чтобы получить существующего пользователя, я думаю, что следующий синтаксис может быть более читаемым - что вы думаете?

$users = new Users(); 
$user = $users->fetchRow($userID); 

ответ

0

хорошо, есть три варианта:

  • взломать это в базовых классы Zend Framework,
  • подкласса их к вашему собственному абстрактному BASECLASSES, чтобы обеспечить эту функцию
  • реализовать это для каждого класса само по себе ...

, разумеется, второй вариант является лучшим ... note t шляпа это не так круто:

$user = new User($userID); 

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

последний вариант, конечно , было бы использовать что-то другое, которое уже работает так, как вы его описали, например motion-twins SPOD, что мне лично нравится намного больше, потому что оно очень легкое, маленькое и простое и, таким образом, хорошо сочетается с другими фреймворками, а также лучше разработанный и централизованный, а код, который вы пишете с ним, выглядит более интуитивно понятным ... или это может вдохновить вас, как исправить структуру zend, чтобы работать для вас так, как вам хотелось бы ...

надежда, что помогает ...

Greetz

back2dos

0

Поскольку я не знаю, как классы Таблица Zend DB и т.п. работа, я предлагаю другой вариант:

Пришло громоздким и, вероятно, слишком много работы для многих разных классов, но вы можете сделать что-то вроде

class User { 
    public function __construct($userID) { 
     //initialize the db 
     $db = Zend_Db::factory(...); 

     $sql = $db->quoteInto("select * from users where user_id = ?", $userID); 

     $userObject = $db->query($sql)->fetchObject(); 

     //now $userObject has all the data of that particular user 
    } 

    public function save() { 
     //first gather this user's data into an array, $userData 
     //put the user id into $user_id 

     $db->update('users', $userData, 'user_id = $user_id); 

    } 
} 

Это неряшливо, но это единственная альтернатива, с которой я могу справиться с места в карьер.

0
class User extends UserModel { 

     function __construct($userid=NULL){ 
      parent::__construct() 

      if($userid!=NULL){ 
       return $this->find($userid); 
      }else{ 
       return $this->createRow(); 
      } 
     } 
    } 

Но, честно говоря, разница не стоит.

1

Вот как построить новый экземпляр строки без таблицы объекта:

class User extends Zend_Db_Table_Row_Abstract 
{ 
    protected $_tableClass = "Users"; 
} 

$user = new User(); 
$user->name = "name"; 
$user->save(); // performs an INSERT 

Вот как построить экземпляр строки для заданной строки в базе данных, без таблицы объекта:

class User extends Zend_Db_Table_Row_Abstract 
{ 
    protected $_tableClass = "Users"; 

    public function __construct(array $config = array()) 
    { 
    if (isset($config["key"]) { 
     $table = $this->_getTableFromString($this->_tableClass); 
     $rowset = call_user_func_array(array($table, "find"), (array) $config["key"]); 
     $row = $rowset->current(); 
     if ($row != false) { 
     $config["data"] = $row->toArray(); 
     $config["stored"] = true; 
     } 
    } 
    parent::__construct($config); 
    } 
} 

$user = new User(array("key"=>$userid)); 
$user->name = "name"; 
$user->save(); // performs an UPDATE 

NB: эти образцы кода не проверены, я оставлю это вам.