Прямая ссылка на представление подпапки возвращает 404

Я не могу напрямую загрузить представление, которое находится в подпапке в моем 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 часов).

Вы были единственным, кто понял назначение.

2

Решение

Изучив ваш вопрос, я обнаружил, что вы пытаетесь написать некоторую универсальную функцию, которая позаботится о загрузке ваших представлений. Пожалуйста, обратитесь ниже, чтобы справиться с любой структурой в 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

Другие решения

Я думаю, что шаблон 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, ПАРИК.

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';
0
По вопросам рекламы [email protected]