it-swarm.com.de

Erstellen eines Moduls zum Durchsuchen der Datenbank und Anzeigen der Ergebnisse

Ich habe eine Tabelle in der Datenbank mit dem Namen #__magazines, Die Daten für Magazine enthält (Veröffentlichungsdatum, Ausgabenummer usw.). Ich habe eine Komponente, ein Plugin und ein Modul für Joomla 3.x erstellt. Ich möchte, dass das Modul Anzeigevariablen anzeigt (verwenden wir als Beispiel Veröffentlichte Daten). Wenn diese ausgewählt sind, wird die Schaltfläche "Suchen" angezeigt Wenn Sie darauf klicken, wechselt das Modul in die Datenbank und zeigt alle Ergebnisse, die dem ausgewählten Datum entsprechen, auf einer neuen Seite an.

Ich habe die Joomla-Tutorials befolgt, kann aber nicht die beste Methode zum Abfragen der Tabelle #__magazines Und zum Anzeigen der Ergebnisse finden.

UPDATE

Ich habe jetzt das Such-Plugin richtig aktiviert. Wenn ich also nach einem Zeitschriftentitel suche (von dem ich weiß, dass er in der Datenbank enthalten ist), wird er in den Suchergebnissen angezeigt.

Ich möchte jedoch wissen, wie ich alle verschiedenen Variablen aus der Datenbanktabelle von #__magazines Anzeigen und in einem Suchmodul als Dropdown-Liste anzeigen kann, ohne dass Duplikate vorhanden sind. Wenn es beispielsweise ein title mit dem Namen June 2014 Gibt und dieses zweimal in der Datenbank vorhanden ist, soll es nur einmal in der Dropdown-Liste "Option auswählen" angezeigt werden, wenn es dann ausgewählt ist und die Option "Suchen" ausgewählt ist "Wenn der Benutzer auf die Schaltfläche geklickt hat, wird die Ergebnisseite aufgerufen, auf der die Mehrfachversion der" Juni 2014 "-Details angezeigt wird.

3
RustyJoomla

Ich habe dies behoben, indem ich Folgendes in der Datei default.php innerhalb des Moduls verwendet habe:

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

Dies ging zur Tabelle #__magazines, holte sich eines von jedem PublishDate und füllte die Tabelle damit auf!

2
RustyJoomla

Update: Um mein Snippet für die dynamische Verwendung für eine Reihe von möglichen eingehenden Variablenwerten zu ändern, könnten Sie vermutlich einfach eine "Whitelist" von Spaltennamen deklarieren und prüfen, ob der eingehende $column, Auf den abgefragt werden soll, gültig ist.

Zum Beispiel $column = "publishedDate"

Sie müssen nur publishedDate mit $column In meinem Skript releasen und $db->qn() jedes Mal aufrufen, um sicher zu gehen.

... und bereiten Sie mit strtolower() die Variable für dom-Attributdeklarationen vor.


Getesteter Code:

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

Erklärungen:

  • Ein try {} catch {} - Block ist eine saubere Methode, um nach Fehlern zu suchen und zu steuern, wie sich Ihr Code nach einem möglichen Abfragesyntaxfehler verhält.
  • Ich bin "Method Chaining" von getQuery(), so dass $query Nur einmal beim Erstellen der Abfrage geschrieben wird.
  • In den meisten Fällen ist Ihre Abfrage besser als SELECT DISTINCT Als als GROUP BY Geschrieben. Hier ist ein unterstützender Beitrag .
  • Ihre select() -Methode muss kein Array empfangen - ein String reicht völlig aus. Da publishedDate nicht [~ # ~] [~ # ~] mit einem Backtick umhüllt werden muss, sollten Sie die qn() Methodenaufruf und belassen ihn als nicht zitierte Zeichenfolge ohne Auswirkungen auf die Sicherheit.
  • ORDER BY Verwendet ASC als Standardrichtung, sodass dies nicht explizit angegeben werden muss. Und Sie brauchten einen Abstand vor Ihrem ASC, aber das war möglicherweise nur ein Tippfehler.
  • loadColumn() ist der am besten geeignete Aufruf, wenn Sie ein eindimensionales Array aus einer einzelnen Spaltenergebnismenge generieren möchten.
  • Ich suche nur nach $user_date, Wenn das Array $dates Nicht leer ist. Die Bedingung macht zwei Dinge: 1. Deklarieren von $dates Und 2. Überprüfen auf einen Nicht-Falsey-Wert (ein leeres Array ist Falsey). Wenn $dates Keine Elemente enthält, ist es fraglich, ob der Benutzer $_GET['publisheddate'] Eingereicht hat oder nicht.
  • Wenn Ihre Abfrage einen Syntaxfehler enthält, deklariere ich $dates Als leeres Array, sodass die foreach() -Schleife nicht iterieren kann.
  • Zeige $e->getMessage() niemals der Öffentlichkeit.
  • Meine persönliche Vorliebe ist es, ein Echo zu verwenden, um jede Codezeile anzuzeigen, anstatt in PHP hinein und heraus zu springen oder mehrzeilige Zeichenfolgen zu schreiben.
  • Ich bin nicht sicher, warum die erste/Standardoption den Wert A hat. Ich gehe davon aus, dass dies "Alle" bedeutet und Sie alle Datensätze in den Suchergebnissen anzeigen, was als sinnvolle Funktion erscheint.
  • Das Schreiben von selected="selected" In das erste <option> Ist nicht erforderlich. Wenn keine andere Option ausgewählt ist, wird sie als ausgewählte Option angezeigt.
  • Die Resultset-Werte werden als $date Innerhalb der foreach() -Schleife deklariert, und es ist keine Objektsyntax (->) Erforderlich.
  • Beim Schreiben von <option> - Werten, die mit dem sichtbaren Text identisch sind, muss das value -Attribut nicht deklariert werden. Ersparen Sie den Code aufblähen; Der Text wird als Wert übergeben.
  • Die geschweiften Klammern um $date Sind mein bevorzugter Codierungsstil - in diesem Fall nicht erforderlich.
0
mickmackusa