2015-06-29 2 views
2

Для расширения TYPO3 Extbase Extension я хочу сделать какую-то разбивку на страницы. Адакс-вызов и все остальное пока прекрасны. Но когда я пытаюсь получить доступ к массиву $this->settings во время вызова ajax, где хранятся значения плагина интерфейса flexform, я всегда получаю null. Часть выглядит следующим образом:TYPO3 Flexform Настройки недоступны во время вызова Ajax

$limit = $this->settings['result']['amount']; 
$orderType = $this->settings['order']['type']; 
$orderFields = $this->settings['additionorder']['fields']; 

$formArr = array(); 
$this->request->hasArgument('offset') ? $offset = $this->request->getArgument('offset') : null; 
$forms = $this->formRepository->findFormsChunked(
$orderFields, $orderType, $limit, $offset 
); 

foreach ($forms as $key => $form) { 
     $formArr[] = array(
        'formUid' => $form->getUid(), 
        'formName' => $form->getName(), 
        'formFile' => $form->getFile()->getOriginalResource()->getPublicUrl(), 
        'formType' => $form->getFormtype()->getUid() 
       ); 
      } 
return json_encode($formArr); 

и $ this-> Настройки равно нулю во время моего AJAX вызова, но я не могу понять, почему. Являются ли значения доступными только во время процесса рендеринга, чего не происходит во время вызова ajax?

Спасибо за помощь.

UPDATE

Насколько я знаю, значения Flexform передаются только в выбранном контроллере действия (т.е. displaycond), как это:

<displayCond>FIELD:switchableControllerActions:=:Controller->ajax:AND:FIELD:switchableControllerActions:=:Controller->normal</displayCond> 

и в меню выбора:

       <numIndex index="1"> 
            <numIndex index="0">LLL:EXT:ext_formpool/Resources/Private/Language/locallang.xlf:name</numIndex> 
            <numIndex index="1">Controller->normal;Controller->ajax</numIndex> 
           </numIndex> 

Значения также должны передаваться в ajaxAction? На данный момент они не доступны ...

Solution

К сожалению, это просто не работает, если вы делаете AJAX звонки с отдельным типом страницы. Flexform хранится в базе данных и анализируется только во время процесса загрузки. Вы можете проверить это, включив диспетчер конфигурации и попытайтесь проанализировать поле «pi_flexform» объекта контента. Или вы вводите flexformservice, который также не загружается во время вызова ajax. Для этого вам нужно использовать eID-механизм.

+1

Как вы Аякса позвонить? Использование eID, тип страницы или расширение Helmut Hummels [typoscript_rendering] (http://typo3.org/extensions/repository/view/typoscript_rendering)? – Jost

+1

Я использую Ajax с прилежащим типа страницы, как это: '# PageType для AjaxCalls ajaxCall = PAGE ajaxCall { typeNum = 999 config.disableAllHeaderCode = 1 config.metaCharset = UTF-8 10 = COA 10 TheFlame

ответ

1

почему нет, вместо того, чтобы вынести свой плагин как объект контента, непосредственно адрес его в Ajax вызова?

plugin_yourext_ajax = PAGE 
plugin_yourext_ajax { 
    typeNum = 2000 

    config { 
     disableAllHeaderCode = 1 
     xhtml_cleaning = 1 
     admPanel = 0 
     additionalHeaders = Content-type: text/plain 
     no_cache = 1 
    } 

    10 = USER 
    10 { 
     userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run 
     pluginName = YourPLugin 
     extensionName = YourExt 
     controller = ControllerName 
     vendorName = Vendor 
     action = ajax 

     switchableControllerActions { 
      YourPlugin { 
       1 = ajax 
      } 
     } 

     persistence =< plugin.tx_your_ext.persistence 
     view =< plugin.tx_your_ext.view 
     update =< plugin.tx_your_ext.update 
     settings < plugin.tx_your_ext.settings 
    } 
} 

Это самонастройки ваш добавочный номер на каждом вызове, а pagerendering

+0

Я попробую сегодня утром и скажу вам свои результаты, спасибо! – TheFlame

+0

Хорошо, с помощью этого метода он работает в активном действии контроллера. Но должна быть другая проблема, я обновил вопрос. – TheFlame

0

Вы объявляете свои гибкие формы в своем ext_tables.php? Я обычно делаю это так:

$extensionName = t3lib_div::underscoredToUpperCamelCase($_EXTKEY); 
$pluginNames = array('pluginname1','pluginname2','...'); 

foreach ($pluginNames as $pluginName) { 
    $pluginSignature = strtolower($extensionName) . '_'.$pluginName; 

    $GLOBALS['TCA']['tt_content']['types']['list']['subtypes_excludelist'][$pluginSignature] = 'recursive'; 
    $GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$pluginSignature] = 'pi_flexform'; 
    t3lib_extMgm::addPiFlexFormValue($pluginSignature, 'FILE:EXT:' . $_EXTKEY . '/Configuration/FlexForms/'.$pluginName.'.xml'); 
} 
+0

Да, мой DownloadController получает данные Flexform, однако, только во время ajax-вызова $ this-> settings пуст (кроме тех констант, которые я объявил в моем ext_setup). Возможно, это связано с процессом рендеринга, как упомянуто @ rob-ot. – TheFlame

+0

, если $ this-> настройки пустые, вы не вводили их правильно ИЛИ ваша декларация неверна. проверьте свой TS. если нормальный вызов действия вашего контроллера приводит к NULL для настроек, то это может быть ключ: settings

+0

Как вы получаете доступ к значениям Flexform? Массив настроек содержит все конфигурации расширения, кроме Flexform. – TheFlame

1

Я тоже была эта проблема, чем я узнал, что вам нужно использовать renderObj, который будет использовать класс ContentObjectRenderer. Мне понадобилось значение Flexform для ссылки f: link to detailpage из моего шаблона списка.

Так что в моем случае я также хотел разбивать страницы Ajax. Я просто использовал виджет paginate по умолчанию Fluid в представлении списка моего собственного расширения для новостей. Если у клиента нет javascript, он все равно работает. Так что очень просто создать крутую анимацию Ajax!

TypoScript для typeNum:

ajaxPageExt = PAGE 
ajaxPageExt { 
    typeNum = 778 

    config { 
     disableAllHeaderCode = 1 
     disableCharsetHeader = 1 
     disablePrefixComment = 1 
    } 

    10 < styles.content.get 
    10 { 
     stdWrap.trim = 1 
     select { 
      where = list_type = "jpnews_list" 
     } 

     renderObj < tt_content.list.20.jpnews_list 
    } 
} 

Часть возможных JavaScript:

   $('body').on('click', 'div.jpnews-list ul.f3-widget-paginator li a', (function (e) { 
        e.preventDefault(); 
        paginateToPageURI = $(this).attr('href') + '&type=' + TYPO3pageType; 
        var parentDivOfNewsList = $(txJpNews).parent(); 
        $(txJpNews).css('opacity', 0.4); 
        $(parentDivOfNewsList).append(spinnerHTML); 
        $.ajax({ 
         type: 'POST', 
         url: paginateToPageURI, 
         data: $(this).serializeArray(), 
         success: function (data) { 
          $(parentDivOfNewsList).html(data); 
         }, 
         error: function (xhr, thrownError) { 
          var msg = "<b>Sorry but there was an error, please contact us..</b><br>"; 
          $(parentDivOfNewsList).html(msg + xhr.status + ' ' + thrownError); 
         } 
        }); 
       }) 
+0

А, я не думал об этом, я попробую это позже – TheFlame

Смежные вопросы