News:

Want to get involved in developing SMF, then why not lend a hand on our github!

Main Menu

No repetir temas recientes

Started by forozontes, June 07, 2023, 03:55:15 PM

Previous topic - Next topic

forozontes

Hola,
Estoy intentando conseguir que en temas recientes no se muestren temas repetidos es decir:

Tema 1 por forero tal
RE: Tema1 por forero tal
Tema 2 por forero pascual
Tema 3 por forero fulanito
RE: Tema 3 por forero fulanito

Que no aparezcan las respuestas a un mismo tema, vaya sin el RE:

Sabeis como puedo hacerlo? Gracias!!!


Danielㅤ

Hola, podrías dejarnos una captura de pantalla? Porque en Temas recientes te tiene que mostrar solo los temas y nos comentas que muestra también los mensajes por eso el RE (de respuesta) antes del título.


Saludos

forozontes

Perdon!!! no se porque puse temas, mira que estube buscando en el foro y en el codigo a ver si podia cambiarlo de alguna forma.

Son MENSAJES RECIENTES. Lo que me gustaria es que no salieran mensajes repetidos, ya que si por lo que sea hay un tema candente y los 10 ultimos mensajes se han hecho en ese tema, en el apartado de Mensajes Recientes, solo se veria mensajes de ese tema.

RE: Me presento por usuario10
RE: Me presento por usuario7
RE: Me presento por usuario1
RE: Me presento por usuario2
RE: Me presento por usuario55
RE: Me presento por usuario12
Me presento por usuario70
 

d3vcho

Hola,

A simple vista, habría que cambiar el código de la consulta que se hace a la base de datos en esta función del código de SMF.

No sé si habrá algún mod ya que haga lo que pides.
"Greeting Death as an old friend, they departed this life as equals"

forozontes

Antes de abrir esta consulta intenté cambiar la siguiente consulta del archivo recent.php de la carpeta sources.

// Find the 10 most recent messages they can *view*.
// !!!SLOW This query is really slow still, probably?
$request = $smcFunc['db_query']('', '
SELECT m.id_msg
FROM {db_prefix}messages AS m
INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board)
WHERE ' . $query_this_board . '
AND m.approved = {int:is_approved}
ORDER BY m.id_msg DESC
LIMIT {int:offset}, {int:limit}',
array_merge($query_parameters, array(
'is_approved' => 1,
'offset' => $_REQUEST['start'],
'limit' => 10,
))
);
// If we don't have 10 results, try again with an unoptimized version covering all rows, and cache the result.
if (isset($query_parameters['max_id_msg']) && $smcFunc['db_num_rows']($request) < 10)
{
$smcFunc['db_free_result']($request);
$query_this_board = str_replace('AND m.id_msg >= {int:max_id_msg}', '', $query_this_board);
$cache_results = true;
unset($query_parameters['max_id_msg']);
}
else
$done = true;
}
$messages = array();
while ($row = $smcFunc['db_fetch_assoc']($request))
$messages[] = $row['id_msg'];
$smcFunc['db_free_result']($request);
if (!empty($cache_results))
cache_put_data($key, $messages, 120);
}

Poniendo en el select DISTINCT
SELECT DISTINCT m.id_msg
Pero no se si es aquí donde deberia hacer este cambio, pero no surgió ningun efecto.

Gracias por tus respuestas!

forozontes

Perdon de nuevo, no habia visto el link a la funcion que me pusiste anteriormente, ahora le echo un vistazo.

d3vcho

Ahora mismo no puedo probarlo ni pararme a mirar la estructura de la base de datos, pero quizás deberías usar:

SELECT DISTINCT m.id_topic
Imagino que id_msg jamás podrá haber más de uno, mientras que un mismo id_topic si podrá pertenecer a varios mensajes.
"Greeting Death as an old friend, they departed this life as equals"

forozontes

Gracias por tu respuesta.

Pero si lo hago en el archivo recent.php, no hay ningun cambio. Si lo hago en el Subs-recent.php peta el foro.

