2014-01-17 2 views
1

У меня есть простое приложение, которое отображает список записей, и я хочу реализовать модальное окно bootstrap для редактирования записей. Я новичок в php, но я пытаюсь использовать cakePHP, потому что предпочитаю MVC.cakephp реализовать модальное окно для редактирования

У меня есть выпадающий список в каждой строке таблицы, который после выбора я хочу открыть модальный, внести изменения и сохранить. В настоящее время я реализую ссылку для вызова url для получения данных async и обновления div с ответом. У меня это работает, но данные кэшируются, поэтому он отображает данные из первой записи, отображаемой даже после выбора новой записи. Я уверен, что могу найти способ его очистить, но это заставляет меня задаться вопросом, как я начал реализовывать модальное окно.

Списочное имеет следующее:

<li> 
      <?php    
      echo $this->Js->link("Edit settings","/units/edit/".$unit['Unit']['id'] , 
        array('update' => '#editModal', 
         'htmlAttributes' => array(
          'data-toggle' => 'modal', 
          'data-target' => '#editModal' 
        ))); 
      ?> 
     </li> 

Контроллер:

if (!$this->Unit->exists($id)) { 
    throw new NotFoundException(__('Invalid unit')); 
} 
if ($this->request->is(array('post', 'put'))) { 
    if ($this->Unit->save($this->request->data)) { 
    $this->Session->setFlash(__('The unit has been saved.')); 
    return $this->redirect(array('action' => 'index')); 
    } else { 
    $this->Session->setFlash(__('The unit could not be saved. Please, try again.')); 
    } 
} else { 
if ($this->request->is('ajax')) { 
    $this->render('edit', 'ajax'); 
    } 
} 

редактировать вид:

<div class="modal-dialog"> 

× Модальные название

<?php 

    echo $this->Form->create('Unit'); 
    echo $this->Form->input('name', array('class' => 'form-control', 'div' => 'form-group', 'disabled' => 'disabled')); 
    echo $this->Form->input('internet_class_id', array('class' => 'form-control', 'div' => 'form-group')); 
    $offOn = array(0 => 'Off', 1 => 'On'); 
    echo $this->Form->input('water_setting_id', array('options' => $offOn, 'default' => 0, 
     'class' => 'form-control', 'div' => 'form-group')); 
    $amenitySettings = array(0 => 'Deny', 1 => 'Allow'); 
    echo $this->Form->input('amenity_setting_id', array('options' => $amenitySettings, 'default' => 0, 
     'class' => 'form-control', 'div' => 'form-group')); 
    echo $this->Form->input('cable_setting_id', array('options' => $offOn, 'default' => 0, 
     'class' => 'form-control', 'div' => 'form-group')); 
    echo $this->Form->hidden('id'); 
    echo $this->Form->hidden('building_id'); 
    echo $this->Form->button('Save', array('type' => 'submit', 'class' => 'btn btn-primary')); 
    echo $this->Form->end(); 
    ?> 

</div> 
<div class="modal-footer"> 
    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
    <button type="button" class="btn btn-primary">Save changes</button> 
</div> 

Это может быть неправильный способ реализации, так что я открыт для предложений. Любая помощь приветствуется.

Спасибо

ответ

2

Вот что я в итоге сделал. Этот раствор образует вместе с других ответов, найденных на StackOverflow:

В контроллере я добавил простую проверку для Ajax запроса, и если да, вынесено мнение с пустым макетом АЯКСА:

if ($this->request->is('ajax')) { 
    $this->render('edit', 'ajax'); 
    } 

I затем добавил JQuery к представлению:

$("a[data-target=#flexModal]").click(function(ev) { 
ev.preventDefault(); 
var target = $(this).attr("href"); 
// load the url and show modal on success 
$("#flexModal .modal-body").load(target, function() { 
    $("#flexModal").modal("show"); 
}); 
}); 

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

Надеюсь, это поможет кому-то.

0

Добавьте следующий код в ваш метод обратного вызова UnitsController beforeFilter:

public function beforeFilter() { 
      parent::beforeFilter(); 
      if ($this->request->is('ajax')) { 
        $this->response->disableCache(); 
      } 
} 

Это проверяет, что запрос был сделан с помощью Ajax с использованием метода есть() от CakeRequest объекта и передавая АЯКС значение. Если это так, мы отключим кеширование, поскольку мы всегда хотим обслуживать наши Ajax-вызовы свежими. Это должно позаботиться о том, что у вас было, где «данные кэшируются, поэтому он отображает данные из первой записи, отображаемой даже после выбора новой записи».

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