The Comments plugin will allow you comment every model with the possibility to change the template in your APP.
This plugin works with a behavior and a helper you need to load to fully works.
composer require kareylo/cakephp-comments
load the plugin in your config/bootstrap.php
:
Plugin::load('Kareylo/Comments', [
'routes' => true
]);
Add in the ModelTable you wanna be commentable the following behavior :
$this->addBehavior('Kareylo/Comments.Commentable');
The behavior can take these options :
null
Kareylo/Comments.Comments
ref_id
false
comments_count
Add the following helper in your src/View/AppView.php
public function initialize()
{
$this->loadHelper('Kareylo/Comments.Comment');
}
The helper can take these options :
ul
ul
, ol
, div
null
null
false
Get all your comments with the comments finder
$data = $this->Model->find()->where(['Model.id' => $id])->find('comments')->first();
$this->set(compact('data'));
To display your comments
$this->Comment->display($data);
You can also chose to not use display($data)
and use a loop to have the full control of your template
// in your view
<div class="row">
<h4>Commentaires</h4>
<ul class="comment-list">
<?php foreach ($model->comments as $comment):
echo $this->Comment->comment($comment);
endforeach; ?>
</ul>
<!-- loadJS and display the comment Form if user is connected -->
<?= $this->Comment->loadFormAndJS($model); ?>
</div>
To create templates for the comment block (1 comment) and the form block, create the views you want if src/Template/Element/Comments
.
Example :
/** src/Template/Element/Comments/comment.ctp
* $connected is used to check is user is connected
*/
<div class="comment-avatar">
<i class="fa fa-user"></i>
</div>
<div class="comment-container">
<div class="comment-author">
<?= $comment->user->username; ?>
<span class="comment-date">on <span
class="underline"><?= $comment->created->format("l, d M y"); ?></span> at <span
class="underline"><?= $comment->created->format("H:i:s"); ?></span></span>
</div>
<div class="comment-content">
<?= h($comment->id); ?>
</div>
<?php if ($connected): ?>
<div class="comment-btn pull-left">
<a href="#" class="reply" data-id="<?= $comment->id ?>"><i class="fa fa-reply"></i> Reply</a>
</div>
<?php endif; ?>
<?php if ($comment->children): ?>
<ul class="comment-list">
<?php foreach ($comment->children as $child) {
echo $this->Comment->comment($child);
} ?>
</ul >
<?php endif; ?>
</div>
// src/Template/Element/Comments/form.ctp
<?= $this->Form->create($comment, ['id' => 'commentForm', 'url' => ['controller' => 'Comments', 'action' => 'add', 'plugin' => 'Comments']]); ?>
<?= $this->Flash->render('comment'); ?>
<?= $this->Form->control('content', ['label' => __('Commentaire'), 'type' => 'textarea']); ?>
<?= $this->Form->hidden('ref'); ?>
<?= $this->Form->hidden('ref_id'); ?>
<?= $this->Form->unlockField('parent_id'); ?>
<?= $this->Form->hidden('parent_id', ['default' => null]); ?>
<?= $this->Form->button(__('Commenter')) ?>
<?= $this->Form->end() ?>
To create the template for your flash, just add a element in src/Template/Element/Flash/Comments
and name it comment.ctp
//src/Template/Element/Flash/Comments/comment.ctp
<?php
if (!isset($params['escape']) || $params['escape'] !== false) {
$message = h($message);
}
?>
<div class="message <?= $params['class'] ?? 'success' ?>" onclick="this.classList.add('hidden');"><?= $message ?></div>
$params['class']
can have the values success
and error
For bugs and feature requests, please use the issues section of this repository.
Follow this guide to contribute
Licensed under the MIT License. Redistributions of the source code included in this repository must retain the copyright notice found in each file.