Foros del Web » Programando para Internet » PHP » Symfony »

Eventos con SonataAdmin

Estas en el tema de Eventos con SonataAdmin en el foro de Symfony en Foros del Web. Buenas foreros, tengo una duda y no consigo encontrar cosas útiles en google, a ver si a alguien le ha surgido algo similar y ha ...
  #1 (permalink)  
Antiguo 13/11/2014, 14:34
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 8 meses
Puntos: 13
Eventos con SonataAdmin

Buenas foreros, tengo una duda y no consigo encontrar cosas útiles en google, a ver si a alguien le ha surgido algo similar y ha sabido solventarlo.

El caso es que necesito que, en mi AdminController de una entidad, después de crear un nuevo registro, pueda acceder a dicho registro y hacer una serie de cosas.

Para ser más concretos, tengo instalado Gedmo y en dicha entidad, genero con Gedmo los slugs a partir del titulo (Titulo es un campo de la entidad). Mi intención es crear enlaces de Bit.ly una vez el usuario haya creado un registro nuevo. Pero gedmo no crea el Slug hasta que el INSERT o UPDATE se ha ejecutado, por lo que necesito coger el valor del slug una vez Doctrine lo haya guardado, por lo que las funciones de Sonata Prepersist y postpersist no me sirven, ya que en ninguna se ha ejecutado el flush.

¿Hay alguna manera de capturar el evento de después del flush?
  #2 (permalink)  
Antiguo 13/11/2014, 15:17
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Eventos con SonataAdmin

Necesitas afectar los registros de la entidad ??
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 13/11/2014, 16:22
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Eventos con SonataAdmin

Así es, necesito acceder a los datos de la entidad recien creada para generar otros datos
  #4 (permalink)  
Antiguo 13/11/2014, 17:20
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Eventos con SonataAdmin

Vas a necesitar un Listener para el evento PostFlush: http://docs.doctrine-project.org/en/...html#postflush creo que seria la mejor aproximación
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 14/11/2014, 07:56
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Eventos con SonataAdmin

Sí, esto habia creado ya, un listener del evento postFlush comprobando que la entidad que esté manejando en el momento sea instancia de la que necesito.

Ahora solo me haría falta una cosa más y es que nunca me ha hecho falta pero, como puedo acceder a Request desde un servicio? Necesito acceder al nombre del host para crear una URL para acceder de manera externa, por ejemplo desde twitter o un foro.
  #6 (permalink)  
Antiguo 14/11/2014, 08:57
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Eventos con SonataAdmin

Solo inyecta la dependencia:
Código yml:
Ver original
  1. top.admin.document_listener:
  2.         class: Top\AdminBundle\EventListener\DocumentListener
  3.         arguments:[@RequestStack]
  4.         tags:
  5.             - { name: doctrine.event_listener, event: postFlush }
En el constructor de la clase solo agrega el parámetro y ya puedes disponer del request.
Código PHP:
Ver original
  1. use Doctrine\ORM\Event\PostFlushEventArgs;
  2. use Symfony\Component\HttpFoundation\RequestStack;
  3.  
  4. class DocumentListener {
  5.  
  6.     private $request;
  7.  
  8.     public function __construct(RequestStack $request)
  9.     {
  10.         $this->request = $request;
  11.     }
  12.  
  13.     public function postFlush(PostFlushEventArgs $eventArgs)
  14.     {
  15.         $this->request;//ya puedes usar request
  16.     }
  17.  
  18. }
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #7 (permalink)  
Antiguo 14/11/2014, 09:04
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Eventos con SonataAdmin

Hay alguna lista donde se puedan ver todos los servicios de Symfony2 para poder injectar? Porque también voy a necesitar el generateUrl() del container xD
  #8 (permalink)  
Antiguo 14/11/2014, 09:14
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Eventos con SonataAdmin

Para ver todos los servicios:
Código BASH:
Ver original
  1. app/console container:debug
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #9 (permalink)  
Antiguo 14/11/2014, 09:16
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Eventos con SonataAdmin

Mil gracias señor. Voy a trastear con esto nuevo a ver si obtengo lo que quiero!
  #10 (permalink)  
Antiguo 14/11/2014, 09:29
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Eventos con SonataAdmin

