Как использовать Zend Layout в качестве темы Wordpress? - PullRequest
5 голосов
/ 25 мая 2011

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

Ответы [ 4 ]

0 голосов
/ 21 сентября 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 -->

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

0 голосов
/ 01 июня 2011

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

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

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

0 голосов
/ 08 сентября 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.

Get Zend Layout

В новой папке 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 из предыдущего скрипта и отобразит все до вашегоосновной контейнерFooter

footer.php похож:

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

include('zend_layout.php');
echo substr($layout, strpos($layout, '<div id="footer">'));
0 голосов
/ 31 мая 2011

Если у вас есть класс страницы, который использует скрипт макета / представления или похожий, вы можете сделать что-то подобное в файле темы 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 ().

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

...