Je crée mon composant personnalisé. En arrière-plan, j'ai la liste des enregistrements individuels. Ils ont des enregistrements parent dans la base de données sous le nom parent_id et ne sont donc affichés dans le back-end qu'en tant qu'id. Comment afficher les noms de ces parents au lieu de leurs identifiants?
Dans mon modèles/records.php il y a la requête:
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('id, header, parent_id, ordering, published');
$query->from('#__records');
return $query;
et dans views/records/view.html.php il y a $this->items = $this->get('Items');
Les noms des enregistrements sont stockés dans le DB dans le champ en-tête
Utilisez la sous-requête.
SELECT
*,
(SELECT header FROM `tablename` WHERE `id`=r.parent_id) AS parent_header
FROM
`tablename` AS r
parent_header
a le nom de l'enregistrement parent.
Avec Joomla! JDatabaseQuery
objet
$db = JFactory::getDBO();
// Create subquery to get `header` column value
$subQuery = $db->getQuery(true)
->select('header')
// You have this row in same table? If not, change table name
->from('`#__records`')
->where('id=r.parent_id');
$query = $db->getQuery(true)
->select('id, header, parent_id, ordering, published')
// Inject subquery select
->select('('.$subQuery->__toString().') AS parent_header')
->from('`#__records` AS r');
return $query;
Sortie de la requête:
SELECT
id, header, parent_id, ordering, published,
(
SELECT
header
FROM
`lab0f_records`
WHERE
id=r.parent_id
) AS
parent_header
FROM
`lab0f_records` AS r
Vous devez laisser rejoindre le nom de l'en-tête lorsque vous créez la requête dans votre méthode modèle getListQuery (). Le code actuel utilisant l'objet de requête Joomla ressemble à ceci:
$query->select('a.id, a.header, a.parent_id, a.ordering, a.published');
$query->from('#__records AS a');
$query->select('p.header as parent_name');
$query->join('LEFT', '#__records AS p ON p.id = a.parent_id');
Ce serait le moyen officiel de Joomla de saisir et d'utiliser le nom réel par rapport à un identifiant. Vous pouvez accéder au nom du nom parent en utilisant les éléments suivants dans vos vues:
$this->item->parent_name
Il est déconseillé d'utiliser une syntaxe pure de MySQL, en particulier si vous envisagez de transférer ce composant dans JED (Joomla Extension Directory) car il ne fonctionnera pas avec les installations Joomla n'utilisant pas MySQL.
En utilisant exclusivement les classes d'abstraction de base de données Joomla pour gérer toutes les opérations de base de données CRUD, vous vous assurez que le code de votre composant peut fonctionner avec toute base de données prise en charge utilisée par toute installation Joomla particulière.
J'espère que cela t'aides!