Layout e gestione contenuti

ciao, ho un'applicazione con alcune viste gestite tramite un layout default.phtml che ha una struttura del tipo:

<?php

  $this->headMeta()->prependHttpEquiv('Content-Type', 'text/html;charset=utf-8');
  $this->headTitle()->setSeparator(' - ');
  
  $this->headLink()->prependStylesheet($this->baseUrl('/css/jquery-ui/smoothness/jquery-ui-1.8.1.custom.css'));
  
  $this->headScript()->prependFile($this->baseUrl('/js/grid.js'));
  $this->headScript()->prependFile($this->baseUrl('/js/lib/flexgrid/flexigrid.js'));;
  $this->headScript()->appendFile($this->baseUrl().'/js/validateForm.js');
?>

<?= $this->doctype() ?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <!-- Title -->
    <?= $this->headTitle() ?>
    
    <!-- Meta -->
    <?= $this->headMeta() ?>
    
    <!-- Links -->
    <?= $this->headLink() ?>
    
    <!-- Scripts -->
    <?= $this->headScript() ?>    
    
  </head>
  <body>
    <div>    
      <span>Utente: <?php echo $this->username; ?></span> |
      <span><a href="<?php echo $this->baseUrl('/index/') ?>">Pagina iniziale</a></span> |
      <span><a href="<?php echo $this->baseUrl('/index.php/auth/passwordchange') ?>">Cambio password</a></span> |
      <span><a href="<?php echo $this->baseUrl('/index.php/auth/mailchange') ?>">Attivazione indirizzo mail</a></span> |
      <span><a href="<?php echo $this->baseUrl('/user/') ?>">Gestione utenti</a></span> 
      <span><a href="<?php echo $this->baseUrl('/index.php/auth/logout') ?>"><i>Log Out</i></a></span>  
    </div>
    <br/>

    <div id="content">
      <h1><?php echo $this->escape($this->title); ?></h1>
      <?php echo $this->layout()->content; ?>
    </div>
<br/>
  </body>
</html>

il mio problema che in alcune viste non vorrei visualizzare alcuni contenuti presenti in questo layout

tipo, se l'utente non loggato non devo poter vedere il menu

<div>

<span>Utente: <?php echo $this->username; ?></span> |

<span><a href="<?php echo $this->baseUrl('/index/') ?>">Pagina iniziale</a></span> |

<span><a href="<?php echo $this->baseUrl('/index.php/auth/passwordchange') ?>">Cambio password</a></span> |

.

come posso gestire questa situazione??

speravo di poter fare come nel controller, usando qualche cosa del tipo:

if(!$this->_session_data)

{

visualizzando quindi il menu solo se

if($this->_session_data)

ma la condizione non sembra funzionare, forse perch valida solo nel controller??

Grazie a tutti in anticipo per i suggerimenti!

inviato 6 anni fa
il_dandi
X 0 X

Se usi zend_registry e salvi li la tua autenticazione diventa poi semplice utilizzare un if del tipo

if(Zend_Auth::getInstance()->hasIdentity()){
   //quello che vuoi far vedere
}

Hai letto anche questo articolo:

http://www.phpnews.it/articoli/autenticare-gli-utenti-con-zend-auth-1/

ovviamente c' anche un successivo.

risposto 6 anni fa
Mario Santagiuliana
modificato 6 anni fa
X 0 X

Intendi dire che potrei utilizzare questo codice

if(Zend_Auth::getInstance()->hasIdentity()){
   //quello che vuoi far vedere
}

anche in una vista .phtml??

ultimo dubbio, alla luce di quanto postata nel mio ultimo post (esempio di come gestisco l'autenticazione), come potrei integrare questo if(Zend_Auth::getInstance()->hasIdentity()) in quanto gi fatto??

Grazie

risposto 6 anni fa
il_dandi
X 0 X

1) si,

2) non ho capito la domanda.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Il mio dubbio questo:

ho un layout

/script/default.phtml

che all'interno include dei JS

<?php
  // Always do prepend, if the addition to the head elements here
  // are to be on top. This is particularly important if adding
  // JavaScript in a controller view.
  
  $this->headMeta()->prependHttpEquiv('Content-Type', 'text/html;charset=utf-8');
  $this->headTitle()->setSeparator(' - ');
  
  $this->headLink()->prependStylesheet($this->baseUrl('/css/style.css'));
  $this->headScript()->prependFile($this->baseUrl('/js/grid.js'));  

?>

<?= $this->doctype() ?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <!-- Title -->
    <?= $this->headTitle() ?>
    
    <!-- Meta -->
    <?= $this->headMeta() ?>
    
    <!-- Links -->
    <?= $this->headLink() ?>

Non tutte le viste utilizzano gli stessi JS, mentre tutte le viste ereditano questo layout (struttura HTML)

quindi ad esempio una vista potrebbe utilizzare questo JS

$this->headScript()->prependFile($this->baseUrl('/js/grid.js'));

mentre altre viste

$this->headScript()->prependFile($this->baseUrl('/js/grid_new.js'));

come posso decidere, per ogni vista, quale porzione del template utilizzare???

Grazie

risposto 6 anni fa
il_dandi
X 0 X

Usi l'oggetto placeholder.

Vedi questa documentazione:

http://zendframework.com/manual/1.10/en/learning.view.placeholders.html

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Giusto per fare un appunto per la correttezza semantica, tutte le righe di codice

$this->headMeta()->prependHttpEquiv('Content-Type', 'text/html;charset=utf-8');
$this->headTitle()->setSeparator(' - ');
...

vanno inserite dentro il campo HEAD, non ad inizio pagina.

Mi saltata all'occhio questa cosa..

Ciao

Luca

risposto 6 anni fa
Luca450Mhz
X 0 X

Quindi cosa avrei sbagliato??

non gi nell'head facendo

$this->headMeta()->

risposto 6 anni fa
il_dandi
X 0 X

Non c' nessun errore.

Semplicemente l'utente Luca450Mhz suggerisce di mettere le stringhe da lui citate all'interno del tag head per pura correttezza semantica.

Io tali impostazioni addirittura eviterei di metterle nel layout ma le metterei nel file di configurazione dell'applicazione o nel bootstrap.

Il risultato comunque identico.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Grazie per i suggerimenti!!

Ma cosa consigliato/suggerito inserire nel bootstrap??

Grazie

risposto 6 anni fa
il_dandi
X 0 X

Come cosa consigliato e suggerito? Stavo facendo riferimento alle impostazioni del layout...

risposto 6 anni fa
Mario Santagiuliana
X 0 X

cosa "bisognerebbe" inserire nel bootstrap....

risposto 6 anni fa
il_dandi
X 0 X

Le risposte mi sembrano chiare... ???

P.S. scusami, intendevo zend_session, non zend_registry.

risposto 6 anni fa
Mario Santagiuliana
modificato 6 anni fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda