Llamar a una función miembro find () en un cakephp que no es un objeto [duplicado]
Frecuentes
Visto 8,530 equipos
0
Posible duplicado:
CakePHP: llamada a una función miembro find () en un no objeto
Tengo tres Modelos: Producto, Prodpage, Campo.
Hice la consola de pasteles para hornear todos los modelos basados en mi base de datos mysql local en mi PC. Luego creé un controlador simple para cada modelo utilizando el $scaffold público. Aquí está el ejemplo de ProductsController:
<?php
// app/Controller/ProductsController.php
class ProductsController extends AppController {
public $scaffold;
}
Entré en mi aplicación (localhost/cake/products) y todo funcionó bien. Podría agregar productos, eliminar productos, editar productos. Luego podría agregar prodpages, y también podría agregar los campos. Decidí seguir adelante y usar la consola de pasteles para hornear los controladores y las vistas. Entendí que debería hacer lo mismo que $scaffold, pero esta vez los controladores deberían tener más código. Permitiéndome así comenzar a personalizarlo un poco más.
Vuelvo a localhost/cake/products y funcionaba bien. Luego, cuando trato de ir a localhost/cake/prodpages/add y aparece este error:
Fatal error: Call to a member function find() on a non-object in C:\wamp\www\cake\app\Controller\ProdpagesController.php on line 50
Aquí está ProdpagesController hasta la línea 53 (la función de agregar):
<?php
App::uses('AppController', 'Controller');
/**
* Prodpages Controller
*
* @property Prodpage $Prodpage
*/
class ProdpagesController extends AppController {
/**
* index method
*
* @return void
*/
public function index() {
$this->Prodpage->recursive = 0;
$this->set('prodpages', $this->paginate());
}
/**
* view method
*
* @param string $id
* @return void
*/
public function view($id = null) {
$this->Prodpage->id = $id;
if (!$this->Prodpage->exists()) {
throw new NotFoundException(__('Invalid prodpage'));
}
$this->set('prodpage', $this->Prodpage->read(null, $id));
}
/**
* add method
*
* @return void
*/
public function add() {
if ($this->request->is('post')) {
$this->Prodpage->create();
if ($this->Prodpage->save($this->request->data)) {
$this->Session->setFlash(__('The prodpage has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The prodpage could not be saved. Please, try again.'));
}
}
$products = $this->Prodpage->Product->find('list');
$this->set(compact('products'));
}
y esta es la línea 50,
$products = $this->Prodpage->Product->find('list');
¿Alguien sabe qué estoy haciendo mal aquí o explica qué me dice el error? Soy nuevo en cakephp, así que estoy leyendo tutoriales. Aunque esto me tiene perplejo.
Actualización: Modelo/Producto.php
<?php
App::uses('AppModel', 'Model');
/**
* Product Model
*
* @property Prodpages $Prodpages
*/
class Product extends AppModel {
/**
* Display field
*
* @var string
*/
public $displayField = 'product_name';
/**
* Validation rules
*
* @var array
*/
public $validate = array(
'product_name' => array(
'notempty' => array(
'rule' => array('notempty'),
//'message' => 'Your custom message here',
//'allowEmpty' => false,
//'required' => false,
//'last' => false, // Stop validation after this rule
//'on' => 'create', // Limit validation to 'create' or 'update' operations
),
),
's7_location' => array(
'notempty' => array(
'rule' => array('notempty'),
//'message' => 'Your custom message here',
//'allowEmpty' => false,
//'required' => false,
//'last' => false, // Stop validation after this rule
//'on' => 'create', // Limit validation to 'create' or 'update' operations
),
),
'created' => array(
'datetime' => array(
'rule' => array('datetime'),
//'message' => 'Your custom message here',
//'allowEmpty' => false,
//'required' => false,
//'last' => false, // Stop validation after this rule
//'on' => 'create', // Limit validation to 'create' or 'update' operations
),
),
'modified' => array(
'datetime' => array(
'rule' => array('datetime'),
//'message' => 'Your custom message here',
//'allowEmpty' => false,
//'required' => false,
//'last' => false, // Stop validation after this rule
//'on' => 'create', // Limit validation to 'create' or 'update' operations
),
),
);
//The Associations below have been created with all possible keys, those that are not needed can be removed
/**
* hasMany associations
*
* @var array
*/
public $hasMany = array(
'Prodpages' => array(
'className' => 'Prodpages',
'foreignKey' => 'id',
'dependent' => false,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'exclusive' => '',
'finderQuery' => '',
'counterQuery' => ''
)
);
}
Aquí está Model/Prodpage.php
<?php
App::uses('AppModel', 'Model');
/**
* Prodpage Model
*
* @property Products $Products
* @property Fields $Fields
*/
class Prodpage extends AppModel {
/**
* Display field
*
* @var string
*/
public $displayField = 'page_name';
/**
* Validation rules
*
* @var array
*/
public $validate = array(
'is_blank' => array(
'boolean' => array(
'rule' => array('boolean'),
//'message' => 'Your custom message here',
//'allowEmpty' => false,
//'required' => false,
//'last' => false, // Stop validation after this rule
//'on' => 'create', // Limit validation to 'create' or 'update' operations
),
),
'page_order' => array(
'numeric' => array(
'rule' => array('numeric'),
//'message' => 'Your custom message here',
//'allowEmpty' => false,
//'required' => false,
//'last' => false, // Stop validation after this rule
//'on' => 'create', // Limit validation to 'create' or 'update' operations
),
),
's7_page' => array(
'numeric' => array(
'rule' => array('numeric'),
//'message' => 'Your custom message here',
//'allowEmpty' => false,
//'required' => false,
//'last' => false, // Stop validation after this rule
//'on' => 'create', // Limit validation to 'create' or 'update' operations
),
),
'created' => array(
'datetime' => array(
'rule' => array('datetime'),
//'message' => 'Your custom message here',
//'allowEmpty' => false,
//'required' => false,
//'last' => false, // Stop validation after this rule
//'on' => 'create', // Limit validation to 'create' or 'update' operations
),
),
'modified' => array(
'datetime' => array(
'rule' => array('datetime'),
//'message' => 'Your custom message here',
//'allowEmpty' => false,
//'required' => false,
//'last' => false, // Stop validation after this rule
//'on' => 'create', // Limit validation to 'create' or 'update' operations
),
),
);
//The Associations below have been created with all possible keys, those that are not needed can be removed
/**
* belongsTo associations
*
* @var array
*/
public $belongsTo = array(
'Products' => array(
'className' => 'Products',
'foreignKey' => 'products_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
/**
* hasMany associations
*
* @var array
*/
public $hasMany = array(
'Fields' => array(
'className' => 'Fields',
'foreignKey' => 'id',
'dependent' => false,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'exclusive' => '',
'finderQuery' => '',
'counterQuery' => ''
)
);
}
Hice la consola de pasteles para hornear estos modelos, así que hice las asociaciones allí. Pensé que había relacionado Prodpage y Product correctamente. Un producto puede tener muchas Prodpages. Una Prodpage pertenece a un producto.
ACTUALIZAR CON ERROR DE CONSULTA
Entonces, cuando voy a localhost/cake/prodpages/add y completo la información, selecciono un producto de la lista desplegable de productos y aparece este error
Error: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`builder_cake`.`prodpages`, CONSTRAINT `fk_prodpages_products` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
SQL Query: INSERT INTO `builder_cake`.`prodpages` (`page_name`, `is_blank`, `page_order`, `s7_page`, `modified`, `created`) VALUES ('Page 2', '0', 2, 2, '2012-06-13 16:51:35', '2012-06-13 16:51:35')
Lo investigué y no está pasando el product_id asociado con la selección de la lista desplegable para agregarlo a la columna product_id en mi tabla Prodpages... ¿alguna idea de por qué?
1 Respuestas
1
Parece que los nombres de sus modelos son plurales, cuando deberían ser singulares. Por ejemplo:
public $belongsTo = array(
// Product, not Products
'Product' => array(
'className' => 'Product',
'foreignKey' => 'products_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
Respondido el 13 de junio de 12 a las 20:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas php cakephp or haz tu propia pregunta.
Significa
$this->Prodpage->Product
no existe, probablemente porque Prodpage no está relacionado con Product. - jeremyharrisEdité la publicación con los modelos Product y Prodpage. Pensé que los había relacionado correctamente... ¿hay algo más? o los hice mal? - thindery
Hay un problema con el nombre de su modelo. tienes productos donde debería ser singular: Producto. Si el nombre de su modelo es realmente Productos, utilice
$this->Prodpage->Products
. Lo mismo ocurre con los campos. - jeremyharris¡Gracias! Lo miré y efectivamente tenía que ver con eso. Hay una última pregunta que tengo. cuando trato de agregar una nueva Prodpage, genera un cuadro desplegable que me permite seleccionar el Producto con el que está asociado. Cuando selecciono el Producto... no está pasando el valor desplegable del producto en la consulta sql en absoluto, lo que resulta en un error. agregué la información en la publicación principal .. - thindery
Agregué la respuesta para que puedas aceptarla. En cuanto a la segunda pregunta, creo que pertenece como una pregunta separada. También deberá publicar el formulario HTML. Supongo que es un problema con su definición de ForeignKey siendo plural nuevamente (en la relación del modelo) pero singular en la tabla. - jeremyharris