<?php
// Hauptcontroller
class BaseController extends CController
{
public $pageNoIndex;
public function init()
{
$this->addClientScripts();
}
public function addClientScripts()
{
if (true === $this->pageNoIndex)
{
Yii::app()->clientScript->registerMetaTag('noindex', 'robots');
}
}
}
?>
Wenn nun ein Controller (also eine bestimmte Seite) den MetaTag haben soll, machst du einfach:
<?php
class TestController extends BaseController
{
public $pageNoIndex = true;
// .......
}
?>
Vielleicht willst du den MetaTag ja auch per Controller-Action setzen, dann wäre eine andere Lösung natürlich sinnvoller da du hier nur global je Controller setzen kannst.
Warum werden Variablen in den Klassen bei yii immer public deklariert. Aus Java weiß ich, das Variablen stehts Private deklariert werden und dazu passende Getter und Setter Methoden erstellt werden.
Zu deiner Lösung
D.h. ich leite jeden Controller von einem "Vor-Controller" ab, den dann wiederrum von CController ableitet. Ich glaube, dass das Symfony - Framework genau soarbeitet, für den Fall, dass man Methoden deklarieren will die für alle Controller verfügbar sein sollen.
Fehler
Den BaseController habe ich in protected/controllers/BaseController.php definiert
Folgenden Fehler kriege ich nun zurück
Fatal error: Class 'BaseController' not found in E:\Workspace\blog2\protected\controllers\EngineController.php on line 3
Ja so funktioniert das. In einem Projekt habe ich z.B. 2 Controller die vor dem eigentlichen Controller kommen. Ein Hauptcontroller mit dem ich $this->forceSuffix usw. machen kann und dann für bestimmte Bereiche (z.B. Admin-Panel) noch einen weiteren Controller mit dem ich dann automatisch auf https umleite und sowas halt.
Das ist einfach Konvention. Prado hat das z.B. auch so gemacht, dass man immer getter/setter schreiben musste, die dann den eigentlich Wert in einer privaten Variable gespeichert/aus ihr gelesen haben. Das verursacht mehr Schreibarbeit und ist für viele Parameter einfach nicht nötig. Yii möchte es ja einfach halten.
Und wenn doch mal getter/setter nötig sind, um z.B. einen Wert beim Beschreiben noch zu prüfen, kann man ja welche schreiben. Für den "Anwender" der Klasse spielt das keine Rolle, da dank CComponent (definiert __get(),__set(),…) transparent auf Klasseneigenschaften zugegriffen werden kann, ohne zu merken, ob man einen getter verwendet oder eine öffentliche Variable direkt ausliest.
Beispielsweise wenn man nicht Apache als Webserver benutzt, oder die Applikation auch auf anderen Webservern laufen soll. (Oder mod_rewrite nicht aktiviert ist)