2014-11-04 3 views
1

Я создал небольшое расширение, которое может показать игру-головоломку. Переключаемые действия контроллера, которые я сделал, включают в себя список/шоу (отлично работает), admin (также отлично) и показывают только.Показывать только один элемент flexform в Extbase

Только для показа. Я хочу выбрать запись базы данных из flexform, которая будет отображаться одним видом. Для этого я добавил новое поле Flexform:

   <settings.singlePuzzle> 
        <TCEforms> 
         <label>Puzzle to show</label> 
         <config> 
          <type>select</type> 
          <foreign_table>tx_wspuzzle_domain_model_puzzle</foreign_table> 
          <items> 
           <numIndex index="0" type="array"> 
            <numIndex index="0">-- Choose --</numIndex> 
            <numIndex index="1"></numIndex> 
           </numIndex> 
          </items> 
          <size>1</size> 
          <maxitems>1</maxitems> 
          <minitems>0</minitems> 
         </config> 
        </TCEforms> 
       </settings.singlePuzzle> 

До сих пор так хорошо, если выбрать пункт здесь и отладить его в списке он, кажется, выбрать правильный идентификатор.

Теперь я изменил showAction в контроллере выглядеть следующим образом:

/** 
* action show 
* 
* @param \Websafari\Wspuzzle\Domain\Model\Puzzle $puzzle 
* @return void 
*/ 
public function showAction(\Websafari\Wspuzzle\Domain\Model\Puzzle $puzzle = NULL) { 
    if(is_null($puzzle)) $puzzle = $this->puzzleRepository->findByUid($this->settings['singlePuzzle']); 

    $this->view->assign('puzzle', $puzzle); 
} 

Так что теперь я изменить действие «показать только» выберите запись для «singlePuzzle», а затем (я думаю) я должны быть хорошо идти, но все это я получаю IST следующее сообщение об ошибке:

Required argument "puzzle" is not set. 

Очевидно, что я сделал ошибку, но я не понимаю.

Во-первых: Почему требуется «головоломка»? Вот почему я добавил «= NULL» к функции (я также попытался добавить @ignorevalidation $ puzzle к комментарию).

Второй: почему он не установлен? Когда я отлаживаю «$ this-» настройки ['singlePuzzle']; Я получаю идентификатор объекта-загадки.

Было бы здорово, если бы кто-нибудь мог указать на мою ошибку, потому что я действительно застрял здесь. Thnx много!

+0

Временное решение добавить пустой параметр в URL, как это tx_wspuzzle_puzzle [головоломки]?. Это прекрасно работает. Я очень ценю всю работу, которая вошла в extbase, но иногда происходят странные вещи. –

ответ

1

Проблема в том, что информация о отражении класса (аргументы и т. Д.) Кэшируется в Extbase. Поэтому, если вы измените определение и не очистите соответствующий кеш, он все равно потребует вашего аргумента.

Вам необходимо очистить «Системные кеши» в TYPO3. Есть три способа сделать это:

  • Если вы находитесь в development context, вы будете иметь кнопку (с флэш-красным значком) в интерфейсе.
  • Вы можете включить кнопку через User TSconfig в контексте производства, используя options.clearCache.system = 1.
  • Кнопка для очистки системного кеша находится в инструменте установки, раздел «Важные действия».

Вы также можете вручную очистить все кэш связанных таблиц в PhpMyAdmin

TRUNCATE table cf_cache_hash; 
TRUNCATE table cf_cache_hash_tags; 
TRUNCATE table cf_cache_pages; 
TRUNCATE table cf_cache_pagesection; 
TRUNCATE table cf_cache_pagesection_tags; 
TRUNCATE table cf_cache_pages_tags; 
TRUNCATE table cf_cache_rootline; 
TRUNCATE table cf_cache_rootline_tags; 
TRUNCATE table cf_extbase_object; 
TRUNCATE table cf_extbase_object_tags; 
TRUNCATE table cf_extbase_reflection; 
TRUNCATE table cf_extbase_reflection_tags; 
TRUNCATE cf_extbase_typo3dbbackend_queries; 
TRUNCATE cf_extbase_typo3dbbackend_queries_tags; 
TRUNCATE cf_extbase_typo3dbbackend_tablecolumns; 
TRUNCATE cf_extbase_typo3dbbackend_tablecolumns_tags; 
TRUNCATE cf_extbase_datamapfactory_datamap; 
TRUNCATE cf_extbase_datamapfactory_datamap_tags; 

Это также обрезает запрос кэша и т.д., что может быть полезно в некоторых ситуациях.

Как только кеш очищается, он должен работать.

BTW, просто чтобы быть на безопасной стороне, вы должны типаж на UID из FlexForm:

if(is_null($puzzle)) $puzzle = $this->puzzleRepository->findByUid((int)$this->settings['singlePuzzle']); 
+0

wow, такой длинный текст для «clear the cache» =) – Daniel

+1

Yay it works! Большое спасибо, я подозревал проблему кеширования, но я забыл о системном кеше. Также спасибо за обширное объяснение, я очень ценю это. –

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