PHPBlog.it

symfony: le viste

Con oggi esploreremo l’argomento viste, template e layout con symfony.

Ma prima di questo, voglio solo aggiornare il codice postato l’altro giorno. La funzione findData infatti non è ottimizzata, in quanto carica tutti i record indiscriminatamente. Per questo va modificata come segue:

private function findData($forumID)
{
$c = new Criteria();
$c->add(ForumPeer::PARENT_ID, $forumID);
$this->childs = ForumPeer::doSelect($c);
$c = new Criteria();
$c->add(ThreadPeer::FORUM_ID, $forumID);
$c->addDescendingOrderByColumn(ThreadPeer::UPDATED_ON);
$this->limit = ($this->getRequest()->getParameter('page', 1) * 10) - 1;
$this->offset = ($this->getRequest()->getParameter('page', 1) - 1) * 10;
$this->page = $this->getRequest()->getParameter('page', 1);
$c->setLimit($this->limit);
$c->setOffset($this->offset);
$this->threads = ThreadPeer::doSelect($c);
}

Con questo codice aggiungo ai criteri di selezione un ordinamento discendente sulla colonna updated_on, ed aggiungo un limite ed un offset in base al parametro get <code>page</code>. Utilizzo la forma $this->limit e non semplicemente $limit (anche per offset e page) perché avrò bisogno di accedere ad essi nella vista..

..che vi presento ora (apps/frontend/modules/forum/templates/viewSuccess.php):

<?php foreach ($forum->getPath() as $path): ?>
<?php echo link_to($path->getTitle(),'@view_forum_by_title?title='.$path->getTitle()) ?> >>
<?php endforeach; ?>

<h1><?php echo $forum->getTitle() ?> Forum</h1>
<h3><?php echo $forum->getDescription() ?></h3>

<?php if (count($childs) > 0): ?>
<h2>Sub Forums:</h2>
<ul>

<?php foreach ($childs as $child): ?>
<li><?php echo link_to($child->getTitle(),'@view_forum_by_title?title='.$child->getTitle()) ?></li>
<?php endforeach; ?>

</ul>
<?php endif; ?>

<h2>Threads:</h2>
<?php if (count($threads) > 0): ?>
<ul>

<?php foreach ($threads as $thread): ?>
<li><?php echo link_to($thread->getTitle(),'@view_thread_by_title?id='.$thread->getID().'&title='.$thread->getTitle()) ?></li>
<?php endforeach; ?>

</ul>
<?php if ($page > 1): ?>
<?php echo link_to('< '.($page - 1).' <', '@view_forum_by_title?id='.$forum->getID().'&title='.$forum->getTitle().'&page='.($page - 1), array ('class' => 'pager')) ?>
<?php endif; ?>

<?php if ($forum->getThreadsNumber() > $limit): ?>
<?php echo link_to('> '.($page + 1).' >', '@view_forum_by_title?id='.$forum->getID().'&title='.$forum->getTitle().'&page='.($page + 1), array ('class' => 'pager')) ?>
<?php endif; ?>

<?php else: ?>

<h3>No threads in this forum</h3>
<?php endif; ?>

<?php if ($sf_user->can('create_thread')): ?>
<?php echo link_to('Create new Thread!','@new_thread_in_forum?id='.$forum->getID().'&title='.$forum->getTitle()) ?>
<?php endif; ?>

Ripeto che comunque è un work in progress, modifico il progetto ogni giorno quindi è soggetto a modifiche. Alla fine di questi post su symfony renderò disponibile la versione finale.

Da notare come le variabili che nel controller sono nella forma $this->variabile nella view sono semplicemente $variabile.
Per il resto faccio notare che i metodi $forum->getPath() e $user->can(‘create_thread’) sono definite da me rispettivamente in lib/model/Forum.php e apps/frontend/lib/myUser.class.php. Le vedremo meglio in seguito, per ora sappiate che servono per ottenere il percorso in cui è il forum, partendo la forum id#1, passando per i figli, mentre la seconda gestisce i permessi dell’utente corrente (o nessun utente, nel caso non sia loggato).

