it-swarm.dev

Sostituzione del modulo XML del modello di componenti di base

Voglio cambiare il tipo di campo per i collegamenti dell'articolo, dal testo di input all'elenco a discesa con voci di menu interne. Sto cercando un modo conveniente per farlo con il minimo lavoro.

Non riesco a trovare da nessuna parte se c'è un modo per creare una semplice sostituzione posizionando l'XML in un'altra posizione. È possibile comunque?

Altrimenti, quale sarebbe l'approccio migliore?

3
FFrewin

L'approccio più standard sarebbe probabilmente quello di utilizzare un plugin per catturare l'oggetto JForm dopo che l'XML è stato elaborato ma prima che abbia lasciato il modello per apportare le modifiche. Un esempio di quella funzione sarebbe come questo:

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 per impostazione predefinita ha $reset flag impostato su true, quindi se esistono campi con lo stesso nome, è necessario sostituirli con la nuova versione. Questo non funzionerebbe come una regex, quindi dovresti definire l'intero campo, non solo il nuovo pezzo. Tuttavia, dovrebbe essere facile mantenere il tuo file separato in un posto che non sarà influenzato dagli aggiornamenti (come nella cartella del plugin!).

Inoltre, se non ovvio, sarebbe meglio renderlo un plugin content.

5
David Fritsch

il plug-in xml-overrides sembra pulito ( Override XML modulo ). Se ho capito bene vuoi modificare il campo urla nel, giusto? Penso che il modo più semplice sia probabilmente quello di utilizzare un tipo di campo sql anziché il tipo di campo menu ( tipo di campo SQL ). La definizione del campo potrebbe essere simile a questa:

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

Questo elencherà tutte le voci di menu del sito e restituirà un URL a ciascuna voce di menu. In questo modo il campo urla (o urlb o urlc) verrà restituito un valore accettato.

2
jonasfh

Ho trovato un plug-in che fa esattamente questo: consente le sostituzioni XML. La pagina JED del plug-in è qui: Form XML Override

Ma sto ancora cercando un modo personalizzato per farlo.

Aggiornare:

Ho testato il plugin e funziona benissimo. Tuttavia, la mia idea specifica di sostituire il campo di immissione del testo dei collegamenti con un elenco delle voci di menu disponibili non era l'ideale, poiché il campo non salva il tipo di dati fornito dall'elenco dei menu. Per questa esigenza specifica dovrei farlo diversamente.

1
FFrewin