AJAX - Problema con combos anidados

   
Vista:

Problema con combos anidados

Publicado por Luis (1 intervención) el 26/01/2011 17:15:12
Buenas amigos,

Estoy modificando una aplicación que contiene unos combos anidados de estado, ciudad y area. Yo a esta anidación le agregue pais. El problema es que estos combos son dependientes solo de a dos, es decir, si modifico el pais, se cambia el estado, pero no afecta a la ciudad, si cambio el estado se recarga con los nuevos datos la ciudad, pero el area mantiene los que tenia. Por esto es que digo que solo estan anidados de a dos. Mi idea es, y es lo que me parece más lógico que cuando cambie el país, que se cargue los estados pero que no exista ninguna ciudad ni area y asi sucesivamente.

Espero que alguien me pueda dar alguna idea de que puede estar pasando o como lo soluciono. Cabe destacar que esto esta programado con joomla, lo pongo este foro porque la pregunta concreta esta relacionada con ajax y no con joomla 1.5. Por favor corrijanme si me equivoco.

Este es el código ajax que esta dentro del formulario

$script=<<<EOB

var townOptionsCallback = {
onComplete: function(response){
var first = $('area_id').getFirst().clone();
$('area_id').empty();
$('area_id').appendChild(first);

response.each(function(item){
var option = new Element('option', {'value' : item.id});
option.appendText(item.value);
$('area_id').appendChild(option);
});
}
};

var deptOptionsCallback = {
onComplete: function(response){
var first = $('town_id').getFirst().clone();
$('town_id').empty();
$('town_id').appendChild(first);

if(response){
response.each(function(item){
var option = new Element('option', {'value' : item.id});
option.appendText(item.value);
$('town_id').appendChild(option);
});
}
}
};

var countryOptionsCallback = {
onComplete: function(response){
var first = $('department_id').getFirst().clone();
$('department_id').empty();
$('department_id').appendChild(first);

if(response){
response.each(function(item){
var option = new Element('option', {'value' : item.id});
option.appendText(item.value);
$('department_id').appendChild(option);
});
}
}
};

window.addEvent('domready', function() {

$('country_id').addEvent('change', function(){
var url = 'index.php?option=com_jea&controller=ajax&task=get_departments'
+ '&country_id=' + this.value;
var jSonRequest = new Json.Remote( url , countryOptionsCallback );
jSonRequest.send();
});

$('department_id').addEvent('change', function(){
var url = 'index.php?option=com_jea&controller=ajax&task=get_towns'
+ '&department_id=' + this.value;
var jSonRequest = new Json.Remote( url , deptOptionsCallback );
jSonRequest.send();
});

$('town_id').addEvent('change', function(){
var url = 'index.php?option=com_jea&controller=ajax&task=get_areas'
+ '&town_id=' + this.value;
var jSonRequest = new Json.Remote( url , townOptionsCallback );
jSonRequest.send();
});
});

EOB;

Estas son las funciones que cargan los combos

function getDepartamentList($default=0, $country_id=0, $grid=false )
{
$featuresModel =& $this->getModel('features');
$title = '- ' . JText::_( 'Departments' ).' -' ;
$list = array();
$onChange = $grid ? 'onchange="document.adminForm.submit();"' : '' ;

if($country_id > 0) {
$featuresModel->setTableName( 'departments' );
$list = $featuresModel->getListForHtml(
$title, 'text',
'country_id=' . intval($country_id)
);
} else {
// Potentialy Too much values
$list[] = JHTML::_('select.option', '0', $title );
}
return JHTML::_(
'select.genericlist',
$list,
'department_id',
'class="inputbox" size="1" '.$onChange,
'value',
'text',
$default
);
}


function getTownsList($default=0, $department_id=0, $grid=false )
{
$featuresModel =& $this->getModel('features');
$title = '- ' . JText::_( 'Town' ).' -' ;
$list = array();
$onChange = $grid ? 'onchange="document.adminForm.submit();"' : '' ;

if($department_id > 0) {
$featuresModel->setTableName( 'towns' );
$list = $featuresModel->getListForHtml(
$title, 'text',
'department_id=' . intval($department_id)
);
} else {
// Potentialy Too much values
$list[] = JHTML::_('select.option', '0', $title );
}
return JHTML::_(
'select.genericlist',
$list,
'town_id',
'class="inputbox" size="1" '.$onChange,
'value',
'text',
$default
);
}

function getAreasList($default=0, $town_id=0 )
{
$featuresModel = new JeaModelFeatures();
$title = '- ' . JText::_( 'Area' ).' -' ;
$list = array();

if($town_id > 0) {
$featuresModel->setTableName( 'areas' );
$list = $featuresModel->getListForHtml(
$title, 'text',
'town_id=' . intval($town_id)
);
} else {
// Potentialy Too much values
$list[] = JHTML::_('select.option', '0', $title );
}
return JHTML::_(
'select.genericlist',
$list,
'area_id',
'class="inputbox" size="1"',
'value',
'text',
$default
);
}

Y estas son las consultas a la base de datos que retornan la respuesta Ajax

function get_areas()
{
$db =& JFactory::getDBO();
$where = '';

if($town_id = JRequest::getInt('town_id', 0)) {
$where = ' WHERE town_id='. $town_id ;
}

$query = 'SELECT * FROM #__jea_areas' . $where
. ' ORDER BY `value`';
$db->setQuery($query);
$response = $db->loadObjectList();

$this->_output($response);
}

function get_towns()
{
$db =& JFactory::getDBO();
$response = false;

if($department_id = JRequest::getInt('department_id', 0)) {
// Require department id
$query = 'SELECT * FROM #__jea_towns'
. ' WHERE department_id='. $department_id
. ' ORDER BY `value`';
$db->setQuery($query);
$response = $db->loadObjectList();
}

$this->_output($response);
}

function get_departments()
{
$db =& JFactory::getDBO();
$response = false;

if($country_id = JRequest::getInt('country_id', 0)) {
// Require country id
$query = 'SELECT * FROM #__jea_departments'
. ' WHERE country_id='. $country_id
. ' ORDER BY `value`';
$db->setQuery($query);
$response = $db->loadObjectList();
}

$this->_output($response);
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder