Session Variablen mit Ajax anlegen

Das Problem bei Seiten die mit Javascript den Seiteninhalt ändern ist, das sobald diese Seiten neu vom Server geladen werden, alle Einstellungen, die Client-seitig vorgenommen wurden verloren gehen. D. h. man benötigt eine Methode, um diese Einstellungen an den Server zu übermitteln.

Es bietet sich an Ajax zu verwenden um bei jeder Javascript Operation einen Request an den Server zu senden, um den Server über die Änderungen zu informieren.

Dazu definiert man einfach ein Modul setvar:

class setvarActions extends sfActions
{
  public function executeSetvar()
  {
    $this->setLayout(false);
    $this->name=$this->getRequestParameter('name');
    $this->value=$this->getRequestParameter('value');
    if ($this->name && $this->value)
    {
      $this->getUser()->setAttribute($this->name,$this->value);
    }
  }
}

Zum Debuggen ist es ganz nützlich, wenn man bei Bedarf Clienseitig ausgeben kann, ob die Variable gesetzt wurde. Deshalb noch ein entsprechendes Template setvarSuccess.php:

name = <?php echo $name ?>,
value = <?php echo $value ?>

Auf der Client Seite kann man jetzt bei Javascript Operationen dem Server mitteilen, wie der aktuelle Status bestimmer Seitenbereiche ist:

$(document).ready(function(){
  // Regionalsuche ein und ausblenden
  $('#region_toggle').click(function(){
    $.get("/setvar?name=region_list&value="+
      $('#region_list').is(':visible'),function(text){});
    $('#region_list') .slideToggle('fast');
    return false;
  });
});

Jetzt kann man im PHP Code die class oder auch den Style so einstellen das es bei einem Neuladen der Seite vom Server nicht zu einem Bruch kommen.

Wem der oben angegeben Javascript Code nichts sagt der schaue sich bitte jquery an. Mit jquery kann man javascript schnell, schmerzfrei und "unaufdringlich" in HTML Seiten einbauen. Natürlich kann man den Ajax Call auch direkt oder mit einer anderen Bibliothek absetzten.

P. S. noch ein kleiner Hinweis: is(':Visible') wird vor der Animation abgefragt, mit der der ein Teil der Seite ein- bzw. ausgeblendet wird. D. h. auf der Server Seite muss das ganze logisch umgedreht werden: also wenn die Variable auf 'true' gesetzt wurde dann nicht anzeigen, wenn 'false' dann anzeigen:

 <ul id="region_list" style="display:<?php
  echo ('false'==$sf_user->getAttribute('region_list'))
    ?'block':'none' ?>">

Implizit wird hier auch der Initialstatus berücksichtigt: Ist die Session Variable nicht gesetzt, wird wird die Regionalliste nicht angezeigt. Soll das anders herum sein müssen 'block' und 'none' vertauscht werden und es muss auf 'true' abgefragt werden.