cakephp3 - cakephp2 install
CakePHP: ¿cómo configuro el título de la página para el nombre de un elemento? (10)
De acuerdo, entonces estoy tratando de enseñarme el framework CakePHP, y estoy tratando de crear una aplicación de demostración simple para mí.
Tengo los controladores, las vistas y los modelos configurados y funcionando, pero quiero hacer algo más de lo que muestra la ayuda básica en línea.
Tengo un archivo guitars_controller.php de la siguiente manera ...
<?php
class GuitarsController extends AppController {
var $name = ''Guitars'';
function index() {
$this->set(''Guitars'', $this->Guitar->findAll());
$this->pageTitle = "All Guitars";
}
function view($id = null) {
$this->Guitar->id = $id;
$this->set(''guitar'', $this->Guitar->read());
// Want to set the title here.
}
}
?>
El objeto ''Guitarra'' contiene un atributo llamado ''Nombre'', y me gustaría poder establecerlo como el título de la página para las vistas de página individuales.
¿Alguien puede decir cómo lo haría, por favor?
NB : Sé que hay un desacuerdo general sobre en qué parte de la aplicación se debe establecer este tipo de datos, pero para mí se trata de datos relacionados.
Debería ir en el controlador. Mira esto
Puede configurar esto en el controlador:
function view($id = null) {
$guitar = $this->Guitar->read(null, $id);
$this->set(''guitar'', $guitar);
$this->pageTitle = $guitar[''Guitar''][''name''];
}
O en la vista:
<? $this->pageTitle = $guitar[''Guitar''][''name'']; ?>
El valor establecido en la vista anulará cualquier valor que ya se haya establecido en el controlador.
Por seguridad, debe asegurarse de que su diseño / vista que muestra la página HTML html codifica estos datos arbitrarios para evitar ataques de inyección y html roto
<?php echo h( $title_for_layout ); ?>
"pero quiero hacer algo un poco más de lo que muestra la ayuda básica en línea".
¿No es eso siempre el problema? Gran parte de la documentación está orientada a un mínimo que realmente no ayuda mucho. Puedes completar muchos de los tutoriales disponibles, pero tan pronto como te des un 1 paso de la reserva, se establece la confusión. Bueno, es el mínimo o el máximo pro desarrollador, pero rara vez alcanza ese punto dulce de facilidad, claridad y profundidad.
Actualmente, estoy reescribiendo algunos documentos de Zend Framework para mi propio uso, simplemente para que pueda suavizar las incoherencias, aclarar las suposiciones y llegar a ser la mejor forma de entenderlo. Mi mantra: facilidad, claridad, profundidad. Facilidad, claridad, profundidad.
Ah, la respuesta no obvia es la siguiente ...
$this->pageTitle = $this->viewVars[''guitar''][''Guitar''][''Name''];
Encontré esto colocando el siguiente código en el controlador (era una posibilidad remota que valió la pena, para ser honesto)
echo "<pre>"; print_r($this);echo "</pre>";
Gracias a todos los que intentaron ayudar.
$this->pageTitle = $this->Guitar->Name;
Sin embargo, debería ir en la Vista, no hago PHP, ni CakePHP, pero eso es algo que debería hacer una vista, no el controlador.
Estas acciones son independientes del modelo, por lo que pueden colocarse en su archivo app / app_controller.php
<?php
class AppController extends Controller {
function index() {
$this->set(Inflector::variable($this->name), $this->{$this->modelClass}->findAll());
$this->pageTitle = ''All ''.Inflector::humanize($this->name);
}
function view($id = null) {
$data = $this->{$this->modelClass}->findById($id);
$this->set(Inflector::variable($this->modelClass), $data);
$this->pageTitle = $data[$this->modelClass][$this->{$this->modelClass}->displayField];
}
}
?>
Apuntar su navegador a / guitarras invocará la acción índice de su controlador de guitarra, que no existe, por lo que se ejecutará en AppController (de lo que hereda GuitarsController). Lo mismo para la acción de vista. Esto también funcionará para tu DrumsController, KeyboardsController, etc.
En respuesta a tu propia respuesta sobre oo paradigma. Es como esto :
function view($id) {
$this->Guitar->id = $id;
$this->Guitar->read();
$this->pageTitle = $this->Guitar->data[''Guitar''][''name''];
$this->set(''data'', $this->Guitar->data);
}
Por cierto, debe verificar si la id está configurada y es válida, etc., ya que esta es la entrada del usuario url.
echo "<pre>"; print_r($this);echo "</pre>";
qué tal si
pr( $this );
A partir de CakePHP 1.3, se ha cambiado el ajuste del título de la página.
$this->pageTitle = "Title"; //deprecated
$this->set("title_for_layout",Inflector::humanize($this->name)); // new way of setting title
Nota: Más sobre Inflector: http://api13.cakephp.org/class/inflector#method-Inflector
De acuerdo, realmente quiero establecer el título de la página en el controlador en lugar de la vista. Entonces esto es lo que hice:
class CustomersController extends AppController {
var $name = ''Customers'';
function beforeFilter() {
parent::beforeFilter();
$this->set(''menu'',$this->name);
switch ($this->action) {
case ''index'':
$this->title = ''List Customer'';
break;
case ''view'':
$this->title = ''View Customer'';
break;
case ''edit'':
$this->title = ''Edit Customer'';
break;
case ''add'':
$this->title = ''Add New Customer'';
break;
default:
$title = ''Welcome to ''.$name;
break;
}
$this->set(''title'',$this->title);
}
El truco es que no puede establecer $this->title
dentro de ninguna acción, no funcionará. Me parece que la página web llega a la acción después de la representación, sin embargo, puede hacerlo en beforeFilter
.