En el Subs-recent.php he puesto aqui el DISTINCT
function getLastPosts($latestPostOptions)
{
global $scripturl, $txt, $user_info, $modSettings, $smcFunc, $context;

// Find all the posts.  Newer ones will have higher IDs.  (assuming the last 20 * number are accessable...)
// !!!SLOW This query is now slow, NEEDS to be fixed.  Maybe break into two?
$request = $smcFunc['db_query']('substring', '
SELECT
m.poster_time, m.subject, [b]DISTINCT[/b] m.id_topic, m.id_member, m.id_msg,
IFNULL(mem.real_name, m.poster_name) AS poster_name, t.id_board, b.name AS board_name,
SUBSTRING(m.body, 1, 385) AS body, m.smileys_enabled
FROM {db_prefix}messages AS m
INNER JOIN {db_prefix}topics AS t ON (t.id_topic = m.id_topic)
INNER JOIN {db_prefix}boards AS b ON (b.id_board = t.id_board)
LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member)
WHERE m.id_msg >= {int:likely_max_msg}' .
(!empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0 ? '
AND b.id_board != {int:recycle_board}' : '') . '
AND {query_wanna_see_board}' . ($modSettings['postmod_active'] ? '
AND t.approved = {int:is_approved}
AND m.approved = {int:is_approved}' : '') . '
ORDER BY m.id_msg DESC
LIMIT ' . $latestPostOptions['number_posts'],
array(
'likely_max_msg' => max(0, $modSettings['maxMsgID'] - 50 * $latestPostOptions['number_posts']),
'recycle_board' => $modSettings['recycle_board'],
'is_approved' => 1,
)
);

d3vcho

La palabra clave DISTINCT debe ir justo después de SELECT. Igualmente, eso no te solucionará el problema. Para solucionarlo probablemente haya que restar dos conjuntos de SQL: el conjunto de todos los posts recientes y el conjunto de los ids de temas más recientes, así, con una condición, te quedarían los mensajes más recientes de temas distintos.

Es algo complejo de lograr.
"Greeting Death as an old friend, they departed this life as equals"

forozontes

Gracias por tu respuesta,

Si nadie sabe alguna solución practica tendre que dejarlo tal y como esta.

Danielㅤ

Yo creo que se puede usar un condicional y una variable temporal, todos los temas tienen un ID único, cuando el foro te muestre los mensajes recientes se podría usar una variable o un array en donde se guarden los IDs de los temas que ya se mostraron (aunque realmente se muestran los mensajes) entonces cuándo el foro intente mostrar otro mensaje reciente y éste tenga una ID que ya está en el array significa que ya se mostró un mensaje de ese tema por lo tanto el foro deberá seguir con otro mensaje hasta que la ID del tema de ese mensaje no esté en el array y ahí se muestre nuevamente y luego de que se muestre guardar ese ID en el array.

Los mensajes recientes tienen un bucle para mostrar la cantidad de mensajes que el administrador haya configurado y eso servirá para lo que necesitas, no creo que sea difícil del lograr, al menos tiro la idea por si a alguien se le ocurre hacer la modificación en el código.


Saludos

Diego Andrés

Según recuerdo aún utilizas SMF 2.0.x?
Si es así, te dejo una función que modifiqué para el foro de rincón matemático.

Sources/Subs-Recent.php (Lo puedes agregar al final del archivo)
function getLastTopics($latestPostOptions)
{
global $scripturl, $txt, $user_info, $modSettings, $smcFunc, $context;

// Find all the posts.  Newer ones will have higher IDs.  (assuming the last 20 * number are accessable...)
// !!!SLOW This query is now slow, NEEDS to be fixed.  Maybe break into two?
$request = $smcFunc['db_query']('', '
SELECT
m.poster_time, ms.subject, m.id_topic, m.id_member, m.id_msg, b.id_board, b.name AS board_name,
IFNULL(mem.real_name, m.poster_name) AS poster_name,
SUBSTRING(m.body, 1, 384) AS body, m.smileys_enabled
FROM {db_prefix}topics AS t
INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_last_msg)
INNER JOIN {db_prefix}boards AS b ON (b.id_board = t.id_board)
INNER JOIN {db_prefix}messages AS ms ON (ms.id_msg = t.id_first_msg)
LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member)' . (!$user_info['is_guest'] ? '
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.id_topic = t.id_topic AND lt.id_member = {int:current_member})
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.id_board = b.id_board AND lmr.id_member = {int:current_member})' : '') . '
WHERE t.id_last_msg >= {int:min_message_id}
AND ' . $user_info['query_wanna_see_board'] . ($modSettings['postmod_active'] ? '
AND t.approved = {int:is_approved}
AND m.approved = {int:is_approved}' : '') . '
ORDER BY t.id_last_msg DESC
LIMIT ' . $latestPostOptions['number_posts'],
array(
'current_member' => $user_info['id'],
'min_message_id' => $modSettings['maxMsgID'] - 35 * min($latestPostOptions['number_posts'], 5),
'is_approved' => 1,
)
);

