Ce problème est une extension de la (des) question (s) par le lien joomla.stackexchange.com/a/9836/4042 mais avec une condition lorsque l'enregistrement enfant a non seulement UN parent (enregistrement parent) mais BEAUCOUP.
Avec deux jointures à gauche de la réponse acceptée par ce lien, cela fonctionne parfaitement si l'enregistrement enfant n'a qu'un seul parent (ou que plusieurs enfants sont liés au même parent ONE). Mais qu'en est-il du cas lorsqu'un enregistrement enfant est lié à plusieurs parents (enregistrements parent)? C'est à dire:
#__ enregistrements:
id name
1 Child1
2 Parent1
3 Parent2
#__ parents:
id child_id parent_id
1 1 2
2 1 3
En utilisant ces deux jointures à gauche pour ce cas, j'obtiens deux fois le même enregistrement enfant dans la liste d'enregistrements au niveau du back-end pour chaque nom parent:
ID CHILD PARENT
1 Child1 Parent1
1 Child1 Parent2
Donc, il y a deux questions:
1. Comment pousser le parent_name vers array () et pour obtenir la liste des enregistrements enfants à la fin de mon composant (si () administrateur/index.php? com_mycom & view = recordS ) comme:
ID CHILD PARENT
1 Child1 Parent1, Parent2
2. Comment obtenir le champ avec un tableau de parents dans le formulaire permettant de modifier un seul enregistrement et comment (ré) enregistrer le champ dans la base de données ( si administrateur/index.php? com_mycom & view = enregistrement & mise en page = éditer & id = 1 )? J'essaie d'ajouter à mon admin/models/forms/record.xml le champ comme:
<field
name="parentheader"
type="list"
label="COM_MYCOM_PARENT"
description=""
class="chzn-color-state"
multiple="multiple">
<option value="0">COM_MYCOM_SELECT_PARENT</option>
</field>
et pour le rendre dans tmpl avec celui-ci:
JHtml::_('formbehavior.chosen', 'select');
...
<div class="control-group">
<div class="control-label">
<?php echo $this->form->getLabel('parentheader'); ?>
</div>
<div class="controls">
<?php echo $this->form->getInput('parentheader'); ?>
</div>
</div>
Mais je reçois cette sortie:
Ce doit être comme le champ pour les catégories dans le panneau d'édition de produit de Virtuemart où je peux lier un produit à plusieurs catégories:
Quel code dois-je ajouter à mon admin/models/forms/record.xml et à admin/models/record. php (ou à la classe JTable)?
Je peux vous aider avec la réponse à Q1 (le SQL).
Voici le code SQL que j'ai utilisé sur sqlfiddle :
SELECT
b.`child_id`,
a.`name`,
GROUP_CONCAT( c.`name` ORDER BY c.`name` SEPARATOR ', ') AS parents
FROM `a_parents` AS b
INNER JOIN `a_records` AS a ON a.`id`=b.`child_id`
INNER JOIN `a_records` AS c ON c.`id`=b.`parent_id`
GROUP BY b.`child_id`;
Il suppose ce qui suit:
la longueur totale des noms des parents ne dépasse pas 1024 (le cas échéant, vous devrez faire quelque chose comme:
SET group_concat_max_len = 1024 * 10;
pour le définir à 10K, par exemple - ceci est fait avant le SELECT)
Le nœud de la solution ici est l’utilisation de GROUP_CONCAT , ce qui évite de recourir à un traitement de tableau PHP pour "convertir" plusieurs lignes en une seule colonne.
En ce qui concerne la deuxième question (Q2), vous aurez probablement besoin d'écrire un gestionnaire de champ personnalisé. Je suppose que vous ne dites pas, mais si vous utilisez VM dans la manière dont vous avez effectué la capture d'écran, cela ressemble à J2.5 (plutôt qu'à J3), il y a de nombreux exemples où VM2 utilise ses propres champs spéciaux (voir administrateur /.../ éléments pour des exemples, si je me souviens bien et peut-être aussi administrateur /.../ modèles/champs). Les liens ici pour écrire du back-end personnalisé les champs pourraient aider