Finally I managed to solve the prob after 2 weeks of research and
reading up. The problem was Cakephp's security component was
blackholing Ajax's observeField request. So, the security component
has to be disabled for the observeField to work. Added the following
beforeFilter code (found from the net) in StudentsController:
function beforeFilter()//executed before any controller action logic
{
if(isset($this->Security) && $this->RequestHandler->isAjax() &&
$this->action = 'getcities'){
$this->Security->enabled = false;
}
}
On Jul 30, 3:39 pm, varai <[email protected]> wrote:
> I'm trying to populate the city select box based on the selected state
> (which is also a select box) using Ajax. When i select state, the city
> select box is not being populated.
>
> There are 5 models below: Student, MerryParent, MerryClass, State,
> City. All of them are related to one another.
>
> Can someone please tell me on what am I doing wrong? thank you.
>
> The following are the models:
> student.php
>
> <?php
> class Student extends appModel{
> var $name='Student';
> var $belongsTo=array('MerryParent','State','City','MerryClass');
>
> }
> ?>
>
> merry_parent.php
>
> <?php
> class MerryParent extends appModel{
> var $name='MerryParent';
> $hasMany=array(
> 'Student'=>array(
> 'className'=>'Student',
> 'foreignKey'=>'merry_parent_id'
> )
> );
> $belongsTo=array('State','City','MerryClass');
>
> ?>
>
> merry_class.php
>
> <?php
> class MerryClass extends AppModel{
> var $name='MerryClass';
> var $hasMany=array
> ('Student'=>array(
> 'className'=>'Student',
> 'foreignKey'=>'class_id'
> ),
> 'MerryParent'
> );
> var $belongsTo=array('State','City');
> //var $displayField='class_name';
> }
> ?>
>
> city.php
>
> <?php
> class City extends AppModel{
> var $name='City';
> var $belongsTo='State';
> var $hasMany=array('MerryParent','MerryClass',
> 'Student'=>array(
> 'className'=>'Student',
> 'foreignKey'=>'city_id'
> )
> );
> }
> ?>
>
> state.php
>
> <?php
> class State extends AppModel{
> var $name='State';
> var $hasMany=array(
> 'MerryParent',
> 'MerryClass',
> 'City'=>array(
> 'className'=>'City',
> 'foreignKey'=>'state_id'
> //'dependent'=>true
> ),
> 'Student'=>array(
> 'className'=>'Student',
> 'foreignKey'=>'state_id'
> )
> );
>
> }
> ?>
>
> The controllers
> students_controller.php
>
> <?php
> class StudentsController extends AppController{
> var $name='Students';
> var $helpers = array('Html','Form','Ajax','Javascript');
> var $components=array('RequestHandler');
>
> function getcities(){
>
> $options=$this->Student->City->find('list',
>
> array
>
> ('conditions'=>array(
>
>
> 'City.state_id'=>$this->data['Student']['state_id']
>
> ),
>
> 'group'=>array('City.name')
> )
>
> );//closing parentheses for find('list'...
>
> $this->render('/students/ajax_dropdown');
> }
>
> function add(){
>
> if (!empty($this->data)){
> /*var_dump($this->data);
> die(debug($this->Student->validationErrors)); */
>
> $student=$this->Student->saveAll($this->data,array('validate'=>'first'));
>
> if (!empty($student))
> {
> $this->Session->setFlash('Your child\'s
> admission has been
> received. We will send you an email shortly.');
>
> $this->redirect(array('controller'=>'pages', 'action'=>'home'));
>
> }
>
> } //for if (!empty....
>
> $states=$this->Student->State->find('list');
>
> $cities=array();
> $this->set(compact('states','cities'));
>
> }//end function}
>
> ?>
>
> merry_parents_controller.php
>
> <?php
> class MerryParentsController extends AppController{
>
> var $name='MerryParents';
>
> }
> ?>
>
> add.ctp
>
> <?php
> echo $javascript->link('prototype',false);
>
> echo $form->create('Student');
> echo '<fieldset>';
> echo '<legend>Student Information</legend>';
> echo $form->input('Student.name');
>
> $options = array('Male'=>'Male','Female'=>'Female');
> $attributes = array('value'=>'Male');
> echo $form->radio('Student.gender',$options,$attributes);
>
> echo $form->input('Student.dob', array('label'=>'Date of Birth',
> 'dateFormat'=>'DMY',
> 'empty'=>true,
> 'timeFormat' => '',
> 'minYear' => (
> date('Y') - 5
> ),
> 'maxYear' => (
> date('Y') - 2
> )
> ));
> echo $form->input('Student.class_id',
> array(
> 'label'=>'Enquiry Class for',
> 'empty'=>'Choose one',
> 'options'=>array('1'=>'Playgroup','2'=>'Nursery','3'=>'LKG',
> '4'=>'UKG')
> )
> );
>
> echo '</fieldset>';
>
> echo '<fieldset>';
> echo '<legend>Parent Information</legend>';
> //echo $form->input('Student.parent_id', array('type'=>'hidden'));
> echo $form->input('MerryParent.initial',
> array('empty'=>true,
> 'options'=>array('Dr'=>'Dr',
> 'Mr'=>'Mr',
> 'Mrs'=>'Mrs',
> 'Ms'=>'Ms')
> )
> );
> echo $form->input('MerryParent.name', array('label'=>'Parent/Guardian
> Name'));
> echo $form->input('MerryParent.email');
> echo $form->input('MerryParent.landline');
> echo $form->input('MerryParent.mobile');
> echo $form->input('MerryParent.address');
> echo $form->input('Student.state_id');
> echo $form->input('Student.city_id');
> echo $form->input('MerryParent.postal_code');
>
> $options = array('url' => 'getcities', 'update' =>
> 'StudentCityId');
> echo $ajax->observeField('StudentStateId', $options); //observes
> the drop down
> changes in state id and makes an xmlHttpRequest when its
> contents have changed.
>
> echo '</fieldset>';
>
> echo $form->end('Submit');
> ?>
>
> ajax_dropdown.ctp
>
> <?php foreach($options AS $k=>$v) : ?>
> <option value="<?php echo $k; ?>"><?php echo $v; ?></option>
> <?php endforeach; ?>
>
>
--
Our newest site for the community: CakePHP Video Tutorials
http://tv.cakephp.org
Check out the new CakePHP Questions site http://ask.cakephp.org and help others
with their CakePHP related questions.
To unsubscribe from this group, send email to
[email protected] For more options, visit this group at
http://groups.google.com/group/cake-php