Session über Controller hinwegspeichern

Hallo,

ich habe ein Drop-Down Feld wo der Besucher auswählen kann wonach er suchen will.

Nun muss ich aber seine letzte Auswahl irgendwo abspeichern können, sprich wenn er in der DropDown Liste den zweiten Wert ausgewählt hat, dann soll das über alle Seiten hinweg ausgewählt bleiben.

Ich vermute das ich das im components/Controller.php unterbringen muss, jedoch weiß ich noch nicht wie.

Hat jemand eine Idee?

Da gibts so viele Möglichkeiten. Wenn du das über Getter/Setter im Basiscontroller lösen willst, würd ich sowas als Ansatz wählen:




 public function getSearchType()

{

    return Yii::app()->user->getState('searchtype','defaultwert');

}

public function setSearchType($value)

{

    Yii::app()->user->setState('searchtype',$value);

}



Es fehlt: Wert von $value in setSearchType prüfen, bevor man ihn reinschreibt. Ich verwende CWebUser::setState() nur aus Faulheit, weil ich mir da keine Gedanken über das Öffnen der Session machen brauche. Muss nicht optimal sein.

Irgendwie glaub ich übrigens schon deine nächste Frage zu kennen…

ok, damit kann ich zwar die Werte auslesen. Aber übernehme ich die Werte vom DropDown Menü und speichere Sie in die Variable?

(ich hoffe das war die Frage auf die du gewartet hast ;)

Exakt die wars

Wie du das am besten verknüpfst, hängt ganz davon ab, wo dieses Dropdown sich befindet und wie du die Daten übermitteln willst. Je nachdem, ob du ein eigenes Form Tag da rum setzt und das Formular onChange abschickst, ob das Dropdown Teil eines größeren SearchModels mit weiteren Attributen ist oder einfach nur über AJAX was zurückschicken soll, würd ich das ganz unterschiedlich angehen.

^^

Ich habe ein Suchformular das auf allen Seiten aufgerufen wird. Darunter befindet sich eine Auswahl-Box.

components/Controller.php wird von allen Controllern aufgerufen.

Demnach bräuchte ich eine Methode im Controller die via $_GET[‘typ’] den Wert vom Suchformular ausliest und in die Session des Users reinschreibt.

Die Methode müsste immer aufgerufen werden wenn der Controller geladen wird.

Die Frage ist nur wie ich die Methode dazubringen immer aufgerunfen zu werden.

In dem Fall würd ich die init() Funktion im Basiscontroller (protected/components/Controller.php) verwenden.

das habe ich gesucht ;)

perfekt.

Ich hoffe nur das ich eine Lösung für das Caching Problem finde.

Und mich interessiert wofür die assets Ordner da sind (http://www.yiiframework.com/forum/index.php?/topic/13198-assets-ordner-sinn-und-zweck/)?! Ich würde jquery und die ui gerne von google beziehen, dann bräuche ich diese Ordner nämlich nicht mehr

Guckst du mal hier:

http://www.yiiframework.com/doc/guide/1.1/de/extension.create#widget

und hier:

http://www.yiiframework.com/doc/guide/1.1/de/topics.performance#minimieren-von-scriptdateien

Beim Widget mal den Text zum zweiten Beispiel lesen, dort wird erklärt, wozu man Assets braucht.

Auf der zweiten Seite unten steht, wie du jquery und Co von Google einbinden kannst.

Wo kommst das rein? In protected/components/Controller.php ?


$cs=Yii::app()->clientScript;

$cs->scriptMap=array(

    'jquery.js'=>false,

    'jquery.ajaxqueue.js'=>false,

    'jquery.metadata.js'=>false,

    ......

);



Das ist irgendwie doppelt gemoppelt?! Zunächst schalte ich es aus dann rufe ich die CGoogleApi auf. Würde es nicht mehr Sinn machen schon im scriptMap die Google URL aufzurufen?


<head>

<?php echo CGoogleApi::init(); ?>

 

<?php echo CHtml::script(

    CGoogleApi::load('jquery','1.3.2') . "\n" .

    CGoogleApi::load('jquery.ajaxqueue.js') . "\n" .

    CGoogleApi::load('jquery.metadata.js')

); ?>

......

</head>

Beispiel 1 kannst du in die main.php reinsetzen:




'components'=>array(

  'clientScript'=>array(

    'scriptMap'=>array(

      'jquery.js'=>false,

      //...

Damit verhinderst du, dass jemals wieder eine Datei namens "jquery.js" vom ClientScriptManager mit Hilfe des AssetManagers veröffentlicht wird. Es wird also kein <script…> tag mehr für jquery automatisch in den Quelltext eingebaut.

Dürfte theoretisch für jQuery auch funktionieren, wenn du einfach die Google URLs statt false einsetzt. Probiers einfach mal aus.

CGoogleApi kann halt noch mehr, um die ganze API zu initialisieren (z.B. mit Google-API-Key usw.). Mehr dazu musst du aber selber mal bei Google nachlesen.