所以我正在开发一个想要在主页上显示所有页面(大部分)的网站。在此过程中,我试图通过为客户提供实际页面来编辑网站的每个“部分”,从而使客户更容易管理。然而,这比我想象的更具挑战性。
我当前的代码是这样的:
<?php
defined('C5_EXECUTE') or die("Access Denied.");
global $c;
$old_c = $c;
// render page object
$_v = View::getInstance();
$old_theme = $_v->getTheme();
$oldDirectory = $_v->getThemeDirectory();
// change theme
$theme = PageTheme::getByHandle('blankTheme');
$_v->setTheme($theme);
foreach ($pages as $page) {
if ($page->getCollectionID() != HOME_CID) {
$c = $page;
$page_name = strtolower( $c->getCollectionName() );
// start output buffering
$_v->setCollectionObject($c);
ob_start();
$_v->render('default');
// get page content
$content = ob_get_contents();
// stop output buffering
if (ob_get_level() > OB_INITIAL_LEVEL) {
ob_end_clean();
}
// process page content..
echo "<section id='$page_name'>$content</section>";
}
}
$c = $old_c;
$_v->setTheme($oldTheme); // precaution
$_v->setThemeDirectory($oldDirectory); // precaution
// Because the above doesn't work in resetting it for some crazy reason
$_v->ptHandle = "newTheme";
$_v->theme = str_replace('blankTheme', 'newTheme', $_v->theme);
$_v->themePath = str_replace('blankTheme', 'newTheme', $_v->themePath);
$_v->themeDir = str_replace('blankTheme', 'newTheme', $_v->themeDir);
$_v->themePkgID = 0;
?>
您已经注意到其中有一些“时髦”的东西 - 即整个主题的变化。让我解释一下 - 这是一个页面列表模板。它接收页面,将它们分配为“$c”,然后继续尝试渲染页面视图。通常,这将包括页眉和页脚,但是我们创建了一个名为“blankTheme”的新主题(我们当前的主题称为“newTheme”),其中包含空页眉和页脚,因为没有真正的方法来输出它,否则它似乎 - 我尝试在同一主题中创建“空”模板,但它们从未被选中。
所以至少这看起来有效。但是,我现在有另一个问题,当它尝试渲染单个页面时,它不会获取任何内容,而只是返回空内容。我尝试了各种方法来显示单页内容,但无论我做什么,它总是空白。它呈现的唯一时间是通过访问 URL 加载页面时。即使我将渲染操作更改为
$_v->render($c);
我仍然没有得到任何回报(我知道在示例中我使用的是“默认”,但我尝试将其设置为单页面名称,但仍然无济于事)。
页面上肯定有内容,但它不会渲染任何内容(甚至 HTML),并且 $innerContent 肯定是空的。
我过去问过类似的事情,但并没有感到高兴,但是鉴于我刚刚在这方面浪费了几个小时,我觉得我至少必须问一下。因此,如果您有任何想法,听到它们将会很棒。
感谢您花时间阅读。
丹。
我找到了答案,我把它放在C5论坛上,可以在这里找到http://www.concrete5.org/community/forums/customizing_c5/manually-render-a-single-page-how/#604028