Questa è la vista legata alla singola azione, ma c’è altro. Ogni applicazione in symfony ha un layout definito in apps/*/config/view.yml. Apriamolo e si presenterà cosi:

default:
http_metas:
content-type: text/html

metas:
title:        Shiny!
#description:  symfony project
#keywords:     symfony, project
#language:     en
robots:       index, follow

stylesheets:    [main, default, my]

javascripts:    []

has_layout:     on
layout:         layout</pre>

has_layout specifica che l’applicazione ha un template generale, mentre la criptica riga seguente layout: layout dice a symfony che il layout dell’applicazione avrà nome layout.php, nella cartella apps/*/templates/.

Ed ora vediamolo, il nostro layout.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php include_http_metas() ?>
<?php include_metas() ?>
<?php include_title() ?>
</head>
<body>
<!-- start header -->
<div id="header">
<div id="logo">
<h1><?php echo link_to('Shiny!','@homepage') ?></h1>
<p>Built with <?php echo link_to('symfony 1.1','http://www.symfony-project.org') ?></p>
</div>
<div id="search">
<form method="post" action="<?php echo url_for('forum/search') ?>">
<fieldset>
<input id="s" type="text" name="s" value="" class="text" />
<input id="x" type="submit" value="Search" class="button" />
</fieldset>
</form>
</div>
</div>
<!-- end header -->
<!-- start page -->
<div id="page">
<!-- start content -->
<div id="content">
<?php echo $sf_content ?>
</div>
<!-- end content -->
<!-- start sidebar -->
<div id="sidebar">
<ul>
<li>
<h2><?php echo (($sf_user->isLogged()) ? $sf_user->getName() : 'User') ?> Menu</h2>
<ul>
<?php if($sf_user->isLogged()): ?><li><?php echo link_to('Control Panel','@user_control_panel') ?></li>
<li><?php echo link_to('Logout','@user_logout') ?></li>
<?php else: ?><li><?php echo link_to('Login','@user_login') ?></li>
<li><?php echo link_to('Register','@user_registration') ?></li>
<?php endif; ?></ul>
</li>
<li>
<h2>Misc</h2>
<ul>
<li><?php echo link_to('Advanced search','@advanced_search') ?></li>
</ul>
</li>
</ul>
</div>
<!-- end sidebar -->
<div class="clearer"> </div>
</div>
<!-- end page -->
<!-- start footer -->
<div id="footer">
<p>©2008 All Rights Reserved.  • </a></p>
</div>
<!-- end footer -->
</body>
</html>

Tralasciando la struttura fatta di div per l’aspetto grafico per l’applicazione, sottolineo come $sf_content contenga il risultato dell’elaborazione del template per il resto sono altre funzioni semplici come quelle definite su $sf_user, che come detto tratterò in seguito.

Ora spiego la funzione link_to(), utilizzata più volte: il primo parametro è il testo che apparirà nel link, il secondo è la destinazione del link. Se è una stringa come quelle utilizzate da me, preceduta dal simbolo @, allora symfony cercherà la regola con quel nome definita nel file di routing, altrimenti accetterà un valore del tipo “modulo/azione”, con eventuali parametri nella classica forma “?parametro=valore&parametro2=valore2″. Inoltre link_to ha un terzo parametro facoltativo, che è un array associativo dove possiamo definire ad esempio classe, id ed altre proprietà del link. Funziona cosi:

<?php echo link_to('Questo è un link', 'modulo/azione?parametro1=valore1&parametro2=valore2', array('class' => 'classe1', 'id' => 'id1')) ?>

Per oggi è tutto, alla prossima!

Commenti

  • Questo articolo è stato segnalato su ZicZac.it….

  • upnews.it scrive:

    symfony: le viste…

    Con oggi esploreremo l’argomento viste, template e layout con symfony.

    Ma prima di questo, voglio solo aggiornare il codice postato l’altro giorno. La funzione findData infatti non è ottimizzata, in quanto carica tutti i record indiscriminatament…

  • Lascia un Commento

    *