Как я могу преодолеть необходимость повторного использования имен ввода при их обработке с помощью класса ввода CodeIgniter?

У меня есть представление с именем волонтер_редактор. В волонтере_edit я использую jQuery для циклического просмотра массива идентификаторов проектов и для каждого идентификатора проекта создаю вкладку. Плагин вкладок jQuery превращает каждую ссылку в элементе неупорядоченного списка во вкладку, заполненную html-кодом, на который указывает ссылка:

/** Print the li elements that gets turned into tabs by jQuery **/
<ul>
<?php foreach ($projects as $project): ?>

    <li><a href="project_edit/<?php echo $project['id'] ?>"><?php echo $project['name'] ?></a></li>

<?php endforeach ?>
</ul>

В моем случае каждая ссылка отправляет другой идентификатор проекта в качестве параметра в представление с именем project_edit. Внутри project_edit есть форма:

<!-- Form contained within a typical tab -->
<form id="proj_form">
    <label for="title">Title:</label><input type="text" value="Comm. Ag. Ext." name="title" />
    <label for="project">Project:</label><input type="text" value="Agriculture" name="project"/>
    ...
    <br/><button type="button" name="proj_submit">Update Project</button><br/>
</form> 

Когда форма отправлена, я использую $this->input->post() для получения содержимого элементов ввода формы, чтобы я мог передать их в свою базу данных:

/** I handle the form's submit and send the form contents to an 'update' method of the project_edit class **/
$(function(){
    $('button[name="proj_submit"]').click(function(){
        vol_params = $('#proj_form').serialize();
        $.post('project_edit/update', vol_params, function(data) {
            console.log(data);
        });
    });
});


/** Inside the project_edit model **/
$data = array(
    'title' => $this->input->post( 'title', true ),
    'project' => $this->input->post( 'project', true ),
    ...
    );

$this->db->update( 'projects', $data, array( 'id' => $this->input->post( 'proj_id', true ) ) );

Все это отлично работает на первой вкладке. Однако на каждой последующей вкладке при отправке формы содержимое первой вкладки передается $this->input->post(). Я предполагаю, что это связано с тем, что при переключении между вкладками неактивные вкладки остаются на странице, и для их свойства «отображение» установлено значение «нет». Таким образом, только первый элемент с атрибутом name, соответствующим первому параметру $this->input->post(), попадает в массив сообщений (первый ввод с name="title", первый ввод с name="project" и т. д.).

Как я могу преодолеть это ограничение? Я бы предпочел, чтобы была представлена ​​только активная (отображаемая в данный момент) вкладка.


person Keyslinger    schedule 30.01.2012    source источник
comment
Я предполагаю, что вы используете одну форму для всех вкладок. Просто используйте отдельные элементы <form ...></form> для каждой вкладки. Таким образом, будет отправлено только содержимое текущей вкладки. Не забудьте также использовать отдельные кнопки отправки, но это зависит от вашей структуры отправки....   -  person Ruben Müller    schedule 03.02.2012
comment
@RubenMüller Я даже не подумал об этом, спасибо! Моя единственная проблема сейчас в том, что я не знаю, как сообщить jQuery, какую форму отправлять.   -  person Keyslinger    schedule 04.02.2012


Ответы (2)


Вместо этого измените идентификатор формы на класс. А затем обработайте отправку формы с помощью .submit() вместо захвата событий нажатия на кнопки. Внутри функции обратного вызова используйте $(this) для ссылки на отправляемую форму и не забудьте предотвратить действие по умолчанию, вызвав preventDefault()

$(function(){
    $('form.proj_form').submit(function(e){
        e.preventDefault();
        vol_params = $(this).serialize();
        $.post('project_edit/update', vol_params, function(data) {
            console.log(data);
        });
    });
});
person Kemal Fadillah    schedule 04.02.2012

У вас может быть только один идентификатор с именем на странице, и запрос POST приходит с кадром name, а не с идентификатором.

Возможно, будет лучше опубликовать свой код, чтобы мы могли увидеть, как составлен HTML.

person Thomas Edwards    schedule 03.02.2012
comment
Извините, я имел в виду идентификаторы в своей базе данных, а не идентификаторы элементов HTML. Я отредактировал свой вопрос для ясности. - person Keyslinger; 04.02.2012