Widget und Ajax

Hallo Forum,

ich blicke einfach nicht durch. Es geht um folgendes… Ich habe ein Widget das eine Loginbox ausgibt, nun möchte ich das die Eingabe per Ajax geprüft wird. Sehe ich das richtig das ich dafür einen Controller brauche?

Denn mit nen Ajax Button wird ja die URL für den Controller und die Funktion angegeben… Man, mit dem Prado-Framework war das ganze schon ein bisschen einfacher.

Danke schon mal in voraus…

Hi und willkommen,

eigentlich brauchst du einen Controller in jedem Fall, da mit jedem Request immer eine Controlleraction aufgerufen wird. Du könnest z.B. einen AjaxController anlegen, der all deine Ajax-Requests bearbeitet. Man könnte auch eine eigene Actionklasse zur Eingabeprüfung erstellen (ähnlich der CCaptchaAction…) und diese dann in einen Controller einbinden. Dann kann man Widget+Action leichter wiederverwenden.

Aber ich hab deshalb "eigentlich" geschrieben, weil man es auch etwas anders lösen kann. Siehe z.B. die login-extension von Qiang. Dort hat er die Logik direkt in das Widget integriert. Ein Widget wird ja bereits von irgendeiner Action im View gerendert. Ist aber m.E. etwas unübersichtlicher.

Evtl. hilft dir das schon mal als Anregung?

Hallo Mike,

danke… hat super funktioniert… der Gedanke mit nen Ajax-Controller -> der war Super :D

Frage mich jedoch ob es bedenklich ist das so zu lösen, funktionieren tut es super:




class WAjaxController extends CController

{

    public function actionAjax()

    {

	eval ('$class = new '.$_GET['class'].'();');

	$funcName = $_GET['function'];

	$class->$funcName($_POST);

    }

}



Dann im view des Widgets:




<?php echo CHtml::ajaxSubmitButton('Login', Yii::app()->createUrl('WAjax/Ajax',

 array('class'=>'WLogin',

       'function'=>'checkLogin')),

 array('update'=>'#Login_InnerContent'),

 array('onClick'=>'showWorker')); ?>



und im Widget dann:




class WLogin extends CWidget

{

    ...


    public function checkLogin($attrib)

    {

        if (isset($attrib['LoginForm'])) {

	    

            ...


	}

    }

}



Also funktionieren tut es so… hab ich mich zu früh gefreut, geht das einfacher oder kann man es so lassen?

Danke nochmal.