web-dev-qa-db-ja.com

記事と関連する特定のカスタムフィールド値のリストを取得する

カスタムフィールドから記事のタイトルとそれぞれの日付を表示するオプションを含むRSFormProフォームフィールドのリストを作成する必要があります。

このようなものの前に:

Select your courses :
Title of the article - 25/12/2019 (date from the custom field)

この記事は表示されますが、カスタムフィールドwww.rsjoomla.com/support/documentation/r...st-from-a-table.htmlと組み合わせる方法がわかりません。

次のコードを使用すると、特定のカテゴリから記事のタイトルを取得できます

// Prepare the empty array
$items = array();
// Prepare the database connection
$db = JFactory::getDbo();
// Keep this if you'd like a "Please select" option, otherwise comment or 
remove it
$items[] = "|Please Select[c]";

// Run the SQL query and store it in $results
$db->setQuery("SELECT title, title FROM jos0x_content WHERE catid = 13 or 
catid = 14");
$results = $db->loadObjectList();

// Now, we need to convert the results into a readable RSForm! Pro format.
// The Items field will accept values in this format:
// value-to-be-stored|value-to-be-shown
// Eg. m|M-sized T-shirt
foreach ($results as $result) {
    $value = $result->title;
    $label = $result->title;
    $items[] = $value.'|'.$label;
}

// Multiple values are separated by new lines, so we need to do this now
$items = implode("\n", $items);

// Now we need to return the value to the field
return $items;

データベース内:

Table jos0x_content : title
Table jos0x_fields_values : field_id=2(calendar field), value, and 
  in item_id the related id of the article 
2
Laurent

これは基本的に_LEFT JOIN_であり、テーブルとWS_CONCAT()呼び出しを関連付けて、SQL内で出力文字列を準備します(結果セットの追加のphp処理はありません)。すべての記事のfields_valuesテーブルに日付値がある場合は、innerJoin();を使用できます。 innerJoin()を使用し、特定の記事の結合テーブルに関連する行がない場合、その記事は結果セットに表示されません。

「接着剤」を使用してJoomlaのconcatenate()メソッドと連結しているため、出力は NULLで壊れやすい _fv.value_値ではありません。

2つの異なる「接着剤」が必要なため、ネストされた連結を使用しています。内部連結は、_The Title|The Title_のようなパイプで区切られたテキストを提供します。外側の連結では、スペース、ハイフン、スペース、次に_The Title|The Title - 28-11-2019_のようなフォーマットされた日付文字列が追加されます。

クエリに並べ替えを適用する場合は、記事の日付で降順で並べ替えることにしました。必要に応じて自由に変更してください。

参考までに、$db->qn()呼び出しはすべて、スクリプトから安全に削除できます。 Joomlaは、見積もり方法を使用して、Webサイトの安全性と安定性を維持することを推奨しています。ただし、すべてのテーブル、列、およびそれらのエイリアスは、バックティックラップされずに同じようにスムーズに実行されます。 (...説明したとおり ここここここここ 、および ここここで説明する具体的な基準 に基づいています。)これらの不要な引用メソッドを削除すると、スクリプトの読みやすさが大幅に向上します。

これはテストされておらず、間違いを犯した可能性があります。もしそうなら、私の答えの下でコメントすることについて恥ずかしがらないでください。すべての回答を希望どおりに機能させる必要があります。

_$db = JFactory::getDBO();
try {
    $query = $db->getQuery(true);
    $query
        ->select(
              $query->concatenate([
                  $query->concatenate([
                      $db->qn("c.title"),
                      $db->qn("c.title")
                  ], "|"),
                  "DATE_FORMAT(" . $db->qn("fv.value") . ", '%d-%m-%Y')"
              ], " - ")
          )
        ->from($db->qn("#__content", "c"))
        ->leftJoin($db->qn("#__fields_values", "fv")
              . " ON " . $db->qn("c.id") . " = " . $db->qn("fv.item_id"))
        ->where([
              $db->qn("fv.field_id") . " = 2",
              $db->qn("c.catid") . " IN (13,14)",
              $db->qn("c.state") . " = 1")
          ])
        ->order($db->qn("fv.value") . " DESC");
    $db->setQuery($query);
    return "|Please Select[c]\n" . implode("\n", $db->loadColumn());
} catch (Exception $e) {
    return "|Syntax Error";
}
_

コメントされた要件に基づく追加:

  • MySQLのDATE_FORMAT() を使用して、日時スタンプをカスタマイズします。
  • 公開された記事のみを結果セットに含めるには、$db->qn("c.state") . " = 1"の配列の別の要素としてwhere()を追加します。
1
mickmackusa