lunes, 16 de julio de 2012

Combos dependientes con sfDependentSelectPlugin

Por fin puede hacer funcionar las combos dependientes con sfDependentSelectPlugin.

Tuve que hacer algunos ajustes mas allá de la documentación.

1. Agregar la opción 'ref_method' que indica cual es el método accesor para obtener el id que relaciona con la tabla independiente.

2. Como mis tablas no se ajustaban exactamente al estándar de symfony modificar un poco el widget para recibir otro parámetro que indicara donde debería enlazar los métodos javascript para el evento del cambio en el combo independiente. fuente (http://roy-rc.blogspot.com/2011/07/sfdependentselectplugin-problema-con.html)

El caso quedo asi:
1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php

/**
 * callcenterRegistroCita form.
 *
 */
class callcenterRegistroCitaForm extends BasecallcenterRegistroCitaForm {

    public function configure() {
        unset($this['modificadoEn'], $this['modificadoPor'], $this['modificadoDesde'], $this['callcenter_agente_id'], $this['motivo_id']);

        
        $this->widgetSchema['callcenter_area_id'] = new sfWidgetFormDoctrineChoice(array(
                   'model' => 'callcenterArea'
                ));


        $this->widgetSchema['callcenter_profesional_id'] = new sfWidgetFormDoctrineDependentSelect(array(
                    'model' => 'callcenterProfesional',
                    'depends' => 'callcenterArea',
                    'widget'   => 'callcenter_registro_cita_callcenter_area_id', // nombre del campo renderizado en el form (combo superior)
                    'ref_method' => 'getCallcenterAreaId',
                    'order_by' => array('nombreCompleto','asc')
                ));


        $this->widgetSchema->moveField('callcenter_profesional_id', 'after', 'callcenter_area_id');

        // validadores

        $this->validatorSchema['callcenter_area_id'] = new sfValidatorDoctrineChoice(array(
                    'model' => 'callcenterArea'
                ));

        $this->validatorSchema['callcenter_profesional_id'] = new sfValidatorDoctrineChoice(array(
                    'model' => 'callcenterProfesional'
                ));
    }

}


Para el caso del widget tambien se debe modificar un poco el codigo del plugin:



1. Modificar /plugins/sfDependentSelectPlugin/sfWidgetFormDependentSelect.class

// en la funcion configure agregar una nueva opcion widget

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
protected function configure($options = array(), $attributes = array())
    {
        $this->addOption('depends', '');
        $this->addOption('add_empty', true);
        $this->addOption('widget', '');//nueva opcion widget
        // ajax
        $this->addOption('ajax', false);
        $this->addOption('cache', true);
        $this->addOption('params', array());
        $this->addOption('url', sfContext::getInstance()->getController()->genUrl('sfDependentSelectAuto/_ajax'));
        // source
        $this->addRequiredOption('source_class', '');
        $this->addOption('source_params', array());
        
        parent::configure($options, $attributes);
    }


2. En la función render modificar la opción 'dependiente'

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 
        $config = array(
            'id'          => $this->generateId($name),
            'opciones'    => $values,
            'vacio'       => true === $this->getOption('add_empty') ? '' : $this->getOption('add_empty'),
            'ajax'        => $this->getOption('ajax'),
            'url'         => $this->getOption('url'),
            'cache'       => $this->getOption('cache'),
            'dependiente' => ($this->getOption('widget') == '' ? $this->getOption('depends') : $this->getOption('widget')),//validamos el valor q viene en la opcion
            //'dependiente' => $this->getOption('depends'),
            'varref'      => '_ds_ref',
            'varsoloref'  => '_ds_get_ref_value',
            'params'      => array_merge($this->getOption('params'), array(