2012-04-26 2 views
0

Например, ссылка на удаление была нажата дважды или с разных пользователей. В то время как первый щелчок правильно удалит мой объект, второй будет терпеть неудачу (поскольку он устарел) до того, как будет вызван мой deleteAction. Как я могу это предотвратить?deleteAction на удаленном ModelInstance в Extbase не удалось

/** 
* action delete 
* 
* @param $upload 
* @dontvalidate $upload 
* @return void 
*/ 
public function deleteAction(Tx_MyExt_Domain_Model_Upload $upload) { 
    $this->uploadRepository->remove($upload); 
    $this->flashMessageContainer->add('Your Upload was removed.'); 
    $this->redirect('list'); 
} 

я получаю исключение:

Значение должно быть типа "Tx_MyExt_Domain_Model_Download", но типа "NULL".

Делать что-то внутри действия не помогает, потому что она не раньше ...

+0

Что значит провалиться? Было ли исключение? Есть ли сообщение об ошибке? – peter

+0

Извините, мой поздний ответ, но я поставил его в вопросе выше. – AdON

ответ

0

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

<f:link.action action="delete" arguments="{upload:uploadObjectToDelete}" > ... 

Который говорит: передать uploadObjectToDelete Объект действия удаления, когда пользователь нажимает на эту ссылку. И когда пользователь нажимает на эту ссылку, ExtBase PropertyMapper использует аргументы, отправленные со ссылкой, чтобы найти uploadObjectToDelete в базе данных, чтобы передать ее вашему контроллеру и действие удаления.

После первого щелчка, это действие удаления успешно удаляет объект из базы данных, и страница перезагружается при перенаправлении на действие списка. Однако на этот раз объект uploadObjectToDelete имеет значение NULL. Итак, для второго щелчка, когда PropertyMapper пытается найти аргумент upload для действия удаления, нет объекта для поиска. И поскольку требуется аргумент upload (т. Е. Не может быть null), вы получаете исключение.

Вариант 1

Изменить список ваших действий, так что он не показывает эти ссылки, когда uploadObjectToDelete объект null. Вероятно, это лучший вариант.

<f:if condition="uploadObjectToDelete"> 
    <f:link.action action="delete" arguments="{upload:uploadObjectToDelete}" > ... 
</f:if> 

Вариант 2

Изменение действия удаления принять null аргументы:

public function deleteAction(Tx_MyExt_Domain_Model_Upload $upload = null) { ... 

Но этот вариант не имеет смысла. Почему вы позволите своему пользователю попробовать и удалить объект, который уже равен нулю?

Это только предложения.

+0

Ahh, отлично, вариант 2 сделал трюк для меня. Проблема может возникнуть, когда пользователь открыл устаревшую страницу, например, другую вкладку. Пользователь успешно уничтожил объект на одной вкладке, но на другой вкладке была ссылка delete. И я просто не хотел получать исключение в интерфейсе на данный момент. Большое спасибо! – AdON