diff --git a/comments.php b/comments.php index e5ebf86..b0ef78e 100644 --- a/comments.php +++ b/comments.php @@ -3,7 +3,7 @@ namespace Grav\Plugin; use Grav\Common\Blueprint; use Grav\Common\Blueprints; use Grav\Common\BlueprintSchema; -use Grav\Common\File\CompiledYamlFile; +//use Grav\Common\File\CompiledYamlFile; use Grav\Common\Filesystem\Folder; use Grav\Common\Filesystem\RecursiveFolderFilterIterator; use Grav\Common\GPM\GPM; @@ -12,6 +12,7 @@ use Grav\Common\Page\Page; use Grav\Common\Page\Pages; use Grav\Common\Plugin; use Grav\Common\Utils; +use RocketTheme\Toolbox\File\File; use RocketTheme\Toolbox\Event\Event; use Symfony\Component\Yaml\Yaml; use Twig_SimpleFunction; @@ -284,9 +285,11 @@ class CommentsPlugin extends Plugin { /** store comments with page **/ /******************************/ $localfilename = $path . '/comments.yaml'; - $localfile = CompiledYamlFile::instance($localfilename); + //$localfile = CompiledYamlFile::instance($localfilename); + $localfile = File::instance($localfilename); if (file_exists($localfilename)) { - $data = $localfile->content(); + //$data = $localfile->content(); + $data = Yaml::parse($localfile->content()); if (isset($data['comments']) && is_array($data['comments'])) { foreach ($data['comments'] as $key => $comment) { if (!empty($comment['parent']) && $comment['parent'] == $id) { @@ -300,7 +303,8 @@ class CommentsPlugin extends Plugin { //reason: could be possible that "deleted" already exists (e.g. false or '') in $comment which would overwrite the first (newly added) occurence $data['comments'][$key]['deleted'] = $date; //no need to look further as ids are supposed to be unique. - $localfile->save($data); + //$localfile->save($data); + $localfile->save(Yaml::dump($data)); $entry_removed = false; $reply_id = empty($comment['id']) ? '' : $comment['id']; $message = "Found active reply ($reply_id) for selected comment ($id)."; @@ -316,7 +320,8 @@ class CommentsPlugin extends Plugin { //reason: could be possible that "deleted" already exists (e.g. false or '') in $comment which would overwrite the first (newly added) occurence $data['comments'][$key]['deleted'] = $date; //no need to look further as ids are supposed to be unique. - $localfile->save($data); + //$localfile->save($data); + $localfile->save(Yaml::dump($data)); $entry_removed = true; $message = "Deleted comment ($id) via path ($path)"; break; @@ -326,31 +331,6 @@ class CommentsPlugin extends Plugin { } else { //nothing - } - /**********************************/ - /** store comments in index file **/ - /**********************************/ - $indexfilename = DATA_DIR . 'comments/index.yaml'; - $indexfile = CompiledYamlFile::instance($indexfilename); - if (file_exists($indexfilename)) { - $dataIndex = $indexfile->content(); - if (isset($dataIndex['comments']) && is_array($dataIndex['comments'])) { - foreach ($dataIndex['comments'] as $key => $comment) { - if (!empty($comment['page']) && !empty($comment['id']) && $comment['page'] == $route && $comment['id'] == $id) { - //add deleted as first item in array (better readability in file) - $dataIndex['comments'][$key] = array_merge(array('deleted' => ''), $comment); - //set date after merge - //reason: could be possible that "deleted" already exists (e.g. false or '') in $comment which would overwrite the first (newly added) occurence - $dataIndex['comments'][$key]['deleted'] = $date; - //no need to look further as ids are supposed to be unique. - $indexfile->save($dataIndex); - break; - } - } - } - } else { - //nothing - } //clear cache $this->grav['cache']->delete($this->comments_cache_id); @@ -392,29 +372,25 @@ class CommentsPlugin extends Plugin { /** store comments with page **/ /******************************/ $localfilename = $path . '/comments.yaml'; - $localfile = CompiledYamlFile::instance($localfilename); + //$localfile = CompiledYamlFile::instance($localfilename); + $localfile = File::instance($localfilename); if (file_exists($localfilename)) { - $data = $localfile->content(); - $data['autoincrement']++; + //$data = $localfile->content(); + $data = Yaml::parse($localfile->content()); + if (isset($data['autoincrement'])) { + $data['autoincrement']++; + } else { + $data['autoincrement'] = max( sizeof($data['comments']), 1 ); + } + } else { $data = array('autoincrement' => 1, 'comments' => array()); } $localid = $data['autoincrement']; - $newComment = ['id' => $data['autoincrement'], 'ip' => $ip, 'parent' => $parent, 'lang' => $lang, 'text' => $text, 'date' => $date, 'author' => $name, 'email' => $email, 'site' => $site, 'user' => $user, 'approved' => $approved, 'isAdmin' => !empty($isAdmin), ]; + $newComment = ['id' => $data['autoincrement'], 'ip' => $ip, 'parent' => $parent, 'lang' => $lang, 'text' => $text, 'date' => $date, 'author' => $name, 'email' => $email, 'site' => $site, 'user' => $user, 'approved' => $approved, 'isAdmin' => !empty($isAdmin) ]; $data['comments'][] = $newComment; - $localfile->save($data); - /**********************************/ - /** store comments in index file **/ - /**********************************/ - $indexfilename = DATA_DIR . 'comments/index.yaml'; - $indexfile = CompiledYamlFile::instance($indexfilename); - if (file_exists($indexfilename)) { - $data = $indexfile->content(); - } else { - $data = array('comments' => array()); - } - $data['comments'][] = ['page' => $route, 'id' => $localid, 'parent' => $parent, 'lang' => $lang, 'text' => $text, 'date' => $date, 'author' => $name, 'email' => $email, 'site' => $site, 'approved' => $approved, ]; - $indexfile->save($data); + //$localfile->save($data); + $localfile->save(Yaml::dump($data)); //clear cache, don't let incoming spam thrash the cache. if ($approved == 'true') { $this->grav['cache']->delete($this->comments_cache_id); @@ -479,8 +455,10 @@ class CommentsPlugin extends Plugin { if (!empty($paths[str_replace('/', '\\', $fileFolder) ])) $route = $paths[str_replace('/', '\\', $fileFolder) ]; if (!empty($paths[str_replace('\\', '/', $fileFolder) ])) $route = $paths[str_replace('\\', '/', $fileFolder) ]; $page_stats[$filepath] = array('active_entries' => 0, 'deleted_entries' => 0, 'active_comments' => 0, 'deleted_comments' => 0, 'active_replies' => 0, 'deleted_replies' => 0, 'latest_active_entry' => 0, 'route' => $route,); - $localfile = CompiledYamlFile::instance($filepath); - $localcomments = $localfile->content(); + //$localfile = CompiledYamlFile::instance($filepath); + $localfile = File::instance($filepath); + //$localcomments = $localfile->content(); + $localcomments = Yaml::parse($localfile->content()); if (!empty($localcomments['comments']) && is_array($localcomments['comments'])) { foreach ($localcomments['comments'] as $comment) { if (!empty($comment['deleted'])) { @@ -538,7 +516,8 @@ class CommentsPlugin extends Plugin { private function getFilesOrderedByModifiedDate($path = '') { $files = []; if (!$path) { - $path = DATA_DIR . 'comments'; + //$path = DATA_DIR . 'comments'; + $path = $this->grav['page']->path() . '/comments.yaml'; } if (!file_exists($path)) { Folder::mkdir($path); @@ -605,9 +584,10 @@ class CommentsPlugin extends Plugin { return $comments; } $lang = $this->grav['language']->getLanguage(); - $filename = $lang ? '/' . $lang : ''; - $filename.= $this->grav['uri']->path() . '.yaml'; - $comments = $this->getDataFromFilename($filename) ['comments']; + //$filename = $lang ? '/' . $lang : ''; + //$filename.= $this->grav['uri']->path() . '.yaml'; + $filename = $this->grav['page']->path() . '/comments.yaml'; + $comments = $this->getDataFromFilename($filename)['comments']; $comments = $this->setCommentLevels($comments); //save to cache if enabled $cache->save($this->comments_cache_id, $comments); @@ -621,15 +601,22 @@ class CommentsPlugin extends Plugin { return $comments; } $levelsflat = array(); + $commentId = 0; foreach ($comments as $key => $comment) { + $commentId += 1; if (!empty($comment['deleted'])) { //if field "deleted" exists and is filled with a true value then ignore the comment completely. //TODO: This only works on this position as long as it is forbidden to delete comments that have active replies (children). // Otherwise implement that children get the deleted flag recursively or are ignored via Comment class. } else { - $levelsflat[$comment['id']]['parent'] = $comment['parent']; - $levelsflat[$comment['id']]['class'] = new Comment($comment['id'], $comments[$key]); + if (isset($comment['id'])) { + $levelsflat[$comment['id']]['parent'] = $comment['parent']; + $levelsflat[$comment['id']]['class'] = new Comment($comment['id'], $comments[$key]); + } else { + $levelsflat[$commentId]['parent'] = $comment['parent']; + $levelsflat[$commentId]['class'] = new Comment($commentId, $comments[$key]); + } } } //get starting points (entries without valid parent = root element) @@ -667,7 +654,7 @@ class CommentsPlugin extends Plugin { $lang = $this->grav['language']->getLanguage(); $filename = $lang ? '/' . $lang : ''; $filename.= $this->grav['uri']->path() . '.yaml'; - $pingbacks = $this->getDataFromFilenameOld($filename) ['pingbacks']; + $pingbacks = $this->getDataFromFilenameOld($filename)['pingbacks']; //save to cache if enabled $cache->save($this->pingbacks_cache_id, $pingbacks); return $pingbacks; @@ -691,12 +678,14 @@ class CommentsPlugin extends Plugin { //Single item details //$fileInstance = CompiledYamlFile::instance(DATA_DIR . 'comments/' . $fileRoute); //Use comment file in page folder - $fileInstance = CompiledYamlFile::instance($this->grav['page']->path() . '/comments.yaml'); + //$fileInstance = CompiledYamlFile::instance($this->grav['page']->path() . '/comments.yaml'); + $fileInstance = File::instance($this->grav['page']->path() . '/comments.yaml'); if (!$fileInstance->content()) { //Item not found return; } - return $fileInstance->content(); + //return $fileInstance->content(); + return Yaml::parse($fileInstance->content()); } private function getDataFromFilenameOld($fileRoute) { diff --git a/templates/partials/comments.html.twig b/templates/partials/comments.html.twig index c686d73..599cc05 100644 --- a/templates/partials/comments.html.twig +++ b/templates/partials/comments.html.twig @@ -48,7 +48,7 @@ {{nested}}