Отправить значение переменной javascript в действие контроллера

#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/sessionStorage

2. Затем вы должны использовать заполнитель в качестве аргумента и заменить его на javascript arguments="{myVar: '__PLACEHOLDER__'}" . onclick="this.href = this.href.replace(/__PLACEHOLDER__/g, sessionStorage.getItem('myItem'))"

3. Я уже пробовал это, но затем меня перенаправляют на страницу 404. Похоже, что это работает, только если оно жестко запрограммировано в кнопке fluid : (

4. Заполнители не работают из-за вычисления cHash, см. Выше.

5. Вы правы. Затем вы должны использовать noCacheHash="1" . Я обновил его в своем примере.