¿Forma correcta de agregar atributos a la etiqueta HTML de la página de Joomla?

11

Estoy usando AngularJS para agregar una funcionalidad más avanzada a varias de mis páginas de artículos de Joomla. En estas páginas necesito agregar el atributo ng-app a la <HTML>etiqueta en mi página. Actualmente, la etiqueta HTML normal para mis páginas de Joomla (v3.3) tiene este aspecto;

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

y necesito que se vea así;

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

Esto debe ser un poco dinámico, ya que diferentes páginas pueden necesitar una directiva ng-app diferente. ¿Hay una manera adecuada de hacer esto en Joomla?

Actualmente estoy importando AngularJS usando lo siguiente:

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

Gracias por cualquier ayuda que pueda dar.

drobertson
fuente
¿Cómo está agregando actualmente AngularJS y tal solo a esas páginas?
David Fritsch
Estoy agregando AngularJS a esas páginas con un simple bloque de código PHP. Aquí está el código utilizado; <pre> {fuente} <? php $ document = JFactory :: getDocument (); $ urlAngular = " ajax.googleapis.com/ajax/libs/angularjs/1.2.21/angular.min.js "; $ document-> addScript ($ urlAngular); ?> {/ source} </pre>
drobertson
Perdón por el código destrozado. No pude averiguar cómo hacer que el bloque de código se vea bien en los 5 minutos que tuve que editarlo.
drobertson
@DougRobertson - Simplemente puede actualizar su pregunta para el código actualizado;) He editado su pregunta en consecuencia
Lodder

Respuestas:

5

Puede crear un systemcomplemento como este:

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
fuente
Gracias, esto es lo que estaba buscando. Trabajaré en el complemento del sistema. A corto plazo, ¿es posible hacer lo mismo desde PHP incrustado dentro del artículo?
drobertson
DOMDocument es muy sensible a la estructura Html. Si no puede cargar el documento, falla a lo grande y no hay forma de recuperar un pequeño error de HTML. Prefiero un preg_replace directo .
Anibal
@DougRobertson AFAIK, no, no es posible. Por cierto, no estoy familiarizado con AngularJS, pero si el atributo se usa en el lado del cliente, también puede definirlo en el lado del cliente. Un ejemplo de jQuery:$('html').attr('ng-app', 'dataManager');
Farahmand
@Fari Pensé en hacer eso, pero la secuencia de cargas se volvió complicada. Si puedo controlar la ubicación del atributo para que suceda específicamente antes de que AngularJS se inicialice, entonces su idea puede ser excelente. Hasta ahora no he llegado tan lejos por la madriguera del conejo.
drobertson
1

Puede usar PHP para agregar contenido dinámico al ng-appatributo.

En su \templates\yourtemplate\index.phparchivo, cambie

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

a

<?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
fuente
Usando este enfoque, necesitaría modificar la plantilla maestra para cada página que quisiera agregar. Funcionaría, pero es muy difícil de manejar ya que agrego más páginas y ng-app (s). Estoy buscando más una forma de agregar un atributo similar a cómo insertamos una referencia de script a una biblioteca de JavaScript. ¿Hay alguna forma de hacer esto?
drobertson
1
posiblemente un complemento del sistema sería la forma más fácil. Puede manipular el html representado justo antes de entregarlo al cliente y tener todos los datos de sesión disponibles para determinar qué atributos son apropiados para usted.
Riccardo Zorn