Ich bin noch recht neu und kenne das yii Framework noch nicht perfekt. Auf jedenfall habe ich eine Frage und zwar möchte ich bei einem Validierungserror dass nur die CSS Klasse ausgegeben wird. Um diesem Wunsch gerecht zu werden habe ich momentan die Methode error() von CHtml wie folgt angepasst(siehe Kommentar im Code):
public static function error($model,$attribute,$htmlOptions=array())
{
$error=$model->getError($attribute);
if($error!='') {
// If-Statement and return Value added
if($htmlOptions['getErrorCssClass']) {
return self::$errorCss;
} else {
if(!isset($htmlOptions['class'])) {
$htmlOptions['class']=self::$errorMessageCss;
}
return self::tag('div',$htmlOptions,$error);
}
} else {
return '';
}
}
Das tolle ist, es funktioniert ! Nur möchte ich die Anpassungen nicht direkt im yii Framework vornehmen sondern über eine Erweiterung oder Vererbung in der Applikationslogik (zB Controller oder was es alles noch gibt). Dies, weil ich damit bei einem Wechsel auf eine neue oder andere yii Framework Version nicht die Veränderungen verliere und wirklich alles durch Handarbeit realisierte übersichtshalber in der Applikationslogik liegt.
Weiter habe ich die Meinung dass manuelle Veränderungen direkt im Code eines Frameworks nichts zu suchen haben.
Könnt ihr mir bei meiner Frage respektive meinem Problem weiterhelfen?
Eigene, von CHtml abgeleitete Klasse mit deiner Funktion erstellen:
class MyHtml extends CHtml
...
public static function error($model,$attribute,$htmlOptions=array())
...
Jetzt musst du überall wo die CHtml error() Methode in deinem Code verwendet wird und du deine spezielle Funktionaltät brauchst diese duch die MyHtml Klasse austauschen.
Wie dies jetzt genau aussieht kann ich dir leider nicht 100%ig sagen, weil ich mir hier selber nicht sicher bin wie hier dann der Aufruf aussehen muss aber so aus dem Bauch raus würde ich mal folgendes probieren.
Im Prinzip ist es in Yii wurscht wo du die Klasse ablegst solange du den Pfad dorthin oder nur die Klasse alleine in der Konfiguration zum Automatischen Laden per import Anweisung angibst.
In deinem Fall würde ich sie wie du schon schreibst, in protected/components speichern.
Da es sich ja um eine statische Methode handelt und du weißt das du noch mehr so Klassen mit statischen Methoden in Zukunft brauchen wirst könntest du auch unter protected/components ein Verzeichnis static anlegen und deine Klassen dann dort speichern. Kann man nachträglich auch noch einfach ändern.
Natürlich nicht vergessen zu kontrollieren ob der neue Pfad deiner Klassen auch wirklich per import in der Konfiguration eingebunden wird.
Dumme Frage: warum möchtest du eigentlich, dass der Name der CSS-Klasse ausgegeben wird? Find ich relativ unkonventionell - und deshalb musst du dich auch so verbiegen, das hinzukrigen. Dafür zahlst du dann den Preis, dass du z.B. $form->error() nicht mehr verwenden kannst, weil das intern immer CHtml verwendet.
Evtl. gibts ja noch eine bessere (standardkonforme) Möglichkeit, bei der du nicht die CSS-Klasse "mißbrauchen" musst?
Wenn du den Code genau anschaust, siehst du dass nur die error-Klasse ausgegeben wird, wenn ich ein bestimmten Parameter bei der error-Methode mitgebe. Falls dieser Parameter nicht mitgeben wird, ist der Output der Selbe wie bisher. Meine Anpassung ist also eine Erweiterung der Methode error() und nicht eine totale Umstrukturierung!
Ich möchte die error-Klasse ausgeben um bei Validierungsfehler auch noch andere HTML Element hervorheben zu können.
Deine Begründung verstehe ich nicht ganz… Im meinem letzten Code Beispiel steht ja MyHtml::error und nicht $form->error also sollte meine Methode ja aufgerufen werden.
Aber dein Alternativvorschlag überzeugt mich sowieso mehr. Ich Idiot hätte auch selber auf die hasError Methode kommen können da ich es auch schon in meinem Controller einsetze.
Um sich noch ein wenig Wartungsarbeiten zu ersparen könnte man das error im IF noch durch eine statische Methode aus einer Helperklasse ersetzen, um bei einer eventuellen Änderung der Error Klasse nur eine Codestelle ändern zu müssen.
So eine Helper Funktion meinte ich eigentlich. Eine Klasse deswegen zu machen wie ich in meinem Beitrag schrieb ist doch zuviel des guten wenn ich nochmal drüber nachdenke.