Я хочу отобразить типичную ссылку в жидкости, но мне нужно проверить, является ли это файлом загрузки (t3: // file? Uid = 1), ссылкой на страницу (t3: // page? Uid = 1) или внешней ссылкой (https://www.abc.de _blank). Есть ли способ или средство просмотра для проверки типа ссылки в жидкости?
То, что я нашел, было только опечаткой или хакерским способом с VHS вроде
<f:if condition = "{target -> v:math.round()} > 0">
Это для TYPO3 9.x
Да, но мне нужно условие, потому что я буду визуализировать загрузку иначе, чем страницу или внешнюю страницу. f: link.typolink не вариант.
Вы уже можете обогатить модель данных дополнительным флагом. Всегда думая о ViewHelper в первую очередь, не только противоречит разделению MVC. Это также часто требует дополнительной работы просто из-за того, что не используются преимущества MVC.





$linkService = $this->objectManager->get(LinkService::class);
$result = $linkService->resolve($linkValue);
Это может помочь вам в настраиваемом ViewHelper
Возможные значения для $linkValue:
t3://page?uid=1 => [строка (pageuid), 'страница'][email protected] => [строка (электронная почта), 'электронная почта']https://typo3.org => [строка (url), 'url']t3://file?uid=226 => [TYPO3 \ CMS \ Core \ Resource \ File, 'файл']$result возвращает массив. У каждого случая есть аргумент «тип». В зависимости от типа возвращается другое значение или объект. Я перечислил это выше.
Класс доступен в TYPO3 версии 8.
Не могли бы вы добавить несколько примеров возможных $linkValue и их соответствующего вывода в $result? Спасибо
Если $ linkValue является файлом и имеет дополнительные аргументы, такие как _blank, этот код вызовет исключение. Пример t3://file?uid=226 _blank. Мой обходной путь для этого - взорвать обрезку строки и взять первый элемент в массиве.
Вы также можете проверить тип ссылки с расширением vhs, например чтобы установить другую цель:
{namespace v=FluidTYPO3\Vhs\ViewHelpers}
...
<f:variable name = "target">_self</f:variable>
<v:condition.string.contains haystack = "{url}" needle = "t3://file?uid">
<f:variable name = "target">_blank</f:variable>
</v:condition.string.contains>
<v:condition.string.contains haystack = "{url}" needle = "http">
<f:variable name = "target">_blank</f:variable>
</v:condition.string.contains>
<v:condition.string.contains haystack = "{url}" needle = "www">
<f:variable name = "target">_blank</f:variable>
</v:condition.string.contains>
<f:link.typolink parameter = "{url}" target = "{target}">the link</f:link.typolink>
Это ViewHelper, который я сейчас использую:
/**
* A view helper for rendering the linktype
*
* = Examples =
*
* <code>
* {nc:linkType(parameter: link)}
* </code>
* <output>
* page, file, url, email, folder, unknown
* </output>
*/
class LinkTypeViewHelper extends AbstractViewHelper
{
use CompileWithRenderStatic;
/**
* Initialize arguments
*/
public function initializeArguments()
{
$this->registerArgument('parameter', 'string', 'stdWrap.typolink style parameter string', true);
}
/**
* @param array $arguments
* @param \Closure $renderChildrenClosure
* @param RenderingContextInterface $renderingContext
* @return string Linktype (page, file, url, email, folder, unknown)
*/
public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
{
$parameter = $arguments['parameter'];
// workaround if parameter has _blank or other additional params
$arr = explode(' ',trim($parameter));
$firstparameter = $arr[0];
$linkService = GeneralUtility::makeInstance(LinkService::class);
$linkDetails = $linkService->resolve($firstparameter);
return $linkDetails['type'];
}
}
Почему бы не использовать
<f:link.typolink parameter = "...">? Это может обрабатывать все 3 типа.