2016-09-03 3 views
2

Ich kann eine Ansicht, die sich in einem Unterordner in meinem CodeIgniter views-Ordner mit einer direkten Verknüpfung befindet, nicht direkt laden. HierDer direkte Verweis auf eine Unterordneransicht gibt 404 zurück

ist die Ordnerstruktur:

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

Ich brauche organization.php und history.php über einen Link für den Zugriff auf wie:

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

aber ich bekomme einen 404.

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

ist mein routes.php die Pages::view(path/to/file) auf meine Standard-View-Controller leitet:

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

Hier ist mein 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); 
    } 
} 

HINWEIS, wenn ich direkt

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

ist es in Ordnung. Gleiches mit dem Drucken:

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

Ich weiß nicht, was das vermasselt haben könnte.

Muss ich einen benutzerdefinierten Controller nur für diese Unterordner erstellen? Das ist die einzige Lösung, an die ich gerade denken kann.


HINWEIS ich auch in diesem Unterordner (des gesamten Projekts ist eigentlich) Berechtigungen 777 und die direkte Verbindung nach wie vor gesetzt hat nicht funktioniert.


HINWEIS Meine einzige Lösung ist jetzt getrennte Controller für jeden dieser Unterordner nur zu betrachten, sie zu machen! Ist das wirklich unmöglich mit nur einem Controller?

Wie das URL-Muster my_app/controller/method ist streng und my_app/folder/view ist nicht erlaubt, es sei denn folder und view zu einem controller und method entspricht jeweils?


SOLUTION

Zeeshandidthat!

Shantay, du bleibst! Thank you.

Sie sind richtig, ich wollte eine generische Methode, um alle meine statischen Seitenaufrufe zu erfassen. Wir können dieses Problem jetzt schließen (ich werde das Kopfgeld in 20 Stunden vergeben).

You were the only one who understood the assignment.

+0

Jungs Ich möchte nicht mehrere Controller für jeden dieser Unterordner erstellen bitte helfen, ich weiß in meinem Herzen ist dies mit diesem einen Controller vielleicht mein 'htaccess' möglich ??? –

+0

Ihre routes.php-Datei ist nicht gut geschrieben. Lesen Sie [this] (https://codeigniter.com/userguide3/general/routing.html) erneut. ** Die reservierten Routen müssen vor beliebigen Platzhalter- oder regulären Ausdrucksrouten stehen. ** aber auch ** Routen werden in der Reihenfolge ausgeführt, in der sie definiert sind. Höhere Routen haben immer Vorrang vor niedrigeren.** Das heißt, wenn Sie $ route ['(: any)'] = 'something/here' haben, muss es als letzte Zeile in der Datei kommen. – Tpojka

+0

@Tpojka: Ich folgte Ihrem Rat und noch keine Änderungen. [Ich bekomme eine 404 für die Unterordneransicht] (http://stackoverflow.com/questions/39360697/link-to-view-inside-subfolder-does-not-display-correctly) –

Antwort

1

durch Ihre Frage Nachdem ich, ich fand, dass Sie einige generische Funktion zu schreiben versuchen, die darauf achten, Ihre views.Please des Ladens unten beziehen können Sie behandeln Sie jede Struktur im Codeigniter.

Controller-Funktion geht wie diese

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

Jetzt in Ihrem Ansichten der Link wie folgt gehen:

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

Bitte beachten Sie auch in Codeigniter Sie brauchen nicht zu behandeln Sie 404 manuell. Fügen Sie folgendes hinzu, um Ihre Gewohnheit zu zeigen

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

Lassen Sie mich wissen, wenn Sie irgendwelche Zweifel oder Fragen haben.

Grüße, Zeeshan.

+0

DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DAS ist GENAU ** was ich wollte aber ich kann es nicht in Worte fassen DANKE !!! –

+1

Willkommen Kumpel ... Seine Ehre zu teilen, was Sie wissen. Fühlen Sie sich frei, Ihre Zweifel oder Fragen zu stellen. – Zeeshan

0

Ich denke, CodeIgniter URI Muster ist streng controller/method und keine Liebe für subfolder/view_file.

Ich habe gerade einen Controller für About mit den Methoden organization und history gemacht, die die Seite zeigen wird.

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

I will probably do this for Contact Us, FAQs...

Apparently this is the correct answer. Verwenden Sie Controller und Methoden, um eine Seite mit dem Formular subfolder/view anzuzeigen. PERÜCKE.

0

Ich veränderte die Pages::view() nicht einen Standardparameter haben:

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

Aufgrund meiner Link:

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

Die Seiten in meiner Website weit so eine Ebene der Unterordner haben, so dass die folgende ich fest einprogrammiert http://localhost:8080/practice/item-2/subitem-2 ist der Wert der URI-Segmente wie folgt:

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

ich die routes.php mit fest einprogrammierten Fänger aktualisiere auch:

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