Modo corretto per aggiungere attributi al tag HTML della pagina Joomla?


11

Sto usando AngularJS per aggiungere alcune funzionalità più avanzate a molte delle mie pagine di articoli Joomla. In queste pagine devo aggiungere l'attributo ng-app al <HTML>tag sulla mia pagina. Attualmente il normale tag HTML per le mie pagine Joomla (v3.3) è simile al seguente;

<html prefix="og: http://ogp.me/ns#" xml:lang="en-gb" lang="en-gb">

e ne ho bisogno per assomigliare a questo;

<html prefix="og: http://ogp.me/ns#" xml:lang="en-gb" lang="en-gb" ng-app="dataManager">

Questo deve essere un po 'dinamico poiché pagine diverse potrebbero aver bisogno di una diversa direttiva ng-app. C'è un modo corretto per farlo in Joomla?

Attualmente sto importando AngularJS usando quanto segue:

<?php 
    $document = JFactory::getDocument();
    $urlAngular = "http://ajax.googleapis.com/ajax/libs/angularjs/1.2.21/angular.min.js";
    $document->addScript($urlAngular); 
?>

Grazie per l'aiuto che puoi dare.


Come stai attualmente aggiungendo AngularJS e simili solo a quelle pagine?
David Fritsch,

Sto aggiungendo AngularJS a quelle pagine con un semplice blocco di codice PHP. Ecco il codice utilizzato; <pre> {source} <? php $ document = JFactory :: getDocument (); $ urlAngular = " ajax.googleapis.com/ajax/libs/angularjs/1.2.21/angular.min.js "; $ documento-> addScript ($ urlAngular); ?> {/ source} </pre>
drobertson

Ci scusiamo per il codice alterato. Non sono riuscito a capire come far apparire il blocco di codice nei 5 minuti che ho dovuto modificarlo.
drobertson,

@DougRobertson - Puoi semplicemente aggiornare la tua domanda per il codice aggiornato;) Ho modificato la tua domanda di conseguenza
Lodder

Risposte:


5

Puoi creare un systemplugin come questo:

class plgSystemAddAttr extends JPlugin
{
    public function onAfterRender()
    {
        $document = JFactory::getApplication();
        $htmlString = $document->getBody();

        $dom = new DOMDocument();
        libxml_use_internal_errors(true);
        $dom->loadHTML($htmlString);
        libxml_use_internal_errors(false);
        $htmlTag = $dom->getElementsByTagName('html')->item(0);

        $domAttribute = $dom->createAttribute('ng-app');
        $domAttribute->value = 'dataManager';
        $htmlTag->appendChild($domAttribute);

        $document->setBody($dom->saveHtml());
    }
}

Grazie, questo è quello che stavo cercando. Lavorerò sul plugin di sistema. Nel breve periodo è possibile fare la stessa cosa da PHP incorporato nell'articolo stesso?
drobertson,

DOMDocument è molto sensibile alla struttura HTML. Se non riesce a caricare il documento, non riesce in grande misura e non c'è modo di recuperare un errore Html minore. Preferisco un preg_replace dritto .
Anibal

@DougRobertson AFAIK, no non è possibile. A proposito, non ho familiarità con AngularJS, ma se l'attributo viene utilizzato sul lato client, è possibile definirlo anche sul lato client. Un esempio di jQuery:$('html').attr('ng-app', 'dataManager');
Farahmand,

@Fari Ho pensato di farlo, ma la sequenza di carichi è diventata complicata. Se riesco a controllare il posizionamento dell'attr in modo che accada in modo specifico prima dell'inizializzazione di AngularJS, la tua idea potrebbe essere fantastica. Finora non sono arrivato così lontano nella tana del coniglio.
drobertson,

1

È possibile utilizzare PHP per aggiungere contenuto dinamico ng-appall'attributo.

Nel tuo \templates\yourtemplate\index.phpfile, cambia

<html prefix="og: http://ogp.me/ns#" xml:lang="en-gb" lang="en-gb" ng-app="dataManager">

per

<?php
if ( condition ) {
   $ngapp = "dataManager";
} else {
   $ngapp = "somethingElse";
}
?>
<html prefix="og: http://ogp.me/ns#" xml:lang="en-gb" lang="en-gb" ng-app="<?php echo $ngapp ?>">

Utilizzando questo approccio avrei bisogno di modificare il modello principale per ogni pagina che volevo aggiungere. Funzionerebbe, ma è molto ingombrante quando aggiungo più pagine e ng-app. Sto cercando un modo per aggiungere un attributo simile a come inseriamo un riferimento di script in una libreria javascript. C'è un modo per fare questo?
drobertson,

1
probabilmente un plugin di sistema sarebbe il modo più semplice. Può manipolare l'html di rendering appena prima di servirlo al client e avere tutti i dati di sessione disponibili per determinare quali attributi sono appropriati per te.
Riccardo Zorn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.