CakePHP: can't get models to work [duplicate] - cakephp

This question already has answers here:
Call to a member function on a non-object [duplicate]
(8 answers)
Closed 9 years ago.
Im really new to cakePHP, and I more or less understand the controllers, and views as I worked with a MVC framework before. However, the models and naming conventions in cakePHP seem to be different from what I've used before. the one's I've used; you call various functions such as select, and insert, with the fields and such you want, and then execute the query. Essentially you build your own query. I'm trying to figure out how to use models in cakePHP, and as I understand it, if I have a controller in /controllers/users_controller.php with the contents:
<?php
class UsersController extends AppController{
var $name = 'Users';
var $helpers = array ('Html','Form');
public function login(){
$this->set('msg', 'Login PAGE!!!! YAY!!!!!!!!!');
$this->set('MT', $this->Users->find('all'));
}
}
then it should automatically have the Model, Users, in models/users.php available to it right? Therefore the variable $MT can be echoed on the page.
The contents on Users.php are:
<?php
class Users extends AppModel{
var $name = 'Users';
}
The problem I'm having though seems to be:
Undefined property: UsersController::$Users [APP\controllers\users_controller.php
and thus leads to:
Call to a member function find() on a non-object in app\controllers\users_controller.php
I'm following the tutorial at http://book.cakephp.org/1.3/en/The-Manual/Tutorials-Examples/Blog.html for cakePHP 1.3 running on a WAMP server. Any advice you can give would be appreciated! Thanks a lot!

change your model name:
class Users extends AppModel{
...
to
class User extends AppModel{
...
and:
$this->set('MT', $this->Users->find('all'));
to
$this->set('MT', $this->User->find('all'));

Related

Cakephp table name error [duplicate]

This question already has answers here:
CakePHP specify table-name
(2 answers)
Closed 7 years ago.
I created a table named as quantities_master but when i using modal name as QuantitiesMaster it is showing some errors. what would be modal name of quantities_master table name?
Table names should be plural and model names singular in CakePHP. So you should have a table named quantities_masters and a QuantitiesMaster model.
However, if you need to have a table with a singular name you can define this in the model.
In CakePHP 2:-
class QuantitiesMaster extends AppModel {
public $useTable = 'quantities_master';
}
In CakePHP 3:-
class QuantitiesMasterTable extends Table
{
public function initialize(array $config)
{
$this->table('quantities_master');
}
}
Only ever break from CakePHP's naming conventions when you have no other choice as it makes working with CakePHP significantly harder!
If you find determining the plural and singular of words for CakePHP (i.e if English is not your first language) then the CakePHP Inflector website is really handy.
The model is looking for quantities_masters table. Add this line at the beginning of the class and it will work fine:
class QuantitiesMaster extends AppModel {
public $useTable = 'quantities_master';
}

CakePHP 2.0 can't access Model from its own Controller

I'm still trying to migrate from CakePHP 1.3 to 2.0
I have a Controller UsersController and its Model User.
The class User has some constants which I could easily access from the UsersController using User::constant. But for CakePHP 2.0 it doesn't work: I get an error saying the User class is not found. It works if I App::Import('Model', 'User');.
It sure has to do with their built-in lazy loading in 2.0!
you simple need to tell this file that it has other dependencies
do that at the very top of your UserController file:
<?php
App::uses('User', 'Model');
then everything works fine
You can try setting the controller name (in UsersController):
var $name = 'Users';
Or using the "uses" var (in other controllers:
public $uses = array('User');
Does that not work?
Did you declare the name of the model like that ?
class User extends AppModel {
public $name = 'User';
}
Do you have others variables in your UsersController ?
I set variables in the model like this:
//Person model
public $genders = array('m' => 'male', 'f' => 'female');
Then get them from the controller like this:
//People controller
$genders = $this->Person->genders;
No special code needed. (Is this what you're talking about?)
Also, I don't believe you need to set the $name variable anywhere anymore - I think that was just for PHP 4. (not 100% on that part, but... I don't ever set that anymore, and my Cake2 apps run fine)
You have to load the model like this:
$this->loadModel('User');

displaying data using a query in a controller - cake php framework

Hy guys, I started to study cake php framework (version 2.0) and when i finished to read the blog tutorial i tried to do some experiments in particular my problem is "Is it possible to create a query in the model then execute it in the controller and in the end display the result of the query in a view in this way?
this is the file post.php(the model):
<?php
class Post extends AppModel {
public $name='Post';
}
?>
this is posts_controller(the controller):
<?php
class PostsController extends AppController {
public $helpers = array ('Html','Form');
public $name = 'Posts';
public $name = 'Articles';
function index() {
//$this->set('posts', $this->Post->find('all'));
$sql="select * from posts";
$this->set('Articles',$this->Post->query($sql));
}
}
?>
The Question is if I declare for the second time $name I obtain an error from cake, in this case, Which is the correct name to set a variable that contain a posts arrays (the databse is the same of the blog tutorial) and the second question is How can I display the data obtained from the query in the index.ctp?? in the example I iterate in this way
<?php foreach ($posts as $post): ?>
and to obtain an element I have to write
<?php echo $post['Post']['title']?>
but in my case?
And Is it possible to declare a function tha returns a result of a query in a model, then call it in a controller and display the data in a someview.ctp?
Question 1: $name should be the name of the controller itself, not sure what you're trying to do with 2 names. Just stick with "Posts".
Question 2:
You're probably just confusing matters here by referring to posts as articles..
Best thing for you to do is change this:
$this->set('Articles',$this->Post->query($sql));
to
$this->set('posts',$this->Post->query($sql));
Then the references in the template will work the same. What's happening here is when calling the $this->set method you're making the data accessible to the template in a variable called $posts. So what you currently have:
$this->set('Articles',$this->Post->query($sql));
Will make the data accessible to the template in a variable called $Articles.

CakePHP doesn't load model

I'm new to cakePhp development. I've stuck on following problem:
I've made few models, controllers and views - it works great. The problem is that after production, I have to made new table(Transactionaltemp table and corresponding model and controller ) in the db that logically is "connected" to other tables, but technically does not needs to - for ex. it holds temporary info on user_id, time, ip and similar. So, other tables doesn't need to be directly connected to that.
The problem is when I try (in some other controller than transactionaltemps_controller):
$this->loadModel('Transactionaltemp');
I get error - the model is not found (it is true because the model is missing in the cache). Interesting enough transactionaltempls_controller is in the cache (in the cake_controllers_list file).
I tried following stuff to resolve the problem:
clear cache
disable cache
tried using uses={..} code in the controller that I would like to use mymodels_controller
tried using init('Transactionaltemp')
with no success. Here is corresponding code:
The model:
<?php
class Transactionaltemp extends AppModel
{
var $name = 'Transactionaltemp';
function beforeSave() {
return true;
}
}
?>
The controller:
<?php
class TransactionaltempsController extends AppController
{
var $name = 'Transactionaltemps';
var $scaffold;
}
?>
I'll very grateful to any help!!!
App:Import('Model','Transactionaltemp');
$this->Transactionaltemp= new Transactionaltemp;
I hope this may work
If you are connecting to a table name with different name than your model, you must specify the table name in it:
<?php
class Transactionaltemp extends AppModel
{
var $uses = 'Transactional';
var $name = 'Transactionaltemp';
function beforeSave() {
return true;
}
}
Try
App::Import('Model', 'YourModelName');
in your controller (or where you want).

cakephp behavior afterFind not called on related models

I am using an afterFind function to modify data from a find function. It works fine. If I move the afterFind function into a behavior (in a plugin) it still works, but only when the model of interest is the primary model, i.e. it isn't called when the model belongsTo another model. Is there any way round this? I'm using cake 1.3.4. This is a simplified version of the behavior:
class ChemicalStructureBehavior extends ModelBehavior {
function afterFind(&$model, $results, $primary) {
foreach ($results as &$unit) {
// format chemical formula (with subscripts)
$unit[$model->alias]['chemical_formula_formatted'] = preg_replace('/([0-9]+)/i', '<sub>$1</sub>', $unit[$model->alias]['chemical_formula']);
}
return $results;
}
}
I guess I'd do one of 2 things depending on how generically the code block applies:
Universal version: not use a behavior, but include your method block in AppModel::afterFind
Surgical version: use a behavior and attach it to each model that needs to share the functionality.
A behavior isn't supposed to work on related models, for example, if you have this two models:
app/models/product.php
<?php
class Product extends AppModel{
var $belongsTo = array('Category');
var $actsAs = array('SomeBehavior');
}
?>
app/models/category.php
<?php
class Category extends AppModel {
var $hasMany = array('Product');
}
?>
SomeBehavior will only be executed when calling methods for Product, because the behavior isn't associated with Category
http://github.com/m3nt0r/eventful-cakephp
Set up an event that does the formatting - trigger that event however you need to. Easy as Cake.

Resources