Richtige Möglichkeit, dem HTML-Tag der Joomla-Seite Attribute hinzuzufügen?

11

Ich verwende AngularJS, um einigen meiner Joomla-Artikelseiten erweiterte Funktionen hinzuzufügen. Auf diesen Seiten muss ich dem <HTML>Tag auf meiner Seite das Attribut ng-app hinzufügen . Derzeit sieht das normale HTML-Tag für meine Joomla (v3.3) -Seiten so aus.

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

und ich brauche es, um so auszusehen;

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

Dies muss etwas dynamisch sein, da unterschiedliche Seiten möglicherweise eine andere ng-app-Direktive benötigen. Gibt es einen richtigen Weg, dies in Joomla zu tun?

Ich importiere derzeit AngularJS wie folgt:

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

Vielen Dank für jede Hilfe, die Sie geben können.

Drobertson
quelle
Wie fügen Sie derzeit AngularJS und dergleichen nur zu diesen Seiten hinzu?
David Fritsch
Ich füge diesen Seiten AngularJS mit einem einfachen Block PHP-Code hinzu. Hier ist der verwendete Code; <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
Entschuldigung für den verstümmelten Code. Ich konnte nicht herausfinden, wie ich den Codeblock in den 5 Minuten, in denen ich ihn bearbeiten musste, richtig aussehen ließ.
Drobertson
@ DougRobertson - Sie können einfach Ihre Frage für Code aktualisiert aktualisieren;) Ich habe Ihre Frage entsprechend bearbeitet
Lodder

Antworten:

5

Sie können ein systemPlugin wie folgt erstellen :

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
quelle
Danke, das habe ich gesucht. Ich werde am System-Plugin arbeiten. Ist es kurzfristig möglich, dasselbe mit PHP zu tun, das in den Artikel selbst eingebettet ist?
Drobertson
DOMDocument reagiert sehr empfindlich auf die HTML-Struktur. Wenn das Dokument nicht geladen werden kann, schlägt es erheblich fehl und es gibt keine Möglichkeit, einen geringfügigen HTML-Fehler zu beheben. Ich bevorzuge einen geraden preg_replace .
Anibal
@ DougRobertson AFAIK, nein das ist nicht möglich. Übrigens kenne ich AngularJS nicht, aber wenn das Attribut auf der Clientseite verwendet wird, können Sie es auch auf der Clientseite definieren. Ein jQuery-Beispiel:$('html').attr('ng-app', 'dataManager');
Farahmand
@Fari Ich habe darüber nachgedacht, aber die Reihenfolge der Ladevorgänge wurde schwierig. Wenn ich die Platzierung des attr so steuern kann, dass es speziell vor der Initialisierung von AngularJS geschieht, ist Ihre Idee möglicherweise großartig. Bisher bin ich noch nicht so weit im Kaninchenbau angekommen.
Drobertson
1

Sie können PHP verwenden, um dem ng-appAttribut dynamischen Inhalt hinzuzufügen .

\templates\yourtemplate\index.phpÄndern Sie in Ihrer Datei

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

zu

<?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
quelle
Mit diesem Ansatz müsste ich die Master-Vorlage für jede Seite ändern, die ich hinzufügen möchte. Es würde funktionieren, aber es ist sehr unhandlich, wenn ich mehr Seiten und ng-Apps hinzufüge. Ich suche eher nach einer Möglichkeit, ein Attribut hinzuzufügen, das dem Einfügen eines Skriptverweises in eine Javascript-Bibliothek ähnelt. Gibt es eine Möglichkeit, dies zu tun?
Drobertson
1
Möglicherweise wäre ein System-Plugin der einfachste Weg. Es kann das gerenderte HTML manipulieren, bevor es dem Client bereitgestellt wird, und alle Sitzungsdaten verfügbar haben, um zu bestimmen, welche Attribute für Sie geeignet sind.
Riccardo Zorn