14.08.2011, 02:04
Hallo zusammen,
ich wollte schonmal eine kleine Vorschau auf die Struktur der v2.0 geben. Diese kann sich aber immer noch wieder aendern!
Alle Aufrufe werden zukuenftig an einen ScreenController gehen, der die Aufrufe auf die jeweiligen "Screens" weiterleitet (genannt Routing).
Kurzes Beispiel:
- game.php?screen=mail&mode=new
-- der ScreenController wird nun die Klasse mailScreen aufrufen, und dort die Methode newMode() ausfuehren.
-- mailScreen::newMode()
- game.php?screen=mail&mode=new&action=send
-- mailScreen:endAction()
-- und danach, mailScreen::newMode()
--- sollte aber moeglichst vermieden werden - ein header('Location: ') sollte den User zurueck zur game.php?screen=mail&mode=new leiten, sofern kein Fehler entsteht.
Wenn kein Argument mode= in der URL spezifiert ist, wird der Aufruf auf die main() Funktion des Screens weitergeleitet.
- game.php?screen=mail
-- mailScreen::main()
Da diese URL (?screen=mail) die Inbox der Nachrichten anzeigen wuerde, die aber auch als Mode aufgerufen werden kann, muss die main()-Methode wie folgt aussehen:
Dies stell sicher, dass die Inbox sowohl als game.php?screen=mail als auch als game.php?screen=mail&mode=in verfuegbar ist.
Alle Action-Methoden sollen bei Fehlern einen string zurueckgeben, der zu einer Variable in der Sprachdatei passt.
en.ini
some screen class
Also, hier ist ein Beispiel, falls jemand z.B. ein Plugin fuer eine "Freunde" funktion einbauen will:
Aber, da ist doch gar kein $smarty->display('...tpl')!
Genau. Und zwar gibt es dafuer den ScreenController, der automatisch folgendes Template aufruft: game_Friends.tpl (in diesem Fall), oder generell: game_$screen.tpl
Fuer Modes wird eine Variable namens $includeTemplateName an die TPLs uebergeben. Da z.B. bei den Nachrichten das Menue immer gleich aussehen soll, ist dieses in der game_mail.tpl enthalten.
Die game_mail.tpl enthaelt dann folgendes:
Die $includeTemplateName enthaelt folgendes: game_$screen_$mode.tpl - also, falls man dann die game.php?screen=mail&mode=in aufruft, wird vom ScreenController die game_mail.tpl aufgerufen, welche durch den obigen Code die game_mail_in.tpl includiert.
Ist genauso wie in der 1.4, nur dass in der 1.4 folgendes da stand:
Bloss ist es diesmal als gesamte Variable uebergeben.
Ich realisiere, dass ich nicht allzu gut im erklaeren bin... Deshalb stellt viele Fragen! So kompliziert ist das System nicht, ich lasse es nur so aussehen... :/
ich wollte schonmal eine kleine Vorschau auf die Struktur der v2.0 geben. Diese kann sich aber immer noch wieder aendern!
Alle Aufrufe werden zukuenftig an einen ScreenController gehen, der die Aufrufe auf die jeweiligen "Screens" weiterleitet (genannt Routing).
Kurzes Beispiel:
- game.php?screen=mail&mode=new
-- der ScreenController wird nun die Klasse mailScreen aufrufen, und dort die Methode newMode() ausfuehren.
-- mailScreen::newMode()
- game.php?screen=mail&mode=new&action=send
-- mailScreen:endAction()
-- und danach, mailScreen::newMode()
--- sollte aber moeglichst vermieden werden - ein header('Location: ') sollte den User zurueck zur game.php?screen=mail&mode=new leiten, sofern kein Fehler entsteht.
Wenn kein Argument mode= in der URL spezifiert ist, wird der Aufruf auf die main() Funktion des Screens weitergeleitet.
- game.php?screen=mail
-- mailScreen::main()
Da diese URL (?screen=mail) die Inbox der Nachrichten anzeigen wuerde, die aber auch als Mode aufgerufen werden kann, muss die main()-Methode wie folgt aussehen:
PHP Code:
public function main() {
$this->inMode();
return 'in';
}
Dies stell sicher, dass die Inbox sowohl als game.php?screen=mail als auch als game.php?screen=mail&mode=in verfuegbar ist.
Alle Action-Methoden sollen bei Fehlern einen string zurueckgeben, der zu einer Variable in der Sprachdatei passt.
en.ini
Code:
[error]
my_error_code = "You suck at entering a number!"
some screen class
PHP Code:
function someAction() {
if(!is_numeric($_GET['number'])) {
return 'my_error_code';
}
}
Also, hier ist ein Beispiel, falls jemand z.B. ein Plugin fuer eine "Freunde" funktion einbauen will:
PHP Code:
<?php
class FriendsScreen extends AbstractScreen
{
/**
* Muss einen String mit dem standardmaessigen Mode zurueckgeben.
*
* @return string
*/
public function main() {
$this->showFriendsMode();
return 'showFriends';
}
/**
* displays all friends.
*/
public function showFriendsMode() {
// some code with database requests..
$this->tpl->assign('friends', $friends);
}
/**
* adds a friend.
*
* @return string error message, if any
*/
public function addAction() {
if( empty($_POST['friendName']) ) {
return 'friend_name_empty';
}
// insert friend to DB
}
/**
* removes a friend by ID.
*
* @return string error message, if any
*/
public function removeAction() {
if( empty($_POST['friendID']) || !is_numeric($_POST['friendID']) ) {
return 'friend_id_empty';
}
// remove friend from DB
}
}
?>
Aber, da ist doch gar kein $smarty->display('...tpl')!
Genau. Und zwar gibt es dafuer den ScreenController, der automatisch folgendes Template aufruft: game_Friends.tpl (in diesem Fall), oder generell: game_$screen.tpl
Fuer Modes wird eine Variable namens $includeTemplateName an die TPLs uebergeben. Da z.B. bei den Nachrichten das Menue immer gleich aussehen soll, ist dieses in der game_mail.tpl enthalten.
Die game_mail.tpl enthaelt dann folgendes:
Code:
{include file=$includeTemplateName}
Ist genauso wie in der 1.4, nur dass in der 1.4 folgendes da stand:
Code:
{include file="game_mail_`$mode`.tpl"}
Ich realisiere, dass ich nicht allzu gut im erklaeren bin... Deshalb stellt viele Fragen! So kompliziert ist das System nicht, ich lasse es nur so aussehen... :/
[ GfX-Dose Forum ]