vierwd/typo3-smarty

在模板中使用 Smarty 而不是 Fluid

安装数: 4,084

依赖项: 1

建议者: 0

安全: 0

星标: 2

关注者: 5

分支: 0

开放问题: 0

类型:typo3-cms-extension

10.2.0 2023-10-20 10:03 UTC

README

在模板和 extbase 扩展中使用 Smarty

安装

使用 composer 安装

composer require 'vierwd/typo3-smarty'

在控制器中的使用

要为扩展的动作使用 smarty 模板,只需扩展 Vierwd\VierwdSmarty\Controller\ActionController。您的模板需要与之前使用的 Fluid 模板位于同一位置,但文件扩展名为 .tpl

示例

// Classes/Controller/BlogController.php
namespace Example\ExampleBlog\Controller;

class BlogController extends \Vierwd\VierwdSmarty\Controller\ActionController {
	/**
	 * @var \Example\ExampleBlog\Domain\Repository\PostRepository
	 * @TYPO3\CMS\Extbase\Annotation\Inject
	 */
	protected $postRepository;

	public function listAction() {
		$posts = $this->postRepository->findAll();
		$this->view->assign('posts', $posts);
	}
}
{* Resources/Private/Templates/Blog/List.tpl *}

{foreach $posts as $post}
	<div class="post">
		<h1>{$post->getTitle()}</h1>

		{$post->getContent()|escape|nl2p nofilter}
	</div>
{/foreach}

预定义变量

有一些变量始终可用于您的模板

预定义 smarty 函数、块和修饰符

  • 翻译
  • uri_resource
  • uri_action
  • link_action
  • flashMessages
  • nl2p
  • email
  • typolink
  • typoscript
  • fluid
  • svg

Power-Blocks: typoscript 和 fluid

这个扩展真正的好处是,您仍然可以在 Smarty 模板中使用 typoscript 和 fluid。这样,您可以确保元素与普通内容元素(如带图片的文本)具有完全相同的 HTML 输出。如果您编写表单,也最好使用 Fluid 为一些 ViewHelpers 提供回退。

typoscript

{capture assign=text}
<p>Lorem <b>ipsum</b> dolor sit amet, consectetur adipisicing elit. Dolorem, earum est reiciendis modi neque in veniam rerum deleniti et praesentium? Numquam, odit, itaque voluptate pariatur adipisci enim tempora ducimus dolor!</p>
{/capture}

{typoscript header='TypoScript Example' bodytext=$text CType=text}
lib.parseFunc_RTE >
10 < tt_content
{/typoscript}
输出(添加了换行符)
<div class="csc-default">
<header class="csc-header"><h1>TypoScript Example</h1></header>
<p>Lorem <b>ipsum</b> dolor sit amet, consectetur adipisicing elit. Dolorem, earum est reiciendis modi neque in veniam rerum deleniti et praesentium? Numquam, odit, itaque voluptate pariatur adipisci enim tempora ducimus dolor!</p>
</div>

typoscript 的更改不会持久保存。这样,您可以在一个 TypoScript 块中删除 lib.parseFunc_RTE,同时仍在另一个中使用它。也可以为所有参数使用 data 数组。

{capture assign=text}
<p>Lorem <b>ipsum</b> dolor sit amet, consectetur adipisicing elit. Dolorem, earum est reiciendis modi neque in veniam rerum deleniti et praesentium? Numquam, odit, itaque voluptate pariatur adipisci enim tempora ducimus dolor!</p>
{/capture}

{$data=[
	CType => text,
	header => 'TypoScript Example',
	header_layout => 1,
	bodytext => $text
]}

{typoscript data=$data header_layout=2}
lib.parseFunc_RTE >
10 < tt_content
{/typoscript}

注意,在块标签中的参数会覆盖数组键(在这个示例中是 header_layout)

输出(添加了换行符)
<div class="csc-default">
<header class="csc-header"><h2>TypoScript Example</h2></header>
<p>Lorem <b>ipsum</b> dolor sit amet, consectetur adipisicing elit. Dolorem, earum est reiciendis modi neque in veniam rerum deleniti et praesentium? Numquam, odit, itaque voluptate pariatur adipisci enim tempora ducimus dolor!</p>
</div>

使用 Smarty 作为基础模板

您还可以在主要的 TypoScript 设置中使用 Smarty 作为您网站基础模板

page = PAGE
page.10 < plugin.tx_vierwdsmarty
page.10.settings {
	template = EXT:example_blog/Resources/Private/Templates/main.tpl

	typoscript.navigation < lib.navigation
	typoscript.footerNavigation < lib.footerNavigation
	typoscript.content < styles.content.get
	typoscript.logo < lib.logo
}

settings.typoscript 中的所有条目都会被解析,并在模板中作为变量可用。

{* example_blog/Resources/Private/Templates/main.tpl *}
<header>
	{$logo nofilter}
	{$navigation nofilter}
</header>
<div role="main">
	<!--TYPO3SEARCH_begin-->
	{$content nofilter}
	<!--TYPO3SEARCH_end-->
</div>
<footer>{$footerNavigation nofilter}</footer>

注意 Smarty 的 nofilter 参数。默认情况下,所有变量都将转义以防止某些 XSS 攻击。

使用 Smarty 作为菜单

lib.navigation = HMENU
lib.navigation {
	entryLevel = 0

	1 = SMARTY
	1 {
		expAll = 1
		extensionName = vierwd_example
		template = Navigation/Main.tpl

		NO = 1
		ACT = 1
		IFSUB = 1
		ACTIFSUB = 1
	}

	2 < .1
	2.template = Navigation/Submenu.tpl
	3 < .2
}

此代码块将加载位于 typo3conf/ext/vierwd_example/Resources/Private/Templates/Navigation/ 的模板以渲染导航。在模板中,您可以遍历菜单项并输出菜单

<nav class="main-navigation">
	<ul>
	{foreach $menu as $item}
		{$hasSubmenu = $menuObject->isSubMenu($item.uid)}
		{$isActive = $menuObject->isActive($item.uid)}
		<li class="{if $isActive}active{/if}">
			<a href="{$item.uid|typolink}">
				{$item.nav_title|default:$item.title}
			</a>
			{$menuObject->submenu($item.uid) nofilter}
		</li>
	{/foreach}
	</ul>
</nav>