如何在MVC首页视图中加载独立Header控制器的渲染内容?
解决方案:将Header控制器的渲染内容嵌入Home视图
你当前的问题是加载Header控制器后得到的是对象而非渲染好的HTML内容,需要通过调用控制器的业务方法+改造输出逻辑来解决,具体步骤如下:
1. 改造setOutput方法,让它返回渲染后的HTML字符串
原方法直接输出视图内容,无法捕获返回值,需要用输出缓冲来捕获视图渲染结果:
public function setOutput($data = array(), $route) { // 开启输出缓冲,捕获视图输出 ob_start(); $path = explode('/', trim($route, '/')); $file = end($path); $incl = ''; foreach ($path as $dir) { if ($dir != $file) { $incl .= $dir . '/'; } } $incl .= $file . '.php'; // 将$data数组转为视图可直接访问的变量 extract($data); require_once(DIR_VIEW . $incl); // 获取缓冲内容并关闭缓冲,返回渲染后的HTML $html = ob_get_clean(); return $html; }
2. 调整Header控制器,返回渲染好的头部内容
修改Header控制器的index方法,让它调用setOutput后返回结果:
class Header extends Controller { public function index() { // 头部所需的业务数据 $headerData = array( 'siteTitle' => '我的站点', 'navLinks' => array('首页', '关于我们', '联系') ); // 返回渲染后的头部HTML return $this->response->setOutput($headerData, 'path/to/header'); } }
3. 修改Home控制器,获取头部HTML并存入$data
加载Header控制器后,调用其index方法拿到渲染好的HTML,再传递给Home视图:
class Home extends Controller { public function index() { $data = array( 'foo' => 'bar', 'key' => 'value', 'etc' => 'another' ); // 加载Header控制器并调用index方法,得到渲染后的头部HTML $data['header'] = $this->load->controller('path/to/header')->index(); // 传递数据到Home视图 $this->response->setOutput($data, 'home'); } }
4. 在Home视图中直接输出头部
在home.php视图里,直接输出$header变量即可:
<!-- home.php 视图内容 --> <?php echo $header; ?> <div class="main-content"> <p><?php echo $foo; ?></p> <!-- 其他页面内容 --> </div>
内容的提问来源于stack exchange,提问作者user7862339
相关产品推荐
相关产品推荐

