Zugriff auf schon erzeugte Widget-Instanz(en)

hallo zusammen

und zwar sitze ich gerade an einem problem, welches auf den ersten blick etwas konfus erscheinen mag. und zwar habe ich einen code, den jemand anderer geschrieben hat. es geht dabei um einen user-counter. diesen würde ich gerne für yii portieren und online stellen. ich habe nun eine komponente geschrieben, welche ich wie folgt aufrufen kann:


<?php $this->widget('application.components.UserCounter', array('action' => 'set')); ?>

nun ist es so, dass dann ja eine instanz von UserCounter erzeugt wird. wie kann ich denn später wieder auf diese instanz zugreifen? denn dort sind noch sachen gespeichert, die ich abrufen will. mir ist schon klar, dass man das auch anders programmieren kann, nur ist der code, wie schon erwähnt, nicht von mir! zudem denke ich, dass das auch ein allgemeines problem sein kann!

mfg

armin

Widgets sind keine Instanzen, die irgendwo gehalten werden. Sie werden nur kurz beim Rendern instanziiiert und erzeugen ihre Ausgabe - fertig. Wenn du etwas anderes brauchst, kannst du z.B. über einen BaseController (von dem alle deine Controller abgeleitet sind) oder eine eigene Applikationskomponente nachdenken. Du kannst beliebig eigene Komponenten schreiben (extends CComponent) und diese in deiner Anwendungskonfiguration unter ‘components’ mit eigener id einbinden. Sie sind dann von überallher über Yii::app()->deinId Aufrufbar und werden automatisch beim ersten Zugriff erzeugt.

Gibts dafür ein Tutorial oder ein Beispiel? Denn ich denke, dass das mit den Components wohl das sinnvollste wäre!

Naja, das Grundgerüst ist ja schnell implementiert. Es kommt mehr drauf an, ob das deinen Anforderungen gerecht wird. Das einfachste Beispiel sieht so aus:

components/MeineKomponente.php


<?php

class MeineKomponente extends CComponent

{

  public $configXY='defaultwert';


  public function irgendwas()

  {

    return 'bla';

  }

}



config/main.php


'components' => array(

  ...

  'xyz' => array(

    'class'=>'MeineKomponente',

    'configXY' => 'irgenwas'

  ),

Im Code dann:


$blabla=Yii::app()->xyz->irgendwas();



Ah, okay! Danke dir! Das ist wohl das, was ich brauche!

Wenn ich dann immer ein Yii::app()->xyz-> mache, wird ein und die selbe Instanz aufgerufen?

Passt alles! Vielen Dank!

An dieser Stelle aber noch ein Hinweise: und zwar hat bei mir eine init-Methode gefehlt, wobei ich nicht sagen kann, warum. Hab Sie einfach deklariert, aber leer gelassen.

So ist es - genau wie mit allen anderen Yii-Komponenten. Komponenten werden immer erst beim ersten Zugriff darauf instanziiert (im Gegensatz z.B. zu PRADO). Außer man führt sie in der Konfig unter preload auf. Diese Komponenten werden immer instanziiert.

Ah, ok. Das kannst du vermeiden, indem du CApplicationComponent statt CComponent erweiterst. Die Application erwartet nämlich, dass ihre Komponenten eine init() Methode haben. Deshalb gibts in CApplicationComponent eine Defaultimplementierung dafür, die auch gleich eventuelle Behaviors registriert.