【问题标题】:Codeigniter MY_Controller not sending variables to the viewCodeigniter MY_Controller 未将变量发送到视图
【发布时间】:2019-07-03 02:16:00
【问题描述】:

我正在使用 CodeIgniter 并尝试制作一个自定义控制器来扩展我的所有控制器。然后它将把它传递给一个布局,除了主页之外的所有代码都将是。我希望有人能告诉我我做错了什么。下面是我如何设置它以及每个控制器和视图的代码。

我做了一个MY_Controller,所以我可以从中扩展我所有的控制器。在MY_Controller 内部,我添加了一个名为loadView 的公共函数。下面是代码。

然后我从它扩展了我的Contact 控制器并调用loadView 并传递了一些变量。请参阅下面的代码。

在我的布局/主视图中,它不会看到任何变量。下面是查看标题的sn-p。

class MY_Controller extends CI_Controller
{
//    protected $trainedJobs = array();

    public function __construct()
    {
        parent::__construct();
    }
    public function loadView($layout = "main", $title = "What Do I Work", $page = "index", $xtraCSS = null, $xtraJS = null, $hideNavbar = false)
    {

        $data['$_title'] = $title;
        $data['$_view'] = $page;
        $data['$_xtraCSS'] = $xtraCSS;
        $data['$_xtraJS'] = $xtraJS;
        $data['$_hideNavbar'] = $hideNavbar;

        $this->load->view('layouts/' . $layout, $data);
    }
}

我的联系人控制器

class Contact extends MY_Controller
{
    public function index()
    {

        $this->loadView('main',"Contact Us", 'contact', 'base_url("assets/css/contact-us.css")');
    }

}

在我的主布局视图中

<!DOCTYPE html>
<html>
<head>
    <title><?php if (isset($_title)) echo $_title; ?></title>
</head>
<body>

<?php if (isset($_view) && $_view)
$this->load->view($_view);
?>

</body></html>

【问题讨论】:

  • 注意到你的合约控制器上有4 parameters,而你的自定义控制器上有6 parameters。那显然是有错误了。
  • @Roshan 所有loadView() 参数都是可选的,因此您可以使用0-6 个参数来调用它。

标签: php codeigniter


【解决方案1】:

问题在于您使用的变量名称,例如:

$data['$_title'] = $title;

数组键($_title)将成为视图中的变量名。但是没有办法解决以$ 开头的变量名,事实上这不是合法的变量名AFAICT。 According to the PHP docs一个变量名:

...以字母或下划线开头,后跟任意数量的字母、数字或下划线。

根本没有提到$ 是一个合法字符——而且它绝对不能是第一个字符。

我很好奇并经过测试,但 $$_title 不起作用,${$_title} 也不起作用(该语法适用于 variable-variables, which are perfectly legal)。

AFAICT 你没有尝试使用变量,所以我认为这是一个简单的错字,你需要做的就是从你的数组键中删除那些 $s:

$data['_title']      = $title;
$data['_view']       = $page;
$data['_xtraCSS']    = $xtraCSS;
$data['_xtraJS']     = $xtraJS;
$data['_hideNavbar'] = $hideNavbar;

【讨论】:

  • 好的,谢谢!我不知道我是怎么错过的。
【解决方案2】:

正如 Dont_panic 正确建议的那样,不要在键中使用 $

另外传这么多参数总会出现这种问题,你要记住它们的先后顺序并相应地传递。

如果您想为需要运行的每个页面动态加载 CSS 和 JS 文件。使用数据库获取您需要的数组中的页面文件,并由foreach($file['css'] as $key =&gt; $value)foreach($file['js'] as $key =&gt; $value) 使用,或者在模型中创建一个数组并返回。

例子

public function get_contact_files() {
$params['css'] = array(
0 => 'assets/css/file_1.css',
1 => 'assets/css/file_2.css',
2 => 'assets/css/file_3.css',
);
$params['js'] = array(
0 => 'assets/js/file_1.js',
1 => 'assets/js/file_2.js',
2 => 'assets/js/file_3.js',
);

return $params;
}

在控制器中

$data['common'] = array(
        'page_title' => 'My Page Title',
        'page_heading' => 'My Page Heading'
);
$this->load->model('File_model');
$data['file'] = $this->File_model->get_contact_files();

在视图中

<html>
        <head>
                <title><?php echo $common['page_title']; ?></title>
<?php foreach($file['css'] as $key => $value) { ?>
    <link rel="stylesheet" href="<?php echo base_url($value); ?>">
<?php } ?>
        </head>
        <body>
        <h1><?php echo $common['page_heading']; ?></h1>
<?php foreach($file['js'] as $key => $value) { ?>
<script src="<?php echo base_url($value); ?>"></script>
<?php } ?>
        </body>
</html>

建议一:内置模板库,以备不时之需

在控制器中

$this->load->library('parser');

$data = array(
        'page_title' => 'My Page Title',
        'page_heading' => 'My Page Heading'
);

$this->parser->parse('ur_page_view', $data);

在你看来

<html>
        <head>
                <title>{page_title}</title>
        </head>
        <body>
        <h1>{page_heading}</h1>
        </body>
</html>

建议 2:如果您想在该特定控制器的所有函数中传递相同的变量,请使用

<?php

class Page extends CI_Controller{

    function __construct()
    {
        parent::__construct();
        $data['page_title'] = 'My Page Title';
        $data['page_heading'] = 'My Page Heading';
        $this->load->vars($data);       
    }

    function name()
    {
        $this->load->view('ur_page_view',$data);
    }

在视图中

<html>
        <head>
                <title><?php echo $page_title; ?></title>
        </head>
        <body>
        <h1><?php echo $page_heading; ?></h1>
        </body>
</html>

如果有帮助请投票

【讨论】:

    猜你喜欢
    • 2014-03-28
    • 2023-03-22
    • 2012-05-18
    • 2018-02-21
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多