Я не могу напрямую загрузить представление, которое находится в подпапке в моем 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
который направляет на мой контроллер представления по умолчанию 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
и прямая ссылка все еще не работала.
НОТА Мое единственное решение сейчас состоит в том, чтобы сделать отдельный контроллеры для каждой из этих подпапок просто для их просмотра! Это действительно невозможно сделать только с одним контроллером?
Как шаблон URL my_app/controller/method
строгий и my_app/folder/view
не допускается, если folder
а также view
соответствует controller
а также method
соответственно?
РЕШЕНИЕ
Шантай, останься! Спасибо.
Вы правы, я собирался за общий метод, чтобы поймать все мои статические запросы просмотра страницы. Мы можем закрыть этот вопрос сейчас (я буду награждать награду через 20 часов).
Изучив ваш вопрос, я обнаружил, что вы пытаетесь написать некоторую универсальную функцию, которая позаботится о загрузке ваших представлений. Пожалуйста, обратитесь ниже, чтобы справиться с любой структурой в 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.
Я думаю, что шаблон URI CodeIgniter строго 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);
}
}
Я, вероятно, сделаю это для Contact Us
, FAQs
…
Видимо это правильный ответ. Используйте контроллеры и методы, чтобы показать страницу с формой subfolder/view
, ПАРИК.
Я модифицировал 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';