PDA

Vollständige Version anzeigen : Attribute dynamisch einem Objekt hinzugefügt


Timo Trallala
25.06.2007, 16:59
HalliHallo

ich würde gerne einem Objekt dynamisch während der Laufzeit ein Attribut samt Wert hinzufügen.

Normalerweise stehen dafür ab php5 die Methode _set/_get zur Verfügung.

Leider hab ich keine Ahnung, wie das bei Zend zu bewerkstelligen habe.

$rows=$news->fetchRow($where, $order);
$rows->leadin='test'; //erstmalig erstellen und Wert zuweisen
$this->view->news=$rows;Besten Dank
derTrallala

KingCrunch
25.06.2007, 17:59
__get und __set werden bereits in Zend_Db_Table_Row_Abstract definiert. Insofern bleibt dir hier nichts anderes übrig, als diese Klasse zu erweitern.

Aber andererseits: Die *_Row-Klasse definiert eine Zeile aus einer Datenbank. Dort nun ein zusätzliches Attribut, welches keine Spalte der Tabelle darstellt, ist Zweckentfremdnung und sollte in der Form vermieden werden.

Ebenso: Was ein Objekt vom Typ *_Row in der View zu suchen? ;) Dies ist kein darstellbarer Typ und sollte dementsprechend vorher in ein primitivier Datentyp umgewandelt werden.

Timo Trallala
25.06.2007, 18:26
Ebenso: Was ein Objekt vom Typ *_Row in der View zu suchen? ;) Dies ist kein darstellbarer Typ und sollte dementsprechend vorher in ein primitivier Datentyp umgewandelt werden.

da hast Du wahrlich Recht

$news=new News();
$where=$news->getAdapter()->quoteInto('news_cat = ?', '1');
$order='news_date desc';

$row=$news->fetchRow($where, $order);

$rowToArray=$row->toArray();

$rowToArray['news_leadin']='TEST';
$addToRows=$row->findUsers();

foreach ($addToRows as $add)
$rowToArray['news_writer']=$add->user_uname;

$this->view->news=$rowToArray;

Gruß
Trallala

budcha
25.06.2007, 19:08
;) und so hat sich die frage auch erledigt *g*

KingCrunch
25.06.2007, 19:33
Gibts kein $row->_toArray() oder vergleichbares? Dann könntest du das Objekt zuerst in ein Array umwandeln und sparst dir die Iteration über das Objekt.

Timo Trallala
25.06.2007, 20:48
aber ich muss doch noch die abhängigen Datensätze nachladen und das geht nicht über ein Array, wenn ich mich nicht irre :confused:

budcha
25.06.2007, 20:58
erklär mir mal was genau du mit folgendem code machst (bzw WARUM du das SO machst). ich denke da isn fehler in der implementierung ;)
$rowToArray['news_leadin']='TEST';
$addToRows=$row->findUsers();

foreach ($addToRows as $add)
$rowToArray['news_writer']=$add->user_uname;

Timo Trallala
25.06.2007, 21:07
das kann ich gerne tun: ich lese den gesuchten Datensatz aus news aus.
Zuvor wird aus dem Orgiantext, ein leadin für eine News-voransich generiert.

Dann wird aus der User-tabelle der Name für die id des Nachrichten-Erstellers nachgeladen und in der View darsgestellt.

Nachfolgend noch das Modell


class News extends Zend_Db_Table_Abstract
{
protected $_name = 'news';
protected $_primary = array('news_id');
protected $_dependentTables = array('Users');

public $_variables = array();

}

class Users extends Zend_Db_Table_Abstract
{
protected $_name = 'users';
protected $_primary = array('user_id');
protected $_referenceMap = array(
'Username' => array(
'columns' => array('user_id'),
'refTableClass' => 'News',
'refColumns' => array('news_writer')
)
);

}

budcha
25.06.2007, 21:15
mmmm, wieso generirst du den "leadin" text nicht schon beim saven der news? dann brauchst du das nur einmal machen. (der rest währe dann wohl richtig :))

Timo Trallala
25.06.2007, 21:19
Das ist ja eine schlaue Idee ...

zumal ich mein Projekt in diesem framework lösen möchte :o

Danke!

budcha
25.06.2007, 21:22
naja, dann erklär mir mal was "leadin" mit dem Framework zu tun hat und wieso du einen Textschnipsel nicht schon vorher generierst sondern jedesmal wenn diese news abgerufen wird?

Timo Trallala
25.06.2007, 21:26
Ich sag ja, ich werde das so ändern, wie du das vorgeschlagen hast, insofern, da ich das ganze Projekt neu überarbeite und somit einen Einstieg in das TF finden möchte.

budcha
25.06.2007, 21:35
achso, sorry! dachte das war ironisch gemeint (misverständniss!)