2015-11-30 1 views

Répondre

1

Bien en quelque sorte. Vous pouvez utiliser la fonction Session::get_once(). Mais cela vous permet seulement de récupérer une variable une fois, et vous ne pouvez plus l'utiliser dans la même requête. Pendant que vous voulez qu'un message flash persiste un cycle de requête complet. Pour gérer cela, vous aurez besoin d'une classe wrapper, quelque chose comme ça.


class Flash { 
    private $session; 
    private $messages = array(); 

    private static $_instance; // Singleton object 

    public static function instance() { 
     if (! isset(self::$_instance)) { 
      self::$_instance = new Flash(); 
     } 

     return self::$_instance; 
    } 

    private function __construct() { 
     $this->session = Session::instance(); 
     $this->messages['current'] = $this->session->get_once('flash'); 
     if(! is_array($this->messages['current'])) { 
      $this->messages['current'] = array(); 
     } 
    } 

    public function add($key, $message === null) { 
     if (is_null($message)) { 
      $message = $key; 
      $key = null; 
     } 
     $this->messages['new'][$key] = $message; 
     $this->session->set('flash', $this->messages['new']); 
     return true; 
    } 

    public function get($item = null) { 
     if($item === null) { 
      return $this->messages['current']; 
     } 
     if(! array_key_exists($item, $this->messages['current'])) { 
      return null; 
     } 
     return $this->messages['current'][$item]; 
    } 

} 

Utilisation:

 
$flash = Flash::instance(); 

$flash->add('A random message'); 
$flash->add('some_key', 'Some message'); 

$flash->get(); // array(0 => 'A random message', 'some_key' => 'Some message') 
$flash->get('some_key'); // 'A Random message' 

Ce qu'il fait est essentiellement lors de l'initialisation, il récupère le message en cours de la session, en utilisant la fonction get_once(). La variable est non hors de l'objet Session, elle ne durera donc que cette requête. Chaque fois que vous ajoutez une variable, elle est immédiatement conservée dans l'objet Session.

Il y a juste un problème; Si vous utilisez des appels ajax, les messages ne seront disponibles que sur la requête php initiale et non sur les appels ajax suivants. Et il n'y a aucune restriction sur le type de variable que vous stockez (mais must be serializable). Vous devrez intégrer des chèques pour cela aussi.

avertissement: la classe n'a pas été testé, il ne me surprendrait pas si vous ne recevez pas une erreur de syntaxe;)

Et pour aller plus loin: vous auriez besoin d'un rafraîchissement supplémentaire de toute façon. Le flux de la demande doit être comme ceci:

Demande 1: Le formulaire est présenté à l'utilisateur Demande 2: L'utilisateur poste le formulaire, qui est traité. Les données sont insérées dans la base de données. Une fois terminé, l'utilisateur est redirigé Demande 3: Une page de confirmation est affichée (peut être "merci", ou la page de détails, peu importe).

Vous devez définir le message flash dans la demande 2 et l'afficher dans 3. Je ne souhaite pas afficher directement la page de remerciements à la demande 2, car lorsque l'utilisateur actualise, le formulaire sera à nouveau affiché.