web-dev-qa-db-fra.com

Obtenir la liste des articles et des valeurs de champ personnalisé spécifiques associées

J'ai besoin de composer une liste pour un champ de formulaire RSFormPro qui contient des options qui affichent les titres d'articles et leur date respective à partir d'un champ personnalisé.

Devant quelque chose comme ça:

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

Je vois cet article, mais je ne sais pas comment le combiner avec le champ personnalisé www.rsjoomla.com/support/documentation/r...st-from-a-table.html

Avec le code suivant, je peux récupérer le titre de l'article dans des catégories spécifiques

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

Dans la base de données:

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

Il s'agit essentiellement d'un LEFT JOIN Pour relier les tables et les appels WS_CONCAT() pour préparer les chaînes de sortie dans le SQL (pas de gestion php supplémentaire du jeu de résultats). Si CHAQUE article a une valeur de date dans la table fields_values, alors vous pouvez utiliser innerJoin(); si vous utilisez innerJoin() et qu'il n'y a pas de ligne associée dans la table jointe pour un article spécifique, cet article ne sera pas représenté dans le jeu de résultats.

Parce que j'utilise une "colle" pour concaténer avec la méthode concatenate() de Joomla, la sortie n'est pas sujette à rupture sur NULLfv.value Valeurs.

J'utilise la concaténation imbriquée car j'ai besoin de deux "colles" différentes. La concaténation interne fournit un texte séparé par des tuyaux comme The Title|The Title. La concaténation externe ajoute espace-trait d'union-espace puis la chaîne de date formatée comme The Title|The Title - 28-11-2019.

Dans le cas où vous souhaitez appliquer un tri à la requête, j'ai arbitrairement décidé de trier par date d'article dans l'ordre décroissant - n'hésitez pas à jouer avec cela selon vos besoins.

Pour mémoire, TOUS les appels $db->qn() peuvent être supprimés de mon script en toute sécurité. Joomla approuve l'utilisation de ses méthodes de cotation pour éviter de garder leurs sites Web sécurisés et stables. Cependant, toutes vos tables, colonnes et leurs alias s'exécuteront tout aussi bien sans être encapsulés en backtick. (... comme je l'ai expliqué ici , ici , ici , ici , et ici basé sur les critères concrets discutés ici .) Vous remarquerez une augmentation importante de la lisibilité du script en supprimant ces méthodes de citation inutiles .

Ce n'est pas testé et il est tout à fait possible que j'ai fait des erreurs. Si c'est le cas, n'hésitez pas à commenter ma réponse; J'ai besoin que toutes mes réponses fonctionnent comme vous le souhaitez.

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

Ajouts basés sur les exigences commentées:

  • utilisez DATE_FORMAT() de MySQL pour personnaliser votre horodatage.
  • pour inclure uniquement les articles publiés dans le jeu de résultats, ajoutez $db->qn("c.state") . " = 1" comme autre élément dans le tableau de where().
1
mickmackusa