Uhms, el container:debug me dice que RequestStack no es un servicio. :S
  #11 (permalink)  
Antiguo 14/11/2014, 09:40
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Eventos con SonataAdmin

Que versión de symfony 2 estas usando ??
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #12 (permalink)  
Antiguo 14/11/2014, 12:31
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Eventos con SonataAdmin

Uso Symfony2.5 pero ya he visto porque me dice que no existe, el servicio se escribe "request_stack" no "requestStack" :)

Al final he inyectado el contenedor y desde ahi he invocado todo, pero ahora nose como guardar los cambios.

Tengo seto:

Código PHP:
Ver original
  1. public function onFlush(OnFlushEventArgs $args)
  2.     {
  3.         $em = $args->getEntityManager();
  4.         $uow = $em->getUnitOfWork();
  5.  
  6.         // we would like to listen on insertions and updates events
  7.         $entities = array_merge(
  8.             $uow->getScheduledEntityInsertions()
  9.         );
  10.        
  11.         foreach ($entities as $entity) {        
  12.             if ($entity instanceof Content) {
  13.                 $bitly = $this->container->get('RukbatBitly');
  14.                 $bitly = $bitly->bitly_v3_shorten('http://'.$this->container->get('request')->getHost().$this->container->get('router')->generate('content_show', array('slug'=>$entity->getSlug())));
  15.                 $entity->setBitlyUrl($bitly['url']);
  16.                 $em->persist($entity);
  17.                 $uow->computeChangeSets();
  18.             }
  19.         }
  20.     }

Has el persist lo entiendo todo, pero que porras hace $uow->computeChangeSets() y porque en lugar de modificar la entidad que estoy manipulando esta tratando de insertar una nueva?
  #13 (permalink)  
Antiguo 14/11/2014, 14:43
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Eventos con SonataAdmin

Código PHP:
Ver original
  1. /**
  2. * Computes all the changes that have been done to entities and collections
  3. * since the last commit and stores these changes in the _entityChangeSet map
  4. * temporarily for access by the persisters, until the UoW commit is finished.
  5. *
  6. * @return void
  7. */
  8. public function computeChangeSets()
  9. {
  10. // Compute changes for INSERTed entities first. This must always happen.
  11. $this->computeScheduleInsertsChangeSets();
Así que si no estas agregando una nuvea entidad, no es necesario que hagas persist() en ese punto.
Mas detalles:https://github.com/doctrine/doctrine...UnitOfWork.php
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #14 (permalink)  
Antiguo 14/11/2014, 16:07
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Eventos con SonataAdmin

Vale, ahora en teoria entiendo lo que hace, pero me surge un problema un tanto extraño. Solamente estoy añadiendo dos campos de la entidad pero al ejecutar el código, el DQL me contesta esto:

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Y es cierto, de todos los campos, solo los que yo he especificado en el Listener se han seteado correctamente, el resto son parametros sin definir en el DQL (Es decir, Interrogantes)

Código DQL:
Ver original
  1. VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["http:\/\/bit.ly\/1xpdRT2", "http:\/\/bit.ly\/1xpdRT0"]
  #15 (permalink)  
Antiguo 14/11/2014, 16:26
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Eventos con SonataAdmin

Vaya eso si es raro, si estas enviando todos los campos de la entidad o los demás campos aceptan null ?
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #16 (permalink)  
Antiguo 14/11/2014, 16:44
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Eventos con SonataAdmin

Los campos van rellenados desde un formulario de Sonata y el formulario hasta ahora funcionaba, es decir, creaba la entidad.

Estoy probando a hacer echos de $entity->getTitle() por ejemplo y lo imprime bien. No entiendo porque no se aplica en el DQL.
  #17 (permalink)  
Antiguo 16/11/2014, 11:57
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Eventos con SonataAdmin

Agregar un flsus en vez de persist en tu evento.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #18 (permalink)  
Antiguo 16/11/2014, 21:12
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Eventos con SonataAdmin

Agregar un flush no haría entrar en un bucle infinito? Si estoy handleando el evento onFlush y desde el handler vuelvo a llamar a Flush, sería algo recursivo.

Etiquetas: eventos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:30.