Как правильно сделать условное форматирование в проекте ZF2 MVC?

В проекте ZF2, который я разрабатываю, я хотел бы создать оболочку вокруг echo $this->content; заявление в layout.phtml, которое позволит условное форматирование основной области содержимого. В частности, я хочу поместить содержимое в столбец шириной 75% и включить некоторые "декоративные" элементы в столбец шириной 25% для большинства страниц. Тем не менее, я хочу перейти на один столбец для страниц, которые требуют больше места. Мой проект - это CMS, в которой каждая страница имеет атрибут, который может указывать либо представлению, либо контроллеру, должна ли страница быть нормальной или широкой. Я рассмотрел несколько методов для достижения того, что я после.

Мое "условное форматирование в макете" может выглядеть так:

// module/Application/view/layout/layout.phtml:
//...

  if ($templateNormal) {
     echo "<div class='col-md-9'>";
  } else {
     echo "<div class='col-md-12'>";
  }

   echo $this->content;

  if ($templateNormal) {
     echo "</div>";
     echo "<div class='col-md-3'>";
       //... ornamentation
     echo "</div>";
  } else {
     echo "</div>";
  }

//...

Хотя вышеприведенный метод мог бы работать, для чистого MVC я не думаю, что в представлении макета предполагается принятие какого-либо решения.

Мое "условное форматирование в частичных представлениях" может выглядеть так:

// module/Application/view/layout/layout.phtml:
//...

  echo $this->partial('partial/open-shell.phtml');

   echo $this->content;

  echo $this->partial('partial/close-shell.phtml');

//...


// module/Application/view/partial/open-shell.phtml:
  if ($templateNormal) {
     echo "<div class='col-md-9'>";
  } else {
     echo "<div class='col-md-12'>";
  }


// module/Application/view/partial/close-shell.phtml:
  if ($templateNormal) {
     echo "</div>";
     echo "<div class='col-md-3'>";
       //... ornamentation
     echo "</div>";
  } else {
     echo "</div>";
  }

Здесь принятие решения вынимается из представления макета, но оно просто помещается в другие представления, поэтому оно все еще находится в пакете представления и все еще не является чисто MVC.

В моем решении "условное форматирование в контроллере" пара строк html-скриптов разрабатывается в функции контроллера, а затем передается в представление. Это может выглядеть так:

// module/Application/view/layout/layout.phtml:
//...

  echo $this->open-shell-script';

   echo $this->content;

  echo $this->close-shell-script';

//...


// some controller function:
  //...
  if ($templateNormal) {
     $open-shell-script = "<div class='col-md-9'>";
     $close-shell-script = "</div>";
     $close-shell-script = "<div class='col-md-3'>";
     $close-shell-script .= //... ornamentation
     $close-shell-script .= "</div>";
  } else {
     $open-shell-script = "<div class='col-md-12'>";
     $close-shell-script = "</div>";
  }
  //...

В этом методе принятие решения осуществляется в контроллере, где, как я полагаю, должно быть, но кажется странным, что здесь пишется html.

Любые комментарии или предложения?

3 ответа

Есть много способов сделать это. Это один из методов, и логика живет в контроллере:

контроллер

public function yourSampleAction()
{
    // assign variables as usual to this view model
    $viewModel = new ViewModel(array(
       //vars
    );

    // this will be the "wrapper" and can be single, double column or anything else.
    $wrapperViewModel = new ViewModel();
    $wrapperViewModel->addChild($viewModel, 'innerContent');

    // use this line when you want one column
    $wrapperViewModel->setTemplate('path/to/your/single-column-wrapper.phtml');

    // when this line you want two columns
    $wrapperViewModel->setTemplate('path/to/your/two-column-wrapper.phtml');

    return $wrapperViewModel;        
}

две колонки-wrapper.phtml

<div class='col-md-9'>
    <?php echo $innerConntent; ?>
</div>
<div class='col-md-3'>
    <!--- something else in here? -->
</div>

один столбец-wrapper.phtml

<div class='col-md-12'>
    <?php echo $innerConntent; ?>
</div>

Создайте два макета и в методе init() модуля Module.php решите, какой макет следует использовать.

    public function init(ModuleManager $moduleManager) {
        $sharedEvents = $moduleManager->getEventManager()->getSharedManager();
        $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
// This event will only be fired when an ActionController under the MyModule namespace is dispatched.
            $controller = $e->getTarget(); 
                        $controller->layout(" your chose layout ");
                }
        }

Вместо настройки разных шаблонов вы можете настроить классы Bootstrap Twitter, сделав необходимые классы зависимыми от переменной макета. Вы можете использовать логику в ваших действиях контроллеров для передачи переменных непосредственно в макет (а не в представление) следующим образом:

$this->layout()->setVariables
        (
            array
            (
                'layoutVar1'     => 75,
                'someColClass'   => ($someSwitch ? 'col-md-9':'col-md-12' ),
                'layoutVar1'     => 75,
            )
         );

а затем просто получите доступ к этим переменным в макете, как переменные, отправленные в представление. Вам не нужно даже ставить перед ними "макет", они не будут конфликтовать.

Другие вопросы по тегам