Где я должен найти логику, связанную с макетом в Zend Framework? - PullRequest
2 голосов
/ 16 июня 2011

Мне нужно настроить атрибуты моего тега body. Где я должен найти логику? В базовом контроллере просмотрите Helper?

Это должен быть макет

<?=$this->doctype() ?>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        ...
    </head>
    <body<?=$this->bodyAttrs?>>  <!-- or <?=$this->bodyAttrs()?> -->
        ...
    </body>
</html>

И это должно быть объявление переменных в контроллерах

class Applicant_HomeController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $this->idBody = "someId1";
        $this->classesBody = array("wide","dark");
    }

    public function loginAction()
    {
        $this->idBody = "someId2";
        $this->classesBody = array();
    }

    public function signUpAction()
    {
        $this->idBody = "someId3";
        $this->classesBody = array("no-menu","narrow");
    }
}

Это функция объединения атрибутов.

/**
  * @param string $idBody     id Attribute
  * @param array $classesBody class Attribute (array of strings)
  */
protected function _makeBodyAttribs($idBody,$classesBody)
{
    $id = isset($idBody)?' id="'.$idBody.'"':'';
    $hasClasses = isset($classesBody)&&count($classesBody);
    $class = $hasClasses?' class="'.implode(' ',$classesBody).'"':'';
    return $id.$class;
}

Мне нужен последний код клея.

1 Ответ

2 голосов
/ 17 июня 2011

Есть лучше для тебя:

<?php
class My_View_Helper_Attribs extends Zend_View_Helper_HtmlElement
{

    public function attribs($attribs) {
        if (!is_array($attribs)) {
            return '';
        }
        //flatten the array for multiple values
        $attribs = array_map(function($item) {
           if (is_array($item) {
                return implode(' ', $item)
           }
           return $item;
        }, $attribs);
        //the htmlelemnt has the build in function for the rest
        return $this->_htmlAttribs($attribs)
    }
}

в вашем контроллере:

public function indexAction()
{
    //notice it is $this->view and not just $this
    $this->view->bodyAttribs= array('id' => 'someId', 'class' => array("wide","dark"));
}

public function loginAction()
{
    $this->view->bodyAttribs['id'] = "someId2";
    $this->view->bodyAttribs['class'] = array();
}

в вашем сценарии просмотра:

<body <?= $this->attribs($this->bodyAtrribs) ?>>
...