2013-07-24 2 views
1

Проблема: У меня есть jQuery скрипт, работающий в методе добавления моего контроллера, но когда я добавить функцию поиска метода редактирования выпадающее меню не работает; однако я знаю, что скрипт jQuery работает, потому что я получаю ответ с результатами. Я, вероятно, пропущу что-то простое, но, похоже, я не вижу его.JQuery автозаполнения виджет в CakePHP Редактировать действие

Контроллер Edit Method:

public function edit($id = null) { 
      $this->loadModel('PsychproScreening'); 
      $this->set('pidList', $this->PsychproScreening->find('list', array('fields' => array('pid','pid'), 
                 'order' => 'pid ASC'))); 

    if (!$this->PsychproConcomitantMed->exists($id)) { 
     throw new NotFoundException(__('Invalid psychpro concomitant med')); 
    } 
    if ($this->request->is('post') || $this->request->is('put')) { 
     if ($this->PsychproConcomitantMed->save($this->request->data)) { 
      $this->Session->setFlash(__('The psychpro concomitant med has been saved')); 
      $this->redirect(array('action' => 'index')); 
     } else { 
      $this->Session->setFlash(__('The psychpro concomitant med could not be saved. Please, try again.')); 
     } 
    } else if(!$this->RequestHandler->isAjax()) { 
     $options = array('conditions' => array('PsychproConcomitantMed.' . $this->PsychproConcomitantMed->primaryKey => $id)); 
     $this->request->data = $this->PsychproConcomitantMed->find('first', $options); 
    } 

      if ($this->RequestHandler->isAjax()) { 
       debug('here'); 
       $this->search(); 
    } 
} 

контроллер Метод поиска:

private function search(){ 
    $this->loadModel('FdaMed'); 
    $this->autoRender=false; 
    $meds=$this->FdaMed->find('all',array('fields' => array('med_id','non_proprietary_name', 'route_name', 'dosage_for_mname'), 
           'conditions'=>array('FdaMed.non_proprietary_name LIKE'=>'%'.$_GET['term'].'%'))); 
      $i=0; 
      foreach($meds as $meds){ 
        $response[$i]['value']=$meds['FdaMed']['med_id']; 
        $response[$i]['label']=$meds['FdaMed']['non_proprietary_name'].' ('. 
          $meds['FdaMed']['route_name'].'/ '.$meds['FdaMed']['dosage_for_mname'].')'; 
      $i++; 
      } 
    echo json_encode($response); 
} 

Edit View

<?php include_once 'concomitant_meds_inc.php'; 
$this->Html->addCrumb('PsychPro', '/Psychpros'); 
$this->Html->addCrumb('PsychPro Concomitant Med', '/PsychproConcomitantMeds'); 
$this->Html->addCrumb('Edit Concomitant Med', '/PsychproConcomitantMeds/edit/'.$this->request->data['PsychproConcomitantMed']['id']); 
?> 
<div class="psychproConcomitantMeds form"> 
<?php echo $this->Form->create('PsychproConcomitantMed',array('action' => 'edit')); ?> 
    <fieldset> 
     <legend><?php echo __('Edit Psychpro Concomitant Med'); ?></legend> 
    <?php 
     echo $this->Form->input('pid', array('options' => $pidList, 'empty' => 'Choose a value')); 
       echo $this->Form->input('timept', array('options' => $tpt, 'empty' => 'Choose a value')); 
       echo '<h3>Current Medication: '.$this->request->data['PidConcomitantMed']['non_proprietary_name'].' Route: '. 
         $this->request->data['PidConcomitantMed']['route_name']." Dosage Type: ". 
         $this->request->data['PidConcomitantMed']['dosage_for_mname'].'</h3>'; 
       echo $this->Form->input('med_name',array('type'=>'text','id'=>'med_name','label'=>'Medication Name (Route/Dosage Type)')); 
       echo $this->Form->hidden('med_id', array('id' => 'med_id')); 
     echo $this->Form->input('meds_taken'); 
       echo $this->Form->hidden('id', array('id' => 'p_form_id')); 
       echo $this->Form->hidden('update_initials',array('value' => $this->Session->read('CoreUser.user_initials'))); 
       echo $this->Form->hidden('update_time_stamp', array('value' => date("Y-m-d h:i:s"))); 
    ?> 
    </fieldset> 
<?php echo $this->Form->end(__('Submit')); ?> 
</div> 
<div class="actions"> 
    <h3><?php echo __('Actions'); ?></h3> 
    <ul> 

     <li><?php echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $this->Form->value('PsychproConcomitantMed.id')), null, __('Are you sure you want to delete # %s?', $this->Form->value('PsychproConcomitantMed.id'))); ?></li> 
     <li><?php echo $this->Html->link(__('List Psychpro Concomitant Meds'), array('action' => 'index')); ?></li> 
    </ul> 
