0
votes

I have created a CommentManager plugin for adding comments in my posts. Adding the comment form in Posts/view.ctp file and the comment form action is redirecting to CommentManager/Comments/add.

The comments are saving properly but when saving empty form, that doesn't shows the validation error messages which i have written in CommentsTable and also the entered data has gone from the form.

CommentManager/src/Controller/CommentsController/add

public function add()
{
    $ccomment = $this->Comments->newEntity($this->request->data);
    if ($this->request->is('post')) {
        $newData = ['post_id' => $this->request->params['pass'][0]];
        $ccomment = $this->Comments->patchEntity($ccomment, $newData);

        if ($this->Comments->save($ccomment)) {
            $this->Flash->success('The comment has been saved.');
            return $this->redirect($_SERVER['HTTP_REFERER']);
        } else {
            $this->Flash->error('The comment could not be saved. Please, try again.');
        }
    }
    $this->set(compact('ccomment'));        
    return $this->redirect($_SERVER['HTTP_REFERER']);
}

CommentManager/src/Model/Table/CommentsTable

public function validationDefault(Validator $validator) {
    return $validator
        ->notEmpty('body', 'Body contents required.')
        ->notEmpty('email', 'An email is required.')
        ->add('email', [
            'format' => [
                'rule' => [
                    'custom',
                    '/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/'
                ],
                'message' => 'Enter a valid email.'
            ]
        ]);
}

src/Template/Posts/view.ctp

<?php echo $this->Html->link('Back', ['action' => 'index']) ?>
<?php echo $this->element('check_login'); ?>
<br/>
<?php $img_path = DS.'webroot'.DS.'images'.DS.$post->image; ?>
<img src="<?php echo empty($post->image)?'':$img_path; ?>">
<h2><?php echo $post->title; ?></h2>
<p><?php echo $post->body; ?></p>
<p><small><?php echo $post->created->format('d M Y'); ?></small></p>


<h3>Comments:</h3>
<?php foreach ($comments as $comment) { ?>
    <p><?php echo $comment->body; ?></p>        
<?php } ?>

<?php
echo $this->Form->create(null, ['url' => ['plugin' => 'CommentManager', 'controller' => 'Comments', 'action' => 'add', $post->id]]);
echo $this->Form->input('body', ['type' => 'textarea', 'rows' => '5', 'cols' => '5']);
echo $this->Form->input('email');
echo $this->Form->button('Save');
echo $this->Form->end();
?>
1

1 Answers

0
votes

Don't call newEntity() with an empty array. Inste of

$ccomment = $this->Comments->newEntity($this->request->data);

Do:

$ccomment = $this->Comments->newEntity();

And in in the call to patchEntity() pass the $this->request->data