Как использовать макет Zend в качестве темы Wordpress?

Я написал приложение Zend и включил Wordpress для ведения блога. Когда я впервые установил Wordpress, я настроил его так, чтобы он использовал тот же заголовок и т. д., что и основное приложение. С тех пор я дважды переделывал основную тему, и мне пришлось переделывать тему Wordpress, чтобы она соответствовала. Есть ли способ для Wordpress использовать мой макет Zend? Мои первые мысли — разбить мой макет на файлы верхнего и нижнего колонтитула и включить их из Wordpress, используя полные пути. Хотя это сработало бы, но далеко не идеально (я бы предпочел сохранить файл макета в целости и сохранности).


person Richard Parnaby-King    schedule 25.05.2011    source источник
comment
думаю, вам нужна какая-то оболочка шаблона, которая заменяет заполнители в вашем макете на вещи WordPress.   -  person opHASnoNAME    schedule 25.05.2011
comment
Вы можете использовать частичные, отдельные верхний и нижний колонтитулы и включить их в структуру WordPress.   -  person Rodrigo Ferrari    schedule 25.05.2011


Ответы (4)


Если у вас есть класс страницы, который использует сценарий макета/представления или аналогичный, вы можете сделать что-то подобное в файле темы WordPress:

$page = new Page;
$page->setTitle(get_the_title());

$content = '';

if (have_posts())
{
   while (have_posts())
   {
       ob_start();
       the_post();
       $content .= ob_get_clean();
   }
}

$page->setContent($content);
...

$view = new Zend_View();
$view->page = $page;
...

Wordpress не упрощает работу со своими функциями, которые выводят вместо возврата, поэтому ob_start().

Я не знаю, лучший ли это способ, мне было бы интересно посмотреть, есть ли лучший способ.

person Gnuffo1    schedule 31.05.2011

Я разделил файл layout.phtml на части верхнего и нижнего колонтитула.

В моих файлах темы Wordpress я включаю свои части.

Более элегантным решением может быть написание моей собственной функции get_header/footer, включающей эти партиалы? Я думаю, это будет в файле function.php темы?

person Richard Parnaby-King    schedule 01.06.2011

Для многих веб-сайтов вам может потребоваться установить Wordpress для интеграции с блогами. Когда дело доходит до оформления блога, вы в значительной степени ограничены копированием html из вашего Zend_Layout в файлы Wordpress header.php и footer.php. Это дублирование, и если вы внесете какие-либо изменения в свой макет, вам также потребуется обновить тему блога. Что ж, есть еще один способ!

Измените свое приложение Zend

Создайте отдельный файл начальной загрузки для своего приложения Zend (например, следуя этому руководству: Доступ к ресурсам приложения Zend из других приложений).

<?php
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
        realpath(APPLICATION_PATH . '/../library'),
        get_include_path(),
    )));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap();

В вашем файле index.php для запуска вашего приложения:

include('bootstrap.php'); //where bootstrap.php is the file of the new bootstrap file
$application->run();

Магия Wordpress

Теперь приходит магия Wordpress.

Получить макет Zend

В папке новой темы Wordpress создайте файл с именем «Zend_Layout.php» и скопируйте/вставьте в него этот код:

<?php
//load Zend_Layout
$layout = new Zend_Layout();

//add the blog's stylesheet to the header
$view = $layout->getView();
$view->headLink()->appendStylesheet(get_bloginfo( 'stylesheet_url' ));

// Set a layout script path:
$layout->setLayoutPath(APPLICATION_PATH . "/modules/default/views/scripts");
$layout = $layout->render();

Заголовок

Измените файл header.php на:

<?php
include('zend_layout.php');
echo substr($layout, 0, strpos($layout, '<div id="container">'));
?>
    <div id="container">

Это загрузит переменную $layout из предыдущего скрипта и отобразит все до вашего основного контейнера div. Нижний колонтитул

Нижний колонтитул.php похож:

    </div><!-- #main -->
<?php

include('zend_layout.php');
echo substr($layout, strpos($layout, '<div id="footer">'));
person Richard Parnaby-King    schedule 08.09.2011
comment
WordPress — относительно тяжелая система и в лучшие времена, но накладывать на нее целый Zend_Application — это абсолютное безумие! Вы можете, если хотите, использовать Zend_Layout и Zend_View как отдельные компоненты, не загружая все остальное, что поставляется с Zend_Application. Читать документацию -› - person adlawson; 21.09.2011

Вам просто нужно передать переменные объекта представления (модель из Wordpress) в ваш макет.

Это своего рода пример того, как я использую его в своих проектах (я использую полный Zend_Layout: headLink, headTitle, headStyle...), но пункт 1 — это смешанный пример:

<?php
// Layout: New; or get from registry if it's stored in; 
// or set your own new Layout with ->setLayout().
$Layout = new Zend_Layout();
$view = $Layout->getView(); ?>

<!-- Header -->
<?php echo $Layout->render('header.phtml'); ?>
<!-- /Header -->

<?php // 1. Now assume you have an usual Wordpress loop: 
// (but IMHO I prefer use $wp_query->posts and partialLoop)
if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();
        $view->post = get_post(get_the_ID());
        $view->render('partials/article.phtml');
        // article.phtml works with $this->post as model.
    }
}

// 2. Example out of loop with $wp_query:
if ( $wp_query instanceof WP_Query && $wp_query->have_posts() ) {
    // Now, we can render your partial article template 
    // passing the posts as model:
    $view->partialLoop()->setObjectKey('post'); // $this->post in article partial template.
    $view->posts        = $view->partialLoop(   'partials/article.phtml', 
                            $wp_query->posts);
    // You can render here your $view->posts var or passing anything.
}
?>

<!-- Sidebar -->
<?php echo $Layout->render('sidebar.phtml');
// or call your Wordpress sidebars: get_sidebar('my_sidebar'); 
// but, again, I prefer use placeholders for that. ?>
<!-- /Sidebar -->

<!-- Footer -->
<?php echo $Layout->render('footer.phtml'); ?>
<!-- /Footer -->

Надеюсь, поможет ;)

person Covi    schedule 20.09.2011
comment
На самом деле вы должны предположить, что загрузка шаблонов из Zend чем-то (более или менее) похожа на функцию get_template_part() Wordpress. - person Covi; 21.09.2011