</div> 
<?php echo $this->Html->script('autocomplete_edit'); ?> 

JQuery автозаполнения

$(document).ready(function(){ 

    // Defining a placeholder text: 
    $('#med_name').defaultText('Search for medications'); 
    console.log($('#p_form_id').val()); 
    var form_id = $('#p_form_id').val(); 

    $('#med_name').autocomplete({ 
    minLength  : 3, 
    source   : 'http://127.0.0.1/my_cakephp/PsychproConcomitantMeds/edit/'+form_id, 
    autoFocus  : true, 
    select   : function(event,ui){ 
     //console.log(ui.item['value']); 
     $('#med_id').val(ui.item['value']); 
     //console.log($('#med_id')); 
    } 
    }); 
}); 

    // A custom jQuery method for placeholder text: 

$.fn.defaultText = function(value){ 

     var element = this.eq(0); 
     element.data('defaultText',value); 

     element.focus(function(){ 
     if(element.val() == value){ 
     element.val('').removeClass('defaultText'); 
     } 
     }).blur(function(){ 
     if(element.val() == '' || element.val() == value){ 
     element.addClass('defaultText').val(value); 
     } 
     }); 

     return element.blur(); 
} 

Debugging

Я знаю, работает следующим образом:

  1. Использование встроенных инструментов разработчика в хроме я получаю ответ от jQuery с jQuery массив, содержащий результаты поиска в формате {Value: , Label: }.
  2. Я знаю, что это код jQuery работает, потому что у меня есть аналогичный код, используемый для метода добавления. Если вы хотите, чтобы код дал мне знать, и я обновлю его. Единственное реальное отличие заключается в том, что мне нужно получить идентификатор записи и добавить ее в конец URL-адреса в сценарии jQuery.
  3. Я получаю правильный URL-адрес в ответ. Похоже ../view/21?term=insulin

ОБНОВЛЕНИЕ 0:

После некоторых более отладок я узнать, где проблема возникает. В сценарии jQuery для метода add эти журналы будут напечатаны, но нет метода edit.

$('#med_name').autocomplete({ 
minLength  : 3, 
source   : 'http://127.0.0.1/my_cakephp/PsychproConcomitantMeds/edit/'+form_id, 
autoFocus  : true, 
select   : function(event,ui){ 
    console.log(ui.item['value']); 
    $('#med_id').val(ui.item['value']); 
    console.log($('#med_id')); 
} 
}); 

Поэтому я знаю, что функция поиска работает, но событие select не запускается. Выпадающее меню также не отображается, и я нахожу странным, потому что jQuery, очевидно, работает с тех пор, как он получает результаты, их просто невозможно отобразить.

ответ

1

Не совсем уверен, что я сделал, но теперь это работа. Вот документация изменений:

autocomplete_edit.js

$(document).ready(function(){ 
    //console.log('AutocompleteEdit:Function=ready():Beginning'); 
    // Defining a placeholder text: 
    $('#search_key').defaultText('Search here'); 
    //console.log($('#p_form_id').val()); 
    var form_id = $('#p_form_id').val(); 
    var pathname = window.location.pathname; 

    $('#search_key').autocomplete({ 
    minLength  : 3, 
    source   : 'http://127.0.0.1'+pathname+'/'+form_id, 
    autoFocus  : true, 
    select   : function(event,ui){ 
     //console.log(ui.item['value']); 
     $('#search_id').val(ui.item['value']); 
     $('#search_key').val(ui.item['label']); 
     //console.log($('#med_id')); 
    } 
    }); 
}); 

Я изменил идентификаторы селекторов, чтобы быть более абстрактными, так это автозаполнение может использоваться другими компонентами. Я добавил путь, который получает webroot и вызывающий контроллер/метод.Я также получаю идентификатор записи, поэтому я могу сохранить med_id в скрытом поле и сохранить имя лекарства в поле поиска.

Обновлено представлении редактирования

echo '<h3>Current Medication: '.$this->request->data['PidConcomitantMed']['non_proprietary_name'].' Route: '. 
$this->request->data['PidConcomitantMed']['dosage_for_mname'].'</h3>'; 
echo $this->Form->input('med_name',array('type'=>'text','id'=>'search_key','label'=>'Medication Name (Route/Dosage Type)')); 
echo $this->Form->hidden('med_id', array('id' => 'search_id')); 
echo $this->Form->input('meds_taken'); 
echo $this->Form->hidden('id', array('id' => 'p_form_id'));