Going on with the Comments plugin
Added a frontend form, store comments under data/, basic visualization options
This commit is contained in:
parent
978abff176
commit
c18914d3e3
6 changed files with 233 additions and 38 deletions
155
comments.php
155
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';
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue