I am working on CakePHP 2.7.8. I want to update related list with change in list using Ajax.
I have a customers
table and customer_addresses
table in the database and customers
and customerAddress
models in the project.
There is another controller serviceRequests
where I have to select customer
and address of the selected customer from a drop down list generated by CakePHP from database.
What I have done-
I have added a function getCustomerAddress
in the serviceRequests
controller
public function getCustomerAddress(){
$customer_id = $this->request->data['Post']['customer_id'];
$customer_address = $this->CustomerAddress->find('list',array(
'condition' => array('CustomerAddress.customer_id' => $customer_id),
'recursive' => -1
));
$this->set('customerAddresses', $customer_address);
$this->layout = 'ajax';
}
to display the retrieved data, I have a view get_customer_address.ctp
<?php
foreach ($customerAddresses as $key => $value): ?>
<option value="<?php echo $key;?>"><?php echo $value; ?></option>
<?php endforeach; ?>
In the add.ctp
view of serviceRequests
controller for add
function, I have added following script at the last.
<div class="serviceRequests form">
<?php echo $this->Form->create('ServiceRequest'); ?>
<fieldset>
<legend><?php echo __('Add Service Request'); ?></legend>
<?php
echo $this->Form->input('customer_id');
echo $this->Form->input('customer_address_id');
echo $this->Form->input('status');
?>
</fieldset>
<?php echo $this->Form->end(__('Submit')); ?>
</div>
<?php
$this->Js->get('#ServiceRequestCustomerId')->event('change',
$this->Js->request(array(
'controller' => 'serviceRequests',
'action' => 'getCustomerAddress'
), array(
'update' => '#ServiceRequestCustomerAddressId',
'async' => true,
'method' => 'post',
'dataExpression' => true,
'data' => $this->Js->serializeForm(array(
'isForm' => true,
'inline' => true
))
))
);
?>
and to render Js
, I have added following code to to last of default.ctp
<!-- script for layout -->
<?php echo $scripts_for_layout; ?>
<!-- Js writeBuffer -->
<?php
if(class_exists('JsHelper') && method_exists($this->Js, 'writeBuffer')) echo $this->Js->writeBuffer ();
// writes cached scripts
?>
But on accessing localhost/serviceRequests/add
the ajax call is not working and all customer's name and all customer's addresses are showing in the list.
This is an example of how to implement chained selects with cake http://sandbox.dereuromark.de/sandbox/ajax_examples/chained_dropdowns - the related article for that example is here http://www.dereuromark.de/2014/01/09/ajax-and-cakephp/