[Duda] ¿Dónde han de ir las consultas a la DB?

Started by Jotade29, December 11, 2021, 03:16:18 PM

Previous topic - Next topic

Jotade29

En algunos tips he leído que es un error poner querrys a la DB en los templates. En mi caso, tengo una consulta en el display.template, que es para contabilizar temas. Me gustaría saber dónde debería poder colocar esa consulta que está en el display template, y cómo hacer para poder llamarla desde el display.t

Grax!!
Quote from: Diego Andrés on August 12, 2023, 02:20:18 AMI'm afraid convincing Jotade to upgrade to SMF 2.1 will require bigger effort than your work sanitizing Unicode characters  :laugh:

Diego Andrés

En Sources/Display.php o similar. Usualmente un template del foro tiene un archivo de lógica (Source), incluso los mods tendrían uno (suponiendo el caso)
Generalmente lo que puedes hacer es guardar tus resultados en $context para así usarlos en el template.
e.g.
// función principal o similar?
function principal {

// Cosas esenciales + se carga el template, linktree, etc.

$var = funcion(); // Mandas llamar una función o lo que sea jaja


// Si quieres usar tus resultados en el template pues algo así como
$context['conteo_de_temas'] = $var;  (o directamente funcion();)

}

function funcion() {
global $smcFunc;

$result = $smcFunc; // Imagina que es tu query
$rows_count = $smcFunc['db_num_rows']($result);
$smcFunc['db_free_result']($result)

return $rows_count;

}


Es un ejemplo rápido pero me imagino que con lo que ya aprendiste le podrías entender.
Si no le das un nombre algo específico a tu variable de $context, primero podrías revisar el contenido de $context en la página donde estás trabajando para evitar sobrescribir algo. e.g. print_r($context);

SMF Tricks - Free & Premium Responsive Themes for SMF.

Jotade29

¿Cuál es el source al que va ligado el display.template? Cierto es que la mayoría de mods tienen un source al que van linkados, ¿pero en el caso del display.template? ¿subs, loads...?
Quote from: Diego Andrés on August 12, 2023, 02:20:18 AMI'm afraid convincing Jotade to upgrade to SMF 2.1 will require bigger effort than your work sanitizing Unicode characters  :laugh:

Diego Andrés

Lo mencioné en mi comentario anterior.
Normalmente tienen el mismo nombre.
Sería el Display.php

SMF Tricks - Free & Premium Responsive Themes for SMF.

Jotade29

Muchas gracias por tus respuestas, Diego Andrés.

Entonces... A ver si lo he entendido, porque con la plantilla que me has pasado no me aclaro bien.

En SOurces -> Display.php debo crear una función, ¿algo así?

función mostrartemas(){
Aquí pego las variables globales que vaya a usar
aquí pongo la consulta

Aquí pondría un condicional para que me los muestre si son mayores o iguales que 1
return loquequieroquememuestredelaconsulta

}

¿Y luego llamarlo desde el display.template?

Muchas gracias de nuevo por la ayuda.
Quote from: Diego Andrés on August 12, 2023, 02:20:18 AMI'm afraid convincing Jotade to upgrade to SMF 2.1 will require bigger effort than your work sanitizing Unicode characters  :laugh:

Diego Andrés

Sí, aunque lo ideal sería hacerlo como en el ejemplo básico que te dejé, al final de la función principal.

// Load up the "double post" sequencing magic.
if (!empty($options['display_quick_reply']))
{
checkSubmitOnce('register');
$context['name'] = isset($_SESSION['guest_name']) ? $_SESSION['guest_name'] : '';
$context['email'] = isset($_SESSION['guest_email']) ? $_SESSION['guest_email'] : '';
}

Después de eso, agregarías algo como
$context['lo_que_sea_que_no_se_este_usando_ya_como_nombre'] = mostrartemas();
Y en el Display.template.php puedes utilizar $context['lo_que_sea_que_no_se_este_usando_ya_como_nombre'] sin tener que cargar tu función directamente.

SMF Tricks - Free & Premium Responsive Themes for SMF.

Jotade29

Vale, a ver si lo he entendido.

Dentro de la función principal, al final, es decir, entre la llave que cierra la principal y la qye cierra //load up the double post añadir la función de temas, quedando así:

if (!empty($options['display_quick_reply']))
{
checkSubmitOnce('register');
$context['name'] = isset($_SESSION['guest_name']) ? $_SESSION['guest_name'] : '';
$context['email'] = isset($_SESSION['guest_email']) ? $_SESSION['guest_email'] : '';
} //cierra load up the double

function mostrartemas() {

global $db_prefix, $smcFunc, $boardurl, $modSettings;
$request = $smcFunc['db_query']('','
SELECT cantidadtemas as temas
FROM tablatemas
WHERE lo que sea...
);
(...)

return temas

}

$context['temas'] = mostrartemas();

}//cierra la función principal

¿Y en el display.template llamarlo con:

$context['temas']?

Muchas gracias de nuevo.
Quote from: Diego Andrés on August 12, 2023, 02:20:18 AMI'm afraid convincing Jotade to upgrade to SMF 2.1 will require bigger effort than your work sanitizing Unicode characters  :laugh:

Diego Andrés

Quote from: Ivan. on December 11, 2021, 08:29:09 PMDentro de la función principal, al final, es decir, entre la llave que cierra la principal y la qye cierra //load up the double post añadir la función de temas, quedando así:
No.

Sería algo así:

// Load up the "double post" sequencing magic.
if (!empty($options['display_quick_reply']))
{
checkSubmitOnce('register');
$context['name'] = isset($_SESSION['guest_name']) ? $_SESSION['guest_name'] : '';
$context['email'] = isset($_SESSION['guest_email']) ? $_SESSION['guest_email'] : '';
}

$context['lo_que_sea_que_no_se_este_usando_ya_como_nombre'] = mostrartemas();
}<--- Cierre de la función


Y esto va al final, o donde quieras, pero no va dentro de una función, va fuera.
function mostrartemas() {

global $db_prefix, $smcFunc, $boardurl, $modSettings;
$request = $smcFunc['db_query']('','
SELECT cantidadtemas as temas
FROM tablatemas
WHERE lo que sea...
);
(...)

SMF Tricks - Free & Premium Responsive Themes for SMF.

Advertisement: