Właściwy sposób dodawania atrybutów do tagu HTML strony Joomla?

11

Używam AngularJS, aby dodać bardziej zaawansowane funkcje do kilku moich stron z artykułami o Joomla. Na tych stronach muszę dodać atrybut ng-app do <HTML>tagu na mojej stronie. Obecnie normalny tag HTML dla moich stron Joomla (v3.3) wygląda następująco;

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

i potrzebuję, żeby tak wyglądało;

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

To musi być nieco dynamiczne, ponieważ różne strony mogą wymagać innej dyrektywy ng-app. Czy jest odpowiedni sposób, aby to zrobić w Joomla?

Obecnie importuję AngularJS, używając następujących elementów:

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

Dziękuję za wszelką pomoc, której możesz udzielić.

drobertson
źródło
Jak obecnie dodajesz AngularJS i takie tylko do tych stron?
David Fritsch,
Dodam AngularJS do tych stron za pomocą prostego bloku kodu PHP. Oto użyty kod; <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,
Przepraszamy za zniekształcony kod. Nie mogłem wymyślić, jak uzyskać blok kodu, aby wyglądał poprawnie w ciągu 5 minut, które musiałem go edytować.
drobertson,
@DougRobertson - Możesz po prostu zaktualizować pytanie o zaktualizowany kod;) Odpowiednio zredagowałem twoje pytanie
Lodder

Odpowiedzi:

5

Możesz utworzyć taką systemwtyczkę:

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
źródło
Dzięki, tego szukałem. Będę pracował nad wtyczką systemową. Czy w krótkim okresie można zrobić to samo z PHP osadzonego w samym artykule?
drobertson,
DOMDocument jest bardzo wrażliwy na strukturę HTML. Jeśli nie uda się załadować dokumentu, kończy się niepowodzeniem na dużą skalę i nie ma możliwości odzyskania drobnego błędu HTML. Wolę proste preg_replace .
Anibal,
@DougRobertson AFAIK, nie, nie jest to możliwe. BTW Nie znam AngularJS, ale jeśli atrybut jest używany po stronie klienta, możesz go również zdefiniować po stronie klienta. Przykład jQuery:$('html').attr('ng-app', 'dataManager');
Farahmand
@Fari Rozważyłem to, ale sekwencja obciążeń stała się trudna. Jeśli mogę kontrolować umiejscowienie atrybutu, tak aby miało to miejsce przed zainicjowaniem AngularJS, to twój pomysł może być świetny. Jak dotąd nie dotarłem tak daleko do króliczej nory.
drobertson,
1

Możesz użyć PHP, aby dodać dynamiczną treść do ng-appatrybutu.

W \templates\yourtemplate\index.phppliku zmień

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

do

<?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
źródło
Przy takim podejściu musiałbym zmodyfikować szablon główny dla każdej strony, którą chciałem dodać. To by działało, ale jest bardzo nieporęczne, gdy dodam więcej stron i aplikacji. Szukam więcej sposobu na dodanie atrybutu podobnego do sposobu wstawiania odwołania skryptu do biblioteki javascript. Czy jest na to sposób?
drobertson,
1
prawdopodobnie wtyczka systemowa byłaby najprostszym sposobem. Może manipulować renderowanym plikiem HTML tuż przed podaniem go klientowi, a wszystkie dane sesji są dostępne, aby określić, które atrybuty są dla Ciebie odpowiednie.
Riccardo Zorn,