sitePicker 组件提供用于处理您的网站的 多站点配置 的工具。最佳的引入位置是您的页面或布局模板。
[sitePicker]{% set availableSites = sitePicker.sites %}以下是一个显示在站点之间切换的下拉菜单的示例。它与 this.site Twig 属性 配合使用。
<select class="form-control" onchange="window.location.assign(this.value)">
{% for site in sitePicker.sites %}
<option value="{{ site.url }}" {{ this.site.code == site.code ? 'selected' }}>
{{ site.name }}
</option>
{% endfor %}
</select>另一个例子是使用元标签生成备用页面链接
{% for site in sitePicker.sites %}
<link rel="alternate" hreflang="{{ site.locale }}" href="{{ site.url }}" />
{% endfor %}默认情况下,sites 属性将返回为当前页面配置的站点,并且 url 将解析为当前页面。pageSites() 函数可用于查找不同页面的站点,其中第一个参数是 CMS 页面名称。
在下面的例子中,每个站点都将有一个 url,该 url 设置为在 pages/blog/index.htm 中找到的 CMS 页面。如果找不到该页面,结果将是一个空数组。
[sitePicker]{% set otherSites = sitePicker.pageSites('blog/index') %}默认情况下,sitePicker 组件无法感知 URL 中的模型参数,例如页面别名和标识符。cms.sitePicker.overrideParams 全局事件 用于将 URL 参数覆盖为它们的翻译版本。放置此事件的好位置是 CMS 组件类 的 init 或 onRun 方法内部。
例如,如果模型实现了 Multisite 特性,则使用 newOtherSiteQuery 方法来定位建议站点的模型并修改 URL 参数。
$myModel = MyModel::find(1);
$otherModels = $myModel->newOtherSiteQuery()->get();
Event::listen('cms.sitePicker.overrideParams', function($page, $params, $currentSite, $proposedSite) use ($otherModels) {
$otherModel = $otherModels->where('site_id', $proposedSite->id)->first();
if ($otherModel) {
$params['id'] = $otherModel->id;
$params['slug'] = $otherModel->slug;
$params['fullslug'] = $otherModel->fullslug;
}
return $params;
});