Yii Framework Forum: Auslagern der Logik von einem Widget - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Auslagern der Logik von einem Widget bzw. Nutzen der Daten von einem Widget ohne Ausgabe. Rate Topic: -----

#1 User is offline   Coksnuss 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 141
  • Joined: 14-May 09

Posted 16 October 2009 - 07:39 AM

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 $this->widget('Teamspeak', array('ip' => 'ip-adresse' [, 'port' => 'port'])); ?>

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

So sieht das Widget aus:
public function run()
{
  $data = $this->getData(); // <-- vereinfacht ausgedrückt
  $this->render('box', array('data' => $data));
}

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
0

#2 User is offline   mbi 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 608
  • Joined: 08-May 09

Posted 16 October 2009 - 07:40 PM

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

#3 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,016
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 17 October 2009 - 07:07 AM

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;

0

#4 User is offline   Coksnuss 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 141
  • Joined: 14-May 09

Posted 18 October 2009 - 06:18 AM

Also ich habe es jetzt so gelöst:

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 & GlobalInfo
      setChannel(); // Legt für jeden Channel eine Instanz von TeamspeakChannel an und speichert in $this->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...
}


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...

This post has been edited by Coksnuss: 18 October 2009 - 06:28 AM

0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users