CHtml Methode error() indirekt anpassen

Hallo zusammen,

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 '';

                }

	}




Im _form.php rufe ich das Ganze dann so auf:


                

<?php echo $form->error($model,'roles', array('getErrorCssClass' => true)); ?>



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?

Danke und Gruss

Redfish

Hallo,

ich würde folgendes versuchen.

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.




<?php echo MyHtml::error($model,'roles', array('getErrorCssClass' => true)); ?>



Hoffe ich konnte dir weiter helfen ;)

Hallo,

Danke für die schnelle Antwort, bevor ich es aber ausprobiere - wo muss ich diese Klasse speichern (zB. protected/components)?

Gruss Redfish

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?

Hallo,

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.

Als sehr rudimentäres Beispiel:


	<div class="row <?php echo MyHtml::error($model,'birthday', array('getErrorCssClass' => true)); ?>">

		<?php echo $form->labelEx($model,'birthday'); ?>

		<?php echo $form->textField($model,'birthday'); ?>

		<?php echo $form->error($model,'birthday'); ?>

                


	</div>

Wenn nun die Validierung fehlschlägt, hat auch das div Element die error-Klasse um zB. via CSS den Hintergrund rot gestalten zu können.

Oder gibt es dafür einen einfacheren Weg?

Gruss Redfish

PS: Ich hab das Ganze mit der Auslagerung in eine eigene Klase noch nicht umgesetzt, sollte aber aus technischer Sicht funktionieren

Genau das wäre das Problem: $form->error() wird deine eigene CHtml-Klasse nicht verwenden, darum klappt das ganze nicht.

error() ist ja zur Ausgabe der Fehlermeldung gedacht und sollte auch keine andere Aufgabe übernehmen. Das was du möchtest geht ganz einfach z.B. so:


<div class="row <?php echo $model->hasError('vorname') ? 'error' : '' ?>">

Deine Begründung verstehe ich nicht ganz… :unsure: 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.

Danke für eure Hilfe,

Gruss Redfish

Find ich auch eine einfachere und bessere Lösung.

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.


<div class="row <?php echo $model->hasError('vorname') ? 'MyHelper::getErrorCssClass()' : '' ?>">

Kommt natürlich auf die Häufigkeit der Verwendung der Error Klasse an ob sich der Aufwand rentiert oder nicht?

Mike was hältst du als "Experte" von diesem Vorschlag?

Jo, warum nicht. Oder man bastelt sich nen kleinen helper:




function csserr($model,$attribute) {

    if ($model->hasError($attribute))

      echo CHtml::errorCssClass;

}

Anwendung:


<div class="row <?php csserr($model,'birthday') ?>">

Es gibt nen Wiki-Artikel zu den Helpern, falls nicht klar ist, wo die hinkommen.

Yep, da stimmts auch - aber das hast du nochmal geändert, gibs zu ;)

Ich bekomm Email-Benachrichtigungen zu jeder Antwort und da stehts noch mit $form->error() drin …

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.

Wiki Helper Funktionen

Hallo,

Ja habs nochmals korrigiert. :rolleyes:

Danke für eure Tipps. Ihr helft mir gerade extrem mit yii besser klar zu kommen.

Gruss Redfish