2012-05-31 5 views
0

Ну, это может показаться легким, но для меня это запутанно, как черт. Я работал над формой для редактирования уже существующей записи в базе данных. Некоторые из полей создаются и заполняются на основе записей из объединенной таблицы.Zend Form Удалить кнопку

Это звучит немного отрывочно, поэтому я попытаюсь проиллюстрировать его. У меня есть таблица с контентом Content и таблица с именем Files, которая содержит имена файлов и местоположения. Я получаю имена файлов на основе предоставленного идентификатора содержимого, а затем форма создает поля, а затем заполняется именами файлов.

public function setFiles($files) { 
    $i = 0; 
    foreach ($files as $file) { 
     $i++; 
     $fieldname = "encloseditemname{$i}"; 
     $this->addElement('text', $fieldname, array('required'  => true, 
                 'label'   => 'Enclosed item name (test)', 
                 'value'   => $file['file_url'], 
     )); 
    } 
} 

Это работает отлично, но теперь я хочу добавить кнопку, которая позволит мне удалить ОДИН из файлов. Так что я должен был сделать, это создать в контроллере fileDeleteAction(), а затем перенаправить кнопку на это действие, удалить его в базе данных и затем визуализировать вид с помощью формы.

Имея действие визуализировать другой вид, то это стандартный вид, а не проблема. Написание кода для удаления записи в базе данных также не является проблемой. Создание кнопки, которая перенаправляет действие удаления с помощью метода addElements в качестве фабрики ... массивная проблема. Вот как далеко я добрался.

$this->addElement('button', "deleteencloseditem{$i}", array(???)); 

Как я могу получить эту кнопку, чтобы перенаправить к операции удаления без него мешая кнопку отправки в нижней части моей формы, которая используется для отправки формы и позвонить в editAction в моем контроллере.

Я изучил использование javascript, чтобы определить, какая кнопка нажата, но я еще не дома в javascript, и у меня возникают проблемы с поиском, какая кнопка нажата, поскольку имя кнопки и id зависят на функцию setFiles и, следовательно, может находиться в диапазоне от deleteencloseditem1 и deleteencloseditem5000 в зависимости от количества имен файлов, которые он вставляет в форму.

Как это сделать? Любые советы или рекомендации хорошо оценены :)

ответ

1

В HTML <form> может быть только один атрибут action, которому отправляется форма при отправке. Тем не менее, есть обходные пути для преодоления этого, как на стороне клиента, так и на стороне сервера.

стороне сервера

  1. Пусть все кнопки просто представить вашей формы action (устанавливается $this->setAction(...) в коде вашей формы)
  2. В этом действии, определить, какая кнопка была нажата, проверив post (или get) переменные
  3. Перенаправить на правильное действие на основании нажатой кнопки

стороне клиента

Используйте click событие кнопки, чтобы определить, какая кнопка была нажата. Я предполагаю, что кнопка ID сообщает вам о файле, который вы удаляете.Предполагая, что вы даете все УДАЛИТЬ нажатие на кнопки class="delete", вы можете сделать следующее с помощью JQuery:

$('input.delete').click(function(){ 
    // remove 'deleteencloseditem' from the button's ID 
    // to only keep the file number 
    var myFileID = $(this).attr('id').replace('deleteencloseditem', ''); 
    window.location.href = 'myLocation?fileID=' + myFileID; 
}); 
+0

Ваша версия клиентской версии, к сожалению, не работает. Кажется, что не удается найти, какая кнопка нажата. '$ ('input.delete'). click (function() { ' выбирает кнопки с установленным типом, без моей собственной расширенной версии кнопки отправки. Я не могу установить тип атрибута кнопки. либо «кнопка», так как я создаю элемент кнопки в своем верхнем столбце или отправлю, если бы я решил создать элемент кнопки отправки. В настоящее время пытается выполнить решение на стороне сервера. –

+0

Я получил версию на стороне сервера, так как вы предположили, что у меня была указатель действия, на которую была нажата кнопка, и на основании того, что она была направлена ​​к правильному действию, после чего удаляет запись и затем перенаправляется на предыдущую страницу действий. И я признаю, что сначала я перенаправил снова удаляя запись только в бесконечном цикле, только прерываясь, пытаясь удалить одну и ту же запись во второй раз, давая ошибку БД. К счастью, s с использованием перенаправления вместо этого. –

+0

Рад, что у вас есть версия на стороне сервера. Что касается подхода на стороне клиента: вы можете, конечно, изменить '$ ('input.delete')' на то, что идентифицирует ваши кнопки удаления. Если ваши кнопки удаления - все '

0

Просто используйте маршрутизацию. Маршрутизация для форм означает направление action на соответствующий маршрут. Ваш путь в действии формы заставит маршрутизацию в ZF использовать связанный контроллер и действие.

+0

Я рассмотрел это решение, к сожалению, однако это приводит к другой проблеме для меня. Хотя он действительно работает по назначению, он создает одну проблему. Он работает для всех кнопок отправки в форме, включая ту, на которой я просто хочу отправить форму. Таким образом, это сработает, если я смогу узнать, как проверить, нажали ли эти кнопки, а затем решить, какой маршрут следовать. Ознакомившись с моим вопросом, я понимаю, что я не упомянул эту кнопку, поэтому я ее отредактирую :) –

+0

@ Björn Совершенно откровенно, я не предпочитаю это решение, но с точки зрения реализации контроллеров и действий, это единственное решение. Я предпочитаю один контроллер/действие и оцениваю параметры, представленные с помощью POST. В зависимости от формы я буду либо напрямую обращаться к моделям, либо использовать '_forward()'. Обратите внимание, что действия также связаны с представлениями. –

0

Самый простой способ, чтобы исправить это было бы просто использовать ссылку для удаления действия, а затем стиль его в качестве кнопки.

В качестве альтернативы вы можете использовать две кнопки с одной формой, которую вам просто нужно пометить их по-разному, и проверить имя ярлыка на POST.

if ($this->getRequest()->getPost('submit') == 'Label') 
+0

Это не работает, '$ this-> getRequest() -> getPost()' будет возвращать массив, содержащий пост-переменные, и нет переменной, называемой '' submit''. Поэтому не удивительно, что '$ this-> getRequest() -> getPost ('submit')' ничего не возвращает и, следовательно, не может сравниться с '' label'' –

+0

, у вас есть что-то переданное, с которым вы можете протестировать. Обычно это будет элемент ввода типа = submit, обычно name = submit со значением = submit или delete или Label или ... этот элемент будет проходить через объект запроса как имя => значение. – RockyFord