$posts = array();
while ($row = $smcFunc['db_fetch_assoc']($request))
{
// Censor the subject and post for the preview ;).
censorText($row['subject']);
censorText($row['body']);

$row['body'] = strip_tags(strtr(parse_bbc($row['body'], $row['smileys_enabled'], $row['id_msg']), array('<br />' => '&#10;')));
if ($smcFunc['strlen']($row['body']) > 128)
$row['body'] = $smcFunc['substr']($row['body'], 0, 128) . '...';

// Build the array.
$posts[] = array(
'board' => array(
'id' => $row['id_board'],
'name' => $row['board_name'],
'href' => $scripturl . '?board=' . $row['id_board'] . '.0',
'link' => '<a href="' . $scripturl . '?board=' . $row['id_board'] . '.0">' . $row['board_name'] . '</a>'
),
'topic' => $row['id_topic'],
'poster' => array(
'id' => $row['id_member'],
'name' => $row['poster_name'],
'href' => empty($row['id_member']) ? '' : $scripturl . '?action=profile;u=' . $row['id_member'],
'link' => empty($row['id_member']) ? $row['poster_name'] : '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['poster_name'] . '</a>'
),
'subject' => $row['subject'],
'short_subject' => shorten_subject($row['subject'], 24),
'preview' => $row['body'],
'time' => timeformat($row['poster_time']),
'timestamp' => forum_time(true, $row['poster_time']),
'raw_timestamp' => $row['poster_time'],
'href' => $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . ';topicseen#msg' . $row['id_msg'],
'link' => '<a href="' . $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . ';topicseen#msg' . $row['id_msg'] . '" rel="nofollow">' . $row['subject'] . '</a>'
);
}
$smcFunc['db_free_result']($request);

return $posts;
}

Sources/BoardIndex.php
Code (Buscar) Select
$context['latest_posts'] = cache_quick_get('boardindex-latest_posts:' . md5($user_info['query_wanna_see_board'] . $user_info['language']), 'Subs-Recent.php', 'cache_getLastPosts', array($latestPostOptions));
Code (Reemplazar) Select
$context['latest_posts'] = cache_quick_get('boardindex-latest_posts:' . md5($user_info['query_wanna_see_board'] . $user_info['language']), 'Subs-Recent.php', 'cache_getLastPosts', array($latestPostOptions));
$context['latest_topics'] = cache_quick_get('boardindex-latest_topics:' . md5($user_info['query_wanna_see_board'] . $user_info['language']), 'Subs-Recent.php', 'cache_getLastTopics', array($latestPostOptions));

Y con esto puedes ahora irte a tu BoardIndex.template.php y utilizar $context['latest_topics'].
<dl id="ic_recenttopics" class="middletext">';

/* Each post in latest_posts has:
board (with an id, name, and link.), topic (the topic's id.), poster (with id, name, and link.),
subject, short_subject (shortened with...), time, link, and href. */
foreach ($context['latest_topics'] as $post)
echo '
<dt><strong>', $post['link'], '</strong> ', $txt['by'], ' ', $post['poster']['link'], ' (', $post['board']['link'], ')</dt>
<dd>', $post['time'], '</dd>';
echo '
</dl>

SMF Tricks - Free & Premium Responsive Themes for SMF.

forozontes

Si uso el 2.0.18

Gracias por el codigo Diego, esta tarde hago la prueba.

forozontes

Quote from: Diego Andrés on June 08, 2023, 08:04:47 PMSegún recuerdo aún utilizas SMF 2.0.x?
Si es así, te dejo una función que modifiqué para el foro de rincón matemático.

