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.
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!
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:
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.getQuery()
afin que $query
Est écrit une seule fois lors de la construction de la requête.SELECT DISTINCT
Plutôt que GROUP BY
. Voici n post de soutien .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.$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.$dates
Comme un tableau vide afin que la boucle foreach()
ne puisse pas itérer.$e->getMessage()
au public.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.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.$date
À l'intérieur de la boucle foreach()
et aucune syntaxe d'objet (->
) N'est requise.<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.$date
Sont mon style de codage préféré - ce n'est pas nécessaire dans ce cas.