tutorial - manual php codeigniter
Cómo recuperar el título de un elemento de una base de datos y enviarlo a la plantilla de encabezado en CodeIgniter (13)
Controlador
$query = $this->Listing_model->get_card($card);
var_dump($query);
//Your $query may be some data got from db;
$card_name = "";
if(!empty($query)){
$card_name = $query[0]->name; //You must verify the name attribute and it should in the $query result;
}
$header["page_title"] = $card_name;
Ver
<title><?php echo (!isset($page_title) ? '''' : $page_title) ?></title>
Estoy escribiendo una aplicación en CodeIgniter donde especifico la meta-etiqueta <title>
en cada página en cada controlador que he podido enviar a mi plantilla de encabezado. Sin embargo, ahora he creado una aplicación que busca tarjetas de crédito y sus títulos de la base de datos, a través de un modelo CodeIgniter. Me gustaría buscar y usar automáticamente el nombre de la tarjeta de crédito en <title>
para no tener que cambiarlo manualmente, pero estoy un poco atascado sobre cómo proceder.
Este es mi código a partir de ahora:
Controlador
public function show($card = NULL)
{
$data[''query''] = $this->Listing_model->get_card($card);
$header["page_title"] = from the model
$this->load->view(''includes/header'',$header);
$this->load->view(''listings/listing_card'',$data);
$this->load->view(''includes/footer'');
}
Modelo
function get_card($card = FALSE)
{
$query = $this->db->get_where(''creditcards'', array(''slug'' => $card), 0,1);
return $query->result();
}
He estado siguiendo la documentación oficial de CodeIgniter al crear esta aplicación, pero hasta ahora no tuve suerte. Alguna solución?
Crea un controlador base. La ubicación predeterminada para esto es application/core/MY_Controller.php =>
esto se puede cambiar a través de la configuración. Al usar $this->site_data
puede agregar variables en su clase base y usarlas en cada control / vista
class MY_Controller extends CI_Controller
{
function __construct()
{
parent::__construct();
$this->load->database();
$this->load->model(''your model'');
$result = $this->Listing_model->get_card($card);
$this->site_data[''query'']=$result;
$this->site_data_header["page_title"] = $result[''get the property you want''];//this is possible, as get_card returns 1 result
}
}
class YourClass extends MY_Controller
{
function __construct()
{
parent::__construct();
}
public function show($card = NULL)
{
//you don''t need to split the variables
//for header and the rest
$this->load->view(''includes/header'',$this->site_data_header);
$this->load->view(''listings/listing_card'',$this->site_data);
$this->load->view(''includes/footer'');
}
}
Y creo que tu get_where está mal:
$query = $this->db->get_where(''mytable'', array(''id'' => $id), $limit, $offset);
tu límite es 0
function get_card($card = FALSE)
{
$query = $this->db->get_where(''creditcards'', array(''slug'' => $card), 1,0);//limit 1 offset 0
return $query->result();
}
accede a los datos en tu vista
<title><?php echo (!isset($page_title) ? '''' : $page_title) ?></title>
En la vista de la tarjeta de listado, haz esto:
foreach ($query as $rec){
<title><?php echo $rec->title ?></title>
}
reemplace ''título'' con el nombre de la columna en su base de datos que conserva el título de la tarjeta de crédito ... por lo que está pasando los resultados de la consulta que ejecutó en su controlador a esta vista, y luego usando un bucle foreach para mostrar datos de la tarjeta de crédito específica
En su modelo, no devuelva $query->result()
, simplemente devuelva $query
:
function get_card($card = FALSE)
{
$query = $this->db->get_where(''creditcards'', array(''slug'' => $card), 0,1);
return $query;
}
Controlador:
public function show($card = NULL)
{
// verify that you got something back from the database
// or show an error
if( ! $query = $this->Listing_model->get_card($card) )
{
$this->_showNoResultsFor($card) ;
}
else
{
// get one record from the query using row()
$onecard = $query->row() ;
// assign the title using whatever your field name is called
$header["page_title"] = $onecard->thetitle ;
// Now assign the query result() to data
$data[''query''] = $query->result() ;
$this->load->view(''includes/header'',$header);
$this->load->view(''listings/listing_card'',$data);
$this->load->view(''includes/footer'');
}
}
Es posible que necesite crear algunas rutas para su función de programa. Codeigniter URI Routing
$route[''your_controller_name/show/(:any)''] = ''your_controller_name/show/$1'';
No estoy seguro si ha configurado un htaccess para su directorio principal para que pueda eliminar el index.php
de su url.
Pruebe este código a continuación
Modelo:
<?php
class Listing_model extends CI_Model {
function get_card_title($card) {
$this->db->where(''slug'', $card);
$query = $this->db->get($this->db->dbprefix . ''creditcards'');
if ($query->num_rows() > 0) {
$row = $quer->row();
return $row->title;
} else {
return false;
}
}
}
Controlador: Your_controller_name.php
<?php
class Your_controller_name extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->model(''listing_model'');
}
public function show($card) {
$data[''title''] = $this->listing_model->get_card_title($card);
$this->load->view(''includes/header'', $data);
$this->load->view(''listings/listing_card'', $data);
$this->load->view(''includes/footer'');
}
}
Ver:
<head>
<title><?php echo $title;?></title>
</head>
Prueba esto
- El modelo ha cambiado
- El controlador está cambiado.
En modelo
function get_card($card)
{
$query = $this->db->query("SELECT * FROM table_name WHERE creditcards = ''$card'' ");
$result = $query->result_array();
$count = count($result); # New
if(empty($count)){ # New
return FALSE;
}
elseif($count > 1){ # New
return 0;
}
else{
return $result;
}
}
En el controlador
public function show($card)
{
$result = $this->Listing_model->get_card($card); # Changed
if($result == FALSE){ # New
echo "No Data Found";
}
elseif($result == 0){ # New
echo "Multiple Data Found";
}
else{
$data["page_title"] = $result[0][''field_name'']; # Changed
$this->load->view(''includes/header'',$data); # Changed
$this->load->view(''listings/listing_card'',$data);
$this->load->view(''includes/footer'');
}
}
En vista
<?php echo (!empty($page_title)) ? $page_title : ''''; ?> # Changed
Prueba esto:
function get_card($card = FALSE)
{
$data = $this->db->get_where(''creditcards'', array(''slug'' => $card), 0,1)->result();
$data->title = $data[0]->title;
return $data;
}
Puede crear un Controlador base y Extender todo el otro controlador a ese controlador base.
Me gusta esto
<?php
class MY_Controller extends CI_Controller {
public $data = array();
function __construct() {
parent::__construct();
$this->data[''errors''] = array();
$this->data[''site_name''] = config_item(''site_name'');
}
}
Luego en tu controlador
class Test extends MY_Controller
{
function __construct() {
parent::__construct();
$this->data[''meta_title''] = ''Your Title'';
}
}
Y en tus visitas accedes al título de la página de esta manera:
echo("<title>.$site_name.</title>");
Puede usar la biblioteca de plantillas para mayor robustez y usar de la siguiente manera:
Controlador
$this->template->title(''Home :: '' . $this->data[''metadata''][''site_name''])
->set_layout(''home_layout'')
->build(''listing_card'', $this->data);
Puntos de vista
<title><?php echo $template[''title'']; ?></title>
<?php echo $template[''metadata'']; ?>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Referencia: https://github.com/philsturgeon/codeigniter-template
Solo para agregar otro, no hay razón para que esto no funcione:
$data[''query''] = $this->Listing_model->get_card($card);
$this->load->view(''header'', array(''page_title'' => $data[''query''][0]->column_name));
//Will there only be one result? Consider returning $query->row(). Multiple,
//loop through and set one title
En su opinión:
<title><?=isset($page_title) ? $page_title : "";?></title>
Si esto no funciona, su consulta no devuelve lo que cree que es.
Un simple ejemplo:
Controlador
$query = $this->Listing_model->get_card($card);
$query = $query->row();
$header["page_title"] = $query->title;
Ver
<title><?php echo (!isset($page_title) ? '''' : $page_title) ?></title>
Controlador :
$data["page_title"] = $result[0][''title_field''];
ver: y solo necesita escribir en su archivo de encabezado como:
<title><?php echo $page_title; ?></title>
Controlador
$card_data= $this->Listing_model->get_card($card); //Your model returns an array of objects
$header["page_title"] = $card_data[0]->title; //grab value of ''title'' property of first object returned from model.
$this->load->view(''includes/header'',$header);
Ver
<title><?php echo (!isset($page_title) ? '''' : $page_title) ?></title>