我正在使用智能模板在Codeigniter工作。
问题是如果我在视图或控制器中查看第二个子文件夹,Codeigniter会停止工作...
e-g here
application/controllers/main.php - works
application/controllers/admin/dashboard.php - works
application/controllers/admin/manageUsers/ListUsers.php - not working
我在网上搜索过,他们说我可以使用路由,这可能与控制器一起工作..
但是我关注的是观点。 我的意思是管理员视图应该在管理文件夹下,但我不能在管理员中创建子文件夹,如果我把所有视图放在管理员文件夹中,它将是一个烂摊子,没有组织。我希望你能理解我想说的话。
E-克
themes/default/views/home.tpl - works
themes/default/views/admin/dashboard.tpl works
themes/default/views/admin/site_settings/preferences.tpl not working
请任何人都可以指导我如何解决这些问题。
答案 0 :(得分:1)
你的问题很常见。当我开始使用CodeIgniter时,我已经拥有它了。我发现克服它的最佳方法是创建Custom_Router
,扩展CI_Router
类。这样做可以覆盖控制器类include / require逻辑并允许使用子目录。这是一个有效的例子:
<?php
class Custom_Router extends CI_Router
{
public function __construct()
{
parent::__construct();
}
public function _validate_request($segments)
{
if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
{
return $segments;
}
if (is_dir(APPPATH.'controllers/'.$segments[0]))
{
$this->set_directory($segments[0]);
$segments = array_slice($segments, 1);
while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.DIRECTORY_SEPARATOR.$segments[0]))
{
// Set the directory and remove it from the segment array
$this->directory = $this->directory . $segments[0] .DIRECTORY_SEPARATOR;
$segments = array_slice($segments, 1);
}
if (count($segments) > 0)
{
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
{
show_404($this->fetch_directory().$segments[0]);
}
}
else
{
$this->set_class($this->default_controller);
$this->set_method('index');
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
{
$this->directory = '';
return array();
}
}
return $segments;
}
show_404($segments[0]);
}
}
?>
上面的代码适用于你想要的尽可能多的子目录,虽然我不建议使用这种方法。我通常在route.php
文件中明确说明控制器的路径。
关于你的第二个问题 - 模板。我从来都不喜欢凌乱的代码甚至是杂乱无章的观众,这些观众到处都是<?php echo $something; for(...){}; foreach(){}... ?>
。对我来说,这使代码真的很难阅读,特别难以调试。这就是我一直在使用Twig模板引擎的原因。有一些教程如何让它在CodeIgniter中运行(我使用过this)。一旦完成它,在控制器中你只需要写:
class Login extends Custom_Controller
{
/**
* Index Page for this controller.
*/
public function index() {
$data = array();
$error_message = "Invalid user!";
if($this->session->getUserId() != null){
redirect('/welcome');
}
// other logic....
// depending on how you configure twig, this will search for "login.html.twig"
// in "application/views/". If your file is located somewhere in the subdirs,
// you just write the path:
// admin/login.html.twig => application/views/admin/login.html.twig
$this->twig->display('login.html.twig', $data);
}
}
如果Twig不是您的选项,那么您需要创建一个新类,该类扩展CI_Loader
类并覆盖public function view(){}
方法。
顺便说一下,如果您正在创建一个带有后端的Web应用程序,那么如果您将应用程序分隔到不同的目录中,您可能会发现管理和维护代码更容易。如果选择这种方式,则需要创建application/public
和application/admin
个文件夹,保留CodeIgniter“应用程序”的目录结构。以下是步骤:
创建单独的应用程序
/applications
-- public (a standard application directory structure)
---- cache
---- config
---- controllers
---- models
---- views
---- ...
-- admin (a standard application directory structure)
---- cache
---- config
---- controllers
---- models
---- views
---- ...
打开/index.php
并将$application_folder
更改为指向applications/public
创建/index.php
的副本,将其命名为backend.php
(或任何您想要的名称)。打开文件并将$application_folder
更改为指向applications/admin
文件夹。
打开.htaccess
并添加规则,将所有以/admin
开头的URI传递给backend.php
# Route admin urls
RewriteCond %{REQUEST_URI} admin([/])?(.*)
RewriteRule .* backend.php?$1 [QSA,L]
答案 1 :(得分:0)