データベースに#__magazines
というテーブルがあります。これは雑誌のデータ(発行日、発行番号など)を保持しています。 Joomla 3.x用のコンポーネント、プラグイン、およびモジュールを作成しました。モジュール表示変数(例として公開された日付を使用しましょう)を使用できるようにしたいのです。クリックすると、モジュールはデータベースに移動し、選択した日付に一致するすべての結果を返して、新しいページに結果を表示します。
私はJoomlaチュートリアルに従ってきましたが、#__magazines
テーブルをクエリして結果を表示するための最良の方法を試すことができません。
[〜#〜]更新[〜#〜]
検索プラグインが正しく機能するようになったので、雑誌のタイトル(データベースにあることがわかっています)を検索すると、検索結果に表示されます。
ただし、知りたいのは、#__magazines
のデータベーステーブルからさまざまな変数をすべて表示し、それらを検索モジュールのドロップダウンとして表示する方法ですが、重複はありません。たとえば、June 2014
と呼ばれるtitle
があり、これがデータベースに2回ある場合、[オプションの選択]ドロップダウンに1回だけ表示します。ボタンをクリックすると、ユーザーは結果ページに移動し、「2014年6月」の詳細の複数のバージョンが表示されます。
モジュール内のdefault.phpファイルで以下を使用してこれを修正しました。
// 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>
これは#__magazinesテーブルに行き、各publishDateの1つを取得して、テーブルにそれを設定しました!
更新:可能性のある着信変数値の各種の動的使用のためにスニペットを変更するには、列名の「ホワイトリスト」を宣言し、クエリ対象の着信_$column
_が有効であることを確認するとします。
たとえば、_$column = "publishedDate"
_
安全のために、スクリプトでpublishedDate
を_$column
_に置き換え、そのたびに$db->qn()
を呼び出すだけです。
...そしてstrtolower()
を使用して、dom属性宣言用の変数を準備します。
テスト済みコード:
_$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>";
_
説明:
try {} catch {}
_ブロックは、エラーをチェックし、クエリ構文エラーが発生した場合のコードの動作を制御するためのクリーンな方法です。getQuery()
からの「メソッドチェーン」なので、クエリの作成中に_$query
_が1回だけ書き込まれます。SELECT DISTINCT
_ではなく_GROUP BY
_として記述する方が適切です。こちらが 補足記事 です。select()
メソッドは配列を受け取る必要はありません-文字列で問題ありません。 publishedDate
はバックティックラップする必要がない[〜#〜] [〜#〜]必要がないため、qn()
メソッド呼び出し。セキュリティに影響を与えることなく、引用符で囲まれていない文字列のままにします。ORDER BY
_は、デフォルトの方向としてASC
を使用するため、これを明示的に示す必要はありません。そして、あなたはあなたのASC
の前にスペースが必要でしたが、それは単に投稿ミスだったかもしれません。loadColumn()
は、単一の列の結果セットから1次元配列を生成する場合に最も適切な呼び出しです。$user_date
_配列が空でない場合にのみ、_$dates
_を探しています。条件は2つのことを実行します。1。_$dates
_を宣言し、2。偽ではない値をチェックします(空の配列は偽です)。 _$dates
_に要素がない場合、ユーザーが_$_GET['publisheddate']
_を送信したかどうかにかかわらず、問題はありません。foreach()
ループが反復できないように、_$dates
_を空の配列として宣言しています。$e->getMessage()
を公開しないでください。A
である理由がわかりません。これは「すべて」を意味すると思います。合理的な機能のように思われるすべてのレコードを検索結果に表示します。selected="selected"
_に_<option>
_を書き込む必要はありません。他のオプションが選択されていない場合は、選択されたオプションとして表示されます。foreach()
ループ内で_$date
_として宣言され、オブジェクト構文(_->
_)は必要ありません。<option>
_値を書き込む場合、value
属性を宣言する必要はありません。コードの膨張を回避します。テキストは値として送信されます。$date
_を囲む中括弧は、私が好むコーディングスタイルです-この場合は必要ありません。