zeroseven / z7-countries
此TYPO3扩展为单个树内容提供灵活的国家配置选项。
Requires
- php: ^7.4 || ^8.0
- ext-json: *
- doctrine/dbal: ^2.13.0
- jaybizzle/crawler-detect: ~1.2
- typo3/cms-core: ^10.4 || ^11
README
此TYPO3扩展为单个树内容提供灵活的国家配置选项。
在TYPO3中存在的语言可以被拆分以匹配单个国家。因此,您可以限制不同语言的内容仅显示在选定的国家中。为了在后台提供整洁且易于理解的行政界面,此扩展使用动态图标、国家过滤器和更多功能。
示例用法
以德语为例。使用此扩展可以将语言“德语”细分为“德国”、“奥地利”和“瑞士”等国家,以便将选定的内容限制为单个国家。在此示例中,除了网站的德语URL(example.com/de/schweiz
)外,其他URL也会自动可用
example.com/de-de/schweiz
example.com/de-at/schweiz
example.com/de-ch/schweiz
现在,如果某个内容元素、页面或任何其他数据库记录仅对瑞士国家提供,则它仅可在example.com/de-ch/schweiz
(注意de-ch
)下访问,而不在其他示例URL上。
在此示例中,仅限瑞士的内容也可以在其他翻译中提供,因此可以用其他语言查看
example.com/en-ch/switzerland
example.com/it-ch/la-suisse
example.com/fr-ch/svizzera
工作原理
对于分配给每种语言的每个国家,该语言将作为附加更改的基URL提供。这由语言的ISO代码和国家参数组成。
当通过具有类似URL中语言国家组合的页面访问时,配置的所有表上的所有数据库查询都将考虑这些国家限制。
💡 因此,在网站配置中的href应仅包含语言(例如,“fr”而不是“fr-FR”)。
SEO
这里无需担心。除了URL之外,页面的hreflang以及lang属性也会被更改。这样,搜索引擎就能找到完美的、可识别且正确的国家变体。简单来说:将不会出现重复内容的投诉。
hreflang标签示例
<link rel="alternate" hreflang="en" href="https://example.com/path"/> <!-- english content --> <link rel="alternate" hreflang="en-AT" href="https://example.com/en-at/path"/> <!-- english content for Austria --> <link rel="alternate" hreflang="en-BE" href="https://example.com/en-be/path"/> <!-- english content for Belgium --> <link rel="alternate" hreflang="en-CH" href="https://example.com/en-ch/path"/> <!-- english content for Switzerland --> <link rel="alternate" hreflang="en-DE" href="https://example.com/en-de/path"/> <!-- english content for Germany --> <link rel="alternate" hreflang="de" href="https://example.com/de/path"/> <!-- german content --> <link rel="alternate" hreflang="de-AT" href="https://example.com/de-at/path"/> <!-- german content for Austria --> <link rel="alternate" hreflang="de-CH" href="https://example.com/de-ch/path"/> <!-- german content for Switzerland --> <link rel="alternate" hreflang="de-DE" href="https://example.com/de-de/path"/> <!-- german content for Germany --> <link rel="alternate" hreflang="fr" href="https://example.com/fr/path"/> <!-- french content --> <link rel="alternate" hreflang="fr-FR" href="https://example.com/fr-fr/path"/> <!-- french content for France--> <link rel="alternate" hreflang="fr-BE" href="https://example.com/fr-be/path"/> <!-- french content for Belgium--> ...
对于管理员
安装
通过composer获取扩展:composer require zeroseven/z7-countries
配置
- 在根级别(
uid:0
)创建大量国家作为数据记录。 - 通过TYPO3站点配置将国家分配给语言。
- 扩展所需的数据记录类型以限制国家。示例
\Zeroseven\Countries\Service\BackendService::enableConfiguration('tx_news_domain_model_news');
💡 安装工具中的数据库分析器将在运行时自动将所需的字段添加到您的数据库中。
扩展国家对象
要扩展国家对象,扩展数据库表tx_z7countries_country
。国家模型自动为每个字段提供set
、get
、has
和is
方法。
示例
$country->getMyNewField(); // Returns the value of the field 'my_new_field' $country->isDemocratic(); // Returns true or false for the field 'democratic' // Overwrite the title $country->setTitle('Brand new Zealand');
国家模板条件
ViewHelpers
使用扩展的ViewHelpers可以在模板中创建国家依赖的结构。为此,您可以使用在Country
对象中可用的任何参数。
<html xmlns:countries="http://typo3.org/ns/Zeroseven/Countries/ViewHelpers" data-namespace-typo3-fluid="true"> <countries:if isoCode="IT">🍕</countries:if> <countries:if uid="4">🥙</countries:if> <countries:if title="Deutschland">🍺</countries:if> <countries:if isoCode="FR"> <countries:then>🥖</countries:then> <countries:else>🍞</countries:else> </countries:if> </html>
TypoScript条件
在TypoScript设置中,可以根据所选国家定义设置。为此,Country
模型可用于条件。
# Define uid of contact page
settings.contactPageUid = 5
# Overwrite page uid for italy
[country.getUid() === 2]
settings.contactPageUid = 8
[global]
# Overwrite page uid for germany and austria
[country.getIsoCode() in ['DE','AT']]
settings.contactPageUid = 12
[global]
编辑器
调整数据记录的国家设置
如果数据记录类型已可用于国家配置,现在可以将其限制为特定的国家。
语言/国家检查
在创建或编辑数据记录时,会检查它是否在所选语言下的当前国家设置中显示。这样,您可以避免任何误导性配置上的浪费精力。
国家筛选器
在列表模块中,您可以找到筛选功能。现在,您可以轻松检查任何选择的国家是否可以提供内容。
自动重定向
当调用起始页面时,会尝试根据用户的浏览器设置将其重定向到合适的语言/国家URL。为此,必须满足以下条件
- 域名被调用时不包含任何路径
- 引用者具有相同的URL来源
- 无法确定任何机器人
如果您想禁用或覆盖自动重定向,请查看TYPO3的中间件API。
禁用重定向功能的示例
必须在扩展的Configuration/RequestMiddlewares.php
中提供配置
return [ 'frontend' => [ 'zeroseven/z7_countries/redirect' => [ 'disabled' => true ] ] ];