web-dev-qa-db-fra.com

Remplacement du noyau de formulaire de modèle de composants de base

Je souhaite modifier le type de champ pour les liens de l'article, du texte de saisie à la liste déroulante avec des éléments de menu internes. Je cherche un moyen pratique de le faire avec un minimum de travail.

Je ne peux trouver nulle part s'il existe un moyen de créer une substitution simple en plaçant le XML dans un autre emplacement. Est-ce possible de toute façon?

Sinon, quelle serait la meilleure approche?

3
FFrewin

L’approche plus standard serait probablement d’utiliser un plugin pour attraper l’objet JForm après le traitement du XML, mais avant qu’il ait quitté le modèle pour effectuer vos modifications. Un exemple de cette fonction serait comme ceci:

function onContentPrepareForm($form, $data)
{
    if (!($form instanceof JForm))
    {
        $this->_subject->setError('JERROR_NOT_A_FORM');
        return false;
    }

    // Check we are manipulating a valid form.
    $name = $form->getName();
    if (!in_array($name, array('com_content.article')))
    {
        return true;
    }

    $form->loadFile('__PATH_ALTERNATE_XML_FILE__');

    return true;
}

loadFile par défaut a le $reset flag défini sur true. Par conséquent, s'il existe des champs portant le même nom, remplacez-les par la nouvelle version. Cela ne fonctionnerait pas comme une regex, il faudrait donc définir le champ entier, pas seulement le nouveau morceau. Cependant, il devrait être facile de conserver votre fichier séparé dans un endroit qui ne sera pas affecté par les mises à jour (comme dans le dossier du plugin!).

En outre, si cela n’est pas évident, il serait préférable d’en faire un plugin content.

5
David Fritsch

le xml-overrides-plugin semble soigné ( Form XML Override ). Si je comprends bien, vous voulez modifier le champ urla dans le, non? Je pense que le moyen le plus simple est probablement d'utiliser un type de champ SQL au lieu du type de champ menu ( type de champ SQL ). Votre définition de champ pourrait être quelque chose comme ceci:

<fields name="urls" label="COM_CONTENT_FIELD_URLS_OPTIONS">
    <field name="urla" type="sql" validate="url"
    filter="url" label="COM_CONTENT_FIELD_URLA_LABEL"
    description="COM_CONTENT_FIELD_URL_DESC" 
    key_field="url" value_field="title"
    query="select concat('index.php?Itemid=', cast(id as char)) url, 
    concat(repeat('    ', (level-1)), menutype,'-',title) as title
    from #__menu where client_id=0 and id != 1 order by menutype, lft"
    ><option value="">-- Select internal menu --</option></field>
</fields>

Ceci listera tous les éléments du menu du site et retournera une URL à chaque élément du menu. De cette façon, le champ urla (ou urlb ou urlc) sera renvoyé à une valeur acceptée.

2
jonasfh

J'ai trouvé un plugin qui fait exactement ceci: Autorise les remplacements XML. La page du plugin JED est ici: Form XML Override

Mais je suis toujours à la recherche d'une solution personnalisée.

Mise à jour:

J'ai testé le plugin et cela fonctionne très bien. Cependant, mon idée spécifique de remplacer le champ de saisie de liens par une liste des éléments de menu disponibles n’était pas idéale, car le champ n’enregistre pas le type de données fourni par la liste de menuitems. Pour ce besoin spécifique, je devrais le faire différemment.

1
FFrewin