Codeigniter MY_Controller不向视图发送变量

时间:2019-02-08 19:40:51

标签: php codeigniter

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

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

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

在我的布局/主视图中,它将看不到任何变量。以下是查看标题的代码段。

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>

2 个答案:

答案 0 :(得分:2)

问题出在您使用的变量名上,例如:

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

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

  

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

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

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

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

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

答案 1 :(得分:0)

根据Dont_panic的正确建议,请勿在密钥中使用using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["GenericDB.Properties.Settings.GenericDBConnectionString"].ToString())) { try { string query = "SELECT name, siteID FROM site"; SqlDataAdapter da = new SqlDataAdapter(query, conn); conn.Open(); DataSet ds = new DataSet(); da.Fill(ds, "site"); cmbOrderReceiving.DisplayMember = "name"; cmbOrderReceiving.ValueMember = "siteID"; cmbOrderReceiving.DataSource = ds.Tables["site"]; }

传递太多的参数总是会导致这类问题,您必须记住它们的顺序并相应地传递它们。

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

示例

foreach($file['js'] as $key => $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();

建议1::如果您要使用内置的模板库,

在控制器中

<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);

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

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

可见

<?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);
    }
  

如果有帮助,请投票