Pagine dinamiche - Codeigniter
-
14-11-2019 - |
Domanda
Aggiornamento:
Ho provato il codice di Sheldon qui sotto, ma ho colpito un paio di problemi:
- .
-
Quando si utilizza la linea
$this->load->view($page->template, array('content' => $page->content), TRUE);
Alble per caricare il file richiesto .php ma se lo modillo su$page->content
funziona bene. -
Quando posizionisco le funzioni dell'indice nei miei altri controller caricano ancora il controller domestico predefinito nonostante sia impostato il segmento URI. Come posso regolare il modello per funzionare?
Domanda originale:
Ho un file temlate.php che ospita la mia struttura del sito principale. Supponiamo di avere una pagina chiamata "casa". Vorrei impostare il
$title
e i dati$content
dal database.Ho impostato una vista per ogni pagina e anche un controller. Ho provato:
.$this->cms_pages->name;
Questo non produce nulla. So che ho bisogno di ottenere il segmento URI ma perché sto usando
/$sales->name
che non sono sicuro se devo cambiarlo su$sales->id
per funzionare. Mi piacerebbe ottenerlo con il nome. Anche le migliori pratiche sono importanti.C'è un modo in cui potrei fare qualcosa come:
$this->cms_pages->id->1->name
?Modello
.function getCMSPages() { $query = $this->db->get('pages'); if($query->num_rows() > 0) return $query->result(); }
Modello
.<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Home extends CI_Controller { public function index() { $data['cms_pages'] = $this->navigation_model->getCMSPages(); $data['title'] = 'Ccho'; $data['content'] = $this->load->view('home', NULL, TRUE); $this->load->view('template', $data); } }
Template
$stylesheetCSS = array('href' => 'includes/css/style.css', 'rel' => 'stylesheet', 'type' => 'text/css', 'media' => 'print'); echo doctype('html5'); ?> <head> <title>Housemovers : <?php echo $title ?></title> <?php echo link_tag($stylesheetCSS);?> </head> <body> <div id ="wrapper"> <header> <p>content</p> </header> <nav> <ul> <?php if($this->session->userdata('logged_in')): ?> <li><?php echo anchor('#','Edit Pages');?> <?php if(is_array($cms_pages)): ?> <ul> <?php foreach($cms_pages as $page): ?> <li><a href="<?=$page->title?>"><?= $page->title?></a></li> <?php endforeach; ?> </ul> <?php endif; ?> </li> <li><?php echo anchor('#','Gallery');?> <ul> <li><?php echo anchor('admin/addgallery','Add Gallery');?></li> <li><?php echo anchor('admin/uploadimage','Upload Image');?> </li> <li><?php echo anchor('#','Delete Gallery');?></li> </ul> </li> <li><?php echo anchor('#','Sales');?> <ul> <li><?php echo anchor('admin/addsale','Add Sale');?></li> <li><?php echo anchor('#','Edit Sale');?> <?php if(is_array($sales_pages)): ?> <ul> <?php foreach($sales_pages as $sale): ?> <li><a href="editsale/index/<?=$sale->id?>"><?= $sale->name?></a></li> <?php endforeach; ?> </ul> <?php endif; ?> </li> <li><?php echo anchor('#','Delete Sale');?></li> <li><?php echo anchor('admin/home/logout','Log Out');?></li> </ul> </li> <?php else: ?> <ul> <li><?php echo anchor('home','Home');?></li> <li><?php echo anchor('about','About Us');?></li> <li><?php echo anchor('gallery','Gallery');?></li> <li><?php echo anchor('testimonials', 'Testimonials');?></li> <li><?php echo anchor('sales','Sales');?></li> <li><?php echo anchor('contact','Contact Us');?></li> </ul> <?php endif; ?> </ul> </nav> <section id="content"> <h1><?= $title ?></h1> <p><?= $content ?></p> </section> <footer>© Houses LTD <?php echo date('Y');?></footer> </div> <!-- Wrapper Close --> </body>
Soluzione
As @davzie said;
Model
function getCMSPage($page_name = '') {
if(!$page_name) $page_name= 'home'; // home be default.
$this->db->where('name', $page_name);
$query = $this->db->get('pages', 1);
if($query->num_rows() == 1) return $query->row();
}
Controller
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Home extends CI_Controller {
public function index()
{
$page = $this->navigation_model->getCMSPage($this-uri->segment(1)); // pretend the first segment in your URI is the page you want.
$data['cms_pages'] = $this->navigation_model->getCMSPages();
$data['title'] = $page->name;
$data['content'] = $this->load->view($page->template, array('content' => $page->content), TRUE);
$this->load->view('template', $data);
}
}
Altri suggerimenti
You might want to consider having a function that gets the details of a page by its name. This in-turn would run a function like getIdByName($page_name = false)
From there you would have the ID to pull from the database and get the correct page.