Auslagern der Logik von einem Widget

Sorry für den undeutlichen Titel, aber ich weiß nicht ganz wie ich es am besten beschreibe.

Konkret geht es um ein Widget welches über telnet Informationen über einen Teamspeakserver ausliest. Diese Informationen werden dann genutzt um eine Art "Infobox" des jeweiligen Servers darzustellen (also welche Channel, welche User etc…)

Jetzt überlege ich wie ich am besten diese Informationen anderweitig nutzen kann.

Also wenn ich nur wissen will wieviele Benutzer momentan online sind zum Beispiel (ohne die Box auszugeben).

Momentan rufe ich das Widget so auf (im view):

[PHP]<?php $this->widget(‘Teamspeak’, array(‘ip’ => ‘ip-adresse’ [, ‘port’ => ‘port’])); ?>[/PHP]

Danach kommt eben diese "infobox" wenn man es so nennen will.

So sieht das Widget aus:

[php]

public function run()

{

$data = $this->getData(); // <-- vereinfacht ausgedrückt

$this->render(‘box’, array(‘data’ => $data));

}

[/PHP]

und ich möchte quasi nicht, dass das widget den viewfile ausgibt sondern mir nur die $data variable liefert.

Müsste ich die Logik dann in eine Klasse auslagern, welche mir dann die Informationen zurückgibt?

// Edit: Wäre es "legitim" eine public static methode in das Widget zu integrieren? (Also das ich dann mit Teamspeak::getData($ip, $port); meine Daten bekomme

Das Widget sollte sich die Daten aus einem Model holen. Das kann eine einfache Klasse sein.

mbi hat recht. Ich würde eine Klasse grob so aufziehen:


TeamSpeak extends CApplicationComponent {


  public $ip;

  public $port=1234; // default


  // evtl. noch weitere Variablen, die z.B. deine offene Telnetconnection beinhalten.


  public init() {

    // hier könntest du die connection aufbauen

  }


  public getDataX() {

      // hier Daten X holen (evtl. caching einbauen)

  }


  public getDataY() {

    // falls sinnvoll: hier andere Daten holen

  }

}

Die bindest du dann einfach in deine Konfiguration ein:


'components' => array(

  'teamspeak' => array(

    'class' => 'application.components.Teamspeak',

    'ip' => '1.2.3.4',

  ),

),

Und kannst damit überall auf deine Teamspeak daten zugreifen:


$ts = Yii::app()->teamspeak->getDataY;

Also ich habe es jetzt so gelöst:

[PHP]

class TeamspeakServer

{

// Array mit instanzen von TeamspeakChannel

public $channel;

// Jede Menge attribute

public $ip;

public $uptime;

//…

public function __construct($ip, $port = 8767, $queryport = 51234)

{

  connect();


  setAttributes(); // Serverinfo &amp; GlobalInfo


  setChannel(); // Legt für jeden Channel eine Instanz von TeamspeakChannel an und speichert in &#036;this-&gt;cannel[];


  setPlayer(); // Weist fuer jeden channel die user zu (Will ich noch nach TeamspeachChannel auslagern, aber das ist garnicht so leicht)

}

}

class TeamspeakChannel

{

// Jede menge flags & Constanten

const CODEC_CELP_52 = 0;

//…

public $subchannel; // Array mit instanzen von TeamspeakChannel

public $player; // Array mit Instanzen von Teamspeak Player

// Jede menge Attribute

public $maxusers;

// …

}

class TeamspeakPlayer

{

// User Attribute etc…

}

[/PHP]

Ist dieser Aufbau so sinnvoll?

Ich will das ganze dann als Extionsion benutzen (und releasen - wenns mal fertig ist)

Die Cache Funktion liegt momentan noch beim Widget…