Я не могу напрямую загрузить представление, которое находится во вложенной папке в моей папке views
CodeIgniter с прямой ссылкой.
Вот структура папок:
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>
компании<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>
компании<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 часов).
Ты был единственным, кто понял задание .
Пройдя свой вопрос, я обнаружил, что вы пытаетесь написать какую-то общую функцию, которая позаботится о загрузке ваших просмотров. Пожалуйста, обратитесь ниже, поскольку вы можете обрабатывать любую структуру в кодеигнитре.
Функция контроллера будет выглядеть следующим образом:
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
с помощью жестко 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';