带有2D阵列的CodeIgniter模板库


CodeIgniter Template Library with a 2D array

我正在使用以下模板库。我想做的是在模板中加载一个或多个上部视图,作为一个数组,这样我就可以使用for each循环轻松地将它们加载到模板中。

这是一个如何在控制器上使用的简单示例:

    function index() {
    $data['title']  = 'My page title';
    $partials = array('content'=>'c_location'); //Load view about inside the template.
    $this->template->load('main', $partials, $data);
    }

在视图上,你有一个类似于html的:

    <html>
    ....
    <?=$content?>
    ...
    </html?>

这是我尝试使用的:控制器:

   $partials = array('content'=>'c_location',
       array(
       'first_upper_content'=>'1_u_location','second_upper_content'=>'2_u_location'
       ) 
   );

例如,我可以传递upper_content,一个顶部标题为"first_upper_content",一个幻灯片为"second_upper_content",然后传递其余内容为"content"。

Html:

    ...
     <?=$upper_content?> 
     <--if upper_content is a array, 
     I could display each content with a for loop-->
     <?=$content?>

当我尝试我得到的一切:

消息:pathinfo()期望参数1为字符串,给定的数组

文件名:core/Loader.php

线路编号:759

我该如何实现?我正在考虑修改

//将视图加载到var数组中

在模板内部。hp&在html中添加foreach循环;

这就是您想要的:

    // Load views into var array
    foreach(array_flat($view) as $key => $file)

在Template.php中包含"array_folat"函数调用,如上所示。

您需要定义此函数。您可以在任何自动加载的帮助程序中执行此操作,甚至可以将其包含在自己的Template类中(在这种情况下,您应该在上面的代码中将其称为$this->array_flat)。给你:

function array_flat($array)
{
    $result = array();
    foreach ($array as $key => $value)
    {
        if (is_array($value))
        {
            $result = array_merge($result, array_flat($value));
        }
        else
        {
            $result[$key] = $value;
        }
    }
    return $result;
}

您想要做的事情在该库中是不可能的。

您收到的错误表明CI Loader类正在传递无效数据。因此,看看库的加载函数,你的代码就会在这里失败:

    // Load views into var array
    foreach($view as $key => $file)
    {
        $tpl[$key] = $this->CI->load->view($file, $vars, TRUE);
    }

库将$partials中的嵌套数组直接传递给CI加载器。有了你的数据,这条线就变成了:

$tpl[0] = $this->CI->load->view(array(
       'first_upper_content'=>'1_u_location','second_upper_content'=>'2_u_location'
       ), vars, TRUE);

您可以在CI用户指南中看到无效的内容。在我看来,你的选择是要么彻底改革图书馆,要么改变你的方法。

只需制作主模板视图,并在其中包含以下内容:

$this->load->view('header');
if (is_array($page) {
    foreach($page as $key=>$val){
        $this->load->view($key, $val); // $val being optional parameters
    }
} else {
    $this->load->view($page);
} 
$this->load->view('footer');

在控制器中,$data['page']将包含视图信息,可以是其名称(字符串),也可以是要按顺序调用的名称数组。当然,您必须使用这些名称预先制作好视图。

这是我的想法,但它应该做你想做的事。这是在没有模板库的情况下完成的,只有普通的CI。

要加载部分,只需要使用:

$this->load->view('partial_location',$data);

您的主视图内部。因此,如果你有一个名为home_page.php的主视图,并且你想加载页眉和页脚的部分,你可以使用:

$this->load->view('header');
// Main page layout
$this->load->view('footer');

如果你想在你的部分中使用自定义不同的数据,只需在你的控制器中定义它们:

$data = array(
   'content'        => 'about',
   'header_content' => 'Welcome to the site!',
   'footer_content' => 'Made by me!'
);

在您的主视图文件中:

$this->load->view('header',$header_content);
// would echo 'Welcome to the site!'
echo $content;
// would echo 'about'
$this->load->view('footer',$footer_content);
// would echo 'Made by me!'