web-dev-qa-db-fra.com

Création d'un module pour rechercher dans la base de données et afficher les résultats

J'ai une table dans la base de données appelée #__magazines, il contient des données pour les magazines (date de publication, numéro de publication, etc.). J'ai créé un composant, un plugin et un module destinés à Joomla 3.x, je souhaite pouvoir afficher les variables du module (utilisons les dates de publication à titre d'exemple). Si elles sont sélectionnées, le bouton "Rechercher" est cliqué, le module ira à la base de données puis rapportera tous les résultats correspondant à la date choisie et les affichera dans une nouvelle page.

J'ai suivi les didacticiels Joomla, mais je ne peux pas déterminer le meilleur moyen d'interroger le #__magazines table puis affichez les résultats.

MISE À JOUR

Le plug-in de recherche fonctionne correctement. Par conséquent, si je cherche un titre de magazine (que je connais dans la base de données), il apparaît dans les résultats de la recherche.

Ce que je veux savoir, cependant, c'est comment je peux afficher toutes les différentes variables de la table de base de données de #__magazines et les afficher sous forme de listes déroulantes dans un module de recherche, mais sans doublons. Par exemple, s’il existe un title appelé June 2014 et cela se trouve deux fois dans la base de données. Je souhaite seulement qu’elle apparaisse une fois dans le menu déroulant Sélectionner une option. Si cette option est ensuite choisie et que le bouton "Rechercher" est cliqué, l’utilisateur est dirigé vers la page de résultats, où la version multiple du "Juin 2014" détails sont affichés.

3
RustyJoomla

J'ai résolu ce problème en utilisant les éléments suivants dans le fichier default.php du module:

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

Ceci est allé à la table #__magazines, et a récupéré un de chaque publishDate et a rempli la table avec!

2
RustyJoomla

Mise à jour: Pour modifier mon extrait de code pour une utilisation dynamique pour un assortiment de valeurs de variables entrantes possibles, je suppose que vous pouvez simplement déclarer une "liste blanche" de noms de colonnes et vérifier que le $column Entrant sur lequel rechercher est valide est valide.

Par exemple, $column = "publishedDate"

Il vous suffit de relacer publishedDate avec $column Dans mon script et d'appeler $db->qn() à chaque fois, juste pour être sûr.

... et utilisez strtolower() pour préparer la variable pour les déclarations d'attributs dom.


Code testé:

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

Explications:

  • Un bloc try {} catch {} Est un moyen propre de vérifier les erreurs et de contrôler le comportement de votre code après une erreur de syntaxe de requête potentielle.
  • Je suis "méthode chaînage" de getQuery() afin que $query Est écrit une seule fois lors de la construction de la requête.
  • Dans la plupart des cas, votre requête est mieux écrite en tant que SELECT DISTINCT Plutôt que GROUP BY. Voici n post de soutien .
  • Votre méthode select() n'a pas besoin de recevoir un tableau - une chaîne fera l'affaire. Parce que publishedDate ne [~ # ~] a besoin de [~ # ~] pour être encapsulé, épargnez la fonction qn() appelez la méthode et laissez-la sous forme de chaîne sans guillemets sans incidence sur la sécurité.
  • ORDER BY Utilisera ASC comme direction par défaut, il n'est donc pas nécessaire de l'indiquer explicitement. Et vous aviez besoin d’un espacement avant votre ASC, mais c’était peut-être simplement une faute de frappe.
  • loadColumn() est l'appel le plus approprié lorsque vous souhaitez générer un tableau à une dimension à partir d'un jeu de résultats à une seule colonne.
  • Je ne cherche que $user_date Si le tableau $dates N'est pas vide. Le conditionnel fait deux choses: 1. déclarer $dates Et 2. rechercher une valeur non-falsey (un tableau vide est falsey). S'il n'y a aucun élément dans $dates, Le fait que l'utilisateur ait soumis ou non $_GET['publisheddate'] Est sans objet.
  • S'il y a une erreur de syntaxe dans votre requête, je déclare $dates Comme un tableau vide afin que la boucle foreach() ne puisse pas itérer.
  • Ne jamais montrer $e->getMessage() au public.
  • Ma préférence personnelle est d’utiliser un écho pour afficher chaque ligne de code plutôt que de rebondir dans et hors de php ou d’écrire des chaînes de plusieurs lignes.
  • Je ne suis pas sûr de savoir pourquoi la première option/default a une valeur de A. Je suppose que cela signifie "Tous" et vous afficherez tous les enregistrements dans les résultats de la recherche, ce qui semble être une fonctionnalité raisonnable.
  • L'écriture de selected="selected" Dans le premier <option> N'est pas nécessaire. Si aucune autre option n'est sélectionnée, elle sera affichée comme option sélectionnée.
  • Les valeurs de l'ensemble de résultats sont déclarées sous la forme $date À l'intérieur de la boucle foreach() et aucune syntaxe d'objet (->) N'est requise.
  • Lors de l'écriture de valeurs <option> Identiques au texte visible, il n'est pas nécessaire de déclarer l'attribut value. Épargnez le code gonflé; le texte sera soumis comme valeur.
  • Les accolades autour de $date Sont mon style de codage préféré - ce n'est pas nécessaire dans ce cas.
0
mickmackusa