The add method in a CakePHP Controller doesn't work

2.1k Views Asked by At

When I am trying to include new content, in this controller, he's not running the save option and returns the error message, since I used the print_r function to check the $ this-> request-> data, and is passing the correct parameters. below is the code:

Controller/CanvasController.php:

class CanvasController extends AppController {
    public $name = 'Canvas';
    function beforeFilter() {
        parent::beforeFilter();
        //$this -> layout = 'dialog';
        $this -> layout = 'default-original';
    }

    public function index() {
        $this -> set('Canvas', $this -> Canvas -> find('all'));
    }

    public function add() {
        if ($this -> request -> is('post')) {
            if ($this -> Canvas -> save($this -> request -> data)) {
                $this -> Session -> setFlash(__('The Canvas has been saved'));
                $this -> redirect(array('action' => 'index'));
            } else {
                $this -> Session -> setFlash(__('The Canvas could not be saved. Please, try again.'));
            }
        }
    }

    public function edit($id = null) {
        $this -> Canvas -> id = $id;
        if ($this -> request -> is('get')) {
            $this -> request -> data = $this -> Canvas -> read();
        } else if ($this -> Canvas -> save($this -> request -> data)) {
            $this -> Session -> setFlash('Canvas updated.');
            $this -> redirect(array('controller' => 'user', 'action' => 'index'));
        }
    }

    public function delete($id = null) {
        if (!$this -> request -> is('post')) {
            throw new MethodNotAllowedException();
        }
        $this -> Canvas -> id = $id;
        if (!$this -> Canvas -> exists()) {
            throw new NotFoundException(__('Invalid.'));
        }
        if ($this -> Canvas -> delete($id)) {
            $this -> Session -> setFlash('The Canvas with id: ' . $id . ' has been deleted.');
            $this -> redirect(array('controller' => 'user', 'action' => 'index'));
        }
        $this -> Session -> setFlash(__('Canvas was deleted.'));
        $this -> redirect(array('controller' => 'user', 'action' => 'index'));
    }
}

Model/Canvas.php:

class Canvas extends AppModel {
    public $name = 'Canvas';

    public $hasAndBelongsToMany = array(
        'users' => array(
            'classname' => 'Users',
            'foreignkey' => 'canvas_id',
            'joinTable' => 'canvas_has_users'
        )
    );

    public $hasMany = array(
        'CanvasContents' => array(
            'classname' => 'CanvasContents',
            'foreignKey' => 'canvas_id'
        )
    );

    public $validate = array(
        'name' => array(
            'required' => array(
                'rule' => array(
                    'notEmpty'
                ),
                'message' => 'A name is required'
            )
        )
    );
}

View/Canvas/add.ctp:

<?php echo $this -> Form -> create('Canvas'); ?>
<fieldset>
    <?php   echo $this -> Form -> input('name'); ?>
    <?php   echo $this -> Form -> input('description'); ?>
</fieldset>
<?php   echo $this -> Form -> end('Submit');?>

SQL code:

CREATE TABLE IF NOT EXISTS `sistema`.`canvas` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(45) NOT NULL,
    `description` TEXT NULL,
    PRIMARY KEY (`id`))
    ENGINE = InnoDB
3

There are 3 best solutions below

0
On BEST ANSWER

I solved, here is the codes:

Controller/CavasController.php:

<?php
class CanvasController extends AppController {
    public $name = 'Canvas';

    function beforeFilter() {
        parent::beforeFilter();
        $this -> layout = 'dialog';
        $this -> Auth -> allow();
        //$this -> layout = 'default-original';
    }

    public function index() {
        $this -> set('Canvas', $this -> Canvas -> find('all'));
    }

    public function setActiveCanvas($canvasId) {
        $this -> Session -> write('activeCanvas', $canvasId);
    }

    public function add() {
        if ($this -> request -> is('post')) {
            $this -> Canvas -> create();
            if ($this -> Canvas -> save($this -> request -> data)) {
                $this -> Session -> setFlash(__('The Canvas has been saved'));
                $this -> redirect('/');
            } else {

                $this -> Session -> setFlash(__('The Canvas could not be saved. Please, try again.'));
            }
        }
    }

    public function edit($id = null) {
        $this -> Canvas -> id = $id;
        if ($this -> request -> is('get')) {
            $this -> request -> data = $this -> Canvas -> read();
        } else if ($this -> Canvas -> save($this -> request -> data)) {
            $this -> Session -> setFlash('Canvas updated.');
            $this -> redirect('/');
        }
    }

    public function delete($id = null) {
        if (!$this -> request -> is('post')) {
            throw new MethodNotAllowedException();
        }

        $this -> Canvas -> id = $id;

        if (!$this -> Canvas -> exists()) {
            throw new NotFoundException(__('Invalid.'));
        }

        if ($this -> Canvas -> delete($id)) {
            $this -> Session -> setFlash('The Canvas with id: ' . $id . ' has been deleted.');
            $this -> redirect(array('controller' => 'user', 'action' => 'index'));
        }

        $this -> Session -> setFlash(__('Canvas was deleted.'));
        $this -> redirect(array('controller' => 'user', 'action' => 'index'));
    }

}
?>

Model/Canvas.php:

<?php
class Canvas extends AppModel {
    public $name = 'Canvas';

    public $hasMany = array(
        'CanvasContents' => array(
            'classname' => 'CanvasContents', 
            'foreignKey' => 'canvas_id'
        )
    );

    public $belongsTo = array(
        'Star' => array(
            'className'     => 'Stars',
            'foreignKey'    => 'stars_id'
        ),
        'User' => array(
            'className'     => 'Users',
            'foreignKey'    => 'users_id'
        ),
        'UserRole' => array(
            'className'     => 'UserRoles',
            'foreignkey'    => 'user_roles_id'
        )
    );

    public $validate = array(
        'name' => array(
            'required' => array(
                'rule' => array(
                    'notEmpty'
                ),
                'message' => 'A name is required'
            )
        )
    );
}
?>

View/Canvas/add.ctp:

<?php echo $this -> Form -> create('Canvas',array('action'=>'add')); ?>
<fieldset>
    <?php   echo $this -> Form -> input('Canvas.name'); ?>
    <?php   echo $this -> Form -> input('Canvas.description'); ?>
</fieldset>
<?php   echo $this -> Form -> end(); ?>

MySQL:

CREATE TABLE IF NOT EXISTS `sistema`.`canvas` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  `description` TEXT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB
0
On

I am not entirely sure what is wrong with your code. However, as a start you should try the following:

public function add() {
    if ($this -> request -> is('post')) {
        $this->Canvas->create(); // **** ADD This missing call ****
        if ($this -> Canvas -> save($this -> request -> data)) {
            $this -> Session -> setFlash(__('The Canvas has been saved'));
            $this -> redirect(array('action' => 'index'));
        } else {
            $this -> Session -> setFlash(__('The Canvas could not be saved. Please, try again.'));
        }
    }
}
0
On

try it by adding $this->Canvas->create(); if you still have problem then the problem may be in table.. also check your dataabase table..