Nieco ponad tydzień temu otrzymałem maila z zapytaniem jak przy pomocy Zend_Layout wykonać układ wielokolumnowy. Wbrew pozorom nie jest to proste do wykonania, ponieważ do wyboru mamy kilka możliwości. Najprostszą z nich byłoby napisanie helpera widoku, który naszpikowany if-ami wyświetlałby stosowną zawartość. O ile w przypadku prostej aplikacji niewymagającej drastycznych zmian wyglądu dynamicznej kolumny, zdałoby to egzamin, tak w momencie gdy kolumny będą znacząco się od siebie różnić w zależności od aktualnej akcji, możemy stworzyć potworka, którego będziemy wstydzili się pokazać nawet niewidomej osobie.

Nie oznacza to, że powinniśmy całkowicie zrezygnować z helperów widoku. Wręcz przeciwnie, będą one stanowić podstawę dynamicznej kolumny. Wystarczy dodać skrypt widoku oraz pobrane z modelu dane, a całość przekazać do layotu. Resztą zajmie się Zend.

Zacznijmy do helpera widoku. Poniższy przykład będzie bardziej niż prosty – ma celu zaprezentowanie idei opisywanego rozwiązania.

class Zend_View_Helper_Column1 extends Zend_View_Helper_Abstract
{
    public function column1(array $data)
    {
        $this->view->data = $data;
        return $this->view->render('column1.phtml');
    }
}

Helper przyjmuje tablicę z danymi, a następnie wyświetla je przy pomocy skryptu widoku, który prezentuje się następująco.

Aktywni użytkownicy
<ul>
    <?php foreach ($this->data as $userName): ?>
        <li><?php echo $userName; ?></li>
    <?php endforeach; ?>
</ul>

Mamy już helper oraz skrypt widoku, pora zająć się layoutem. Załóżmy, że nasza aplikacja będzie składać się z dwóch kolumn.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>multicolumn layout</title>
    </head>
    <body>
        <section class="content">
            <?php echo $this->layout()->content; ?>
        </section>
        <aside class="aside">
            <?php echo $this->layout()->aside; ?>
        </aside>
        <div class="clear"></div>
    </body>
</html>

Domyślnie Zend Framework przekazuje do placeholdera o nazwie content zawartość skryptu widoku bieżącej akcji. My wykorzystamy ten sam mechanizm do wyświetlenia dodatkowej kolumny. Stąd właśnie w powyższym kodzie znalazł się placeholder aside. Ponieważ Zend Framework nie wie co ma się w nim znaleźć, nie będzie on nic wyświetlał. Sami musimy zadbać o poinformowanie ZF jaka treść ma wyświetlić. A zrobimy to w akcji kontrolera.

public function indexAction()
{
    $this->_helper->getHelper('Layout')->assign(
        'aside',
        $this->view->column1(array('Jan Kowalski', 'Ewa Nowak'))
    );
}

W prawdziwej aplikacji dane przekazane do helpera będą pochodzić z modelu, jednak dla uproszczenia przykładu, zastosowałem najzwyklejszą tablicę.

I to już wszystko co jest potrzebne do wykonania wielokolumnowego układu strony z dynamiczną kolumną. Nie jest to uniwersalne rozwiązanie, ponieważ jak to zwykle w życiu bywa, wszystko zależy od aplikacji, nad którą właśnie pracujemy. Niemniej w większości przypadków sprawdzi się doskonale i będzie wymagać jedynie drobnych modyfikacji.

Kompletny kod aplikacji znajdziecie na GitHubie.