Как использовать Zend Framework только для макетов?

Недавно меня пригласили помочь с проектом, который состоял из отдельных файлов HTML, за исключением контактной формы PHP. Так что нет даже намека на объектно-ориентированное программирование, MVC или макеты (или даже PHP в этом отношении).

Проект довольно большой, но я хотел постепенно интегрировать Zend Framework в этот проект, в основном, чтобы начать использовать макеты. Существует так много избыточностей, что делать небольшие обновления, которые следовало бы сделать в одном файле, - это такая трата времени.

На заре PHP можно было разделить блоки содержимого, включив их на каждую страницу (например, верхний и нижний колонтитулы). Теперь, используя фреймворки MVC, такие как Zend Framework, вы можете создавать файлы макета, которые включают индивидуальное содержимое страницы (представления) с помощью помощника представления. Мне это очень нравится, потому что это означает, что мне нужно «включить» мой верхний или нижний колонтитул только в одном месте.

Однако я не уверен, как это будет работать без отправки / начальной загрузки приложения (т.е. вместо использования компонентов Zend Framework MVC в качестве автономных компонентов). Как лучше всего переключить сайт на использование макетов? Как это будет работать? Это вообще хорошая идея?


person Andrew    schedule 12.05.2009    source источник


Ответы (6)


Недавно я начал преобразование файловой структуры mish-mash *, чтобы использовать макет и представления ZF. Цель состоит в том, чтобы переместить все файлы, содержащие html, в рекомендуемую файловую структуру для макетов и видов. Вот как к этому подготовиться:

  1. Извлеките всю разметку из каждого файла, сохраните в нем переменные, но без логики. Присвойте этому файлу имя /application/views/scripts/<▪page
  2. Создайте скелет, который подходит для большинства страниц, как /application/layouts/scripts/< sizeslayout

    <?php echo $this->doctype('XHTML1_STRICT'); ?>
    <html>
    <head>
        <?php echo $this->headLink(); ?>
    </head>
    <body>
        <div id="wrapper">
        <?php echo $this->layout()->content; ?>
        </div>
    </body>
    </html>
    
  3. (Добавьте Zend в свой путь включения и зарегистрируйте его автозагрузчик.) Создайте файл, который будет включен во все ваши файлы (если у вас нет единственная точка входа, в этом случае - поместите ее туда!) Создайте ссылку на свой макет, эквивалентную этой:

    $view = new Zend_View();
    $view->setScriptPath('/application/views/scripts');
    
    $layout = new Zend_Layout();
    $layout->setLayoutPath('/application/layouts/scripts');
    $layout->setView($view);
    
    Zend_Registry::getInstance()->set('layout', $layout);
    
  4. Каждый оставленный php-файл (с логикой, а не html) должен иметь доступ к макету и изменять его:

    $layout = Zend_Registry::getInstance()->get('layout');
    
    $view = $layout->getView();
    $view->headLink()->appendStylesheet('/css/a_css_file.css');
    
    // most important step, done automatically when using MVC, but now you have to do it manually
    $layout->content = $view->render('index/login.phtml');
    
    echo $layout->render();
    
  5. Следующим наиболее важным шагом будет добавление еще одного макета:

    // /application/layouts/scripts/blank.phtml
    <?php echo $this->doctype('XHTML1_STRICT'); ?>
    <html>
        <head></head>
        <body>
            <?php echo $this->layout()->content; ?>
        </body>
    </html>
    

    и в одном из ваших логических файлов

    $layout = Zend_Registry::getInstance()->get('layout');
    $layout->setLayout('blank');
    

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

* Один файл: модель, контроллер, html, в произвольном порядке.

person chelmertz    schedule 11.10.2009

Вы, безусловно, можете использовать Zend_Layout изолированно, и это подробно описано в руководстве:

28.2.3. Использование Zend_Layout как отдельного компонента

Я считаю, что тогда вам нужно будет захватить вывод сценария через буферизацию вывода и передать его в макет для отображения.

Эта ситуация не идеальна, и, не переходя к полной версии MVC, я бы, вероятно, порекомендовал использовать другую базовую систему шаблонов или следовать советам в других комментариях здесь.

person David Snabel-Caunt    schedule 15.05.2009

Лично я бы рекомендовал не использовать Zend Framework, если вы планируете использовать его только для управления шаблонами / макетами. Существуют гораздо лучшие решения для создания шаблонов с помощью PHP, очевидным выбором является Smarty (ранее входивший в проект PHP).

Smarty действительно обеспечивает достаточно простую интеграцию с Zend Framework, если вам понадобится сделать это позже, и есть несколько статей об этом на Zend DevZone.

person James B    schedule 12.05.2009
comment
Я бы не рекомендовал использовать smarty, для меня это дополнительный уровень вычислений, в котором нет необходимости. Я обнаружил, что придумываю различные хитрости для умных вещей, которым требовалось 2-3 строчки в php, просто потому, что эти вещи не поддерживались в умном синтаксисе. - person Gabriel Solomon; 12.05.2009
comment
Ваше мнение отличается, значит, стоит проголосовать против? Ух ты. Я думал, в подписи сказано: этот ответ бесполезен. - person James B; 12.05.2009
comment
да, я тоже подумал, что это было интересно. Это не то, для чего нужны голоса против. - person Andrew; 12.05.2009

Я не уверен, что это то, что вы ищете, но на BBC есть несколько видеороликов, в которых используются части фреймворка zend без использования всего MVC. Я думаю, что они находятся в частях 4 и 5, http://bbcwebdevelopers.blip.tv/

person Community    schedule 15.05.2009

Zend_Layout на самом деле не предназначен для включения верхнего или нижнего колонтитула, скорее его лучше всего использовать для вставки различных фрагментов контента в один большой шаблон. Это довольно сложно, и, помимо обычных вариантов использования, таких как вставка основного текста контента, вы можете вставлять теги HEAD, такие как CSS, скрипты или теги заголовков, а также настраиваемые заполнители, такие как навигация.

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

Если вы действительно хотите использовать это для изучения Zend Framework, вы можете использовать Zend_Layout в автономном режиме, как предлагает dcaunt. Нет смысла пытаться использовать систему начальной загрузки MVC, поскольку вашему сайту она, похоже, не нужна. Я бы просто сделал что-то вроде перезаписи URL, чтобы отправить все запросы * .html в один файл PHP, который затем запускает Zend_Layout и загружает запрошенный файл в переменную $ layout-> content через что-то вроде file_get_contents ()

Вы также можете использовать ZF для обработки форм, если хотите.

person simonrjones    schedule 21.07.2009

Я не думаю, что вы можете сделать это по умолчанию, я думаю, вам также нужно использовать Zend View. Но я уверен, что вы можете изменить Zend_Layout для работы с существующими настройками. Извините, я не могу сказать более конкретно, как это сделать, потому что это во многом зависит от того, что уже есть.

В качестве отправной точки я рекомендую изучить возможности интеграции Smarty с Zend, чтобы увидеть, как вы можете его изменить.

person Gabriel Solomon    schedule 12.05.2009
comment
А в другом своем комментарии вы не рекомендуете Smarty? - person d-_-b; 09.09.2010