我想知道是否有人在Symfony中设置动态元标题方面有任何好的建议/经验?
目前,我所知道的解决方案是使用以下代码在每个操作中单独设置标题:
$this->getResponse()->setTitle('This is a title');
因为我还需要翻译标题,所以我可以在动作中调用i18n助手,将它们包含在提取的XLIFF中。不需要特殊的SEO东西,只是一个干净的标题。
但是,上述内容确实需要我分别调整每个动作。 View.yml不合适,因为每个模块经常有多个动作/模板。
是否有人知道Symfony有更好的方法,或者这确实是正确/唯一的方法?
谢谢。
答案 0 :(得分:25)
您应该使用slots。
在您的布局<head>
标记中:
<title><?php echo get_slot('page_title', __('Default page title here')) ?></title>
在动作模板中:
<?php slot('page_title', __('Action page title goes here')) ?>
答案 1 :(得分:5)
我认为在每个动作中都可以单独编写标题。但是如果你想添加一些全局前缀,你可以在布局中使用这样的东西:
<title>SITE NAME — <?= $sf_response->getTitle() ?></title>
此外,您可以在操作中使用preExecute()方法操作每个模块的标题。
答案 2 :(得分:3)
我个人喜欢使用yml文件,它将'配置'与代码
分开为了处理动态标题,请按以下步骤操作:
在apps / frontend / config / app.yml
中all:
title_separator: ' - '
title_default: 'TITLE'
在apps / frontend / config / view.yml
中default:
metas:
title: %APP_TITLE_DEFAULT%
如果您需要将操作中的数据放入标题中,请使用以下内容创建文件lib / myActions.class.php:
<?php
class myActions extends sfActions
{
protected function setTitle($string)
{
$this->getResponse()->setTitle($string . sfConfig::get('app_title_separator') . sfConfig::get('app_title_default'));
}
}
?>
(注意:根据需要修改此项,例如将默认标题放在前面)
然后更改action.class.php以扩展myActions而不是sfActions
class memberActions extends myActions
每当您需要更改标题时,只需在操作中调用
即可$this->setTitle('This is how I roll');
您将获得以下标题(如果使用与我上面相同的配置):
This is how I roll - TITLE
答案 3 :(得分:1)
$i18n = $this->getContext()->getI18N();
$this->getResponse()->setTitle('Your title' . ' | ' . $i18n->__('your module name'));