真正的 url 不适用于 javascript TYPO3 构建的 url
Real url not working for url build by javascript TYPO3
我在我的页面中配置了扩展程序 tt_address。我需要按年份过滤地址。所以我构建了一个 select 框。我需要附加一些查询参数及其 url 以在控制器中访问以实现过滤器。
该功能已成功完成。但 realurl 不适用于此特定功能。
main.js
function initYearFilter() {
var selectedItem = sessionStorage.getItem('year');
if (selectedItem !== null) {
$('.year-filter select').val(selectedItem);
}
$('.year-filter select').on('change', function () {
var loc = location.href.match(/.*people\/alumni\/+/)[0],
url;
if ($(this).val() == 'reset') {
url = loc + '?no_cache=1';
} else {
url = loc + '?ts_address[year]=' + $(this).val() + '&no_cache=1';
}
sessionStorage.setItem("year", $(".year-filter select").first().val());
window.location.href = url;
});
}
我的真实url 配置
'postVarSets' => array(
'_DEFAULT' => array(
'year' => array(
array(
'GETvar' => 'ts_address[year]',
),
),
),
)
如果您认为 ext:realurl 是罪魁祸首,请停用 ext:realurl 并查看它是否有效。
我认为它仍然无法正常工作,但您会在 url 中看到一些内容,应该会为您提供必要的提示。
您可能偶然发现了 TYPO3 的安全功能:cHash
.
使用 cHash URL 参数,TYPO3 确保它的 URLs 不会为页面的缓存版本注入不相关的参数。如果 TYPO3 构建了一个 URL 它会散列所有参数并将此散列附加到 url。如果在 URL 中找到这样的 cHash,则从数据库中获取参数并忽略所有当前 URL 参数。特别是任何附加参数。所以缓存的页面匹配给定的 url.
如果使用ext:realurl,这个cHash参数隐藏在'normal'URL路径中。如果你添加参数,比如在你的 javascript 中,它们将被删除,因为它们没有在 cHash 中编码,而 cHash 在说话 URL.
中编码
在您的情况下,附加参数会更改页面的内容。如果附加参数包含在 cHash 中,则可以缓存此页面。
在这里你必须帮助 realurl 构建一个没有 cHash 的 URL,或者构建包含这些单独 cHash 的 URLs:
您可以构建一个可用年份的菜单,还可以为该年份配置一个路径段。通过这种方式,您可以获得每年的单独 cHashes。您需要更改 javascript 以添加路径段而不是参数。
不要让 urls
在前端手动生成,就像在 Javascript 中那样。
我的建议是生成 urls 后端并将其附加到选项属性(data-reset-url
、data-url
)。
// maybe a foreach here
$GLOBALS['TSFE']->cObj->typolink_URL([
'parameter' => '_PAGEUID_',
'additionalParams' => '?ts_address[year]=' . $year, // suppose in foreach have year var
'no_cache' => true
]);
我在我的页面中配置了扩展程序 tt_address。我需要按年份过滤地址。所以我构建了一个 select 框。我需要附加一些查询参数及其 url 以在控制器中访问以实现过滤器。 该功能已成功完成。但 realurl 不适用于此特定功能。
main.js
function initYearFilter() {
var selectedItem = sessionStorage.getItem('year');
if (selectedItem !== null) {
$('.year-filter select').val(selectedItem);
}
$('.year-filter select').on('change', function () {
var loc = location.href.match(/.*people\/alumni\/+/)[0],
url;
if ($(this).val() == 'reset') {
url = loc + '?no_cache=1';
} else {
url = loc + '?ts_address[year]=' + $(this).val() + '&no_cache=1';
}
sessionStorage.setItem("year", $(".year-filter select").first().val());
window.location.href = url;
});
}
我的真实url 配置
'postVarSets' => array(
'_DEFAULT' => array(
'year' => array(
array(
'GETvar' => 'ts_address[year]',
),
),
),
)
如果您认为 ext:realurl 是罪魁祸首,请停用 ext:realurl 并查看它是否有效。
我认为它仍然无法正常工作,但您会在 url 中看到一些内容,应该会为您提供必要的提示。
您可能偶然发现了 TYPO3 的安全功能:cHash
.
使用 cHash URL 参数,TYPO3 确保它的 URLs 不会为页面的缓存版本注入不相关的参数。如果 TYPO3 构建了一个 URL 它会散列所有参数并将此散列附加到 url。如果在 URL 中找到这样的 cHash,则从数据库中获取参数并忽略所有当前 URL 参数。特别是任何附加参数。所以缓存的页面匹配给定的 url.
如果使用ext:realurl,这个cHash参数隐藏在'normal'URL路径中。如果你添加参数,比如在你的 javascript 中,它们将被删除,因为它们没有在 cHash 中编码,而 cHash 在说话 URL.
中编码在您的情况下,附加参数会更改页面的内容。如果附加参数包含在 cHash 中,则可以缓存此页面。
在这里你必须帮助 realurl 构建一个没有 cHash 的 URL,或者构建包含这些单独 cHash 的 URLs:
您可以构建一个可用年份的菜单,还可以为该年份配置一个路径段。通过这种方式,您可以获得每年的单独 cHashes。您需要更改 javascript 以添加路径段而不是参数。
不要让 urls
在前端手动生成,就像在 Javascript 中那样。
我的建议是生成 urls 后端并将其附加到选项属性(data-reset-url
、data-url
)。
// maybe a foreach here
$GLOBALS['TSFE']->cObj->typolink_URL([
'parameter' => '_PAGEUID_',
'additionalParams' => '?ts_address[year]=' . $year, // suppose in foreach have year var
'no_cache' => true
]);