Interesante, efectivamente al parecer actualmente no hay forma de mover los adjuntos no-huerfanos desde el panel de administración, podría ser una buena idea para una extensión.
Tu método me parece que es el más correcto y además sencillo, pero si te gusta complicarte la vida podrías hacerlo desde phpMyAdmin aunque
no lo recomiendo salvo que sea realmente necesario, además de que no he revisado a profundidad todas las tablas que mantienen referencias a los adjuntos.
Sé que contigo no habría problema, pero para quien lo lea, recordarle hacer una copia de seguridad de la base de datos antes de hacer cualquier cambio.
En la tabla
phpbb_attachments
hay dos columnas que nos interesan que son
post_msg_id
y
topic_id
, estas modifican el mensaje y el tema al que pertenecen, respectivamente.
De la tabla
phpbb_posts
sólo nos interesa la columna
post_attachment
, que es el que indica si el mensaje contiene adjuntos o no.
Se puede obtener
post_msg_id
y
topic_id
con el enlace que te muestra la cabecera de cada mensaje y en el pequeño icono del documento, esto en
prosilver
porque hay algunos que modifican la plantilla, como el que usa este sitio que te lo muestra directamente, que dicho sea de paso lo encuentro muy útil.
Por ejemplo, las siguientes URLs pertenecen al mismo mensage y son equivalentes.
Código: Seleccionar todo
http://ejemplo.com/forum/viewtopic.php?f=2&t=2#p3
http://ejemplo.com/forum/viewtopic.php?p=3#p3
De las URLs anteriores podemos deducir que
topic_id
tiene un valor de
2
(
t=2
) y
post_msg_id
tiene un valor de
3
(
p=3
o
#p3
).
Si los adjuntos que quieres cambiar pertenecen al mismo tema, sólo tendrías que modificar
post_msg_id
, si en cambio quieres cambiarlo de mensaje y tema, tendrias que modificar tanto
post_msg_id
como
topic_id
Para este ejemplo uso marcadores de texto en lugar de valores reales para que se entienda mejor sólo con verlo, y para evitar posibles errores en los identificadores al hacer un remplazo de texto usando programas como Notepad++ o Notepadqq.
{ID_POST_ORIGINAL}
: ID del post original del adjunto
{ID_POST_NUEVO}
: ID del post que recibirá el nuevo adjunto
Obtener identificador del adjunto:
Código: Seleccionar todo
SELECT attach_id, post_msg_id, topic_id FROM phpbb_attachments WHERE post_msg_id = {ID_POST_ORIGINAL}
Obtenemos y seleccionamos el ID del adjunto, que en este ejemplo lo nombraré como
{ID_ADJUNTO}
.
Cambiamos el adjunto de post:
Código: Seleccionar todo
UPDATE phpbb_attachments SET post_msg_id = {ID_POST_NUEVO} WHERE attach_id = {ID_ADJUNTO} AND post_msg_id = {ID_POST_ORIGINAL}
Modificamos el post que recibirá el nuevo adjunto para que permita mostrarlo, de no hacerlo el adjunto no aparecerá:
Código: Seleccionar todo
UPDATE phpbb_posts SET post_attachment = 1 WHERE post_id = {ID_POST_NUEVO} AND post_attachment = 0
Modificamos el post original
sólo si movimos todos sus adjuntos, para evitar inconsistencias en el la tabla.
Código: Seleccionar todo
UPDATE phpbb_posts SET post_attachment = 0 WHERE post_id = {ID_POST_ORIGINAL} AND post_attachment = 1
Si remplazamos los marcadores con datos reales, nos quedaría:
Código: Seleccionar todo
SELECT attach_id, post_msg_id, topic_id FROM phpbb_attachments WHERE post_msg_id = 5
UPDATE phpbb_attachments SET post_msg_id = 3 WHERE attach_id = 6 AND post_msg_id = 5
UPDATE phpbb_posts SET post_attachment = 1 WHERE post_id = 3 AND post_attachment = 0
UPDATE phpbb_posts SET post_attachment = 0 WHERE post_id = 5 AND post_attachment = 1
Donde:
{ID_POST_ORIGINAL}
tiene un valor de 5
{ID_POST_NUEVO}
tiene un valor de 3
{ID_ADJUNTO}
tiene un valor de 6
Luego de hacer cambios en la base de datos será necesario limpiar la caché y resincronizar las estadisticas dentro del PCA.