ForoFyL / forofyl.com.ar

ForoFyL's public website.
http://www.forofyl.com.ar
5 stars 3 forks source link

En algunos threads (fundamentalmente anuncios) no se puede agradecer posts #2

Closed Canta closed 10 years ago

Canta commented 10 years ago

Creo este issue de acuerdo a http://www.forofyl.com.ar/viewtopic.php?p=2348013&f=179#p2348013

Tal y como dije en aquel thread, especulo que es un problema de "permisos del subforo". https://github.com/ForoFyL/forofyl.com.ar/blob/master/phpbb/includes/functions_thanks.php#L105

Ahí, ese if chequea los permisos del subforo y los permisos globales antes de permitirte agradecer. Si ninguno de los dos permisos para agradecer existen, te devuelve "agradecimiento inválido". Habría que ver cómo se comportan los anuncios frente a ese chequeo; por ahí quedan referidos a un "subforo" sin permisos, o algún subforo "nulo" y no hay permiso global, o situaciones de esas. El resto de los chequeos que hace esa función estimo que dan luz verde.

Todavía no pude levantar la aplicación, de modo que no puedo hacer tests locales y depurar.

andrezrv commented 10 years ago

Buen punto. Por lo que vengo viendo, los anuncios globales quedan asignados al subforo desde el cual se los crea, pero tienen un comportamiento medio raro porque, al haber un nuevo post en alguno de ellos, el foro indica que hay posts no leídos en el primer subforo del índice, así que algún otro tipo de relación con otro subforo (o con un subforo nulo) debe haber por algún lado. Habría que ver si podemos trackear esa supuesta referencia.

Canta commented 10 years ago

Estimo que la forma más fácil de depurar es poner un var_dump en algún lado durante el proceso de agradecimiento en anuncio.

Pero como no pude montar la aplicación, creo que podemos hacer un experimento. El action del formulario del posteo tiene inyectado el id de subforo. Fijate haciendo click en "crear anuncio" (si es que existe tal botón), y tirando esto en la consola js:

$("form")[1].action

Cuando posteo un topic nuevo, el action del form de posteo es "./posting.php?mode=post&f=179&sid=balblabla". Si cuando se crea un anuncio eso está seteado, estimo que "posting.php" (que no lo revisé todavía) lo toma y lo guarda como su flujo normal de actividad, sin discriminar "anuncio". Con esa data no debería ser tan difícil seguir la ejecución del código con el dedo, y ver qué es lo que hace cuando se crea un anuncio.

Canta commented 10 years ago

Confirmado el problema en https://github.com/ForoFyL/forofyl.com.ar/blob/master/phpbb/includes/functions_thanks.php#L105

Sucede en los anuncios globales, más no en los anuncios locales.

$auth->acl_get('f_thanks', $row['forum_id'])

Esa sentencia devuelve "0" en el caso de los anuncios globales. $row['forum_id'] es "0" cuando se trata de un anuncio global, y en ese caso "acl_get" devuelve "0" porque, al tratarse de un "foro 0", checkea un flag en la base de datos, en la tabla "phpbb_acl_options": "is_global".

Cambié a mano en la base de datos ese flag, y los agradecimientos funcionaron. No estoy seguro de cómo hacerlo, pero especulo que ha de haber alguna opción en el panel de control de administración para lograr el mismo resultado.

andrezrv commented 10 years ago

Hasta donde pude ver (y acabo de volver a fijarme) no la hay. El panel de control de agradecimientos es bastante escueto, y no existe algo como una configuración de anuncios.

¿Se romperá algo si se reemplaza $row['forum_id'] por el ID del foro al que realmente pertenece el thread? Porque esa relación tiene que estar guardada en algún otro lado.

Si se rompe, otras opciones serían poner algo que fuerce el flag a true, o directamente tirar un update en la tabla. O algo más avanzado, como agregar la opción en el panel, aunque no sé si me calentaría por eso.

Canta commented 10 years ago

Creo que el mejor camino a seguir es ese de reemplazar la variable.

El "id de foro" se pasa por GET en la url del botón de agradecimiento (que es un tag "a"). Pero después la función "insert_thanks", que tiene acceso a ese id, lo toma de otro lado: de las configs del post que estás agradeciendo. Eso está en la tabla "phpbb_posts", el campo "forum_id". Seguramente "forum_id=0" significa "global".

Para mí esto es un bug del plugin de agradecimientos. Debería tomar el forum_id desde la url, porque sino no sé para qué la agrega, y no sé por qué se pretendería que un anuncio global no se pueda agradecer.

Así que, sí, diría que usemos $forum_id (que ya está definida dentro de "insert_thanks") en lugar de $row["forum_id"].

Una observación nomás: ojo que eso mete otro potencial bug, que no creo que sea nada significativo. Resulta que $forum_id es trucho: es el id del foro actual que está navegando el usuario, no el id del foro del post. Y contra ese id se van a chequear los permisos de agradecimiento. Entonces, si te cruzás con un subforo donde no se permite agradecer, y ahí entran al anuncio global, ahí no van a poder agradecer.

andrezrv commented 10 years ago

Sale chequear contra $forum_id, entonces. Si llega a dispararse ese bug que mencionás, es una boludez mover el anuncio global a un subforo donde se pueda agradecer. De todas formas, ahora mismo no tenemos subforos donde no se permita agradecer, y no creo que vayamos a tenerlos nunca.