Note: This requires Concrete CMS 5.7.4 or Greater.
Concrete 5.7.4 introduces a cool new service object: SEO Helper.
$seo = \Core::make('helper/seo');
This will return an instance of the \Concrete\Core\Html\Service\Seo object, which has a number of interesting methods available to it.
- setSiteName
- addTitleSegment
- setTitleFormat
- setTitleSegmentSeparator
Use this service object to set your site's title from anywhere, or modify the existing title of the page. For example, let's say you want to render a custom view for a single page at a controller method:
public function view_album($albumID = null)
{
$selectedAlbum = \Foo\Media\Album::getByID($albumID);
$this->set('albumID', $albumID);
$this->set('album', $selectedAlbum);
$this->render('/media/albums');
}
While this method will work to render the albums list – the name of the page will be unchanged. Why not change the page's name as well?
public function view_album($albumID = null)
{
$selectedAlbum = \Foo\Media\Album::getByID($albumID);
$this->set('albumID', $albumID);
$this->set('album', $selectedAlbum);
$this->render('/media/albums');
$seo = \Core::make("helper/seo");
$seo->addTitleSegment('Albums');
}
This can even work from a block view. Check out how the Page List block listens for the active topic filtering a page, and then modifies the page's title accordingly:
public function action_filter_by_topic($treeNodeID = false, $topic = false)
{
if ($treeNodeID) {
$this->list->filterByTopic(intval($treeNodeID));
$topicObj = Topic::getByID(intval($treeNodeID));
if (is_object($topicObj)) {
$seo = Core::make('helper/seo');
$seo->addTitleSegment($topicObj->getTreeNodeDisplayName());
}
}
$this->view();
}
Note: This is all accomplished at runtime for the current request. This does not change the underlying page's name at the record level.