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

Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

Estas en el tema de Symfony2 y Slugify en las entidades (Famoso manual Jobbet) en el foro de Symfony en Foros del Web. Hola a todos, Espero que pueda explicarme correctamente, llevo ya un par de días atascado en el capítulo 5 del manual Jobeet de Symfony2. Es ...
  #1 (permalink)  
Antiguo 29/10/2012, 06:40
 
Fecha de Ingreso: enero-2012
Mensajes: 64
Antigüedad: 12 años, 3 meses
Puntos: 0
Exclamación Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

Hola a todos,

Espero que pueda explicarme correctamente, llevo ya un par de días atascado en el capítulo 5 del manual Jobeet de Symfony2. Es algo bastante sencillo pero yo no consigo que funcione.

La cosa es simple, ya he generado en el directorio /Utils una clase que contiene el método slugify(). Luego en la entidad llamas a dicho método con uno de los campos que tienes interés en crear un texto sin caracteres ASCII (como ya sabréis) de la siguiente forma:

public function getTitleSlug()
{
return Cosmo::slugify($this->getLocation());
}

Creo que hasta ahí todo correcto, lo gracioso viene cuando al hacer la llamada en el controlador en la acción Index me salta el error:

[Semantical Error] line 0, col 74 near 'titleslug,
': Error: Class cosmo\HomeBundle\Entity\Notices has no field or association named titleslug

Lo que más raro me parece que este error sale sólo cuando utilizo DQL, si uso la propiedad FindAll del getRespository me sale todo OK, pero yo nocesito realizar JOINs de varias tablas y en si en la parte de la Select le añado el nuevo campo "virtual" titleslug me salta el error.

Estoy increiblemente despesperado , si alguien le ha sucedido lo mismo, si me falta algo que en el manual de Jobbet no viene, por favor comentarmelo!

Muchas gracias de antemano!!
  #2 (permalink)  
Antiguo 29/10/2012, 06:59
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

Como estas invocando al método ?, cual es el DQL ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 29/10/2012, 07:29
 
Fecha de Ingreso: enero-2012
Mensajes: 64
Antigüedad: 12 años, 3 meses
Puntos: 0
Pregunta Respuesta: Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

Gracias por responder!

La funcion Index es la siguiente:

public function indexAction()
{
$em = $this->getDoctrine()->getEntityManager();

$qy = $em->createQuery('SELECT n.id,
n.title,
n.titleslug,
n.notice,
n.url,
n.createdAt,
c.category,
u.login
FROM HomeBundle:Categories c,
HomeBundle:Notices n,
HomeBundle:Users u,
HomeBundle:UserPublish up
WHERE up.notices = n.id
AND up.categories = c.id
AND up.users = u.id');

$entities = $qy->getResult();

//Esto si funciona
//$entities = $em->getRepository('HomeBundle:Notices')->findAll();

return $this->render('HomeBundle:Notices:index.html.twig', array(
'entities' => $entities
));
}

Estará mal el DQL o me falta algo en la entidad?
  #4 (permalink)  
Antiguo 29/10/2012, 08:47
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

Te sugiero que leas sobre DQL en la documentación de Doctrine, DQL no es SQL basta con hacer join para obtener las entidades relacionadas, fuera de esto, la entidad Noticia tiene una propiedad titleslug ?

Y un comentario, DQL en un controlador es una muy mala practica,debería estar en el repositorio correspondiente a la entidad.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 29/10/2012, 11:17
 
Fecha de Ingreso: enero-2012
Mensajes: 64
Antigüedad: 12 años, 3 meses
Puntos: 0
Pregunta Respuesta: Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

Ante todo gracias por tus consejos. Ya he leído sobre DQL y la forma de generarlo. Sé que mi sentencia no esta muy estandarizada con DQL, pero por rapidez y al estar aprendiendo de momento lo he dejado así. Y el comentario lo he mantenido porque con esa sentencia de FindAll (sin excepción) si me reconoce el titleslug.

La propiedad titleslug no esta en la BBDD como campo, pero según explica el manual jobbet en el capítulo 5, lo que hacemos para crear las URL amigables es crear propiedades "virtuales" que pasen su texto (que si están en la BBDD) por el método Slugify para quitar todo carácter NOASCII y así tener las URL limpias.

Mi problema es ese, que me salta el error cuando quiero hacer las JOIN para unir varias tablas, si hago un findAll de toda la entidad el titleslug si que me lo reconoce. He seguido paso a paso el manual Jobbet, y para ellos esta práctica funciona correctamente. Yo sólo necesito tener en mi proyecto URL amigables para los buscadores.

Gracias por responder!! Saludos!
  #6 (permalink)  
Antiguo 29/10/2012, 12:01
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

Lo "virtual" es el accessor(no entiendo la parte de virtual, no son mas que métodos...), la propiedad como tal no existe por lo tanto no la debes definir en el DQL, y luego utilizas el mapeo que twig hace de propiedades a métodos, en definitiva, simplemente quita titleslug del DQL.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 29/10/2012, 14:46
 
Fecha de Ingreso: enero-2012
Mensajes: 64
Antigüedad: 12 años, 3 meses
Puntos: 0
De acuerdo Respuesta: Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

Hola de nuevo y gracias por seguirme el hilo de todo el problema!

Eso ya lo he probado y me salta el siguiente error:

Item "titleslug" for "Array" does not exist in HomeBundle:Notices:index.html.twig at line 4

La plantilla donde están los bloques Twig es el siguiente:

Código PHP:
{% extends 'HomeBundle::index.html.twig' %}
{% 
block content %}
    {% for 
entity in entities %}
        <
a href="{{ path('notices_show', { 'id': entity.id, 'title':entity.titleslug }) }}"><h2>{{ entity.title }}</h2></a>    
      <
class="postcontent">
          {{ 
entity.notice }}
          {{ 
entity.url }}
      </
p>
        <
class="postmeta">Publicado por <a href="#">"Juan"</a> | <a href="#">Category</a> | {% if entity.createdAt %}{{ entity.createdAt|date('d-m-Y') }}{% endif %} | <a href={{ path('notices_new') }}>2 comments</a></p>
    {% endfor %}
{% 
endblock %} 
Como puedes ver hago el llamamiento a "entity.titleslug" y me salta este error. ¿Hay que hacer de alguna otra forma?

Mil gracias!
  #8 (permalink)  
Antiguo 29/10/2012, 15:50
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

Primero tienes que crear correctamente el DQL, para que te retorne objetos y no arrays..., no se como son las relaciones pero te dejo un ejemplo:

Código DQL:
Ver original
  1. SELECT n, c, u
  2. FROM Notices n
  3. LEFT JOIN n.categories c
  4. JOIN n.users u
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 29/10/2012, 18:04
 
Fecha de Ingreso: enero-2012
Mensajes: 64
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

Perfecto, acabo de aprender, que si lo haces de una forma te devuelven objetos, y si lo haces de otra te devuelve un array. Gracias!

Lo único que me queda por aprender es a manejar correctamente y DQL y por más que miro en la documentación no veo nada de tablas intermedias que es este caso.

La query que tu me has puesto de ejemplo, sería perfecta, pero yo tengo una tabla intermedia donde todos los id de categorias, noticias y usuarios se juntan para luego obtener los comentarios de cada noticia por ejemplo.

He intentado hacer un DQL con la tabla intermedia y los JOIN y no encuentro la forma. Como podrás imaginar la tabla intermedia es UserPublish y contiene las propiedades categories,notices e users.

Espero haberme explicado correctamente y como siempre gracias!
  #10 (permalink)  
Antiguo 29/10/2012, 18:21
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

Es que lo que tu ves como "tabla intermedia" no es mas que otra entidad para Doctrine,

Código DQL:
Ver original
  1. SELECT up, n, c, u
  2. FROM UserPublish up
  3. JOIN up.notice n
  4. JOIN up.category c
  5. JOIN up.user u

todo depende de que quieres mostrar exactamente, cualquier cosa postea la entidades(preferible en un gist).
__________________
http://es.phptherightway.com/
thats us riders :)
  #11 (permalink)  
