it-swarm-es.tech

Crear un módulo para buscar en la base de datos y mostrar los resultados

Tengo una tabla en la base de datos llamada #__magazines, esto contiene datos para revistas (fecha de publicación, número de edición, etc.). He creado un componente, un complemento y un módulo que es para Joomla 3.x, quiero poder mostrar las variables del módulo (usemos las fechas publicadas como ejemplo) que si se eligen y luego el botón "Buscar" aparece Al hacer clic, el módulo irá a la base de datos y luego traerá todos los resultados que coincidan con la fecha elegida y mostrará los resultados en una nueva página.

He seguido los tutoriales de Joomla, pero no puedo entrenar la mejor manera de consultar el #__magazines tabla y luego mostrar los resultados.

ACTUALIZACIÓN

Ahora tengo el complemento de búsqueda funcionando correctamente, así que si busco el título de una revista (que sé que está en la base de datos) aparece en los resultados de búsqueda.

Sin embargo, lo que quiero saber es cómo puedo mostrar todas las diferentes variables de la tabla de la base de datos de #__magazines y mostrarlos como menús desplegables en un módulo de búsqueda pero no tener duplicados Por ejemplo, si hay un title llamado June 2014 y esto está en la base de datos dos veces, solo quiero que se muestre una vez en el menú desplegable Seleccionar opción, si se elige y el botón "Buscar" hace clic, el usuario es llevado a la página de resultados, donde la versión múltiple del Se muestran los detalles de "junio de 2014".

3
RustyJoomla

Lo solucioné usando lo siguiente en el archivo default.php dentro del módulo:

// Get a db connection.
$db = JFactory::getDbo();

// Published dates
$query = $db->getQuery(true);
$query->select($db->quoteName(array('publishedDate')));
$query->from($db->quoteName('#__magazines'));
$query->order('publishedDateASC');
$query->group('publishedDate');
$db->setQuery($query);

// Load dates
$dates = $db->loadObjectList();

// Input
$input = JFactory::getApplication()->input;

<label for="publisheddate">Departure Date:</label>
            <select id="publisheddate" name="publisheddate">
                <option selected="selected" value="A">Choose Date</option>
                <?php $dateInput = $input->get('publisheddate', null, 'string'); ?>
                <?php foreach ($dates as $result): ?>
                <option value="<?php echo $result->publishedDate; ?>"<?php echo $dateInput == $result->publishedDate ? ' selected="selected"' : ''; ?>>
                    <?php echo $result->publishedDate; ?>
                </option>
                <?php endforeach; ?>
            </select>

¡Esto fue a la tabla #__magazines, y recuperó uno de cada uno de los datos publicados y llenó la tabla con él!

2
RustyJoomla

Actualización: para modificar mi fragmento para uso dinámico para una variedad de posibles valores de variables entrantes, supongo que podría declarar una "lista blanca" de nombres de columna y verificar que el _$column_ entrante para ser consultado sea válido.

Por ejemplo, _$column = "publishedDate"_

Solo necesita relacionar publishedDate con _$column_ en mi script y llamar a $db->qn() cada vez solo para estar seguro.

... y use strtolower() para preparar la variable para las declaraciones de atributos dom.


Código probado:

_$db = JFactory::getDBO();
try {
    $query = $db->getQuery(true)
                ->select("DISTINCT publishedDate")
                ->from("#__magazines")
                ->order("publishedDate");
    // echo $query->dump();  // uncomment if you want to see what is generated
    $db->setQuery($query);
    if ($dates = $db->loadColumn()) {
        $user_date = JFactory::getApplication()->input->get('publisheddate', null, 'string');
    }
} catch (Exception $e) {
    $dates = array();
    // echo "Syntax Error" , $e->getMessage();
}

echo "<label for=\"publisheddate\">Departure Date:</label>";
echo "<select id=\"publisheddate\" name=\"publisheddate\">";
    echo "<option value=\"A\">Choose Date</option>";
    foreach ($dates as $date) {
        echo "<option" , ($user_date == $date ? " selected" : "") , ">{$date}</option>";
    }
echo "</select>";
_

Explicaciones:

  • Un bloque _try {} catch {}_ es una forma limpia de verificar errores y controlar cómo funciona su código después de un posible error de sintaxis de consulta.
  • Estoy "encadenando el método" de getQuery() para que _$query_ solo se escriba una vez mientras se crea la consulta.
  • En la mayoría de los casos, su consulta se escribe mejor como _SELECT DISTINCT_ en lugar de _GROUP BY_. Aquí está na publicación de apoyo .
  • Su método select() no necesita recibir una matriz; una cadena funcionará bien. Debido a que publishedDate no necesita [~ # ~] necesita [~ # ~] para estar envuelto en un backtick, ahorre la función qn() llame al método y déjelo como una cadena sin comillas sin implicaciones de seguridad.
  • _ORDER BY_ usará ASC como la dirección predeterminada, por lo que no es necesario indicarlo explícitamente. Y necesitabas un espacio antes de tu ASC, pero eso puede haber sido simplemente un error tipográfico de publicación.
  • loadColumn() es la llamada más apropiada cuando desea generar una matriz unidimensional a partir de un conjunto de resultados de una sola columna.
  • Solo busco _$user_date_ si la matriz _$dates_ no está vacía. El condicional está haciendo dos cosas: 1. declarar _$dates_ y 2. verificar un valor que no sea falsey (una matriz vacía es falsey). Si no hay elementos en _$dates_, entonces si el usuario ha enviado _$_GET['publisheddate']_ es discutible.
  • Si hay un error de sintaxis en su consulta, estoy declarando _$dates_ como una matriz vacía para que el bucle foreach() no pueda iterar.
  • Nunca muestre $e->getMessage() al público.
  • Mi preferencia personal es usar un eco para mostrar cada línea de código en lugar de rebotar dentro y fuera de php o escribir cadenas de varias líneas.
  • No estoy seguro de por qué la primera opción/predeterminada tiene un valor de A. Asumiré que esto significa "Todos" y mostrará todos los registros en los resultados de búsqueda, lo que parece una característica razonable.
  • Escribir _selected="selected"_ en el primer _<option>_ no es necesario. Si no se selecciona ninguna otra opción, se mostrará como la opción seleccionada.
  • Los valores del conjunto de resultados se declaran como _$date_ dentro del bucle foreach() y no se requiere sintaxis de objeto (_->_).
  • Al escribir _<option>_ valores que son idénticos al texto visible, no es necesario declarar el atributo value. Ahorre el código hinchado; El texto se enviará como el valor.
  • Los corchetes alrededor de _$date_ es mi estilo de codificación preferido, no es necesario en este caso.
0
mickmackusa