Das ist keine Frage sondern eher ein Tip. Mir ist klar, dass das eigentlich nicht hier her gehört, aber mein Englisch ist so schlecht, dass ich nicht unter Tipps schreiben wollte.
Wenns nicht stört, würde ich gern Problemlösungen weiter hier beschreiben, dann findet man sie an der richtigen Stelle wieder. Wenn’s das Forum stört, lasse ich es natürlich.
Problemstellung: Es gibt eine Tabelle crm_stammdaten. Diese enthält ALLE Adressen. In der Tabelle existieren Foreign-Keys die Tabelle selbst (crm_stammdaten), z.B. für die Verknüpfung zu einer abw. Versandadresse, zu einem Finanzamt oder zu einem gesetzlichen Vertreter.
Diese Adressen sollen im Formular per autocomplete eingelesen werden. Die Rückgabe der Auswahl erfolgt dann in einem Feld mehr für die ID des gewählten Datensatzes (der Adresse). Damit stets die Adresse als String vorliegt sowie zusätzlich die ID, wird ein Behavior eingebunden, welches die jeweils fehlenden Daten afterFind() und beforeSave() einliest.
Hier ergibt sich nun ein Problem, an dem ich eine Weile geknabbert habe:
In der afterFind-Methode muss die Adresse z.B. des Finanzamts eingelesen werden. Das führt unweigerlich zu einer Endlosschleife, weil nach dem Finden des Finanzamt-Datensatzes natürlich afterFind() wieder aufgerufen wird.
Hier die triviale Abhilfe:
Ich erzeuge eine neue Model-Klasse, welche auf die gleiche Tabelle zeigt und ermittle die Adresse über eine Model-Instanz dieser Klasse, in der ich ausschließlich den Tabellennamen angebe:
[i]class CrmStammdatenOnly extends CActiveRecord
{
/**
* @return string the associated database table name
*/
public function tableName()
{
return 'crm_stammdaten';
}
}[/i]
So kann ich die find()-Methode auf die Tabelle ausführen, ohne das ein Zugriff auf das Behavior und damit die
afterFind()-Methode des eigentlichen CActiveRecord-Models stattfindet.