diff --git a/README.md b/README.md
index 87286df..716baca 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Grav Data Manager Plugin
+# Grav Comments Plugin
The **Comments Plugin** for [Grav](http://github.com/getgrav/grav) adds the ability to add comments to pages, and moderate them.
@@ -6,7 +6,7 @@ The **Comments Plugin** for [Grav](http://github.com/getgrav/grav) adds the abil
# Installation
-The Data plugin is easy to install with GPM.
+The Comments plugin is easy to install with GPM.
```
$ bin/gpm install comments
@@ -16,10 +16,10 @@ Or clone from GitHub and put in the `user/plugins/comments` folder.
# TODO
-- Create inferface (with Form?) to allow people to submit a comment to a Page
-- Store and email the comment to the emails configured (default to all with admin.super)
-- Enable by default on all Pages
+- Validate comment, name and email on the frontend form
+- Add language file for the frontend
+- Allow to moderate comments from the admin
+- Email the comment to the site admins (default to all with admin.super, could be configured)
- Allow to enable on some taxonomies or page types only
- Allow some pages to disable comments
-- Admin interface to moderate comments
-- Add ACL permissions so users can moderate comments in admin
+- Better presentation of the comments in Antimatter and other default themes
\ No newline at end of file
diff --git a/admin/pages/comments.md b/admin/pages/comments.md
index 5996684..2b290b0 100644
--- a/admin/pages/comments.md
+++ b/admin/pages/comments.md
@@ -1,7 +1,7 @@
---
-title: Data Manager
+title: Comments
access:
- admin.data-manager: true
+ admin.comments: true
admin.super: true
---
diff --git a/admin/templates/comments.html.twig b/admin/templates/comments.html.twig
index 7700f2e..49bd8ea 100644
--- a/admin/templates/comments.html.twig
+++ b/admin/templates/comments.html.twig
@@ -9,28 +9,33 @@
{% endblock %}
{% block content %}
-
-
-
{{"PLUGIN_COMMENTS.COMMENTS"|e|tu}}
-
-
- {% for item in grav.twig.comments %}
- -
-
-
- {% endfor %}
-
-
+
+
+ {% for file in grav.twig.files %}
+
+
+
+ {{ file.fileName }}
+ {% if file.data.hasUnread %}Has {{file.data.unreadCount}} unread comments{% endif %}
+ |
+
+
+ |
+
+
+ {% include 'partials/comments-list.html.twig' with { file: file } %}
+
+ |
+
+ {% endfor %}
+
{% endblock %}
+
+
diff --git a/admin/templates/partials/comments-list.html.twig b/admin/templates/partials/comments-list.html.twig
new file mode 100644
index 0000000..3eb2bef
--- /dev/null
+++ b/admin/templates/partials/comments-list.html.twig
@@ -0,0 +1,11 @@
+
+ {% for comment in file.data.comments %}
+
+
+ {{ comment.text }}
+
+ By {{ comment.author }} {{ comment.email }}
+ |
+
+ {% endfor %}
+
diff --git a/comments.php b/comments.php
index 166bb34..677b800 100644
--- a/comments.php
+++ b/comments.php
@@ -6,6 +6,10 @@ use Grav\Common\Grav;
use Grav\Common\Page\Page;
use Grav\Common\Page\Pages;
use Grav\Common\Plugin;
+use RocketTheme\Toolbox\File\File;
+use RocketTheme\Toolbox\Event\Event;
+use Grav\Common\Filesystem\RecursiveFolderFilterIterator;
+use Symfony\Component\Yaml\Yaml;
class CommentsPlugin extends Plugin
{
@@ -22,32 +26,159 @@ class CommentsPlugin extends Plugin
}
/**
- * Enable search only if url matches to the configuration.
*/
public function onPluginsInitialized()
{
if (!$this->isAdmin()) {
+
+ // //Site
+ // $this->enable([
+ // 'onPageProcessed' => ['onPageProcessed', 0],
+ // ]);
+
+
+ $this->enable([
+ 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 0],
+ ]);
+
+ $this->addCommentURL = $this->config->get('plugins.comments.addCommentURL', '/add-comment');
+
+ if ($this->addCommentURL && $this->addCommentURL == $this->grav['uri']->path()) {
+ $this->enable([
+ 'onPagesInitialized' => ['addComment', 0]
+ ]);
+ } else {
+ $this->grav['twig']->comments = $this->fetchComments();
+ }
+
+ } else {
+ //Admin
+ $this->enable([
+ 'onTwigTemplatePaths' => ['onTwigAdminTemplatePaths', 0],
+ 'onAdminTemplateNavPluginHook' => ['onAdminTemplateNavPluginHook', 0],
+ 'onDataTypeExcludeFromDataManagerPluginHook' => ['onDataTypeExcludeFromDataManagerPluginHook', 0],
+ ]);
+
+ $this->grav['twig']->files = $this->getFilesOrderedByModifiedDate();
+ }
+ }
+
+ public function addComment()
+ {
+ $post = !empty($_POST) ? $_POST : [];
+ $filename = DATA_DIR . 'comments' . $post['path'] . '.yaml';
+ $file = File::instance($filename);
+
+ if (file_exists($filename)) {
+ $data = Yaml::parse($file->content());
+
+ $data['comments'][] = [
+ 'text' => $post['text'],
+ 'date' => gmdate('D, d M Y H:i:s', time()),
+ 'author' => $post['name'],
+ 'email' => $post['email']
+ ];
+ } else {
+ $data = array(
+ 'comments' => array([
+ 'text' => $post['text'],
+ 'date' => gmdate('D, d M Y H:i:s', time()),
+ 'author' => $post['name'],
+ 'email' => $post['email']
+ ])
+ );
+ }
+
+ $file->save(Yaml::dump($data));
+
+ exit();
+ }
+
+ private function getFilesOrderedByModifiedDate($path = '') {
+ $files = [];
+ $dirItr = new \RecursiveDirectoryIterator(DATA_DIR . 'comments' . $path, \RecursiveDirectoryIterator::SKIP_DOTS);
+ $filterItr = new RecursiveFolderFilterIterator($dirItr);
+ $itr = new \RecursiveIteratorIterator($filterItr, \RecursiveIteratorIterator::SELF_FIRST);
+
+ $itrItr = new \RecursiveIteratorIterator($dirItr, \RecursiveIteratorIterator::SELF_FIRST);
+ $filesItr = new \RegexIterator($itrItr, '/^.+\.yaml$/i');
+
+ foreach ($filesItr as $filepath => $file) {
+ $files[] = (object)array(
+ "modifiedDate" => $file->getMTime(),
+ "fileName" => $file->getFilename(),
+ "filePath" => $filepath,
+ "data" => Yaml::parse(file_get_contents($filepath))
+ );
+ }
+
+ foreach ($itr as $file) {
+ if ($file->isDir()) {
+ $this->getFilesOrderedByModifiedDate('/' . $file->getFilename());
+ }
+ }
+
+ // Order files by last modified date
+ usort($files, function($a, $b) {
+ return !($a->modifiedDate > $b->modifiedDate);
+ });
+
+ return $files;
+ }
+
+
+
+ private function fetchComments() {
+
+
+ return $this->getFileContentFromRoute($this->grav['uri']->path() . '.yaml')['comments'];
+
+
+
+
+
+ // return [
+ // 'route' => 'comment-test-1',
+ // 'content' => 'A comment text'
+ // ];
+ }
+
+ /**
+ * Given a data file route, return the YAML content already parsed
+ */
+ private function getFileContentFromRoute($fileRoute) {
+
+ //Single item details
+ $fileInstance = File::instance(DATA_DIR . 'comments/' . $fileRoute);
+
+ if (!$fileInstance->content()) {
+ //Item not found
return;
}
- $this->enable([
- 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 0],
- 'onAdminTemplateNavPluginHook' => ['onAdminTemplateNavPluginHook', 0],
- 'onDataTypeExcludeFromDataManagerPluginHook' => ['onDataTypeExcludeFromDataManagerPluginHook', 0],
- ]);
+ return Yaml::parse($fileInstance->content());
+ }
- $comments[] = [
- 'route' => 'comment-test-1',
- 'content' => 'A comment text'
- ];
+ // /**
+ // */
+ // public function onPageProcessed(Event $e)
+ // {
+ // $page = $e['page'];
+ // $page->setRawContent('ss');
+ // }
- $this->grav['twig']->comments = $comments;
+ /**
+ * Add templates directory to twig lookup paths.
+ */
+ public function onTwigTemplatePaths()
+ {
+ $this->grav['twig']->twig_paths[] = __DIR__ . '/templates';
}
/**
* Add plugin templates path
*/
- public function onTwigTemplatePaths()
+ public function onTwigAdminTemplatePaths()
{
$this->grav['twig']->twig_paths[] = __DIR__ . '/admin/templates';
}
diff --git a/templates/partials/comments.html.twig b/templates/partials/comments.html.twig
new file mode 100644
index 0000000..af337eb
--- /dev/null
+++ b/templates/partials/comments.html.twig
@@ -0,0 +1,48 @@
+Add a Comment
+
+
+
+
+
+Comments
+
+
+ {% for comment in grav.twig.comments|array_reverse %}
+
+
+ {{ comment.text }}
+
+ Written on {{comment.date}} by {{comment.author}}
+ |
+
+ {% endfor %}
+