it-swarm.dev

Creazione di un modulo per la ricerca nel database e la visualizzazione dei risultati

Ho una tabella nel database chiamata #__magazines, contiene i dati per le riviste (data di pubblicazione, numero di emissione ecc.). Ho creato un componente, un plug-in e un modulo che è per Joomla 3.x, voglio essere in grado di avere le variabili di visualizzazione del modulo (usiamo le date pubblicate come esempio) che se vengono scelte e quindi il pulsante "Cerca" è se cliccato, il modulo andrà al database e quindi riporterà tutti i risultati che corrispondono alla data scelta e visualizzerà i risultati in una nuova pagina.

Ho seguito i tutorial di Joomla, ma non riesco ad allenarmi nel modo migliore per interrogare il #__magazines tabella e quindi visualizzare i risultati.

[~ ~ #] aggiornamento [~ ~ #]

Ora il plugin di ricerca funziona correttamente, quindi se cerco un titolo di rivista (che so sia nel database), questo appare nei risultati di ricerca.

Quello che voglio sapere, tuttavia, è come posso visualizzare tutte le diverse variabili dalla tabella del database di #__magazines e mostrali come menu a discesa in un modulo di ricerca ma non hanno duplicati. Ad esempio, se esiste un title chiamato June 2014 e questo è nel database due volte, voglio solo che venga visualizzato una volta nel menu a discesa Seleziona opzione, se viene quindi scelto e facendo clic sul pulsante "Cerca" l'utente viene portato alla pagina dei risultati, dove la versione multipla del Vengono visualizzati i dettagli di "giugno 2014".

3
RustyJoomla

Ho risolto questo problema usando il seguente file default.php all'interno del modulo:

// 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>

Questo è andato alla tabella #__magazines, ha recuperato una delle date di pubblicazione e ha popolato la tabella con essa!

2
RustyJoomla

Aggiornamento: per modificare il mio frammento per un uso dinamico per un assortimento di possibili valori di variabili in entrata, suppongo che potresti semplicemente dichiarare una "lista bianca" di nomi di colonna e verificare che il $column In arrivo su cui eseguire la query sia valido.

Ad esempio, $column = "publishedDate"

Devi solo ricollegare publishedDate con $column Nel mio script e chiamare $db->qn() ogni volta solo per sicurezza.

... e usa strtolower() per preparare la variabile per le dichiarazioni degli attributi dom.


Codice testato:

$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>";

Spiegazioni:

  • Un blocco try {} catch {} È un modo chiaro per verificare la presenza di errori e controllare il rendimento del codice dopo un potenziale errore di sintassi della query.
  • Sto "concatenamento di metodi" da getQuery() in modo che $query Venga scritto una sola volta durante la creazione della query.
  • Nella maggior parte dei casi, la tua query è meglio scritta come SELECT DISTINCT Piuttosto che GROUP BY. Ecco n post di supporto .
  • Il tuo metodo select() non ha bisogno di ricevere un array - una stringa andrà bene. Poiché publishedDate non ha bisogno di [~ # ~] [~ # ~] per avvolgere indietro, risparmia la funzione qn() chiama il metodo e lo lascia come una stringa non quotata senza implicazioni di sicurezza.
  • ORDER BY Utilizzerà ASC come direzione predefinita, quindi non è necessario dichiararlo esplicitamente. E avevi bisogno di una spaziatura prima del tuo ASC, ma potrebbe essere stato solo un errore di battitura.
  • loadColumn() è la chiamata più appropriata quando desideri generare un array unidimensionale da un gruppo di risultati a colonna singola.
  • Sto cercando $user_date Solo se l'array $dates Non è vuoto. Il condizionale sta facendo due cose: 1. dichiarando $dates E 2. controllando un valore non falso (un array vuoto è falso). Se non ci sono elementi in $dates, È discutibile se l'utente abbia inviato o meno $_GET['publisheddate'].
  • Se c'è un errore di sintassi nella tua query, dichiaro $dates Come un array vuoto in modo che il ciclo foreach() non possa iterare.
  • Non mostrare mai $e->getMessage() al pubblico.
  • La mia preferenza personale è usare un'eco per visualizzare ogni riga di codice anziché rimbalzare dentro e fuori da php o scrivere stringhe su più righe.
  • Non sono sicuro del perché l'opzione first/default abbia un valore di A. Presumo che questo significhi "Tutti" e visualizzerai tutti i record nei risultati della ricerca che sembrano una funzionalità ragionevole.
  • Non è necessario scrivere selected="selected" Nel primo <option>. Se non viene selezionata alcuna altra opzione, verrà visualizzata come opzione selezionata.
  • I valori del gruppo di risultati sono dichiarati come $date All'interno del ciclo foreach() e non è richiesta alcuna sintassi dell'oggetto (->).
  • Quando si scrivono valori <option> Identici al testo visibile, non è necessario dichiarare l'attributo value. Risparmia il codice gonfio; il testo verrà inviato come valore.
  • Le parentesi graffe attorno a $date Sono il mio stile di codifica preferito, non necessario in questo caso.
0
mickmackusa