Typo3 v9.5LTS частичное не рендеринг
Пытаясь понять правильный способ создания шаблонов в typo3, я перешел с typo3 6.2 на typo3 v9.5, и все новое. Я достиг использования DCE, создал бэкэнд-макет, и теперь я пытаюсь создать повторяющийся элемент для использования, например, на нескольких страницах с разными шаблонами.
По сравнению с новой установкой typo3 с основным шаблоном, поставляемым с typo3, я вижу, что они используют файл внутри:
внутр / your_template / Ресурсы / Private / Partials / страница / Структура / Footercontent
Затем в шаблоне они отображают HTML-файл, который загружает элементы из домашнего шаблона (я полагаю).
Здесь вы можете увидеть рендер
Моя проблема возникает, когда я пытаюсь повторить это на своей странице. Он не отображается на моей странице, даже базовая структура HTML.
FooterContent.html внутри, как я показываю на этой картинке, и вызов render в моем основном шаблоне, как на этой картинке
Home.html (Шаблон)
<f:section name="Footer">
<f:render partial="Structure/FooterContent" arguments="{_all}" />
</f:section>
FooterContent.html
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<section class="section footer-section footer-section-content">
<div class="beez_footer">
<div class="beez_footer_top beez_section">
<div class="beez_ft_left">
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '5'}" />
</div>
<div class="beez_ft_right">
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '6'}" />
</div>
</div>
<div class="beez_footer_middle beez_section">
<div class="beez_ft_left">
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '7'}" />
</div>
<div class="beez_ft_middle">
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '8'}" />
</div>
<div class="beez_ft_right">
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '9'}" />
</div>
</div>
<div class="beez_footer_bottom beez_section">
<div class="beez_ft_left">
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '10'}" />
</div>
<div class="beez_ft_right">
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: 11}" />
</div>
</div>
</div>
</section>
</html>
setup.typoscript в (ext/your_template/Configuration/Typoscript/):
######################
#### DEPENDENCIES ####
######################
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:fluid_styled_content/Configuration/TypoScript/setup.typoscript">
################
#### HELPER ####
################
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:nubis_theme/Configuration/TypoScript/Helper/DynamicContent.typoscript">
##############
#### PAGE ####
##############
page = PAGE
page {
typeNum = 0
shortcutIcon = EXT:nubis_theme/Resources/Public/Icons/favicon.ico
10 = FLUIDTEMPLATE
10 {
# Template names will be generated automaticly by converting the applied
# backend_layout, there is no explicit mapping nessesary anymore.
#
# BackendLayout Key
# subnavigation_right_2_columns -> SubnavigationRight2Columns.html
#
# Backend Record
# uid: 1 -> 1.html
#
# Database Entry
# value: -1 -> None.html
# value: pagets__subnavigation_right_2_columns -> SubnavigationRight2Columns.html
templateName = TEXT
templateName {
cObject = TEXT
cObject {
data = pagelayout
required = 1
case = uppercamelcase
split {
token = pagets__
cObjNum = 1
1.current = 1
}
}
ifEmpty = Default
}
templateRootPaths {
0 = EXT:nubis_theme/Resources/Private/Templates/Page/
1 = {$page.fluidtemplate.templateRootPath}
}
partialRootPaths {
0 = EXT:nubis_theme/Resources/Private/Partials/Page/
1 = {$page.fluidtemplate.partialRootPath}
}
layoutRootPaths {
0 = EXT:nubis_theme/Resources/Private/Layouts/Page/
1 = {$page.fluidtemplate.layoutRootPath}
}
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
10 {
references.fieldName = media
}
20 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor
20 {
levels = 2
includeSpacer = 1
as = mainnavigation
}
}
}
meta {
viewport = {$page.meta.viewport}
robots = {$page.meta.robots}
apple-mobile-web-app-capable = {$page.meta.apple-mobile-web-app-capable}
description = {$page.meta.description}
description {
override.field = description
}
author = {$page.meta.author}
author {
override.field = author
}
keywords = {$page.meta.keywords}
keywords {
override.field = keywords
}
X-UA-Compatible = {$page.meta.compatible}
X-UA-Compatible {
attribute = http-equiv
}
# OpenGraph Tags
og:title {
attribute = property
field = title
}
og:site_name {
attribute = property
data = TSFE:tmpl|setup|sitetitle
}
og:description = {$page.meta.description}
og:description {
attribute = property
field = description
}
og:image {
attribute = property
stdWrap.cObject = FILES
stdWrap.cObject {
references {
data = levelfield:-1, media, slide
}
maxItems = 1
renderObj = COA
renderObj {
10 = IMG_RESOURCE
10 {
file {
import.data = file:current:uid
treatIdAsReference = 1
width = 1280c
height = 720c
}
stdWrap {
typolink {
parameter.data = TSFE:lastImgResourceInfo|3
returnLast = url
forceAbsoluteUrl = 1
}
}
}
}
}
}
}
includeCSSLibs {
}
includeCSS {
nubis_theme_layout = EXT:nubis_theme/Resources/Public/Css/layout.min.css
}
includeJSLibs {
}
includeJS {
}
includeJSFooterlibs {
}
includeJSFooter {
nubis_theme_scripts = EXT:nubis_theme/Resources/Public/JavaScript/Dist/scripts.js
}
}
################
#### CONFIG ####
################
config {
absRefPrefix = auto
contentObjectExceptionHandler = 0
no_cache = {$config.no_cache}
uniqueLinkVars = 1
pageTitleFirst = 1
linkVars = L
prefixLocalAnchors = {$config.prefixLocalAnchors}
renderCharset = utf-8
metaCharset = utf-8
doctype = html5
removeDefaultJS = {$config.removeDefaultJS}
inlineStyle2TempFile = 1
admPanel = {$config.admPanel}
debug = 0
cache_period = 86400
sendCacheHeaders = {$config.sendCacheHeaders}
intTarget =
extTarget =
disablePrefixComment = 1
index_enable = 1
index_externals = 1
index_metatags = 1
headerComment = {$config.headerComment}
// Disable Image Upscaling
noScaleUp = 1
// Compression and Concatenation of CSS and JS Files
compressJs = 0
compressCss = 0
concatenateJs = 0
concatenateCss = 0
}
Затем внутри моего сайта я получаю только тот контент, который мне удалось отобразить из шаблона. Другими словами, все, кроме рендера, частично. Я не мог видеть никаких проблем, связанных с этим, и документация от typo3 не проясняет это. Я должен что-то упустить, но я не знаю что.
Изменить: Добавлен setup.typoscript (я использую настройки по умолчанию, предоставляемые при установке пакета темы с: https://sitepackagebuilder.com/)
3 ответа
Исходя из комментариев, решением должно быть добавление раздела в файл макета страницы по умолчанию.
По умолчанию (из https://sitepackagebuilder.com/) используется файл макета, поэтому разделы, определенные в шаблоне, должны быть определены в файле макета.
В файле макета по умолчанию вы найдете только раздел "main", который отображается.
Чтобы добавить Footer
раздел, место RenderViewHelper
где-то в вашем макете:
<f:render section="Footer" />
Если вы хотите сделать это необязательным, вы можете добавить атрибут optional="true"
для ViewHelper, поэтому вам не нужно определять раздел нижнего колонтитула в каждом шаблоне, если вам это не нужно.
Структура FLUIDTEMPLATE выглядит следующим образом:
Templates
может содержатьPartials
и может иметьSections
Partials
может содержать другиеPartials
Layouts
приложитьTemplates
может оказатьSections
и может также содержатьPartials
Если вы хотите отобразить нижний колонтитул на своей глобальной странице, поместите нижний колонтитул Partial
в вашем Layout
файл. Если вам нужен нижний колонтитул в зависимости от используемого шаблона, поместите нижний колонтитул в Section
вашего шаблона и пусть рендерит Section
в вашем Layout
,
Просто для уточнения ответа Рене:
Жидкие шаблоны:
Шаблоны - это вход в жидкость. если вы называете жидкость, вы называете шаблон (
<f:layout name="layoutname" />
). Шаблон может определять макет; если это так, рендеринг начинается с макетамакеты - они предназначены, чтобы дать общую структуру. Это может быть достигнуто путем вставки различных разделов из определяющего шаблона и / или из частичных.
частичные - это гибкие строительные блоки, которые будет создавать ваша страница. каждый раз, когда у вас есть блок данных, который может встречаться чаще или который представляет собой единицу для себя, сделайте из него частичное, чтобы вы могли использовать его повторно и структурировать свою жидкость.
разделы могут встречаться в шаблонах и частичностях в виде подблока.
Если вы вставите разделы, как <f:render section="sectionname" />
ожидается, что раздел будет в текущем файле - кроме макетов, они ожидают свои разделы в шаблоне.
Если вы хотите вставить раздел из другого файла, вы можете вставить разделы только из части: <f:render section="sectionname" partial="partialname" />
, Если вы опускаете имя раздела, вы вставляете все частичное (<f:render partial="partialname" />
)
В общем все вставки с f:render
не передавать данные (переменные жидкости), за исключением: макет получает все данные, известные определяющему шаблону, а раздел в шаблоне, который вставляется из макета, знает все данные исходного шаблона.
Для всех других вставок вам может понадобиться перенести данные с arguments
параметр f:render
ViewHelper:
<f:render section="sectionname" arguments="{ind1:'data1', ind2:'data2'}" />
Особый случай: вы можете передавать все (локально известные) данные с помощью arguments="{_all}"
Спасибо Рене Пфламм и Бернду Вилке за их объяснения. Поскольку я пришел из tpyo3 v6.2, я использовал записи меток для повторения одного и того же элемента на нескольких шаблонах с:
LOGO = RECORDS
LOGO.tables = tt_content
LOGO.source = 1
А потом в шаблоне
<div class="myClass">###LOGO###</div>
Это позволило мне получить некоторые элементы из папки внутри typo3, соответствующие их идентификатору.
Я не знаю, если это все еще можно использовать, но я создал простую функцию
(находится по адресу ext/your_theme/Configuration/Typoscript/Helper/DynamicContent.typoscript)
использовать в частичных, где я звоню typoscriptObjectPath="lib.dynamicContentFunction"
и это позволяет мне вызывать через параметры данных идентификатор элемента, который я хотел бы визуализировать. Вот пример и функция:
<f:cObject typoscriptObjectPath="lib.dynamicContentFunction" data="{Uid: '11'}" />
А ТАКЖЕ
lib.dynamicContentFunction = COA
lib.dynamicContentFunction {
5 = LOAD_REGISTER
5 {
Uid.cObject = TEXT
Uid.cObject {
field = Uid
}
}
20 = CONTENT
20 {
table = tt_content
select {
includeRecordsWithoutDefaultTranslation = 1
orderBy = sorting
where = {#uid}={register:Uid}
where.insertData = 1
pidInList = -1
recursive = 99
}
stdWrap {
dataWrap = {register:wrap}
required = 1
}
}
90 = RESTORE_REGISTER
}
Предупреждение: это может повлиять на скорость вашего сайта, если у вас много элементов.
Кроме того, я хотел бы знать, что вы, ребята, думаете. Есть лучший способ сделать это?
Цель: сделать определенный элемент контента, созданный в typo3, и редактировать его оттуда, где я могу вызвать партиалы, выбрав их идентификатор. Функция должна искать, если это возможно, из определенной страницы / папки typo3 (id) и выбирать требуемый элемент содержимого через параметры данных. Таким образом, я могу использовать редактируемый элемент нижнего колонтитула, который будет повторяться, например, на каждой странице.