我正在使用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>
答案 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);
}
如果有帮助,请投票