Automatically date archive blog posts / articles on publish
Set up listing page template - include page list & stack for sidebar Set up article page for composer
/application/bootstrap/app.php
<?php
use Application\Src\NewsPublish\Handler as PageHandler;
//or c5.8 use Application\Src\Concrete\NewsPublish\Handler as PageHandler;
$handler = new PageHandler();
\Events::addListener('on_page_type_publish', function($event) use ($handler) {
$page = $event->getPageObject();
if ($page->getPageTypeHandle() == 'news') {
$handler->placePost($page);
}
});
\Events::addListener('on_page_version_approve', function($event) use ($handler) {
$page = $event->getPageObject();
if ($page->getPageTypeHandle() == 'news' && $page->isPageDraft()) {
$handler->placePost($page);
}
});
\Events::addListener('on_page_move', function($event) use ($handler) {
$page = $event->getPageObject();
if ($page->getPageTypeHandle() == 'news') {
$parent = $event->getOldParentPageObject();
$handler->cleanPostParent($parent);
}
});
/application/src/NewsPublish/Handler.php
or c5.8 /application/src/Concrete/NewsPublish/Handler.php
<?php
namespace Application\Src\NewsPublish;
//c5.8 namespace Application\Concrete\NewsPublish;
use Concrete\Core\Page\Page;
use Concrete\Core\Page\Template;
use Concrete\Core\Page\Type\Type;
class Handler
{
public function placePost(Page $page) {
$date = $page->getCollectionDatePublic();
$y = date('Y', strtotime($date));
$m = date('m', strtotime($date));
$mm = date('F', strtotime($date));
$handle = $page->getCollectionHandle();
if (!$handle) { $handle = $page->getCollectionID(); }
$posts = \Page::getByPath('/news/latest');
$yearPage = \Page::getByPath('/news/latest/' . $y);
$pageType = \PageType::getByHandle('news_list');
$template = \PageTemplate::getByHandle('default');
if (!is_object($yearPage) || $yearPage->isError()) {
$year = $posts->add($pageType, array(
'cName' => $y,
'cDescription' => 'Latest news for '.$y,
'cDatePublic' => $y.'-01-01 13:05:05', // Y-m-d H:i:s e.g. 2016-01-28 13:05:05
'cHandle ' => $y
), $template);
$year->setCanonicalPagePath('/news/latest/' . $y);
$yearPage = Page::getByPath('/news/latest/'.$y);
}
$monthPage = Page::getByPath('/news/latest/' . $y . '/' . $m);
if (!is_object($monthPage) || $monthPage->isError()) {
$descMonth = date('F', strtotime($date));
$month = $yearPage->add($pageType, array(
'cName' => $descMonth.' '.$y,
'cDescription' => "Latest News for $descMonth $y",
'cDatePublic' => $y.'-'.$m.'-01 13:05:05', // Y-m-d H:i:s e.g. 2016-01-28 13:05:05
'cHandle ' => $m
), $template);
$month->setCanonicalPagePath('/news/latest/'.$y.'/'.$m);
$monthPage = Page::getByPath('/news/latest/'.$y.'/'.$m);
}
$page->move($monthPage);
}
public function cleanPostParent(Page $parent) {
if ($parent->getPageTypeHandle() == 'news_list') {
$children = $parent->getCollectionChildren();
if (count($children) == 0) {
$year = Page::getByID($parent->getCollectionParentID());
$parent->moveToTrash();
if (is_object($year) && !$year->isError() && $year->getPageTypeHandle() == 'news_list') {
$children2 = $year->getCollectionChildren();
if (count($children2) == 0) { $year->moveToTrash(); }
}
}
}
}
}