#javascript #php #typo3 #fluid #typo3-6.2.x
#javascript #php #typo3 #fluid #typo3-6.2.x
Вопрос:
Я просто пытаюсь передать значение из javascript в действие с моего контроллера и вернуть значение обратно:
Это мой контроллер:
<?php
namespace BlackTestController;
/**
* CustomController
*/
class CustomController extends TYPO3CMSExtbaseMvcControllerActionController
{
/**
* action test
*
* @return void
*/
public function testAction()
{
$myVar = $this->request->getArgument('myVar');
echo "myVar = ". $myVar;
}
}
Как мне настроить мою кнопку, чтобы она работала?
Давайте предположим, что я пытаюсь передать элемент sessionStorage test
.
Это то, что я пробовал:
<f:link.action controller="Custom" action="test" arguments="{myVar: sessionStorage.getItem('test')}" class="mbButton">Download</f:link.action>
Я получаю: The argument "arguments" was registered with type "array", but is of type "string" in view helper "TYPO3CMSFluidViewHelpersLinkActionViewHelper
Если я установлю значение вручную, например:
<f:link.action controller="Custom" action="test" arguments="{myVar: 1}" class="mbButton">Download</f:link.action>
Затем я получаю 1
в качестве ответа.
Ответ №1:
Создание ссылки со значением-заполнителем, а затем изменение этого значения-заполнителя приведет к искажению значения cHash, которое вычисляется для ссылки. Кроме того, это вызвало бы коллизии cHash в этой и других ссылках, использующих один и тот же заполнитель (в результате получаются идентичные ссылки).
Это часть фреймворка, и по соображениям безопасности этого нельзя избежать. Укажите правильный идентификатор из вашего шаблона; создайте ViewHelper для обработки хранилища, если оно вам нужно как-то отдельно (но будьте осторожны, если вы смешаете кэшированные и некэшированные плагины тогда!). Но лучше всего, чтобы при построении ссылок соблюдались правила безопасности и включалось значение, чтобы cHash вычислялся и проверялся правильно.
Кроме того, у вас синтаксическая ошибка в arguments
аргументе для вашей ссылки:
arguments="{myVar: sessionStorage.getItem('test')}"
Не будет работать. Если ваш sessionStorage является переменной, и «item» в нем реализует ArrayAccess или имеет средство получения для свойства «test», используйте:
arguments="{myVar: sessionStorage.item.test}"
Комментарии:
1. Спасибо, Клаус!
sessionStorage.getItem('test')
из javascript и, тем не менее, должен быть правильный синтаксис. Я думаю, вы, возможно, перепутали это с php?
Ответ №2:
В контроллере:
public function testAction()
{
$this->view->assign('test', $someVariable);
…
в жидкости:
<f:link.action controller="Custom" action="test" arguments="{myVar: test}" class="mbButton" noCacheHash="1">Download</f:link.action>
Я действительно не понимаю, что такое sessionStorage и что вы хотите с ним сделать. Если вы замените $someVariable
в testAction на sessionStorage, это должно сработать.
Комментарии:
1. Проблема в том, что вместо
test
я должен передавать значение переменной javascript. напримерarguments="{myVar: sessionStorage.getItem('myItem')}}"
. Это sessionStorage: developer.mozilla.org/de/docs/Web/API/Window/sessionStorage2. Затем вы должны использовать заполнитель в качестве аргумента и заменить его на javascript
arguments="{myVar: '__PLACEHOLDER__'}"
.onclick="this.href = this.href.replace(/__PLACEHOLDER__/g, sessionStorage.getItem('myItem'))"
3. Я уже пробовал это, но затем меня перенаправляют на страницу 404. Похоже, что это работает, только если оно жестко запрограммировано в кнопке fluid : (
4. Заполнители не работают из-за вычисления cHash, см. Выше.
5. Вы правы. Затем вы должны использовать
noCacheHash="1"
. Я обновил его в своем примере.