Sources/Subs-Recent.php (Lo puedes agregar al final del archivo)
function getLastTopics($latestPostOptions)
{
    global $scripturl, $txt, $user_info, $modSettings, $smcFunc, $context;

    // Find all the posts.  Newer ones will have higher IDs.  (assuming the last 20 * number are accessable...)
    // !!!SLOW This query is now slow, NEEDS to be fixed.  Maybe break into two?
    $request = $smcFunc['db_query']('', '
        SELECT
            m.poster_time, ms.subject, m.id_topic, m.id_member, m.id_msg, b.id_board, b.name AS board_name,
            IFNULL(mem.real_name, m.poster_name) AS poster_name,
            SUBSTRING(m.body, 1, 384) AS body, m.smileys_enabled
        FROM {db_prefix}topics AS t
            INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_last_msg)
            INNER JOIN {db_prefix}boards AS b ON (b.id_board = t.id_board)
            INNER JOIN {db_prefix}messages AS ms ON (ms.id_msg = t.id_first_msg)
            LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member)' . (!$user_info['is_guest'] ? '
            LEFT JOIN {db_prefix}log_topics AS lt ON (lt.id_topic = t.id_topic AND lt.id_member = {int:current_member})
            LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.id_board = b.id_board AND lmr.id_member = {int:current_member})' : '') . '
        WHERE t.id_last_msg >= {int:min_message_id}
            AND ' . $user_info['query_wanna_see_board'] . ($modSettings['postmod_active'] ? '
            AND t.approved = {int:is_approved}
            AND m.approved = {int:is_approved}' : '') . '
        ORDER BY t.id_last_msg DESC
        LIMIT ' . $latestPostOptions['number_posts'],
        array(
            'current_member' => $user_info['id'],
            'min_message_id' => $modSettings['maxMsgID'] - 35 * min($latestPostOptions['number_posts'], 5),
            'is_approved' => 1,
        )
    );

    $posts = array();
    while ($row = $smcFunc['db_fetch_assoc']($request))
    {
        // Censor the subject and post for the preview ;).
        censorText($row['subject']);
        censorText($row['body']);

        $row['body'] = strip_tags(strtr(parse_bbc($row['body'], $row['smileys_enabled'], $row['id_msg']), array('<br />' => '&#10;')));
        if ($smcFunc['strlen']($row['body']) > 128)
            $row['body'] = $smcFunc['substr']($row['body'], 0, 128) . '...';

        // Build the array.
        $posts[] = array(
            'board' => array(
                'id' => $row['id_board'],
                'name' => $row['board_name'],
                'href' => $scripturl . '?board=' . $row['id_board'] . '.0',
                'link' => '<a href="' . $scripturl . '?board=' . $row['id_board'] . '.0">' . $row['board_name'] . '</a>'
            ),
            'topic' => $row['id_topic'],
            'poster' => array(
                'id' => $row['id_member'],
                'name' => $row['poster_name'],
                'href' => empty($row['id_member']) ? '' : $scripturl . '?action=profile;u=' . $row['id_member'],
                'link' => empty($row['id_member']) ? $row['poster_name'] : '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['poster_name'] . '</a>'
            ),
            'subject' => $row['subject'],
            'short_subject' => shorten_subject($row['subject'], 24),
            'preview' => $row['body'],
            'time' => timeformat($row['poster_time']),
            'timestamp' => forum_time(true, $row['poster_time']),
            'raw_timestamp' => $row['poster_time'],
            'href' => $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . ';topicseen#msg' . $row['id_msg'],
            'link' => '<a href="' . $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . ';topicseen#msg' . $row['id_msg'] . '" rel="nofollow">' . $row['subject'] . '</a>'
        );
    }
    $smcFunc['db_free_result']($request);

    return $posts;
}

Sources/BoardIndex.php
Code (Buscar) Select
$context['latest_posts'] = cache_quick_get('boardindex-latest_posts:' . md5($user_info['query_wanna_see_board'] . $user_info['language']), 'Subs-Recent.php', 'cache_getLastPosts', array($latestPostOptions));
Code (Reemplazar) Select
$context['latest_posts'] = cache_quick_get('boardindex-latest_posts:' . md5($user_info['query_wanna_see_board'] . $user_info['language']), 'Subs-Recent.php', 'cache_getLastPosts', array($latestPostOptions));
        $context['latest_topics'] = cache_quick_get('boardindex-latest_topics:' . md5($user_info['query_wanna_see_board'] . $user_info['language']), 'Subs-Recent.php', 'cache_getLastTopics', array($latestPostOptions));

