Il collegamento diretto a una vista sottocartella restituisce 404

Non riesco a caricare direttamente una vista che si trova in una sottocartella nella mia cartella di views CodeIgniter con un collegamento diretto.

Ecco la struttura delle cartelle:

 my_project/ application/ views/ pages/ about.php about/ organization.php history.php 

Ho bisogno di accedere a organization.php e history.php attraverso un link come:

 <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> 

Comunque ottengo un 404.

Il mio 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> 

    Ecco il mio routes.php che indirizza al mio controller di visualizzazione predefinito 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'; 

    Ecco il mio controller:

     <?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); } } 

    NOTA each volta che uso direttamente

     $this->load->view('pages/views/about/organization'); 

    va bene. Lo stesso con la printing:

     file_exists(APPPATH.'views/pages/about/organization.php'); 

    Non so cosa possa averlo incasinato.

    Devo creare un controller personalizzato solo per queste sottocartelle? Questa è l'unica soluzione a cui riesco a pensare in questo momento.


    NOTA Ho anche impostato le autorizzazioni di questa sottocartella (in realtà l'integer progetto) su 777 e il collegamento diretto non ha funzionato.


    NOTA La mia unica soluzione al momento è quella di creare controller separati per ognuna di queste sottocartelle solo per vederle! È davvero imansible farlo con un solo controller?

    Come il pattern url my_app/controller/method è strict e my_app/folder/view non è permesso a less che folder e view corrispondano rispettivamente a un controller e un method ?


    SOLUZIONE

    Zeeshan l'ha fatto !

    Shantay, tu rimani! Grazie

    Hai ragione, stavo cercando un metodo generico per catturare tutte le mie richieste statiche di visualizzazione di pagina. Ora possiamo chiudere questo problema (assegnerò la taglia in 20 ore).

    Sei stato l'unico a capire il task .

    Dopo aver esaminato la tua domanda, ho scoperto che stai tentando di scrivere alcune funzioni generics che si occuperanno di caricare le tue visualizzazioni. Ti preghiamo di fare riferimento di seguito poiché puoi gestire qualsiasi struttura in codeigniter.

    La function controller andrà così

     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); } 

    Ora nelle tue visualizzazioni il link andrà in questo modo:

     <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> 

    Inoltre, si prega di notare in Codeigniter che non è necessario gestire manualmente 404. Basta aggiungere i seguenti per mostrare la tua abitudine

     $route['404_override'] = 'mycustom404';//mycustom404 is controller for 404 

    Fammi sapere se hai dubbi o domande.

    Saluti, Zeeshan.

    Penso che lo schema URI di CodeIgniter sia strettamente controller/method e nessun amore per la subfolder/view_file .

    Ho appena creato un controller per About con methods organization e history che mostreranno la pagina.

     <?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); } } 

    Probabilmente lo farò per Contact Us , FAQs

    Apparentemente questa è la risposta corretta . Usa controller e methods per mostrare una pagina con la subfolder/view del module. PARRUCCA.

    Ho modificato Pages::view() per non avere un parametro predefinito:

     <?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); } } 

    Le pagine del mio sito hanno finora un livello di sottocartella, quindi ho codificato quanto segue:

     $page = $this->uri->segment(1); if(!empty($this->uri->segment(2))) { $page .= '/'.$this->uri->segment(2); } 

    Dato il mio link http://localhost:8080/practice/item-2/subitem-2 , il valore dei segmenti URI è il seguente:

     $this->uri->segment(1) == 'item-2' $this->uri->segment(2) == 'subitem-1' 

    Ho aggiornato anche il routes.php con i catcher codificati:

     $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';