Antiguo 30/10/2012, 09:34
 
Fecha de Ingreso: enero-2012
Mensajes: 64
Antigüedad: 12 años, 3 meses
Puntos: 0
Pregunta Respuesta: Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

Acabo de poner esta query y ahora me salta el siguiente error:

Method "title" for object "cosmo\HomeBundle\Entity\UserPublish" does not exist in HomeBundle:Notices:index.html.twig at line 4

Y tiene gran parte de lógica, si no estuviesemos haciendo los JOIN, ya que la entidad "intermedia" para Doctrine sólo tiene las propiedades notices, users y categories. Pero entiendo que al hacer las JOIN ya disponemos de todas las propiedades de las entidades incluidas en la query y parece ser que no es así, que sólo obtiene las propiedades de UserPublish y de ahí el error. El method title está en la entidad de notices.

Yo necesito obtener de notices ciertos campos, de categories la categoría y de users el login, por lo que me quedaría una query parecida a la que yo tenía antes y que tampoco funciona porque el titleslug no lo reconoce:

Código:
//Esta es tu query
SELECT up, n, c, u
  FROM HomeBundle:UserPublish up
   JOIN up.notices n
   JOIN up.categories c
   JOIN up.users u

//Estos son los campos que yo necesito (Aquí saldría el error que no reconoce el titleslug)

SELECT n.title,
             n.titleslug,
             n.notice,
             n.createdAt,
             c.category, 
             u.login
  FROM HomeBundle:UserPublish up
   JOIN up.notices n
   JOIN up.categories c
   JOIN up.users u

//La última solución que se me ocurría era sacar sólo n, c y u, pero al quitar up me sale el siguiente error:

//[Semantical Error] line 0, col -1 near 'SELECT n, c,': Error: Cannot select entity //through identification variables without choosing at least one root entity alias.

SELECT n, c, u
  FROM HomeBundle:UserPublish up
   JOIN up.notices n
   JOIN up.categories c
   JOIN up.users u
Nunca me resultó tan complicado relacionar varias tablas para sacar la información que me interesa y pasandola por el método slugify, en este caso el titulo para que a la hora de ponerlo en un LINK tenga una url amigable.

Gracias nuevamente por todo el apoyo mostrado y aver si podemos conseguir una solución a todo esto.
  #12 (permalink)  
Antiguo 30/10/2012, 14:36
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

No son tablas lo que relacionas sino modelos, y en realidad es algo simple luego que comprendes la lógica, para hacer correctamente el DQL debería ver las entidades, las relaciones que hay entre ellas y también debería saber que quieres mostrar exactamente, de todas formas ten en cuenta que que para acceder al titulo de un notice a través de userpublish tienes que acceder primero al notice.

Código TWIG:
Ver original
  1. {{ userPublish.notice.title }}

Ahora no se si notice es una unidad o la colección si fuera este último caso deberías iterar primero.
Postea en un gist o algo similar las entidades.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #13 (permalink)  
Antiguo 30/10/2012, 16:40
 
Fecha de Ingreso: enero-2012
Mensajes: 64
Antigüedad: 12 años, 3 meses
Puntos: 0
De acuerdo Respuesta: Symfony2 y Slugify en las entidades (Famoso manual Jobbet)

¡¡¡Ya está por fin!!! Como agradecértelo!!

Era tan simple como referenciar primero a la entidad de la que quieres obtener el resultado, porque a ver si lo he entendido bien (esto lo hago ya por aprender del todo la lógica de todo esto):

Cuando hago el getresult y lo meto en el objeto $entities, al ser la entidad principal por la cual se hacen los JOIN el UserPublish, se accede directamente desde "entities.loquesea", pero para acceder a las entidades a las que les has hecho el JOIN debes referirte primero a la entidad a la que le has hecho el JOIN. ¿Es correcto?

Bueno pues ya he conseguido lo que buscaba, así que de verdad que muchas gracias!!

Nos vamos viendo por el foro!!

Etiquetas: doctrine, symfony2
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 19:43.