Y con esto puedes ahora irte a tu BoardIndex.template.php y utilizar
$context['latest_topics']
.
<dl id="ic_recenttopics" class="middletext">';

        /* Each post in latest_posts has:
            board (with an id, name, and link.), topic (the topic's id.), poster (with id, name, and link.),
            subject, short_subject (shortened with...), time, link, and href. */
        foreach ($context['latest_topics'] as $post)
            echo '
                        <dt><strong>', $post['link'], '</strong> ', $txt['by'], ' ', $post['poster']['link'], ' (', $post['board']['link'], ')</dt>
                        <dd>', $post['time'], '</dd>';
        echo '
                    </dl>

Hola Diego,

He hecho todos los pasos que me has indicado y cuando actualizo no aparece ningún mensaje reciente.



No se si es que hay que hacer alguna cosa mas para que se muestren.
Gracias!!!

Diego Andrés

Bueno supondría que si averiguaste como quitar el copyright, esto debe ser igual de sencillo de ajustar  :P

SMF Tricks - Free & Premium Responsive Themes for SMF.

forozontes

Quote from: Diego Andrés on June 09, 2023, 03:22:09 PMBueno supondría que si averiguaste como quitar el copyright, esto debe ser igual de sencillo de ajustar  :P

Quitar se me da mejor que poner jajajaj, y anda que no me costó...
Hice mal en quitar el copyright? es que a parte me salia como estaba hecho el foro, el php, el 2.0.18 de la version de smf....

Danielㅤ

Quote from: forozontes on June 10, 2023, 01:34:34 PM
Quote from: Diego Andrés on June 09, 2023, 03:22:09 PMBueno supondría que si averiguaste como quitar el copyright, esto debe ser igual de sencillo de ajustar  :P

Hice mal en quitar el copyright?

Si, porque el copyright además de no molestar para nada, el no quitarlo es reconocer y valorar el gran esfuerzo de todo el equipo de programadores de SMF, tu foro/comunidad está basado en el desarrollo que tuvo mucho trabajo, tiempo e ideas de sus creadores y lo mínimo que uno puede hacer al menos por agradecimiento es dejar el copyright que además de los derechos de autor también es considerar la plataforma que uno eligió para su foro de producción y la misma es Simple Machines.


Saludos

forozontes

Quote from: Daniel� on June 10, 2023, 04:38:42 PM
Quote from: forozontes on June 10, 2023, 01:34:34 PM
Quote from: Diego Andrés on June 09, 2023, 03:22:09 PMBueno supondría que si averiguaste como quitar el copyright, esto debe ser igual de sencillo de ajustar  :P

Hice mal en quitar el copyright?

Si, porque el copyright además de no molestar para nada, el no quitarlo es reconocer y valorar el gran esfuerzo de todo el equipo de programadores de SMF, tu foro/comunidad está basado en el desarrollo que tuvo mucho trabajo, tiempo e ideas de sus creadores y lo mínimo que uno puede hacer al menos por agradecimiento es dejar el copyright que además de los derechos de autor también es considerar la plataforma que uno eligió para su foro de producción y la misma es Simple Machines.


Saludos

Pues lo pondré arriba o abajo del correo electrónico del foro. Con link a smf.

Danielㅤ

El copyright debe ir en el footer del foro porque tiene que mostrarse en todas las secciones del foro, de todas maneras no es obligación que lo insertes pero si lo dejas sin el copyright es probable que algunos colaboradores no quieran ayudarte.

forozontes

Quote from: Daniel� on June 10, 2023, 06:19:19 PMEl copyright debe ir en el footer del foro porque tiene que mostrarse en todas las secciones del foro, de todas maneras no es obligación que lo insertes pero si lo dejas sin el copyright es probable que algunos colaboradores no quieran ayudarte.

Ya esta arreglado. Todo es hablarlo. Gracias a todos por vuestras respuestas!!!

Advertisement: