我无法使用直接链接直接加载我的CodeIgniter views
文件夹中子文件夹中的视图。
这是文件夹结构:
my_project/
application/
views/
pages/
about.php
about/
organization.php
history.php
我需要通过以下链接访问organization.php
和history.php
:
<div id="container">
<ul>
<li>
<a href='<?php echo base_url('about'); ?>'>About</a>
</li>
<li>
<a href='<?php echo base_url('about/organization'); ?>'>About/Organization</a>
</li>
<li>
<a href='<?php echo base_url('about/history'); ?>'>About/History</a>
</li>
</ul>
</div>
但是我得到了404。
我的htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /my_project/
# Removes index.php from ExpressionEngine URLs
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteRule (.*?)index\.php/*(.*) /my_project/$1$2 [R=301,NE,L]
# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /my_project/index.php/$1 [L]
</IfModule>
这是指向我的默认视图控制器routes.php
的{{1}}:
Pages::view(path/to/file)
这是我的控制器:
$route['default_controller'] = 'welcome';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;
$route['pages/(:any)/(:any)'] = 'pages/view/$1/$2';
$route['(:any)'] = 'pages/view/$1';
每当我直接使用时,注意
<?php
class Pages extends CI_Controller
{
function __construct()
{
parent::__construct();
}
public function view($page = 'home')
{
if(!file_exists(APPPATH.'views/pages/'.$page.'.php'))
{
show_404();
}
$data['title'] = strtoupper(str_replace(["-", "–"], ' ', $page));
$this->load->view('templates/header', $data);
$this->load->view('pages/'.$page, $data);
$this->load->view('templates/footer', $data);
}
}
没关系。与打印相同:
$this->load->view('pages/views/about/organization');
我不知道可能搞砸了什么。
我是否必须为这些子文件夹制作自定义控制器?这是我现在能想到的唯一解决方案。
注意我还将此子文件夹(实际上是整个项目)的权限设置为file_exists(APPPATH.'views/pages/about/organization.php');
,直接链接仍无效。
注意我现在唯一的解决方案是为每个子文件夹创建单独的控制器,只是为了查看它们!仅仅一个控制器真的不可能吗?
与网址格式777
一样严格,my_app/controller/method
是不允许的,除非my_app/folder/view
和folder
分别对应view
和controller
?
解
Shantay,你留下来! Thank you。
你是对的,我想要一个泛型方法来捕获我所有的静态页面查看请求。我们现在可以解决这个问题(我将在20小时内给予奖励)。
答案 0 :(得分:1)
在完成你的问题之后,我发现你正在尝试编写一些通用函数来处理你的视图。请参阅下面的代码,你可以处理codeigniter中的任何结构。
控制器功能将如下所示
public function view($folder='',$page = 'home')
{
$path = $folder!=""?$folder.'/':'';
$path = $page!=""?$path.$page:$page;
$this->load->view('templates/header', $data);
**$this->load->view($path, $data);**
$this->load->view('templates/footer', $data);
}
现在,在您的观看中,链接将如下所示:
<div id="container">
<ul>
<li>
<a href='<?php echo base_url."about/"; ?>'>About</a>
</li>
<li>
<a href='<?php echo base_url."about/organization" ?>'>About/Organization</a>
</li>
<li>
<a href='<?php echo base_url."about/history" ?>'>About/History</a>
</li>
</ul>
另请注意在Codeigniter中您不需要手动处理404.只需添加以下内容即可显示您的自定义
$route['404_override'] = 'mycustom404';//mycustom404 is controller for 404
如果您有任何疑问或疑问,请与我联系。
此致 Zeeshan。
答案 1 :(得分:0)
我认为CodeIgniter的URI模式严格为controller/method
,并且对subfolder/view_file
不感兴趣。
我刚为About
创建了一个控制器,其中包含将显示该页面的方法organization
和history
。
<?php
class About extends CI_Controller
{
function __construct()
{
parent::__construct();
$this->load->helper('url');
}
function organization($page = 'organization')
{
if(!file_exists(APPPATH.'views/pages/about/'.$page.'.php'))
{
show_404();
}
$data['title'] = strtoupper(str_replace(["-", "–"], ' ', $page));
$this->load->view('templates/header', $data);
$this->load->view('pages/about/'.$page, $data);
$this->load->view('templates/footer', $data);
}
function history($page = 'history')
{
if(!file_exists(APPPATH.'views/pages/about/'.$page.'.php'))
{
show_404();
}
$data['title'] = strtoupper(str_replace(["-", "–"], ' ', $page));
$this->load->view('templates/header', $data);
$this->load->view('pages/about/'.$page, $data);
$this->load->view('templates/footer', $data);
}
}
I will probably do this for Contact Us
, FAQs
...
Apparently this is the correct answer。使用控制器和方法显示格式为subfolder/view
的页面。 WIG。
答案 2 :(得分:0)
我将Pages::view()
修改为没有默认参数:
<?php
class Pages extends CI_Controller
{
function __construct()
{
parent::__construct();
}
public function view()
{
$page = $this->uri->segment(1);
if(!empty($this->uri->segment(2))) {
$page .= '/'.$this->uri->segment(2);
}
if(!file_exists(APPPATH.'views/pages/'.$page.'.php'))
{
show_404();
}
$data = "";
$this->load->view('templates/header', $data);
$this->load->view('pages/'.$page, $data);
$this->load->view('templates/footer', $data);
}
}
到目前为止,我网站中的网页都有一个级别的子文件夹,因此我对以下内容进行了硬编码:
$page = $this->uri->segment(1);
if(!empty($this->uri->segment(2))) {
$page .= '/'.$this->uri->segment(2);
}
鉴于我的链接http://localhost:8080/practice/item-2/subitem-2
,URI段的值如下:
$this->uri->segment(1) == 'item-2'
$this->uri->segment(2) == 'subitem-1'
我还用硬编码的捕手更新了routes.php
:
$route['default_controller'] = 'welcome';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;
$route['pages/(:any)'] = 'pages/view/$1';
$route['pages/(:any)/(:any)'] = 'pages/view/$1/$2';
$route['pages/view/(:any)'] = 'pages/view/$1';
$route['pages/view/(:any)/(:any)'] = 'pages/view/$1/$2';
$route['(:any)'] = 'pages/view/$1';
$route['(:any)/(:any)'] = 'pages/view/$1/$2';