Une bonne façon d'ajouter des attributs à la balise HTML de la page Joomla?

11

J'utilise AngularJS pour ajouter des fonctionnalités plus avancées à plusieurs de mes pages d'articles Joomla. Sur ces pages, je dois ajouter l'attribut ng-app à la <HTML>balise sur ma page. Actuellement, la balise HTML normale de mes pages Joomla (v3.3) ressemble à ceci;

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

et j'en ai besoin pour ressembler à ceci;

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

Cela doit être un peu dynamique car différentes pages peuvent nécessiter une directive ng-app différente. Existe-t-il un moyen approprié de le faire dans Joomla?

J'importe actuellement AngularJS en utilisant les éléments suivants:

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

Merci pour toute aide que vous pouvez apporter.

drobertson
la source
Comment ajoutez-vous actuellement AngularJS et autres uniquement à ces pages?
David Fritsch
J'ajoute AngularJS à ces pages avec un simple bloc de code PHP. Voici le code utilisé; <pre> {source} <? php $ document = JFactory :: getDocument (); $ urlAngular = " ajax.googleapis.com/ajax/libs/angularjs/1.2.21/angular.min.js "; $ document-> addScript ($ urlAngular); ?> {/ source} </pre>
drobertson
Désolé pour le code mutilé. Je ne pouvais pas comprendre comment obtenir le bloc de code correctement dans les 5 minutes que j'ai dû le modifier.
drobertson
@DougRobertson - Vous pouvez simplement mettre à jour votre question pour le code mis à jour;) J'ai modifié votre question en conséquence
Lodder

Réponses:

5

Vous pouvez créer un systemplugin comme celui-ci:

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());
    }
}
Farahmand
la source
Merci, c'est ce que je cherchais. Je vais travailler sur le plugin système. À court terme, est-il possible de faire la même chose à partir de PHP intégré à l'article lui-même?
drobertson
DOMDocument est très sensible à la structure Html. S'il ne parvient pas à charger le document, il échoue de manière importante et il n'y a aucun moyen de récupérer une erreur HTML mineure. Je préfère un preg_replace droit .
Anibal
@DougRobertson AFAIK, non ce n'est pas possible. BTW Je ne connais pas AngularJS, mais si l'attribut est utilisé côté client, vous pouvez également le définir côté client. Un exemple jQuery:$('html').attr('ng-app', 'dataManager');
Farahmand
@Fari J'ai envisagé de le faire, mais la séquence de charges est devenue délicate. Si je peux contrôler le placement de l'attr afin qu'il se produise spécifiquement avant l'initialisation d'AngularJS, votre idée peut être excellente. Jusqu'à présent, je ne suis pas allé aussi loin dans le terrier du lapin.
drobertson
1

Vous pouvez utiliser PHP pour ajouter du contenu dynamique à l' ng-appattribut.

Dans votre \templates\yourtemplate\index.phpdossier, changez

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

à

<?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 ?>">
johanpw
la source
En utilisant cette approche, je devrais modifier le modèle principal pour chaque page que je voulais ajouter. Cela fonctionnerait, mais c'est très lourd car j'ajoute plus de pages et ng-app (s). Je cherche plus un moyen d'ajouter un attribut similaire à la façon dont nous insérons une référence de script à une bibliothèque javascript. Est-ce qu'il y a un moyen de faire ça?
drobertson
1
peut-être qu'un plugin système serait le moyen le plus simple. Il peut manipuler le code HTML rendu juste avant de le servir au client et disposer de toutes les données de session pour déterminer les attributs qui vous conviennent.
Riccardo Zorn