Voy a intentar explicar con un ejemplo concreto como implementar autocompletado en formularios synfony con sfFormExtraPlugin y Doctrine ORM.
Para ello vamos a utilizar el clásico ejemplo del blog, donde tenemos dos tablas.
post:
id: INT(11) titulo: VARCHAR(45) texto: TEXT categoria_id: INT(11)
y categoria:
id: INT(11) nombre: VARCHAR(45)
La idea es modificar el formulario ‘PostForm’ para que se vea así:
En primer lugar descargamos la ultima version de jQuery y lo guardamos en el directorio ‘web/js/jquery’ de nuestro proyecto.
Luego instalamos el plugin sfFormExtraPlugin.
En el archivo ’settings.yml’ agregamos la siguiente clave:
all: jquery_autocomplete: /sfFormExtraPlugin/js/jquery.autocompleter.js
Nota: en la vista donde se va a renderizar nuestro formulario, no debemos olvidarnos de incluir el script ‘jquery-1.6.2.js’ (o el que corresponda a la version que descargamos), ya que el plugin, por alguna razón no lo hace. Para ello podemos usar el helper ‘use_javascript()’ o modificar el archivo ‘view.yml’ del módulo donde vamos a implementar el autocompletado (en este caso el modulo post):
default: javascripts: [jquery/jquery-1.6.2.js]
En el action del mismo módulo, creamos la acción que retorna un objeto JSON con pares ‘id - nombre’ de categorías:
public function executeBuscarCategoria(sfWebRequest $request) { $this->getResponse()->setContentType('application/json'); $categorias = Doctrine::getTable('Categoria') ->retrieveForSelect( $request->getParameter('q'), $request->getParameter('limit') ); return $this->renderText(json_encode($categorias)); }
En CategoriaTable creamos el método que retorna el listado de categorías filtrado por nombre:
public function retrieveForSelect($q, $limit) { $q = Doctrine_Query::create() ->from('Categoria') ->andWhere('nombre like ?', '%' . $q . '%') ->addOrderBy('nombre') ->limit($limit); return $q->execute()->toKeyValueArray('id', 'nombre'); }
Por último, modificamos el formulario (PostForm):
public function configure() { $this->widgetSchema['categoria_id']->setOption( 'renderer_class', 'sfWidgetFormDoctrineJQueryAutocompleter' ); $this->widgetSchema['categoria_id']->setOption( 'renderer_options', array( 'model' => 'Categoria', 'url' => 'buscarCategoria', ) ); }
Y esto es todo, solo resta utilizar el formulario ‘PostForm’ en la acción donde sea necesario, en el caso de la imagen anterior, se trata de la acción ‘post/new’ creada mediante el comando ‘doctrine:generate-admin’.
Hasta la próxima!


