Правильний спосіб додати атрибути до тегу HTML сторінки Joomla?


11

Я використовую AngularJS, щоб додати кілька більш досконалих функціональних можливостей на кілька моїх сторінок статей Joomla. На цих сторінках мені потрібно додати атрибут ng-app до <HTML>тегу на моїй сторінці. Наразі звичайний тег HTML для моїх сторінок Joomla (v3.3) виглядає приблизно так;

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

і мені це потрібно, щоб виглядати так;

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

Це має бути трохи динамічним, оскільки для різних сторінок може знадобитися інша директива щодо додатків ng. Чи є правильний спосіб зробити це в Joomla?

Зараз я імпортую AngularJS, використовуючи наступне:

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

Дякую за будь-яку допомогу, яку ви можете надати.


Як ви зараз додаєте AngularJS та подібні лише до цих сторінок?
Девід Фрітш

Я додаю AngularJS на ці сторінки простим блоком коду PHP. Ось використаний код; <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

Вибачте за розіграний код. Я не міг зрозуміти, як змусити блок коду виглядати правильно за 5 хвилин, які мені довелося відредагувати.
drobertson

@DougRobertson - Ви можете просто оновити своє запитання для оновлення коду;) Я відповідно відредагував ваше запитання
Lodder

Відповіді:


5

Ви можете створити systemплагін так:

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());
    }
}

Спасибі, це те, що я шукав. Я буду працювати над плагіном системи. Зрештою, чи можна зробити те саме з PHP, вбудованого в саму статтю?
drobertson

DOMDocument дуже чутливий до структури Html. Якщо не вдасться завантажити документ, він виходить з ладу великим способом, і немає можливості відновити незначну помилку Html. Я вважаю за краще прямий preg_replace .
Анібал

@DougRobertson AFAIK, ні це не можливо. BTW Я не знайомий з AngularJS, але якщо атрибут використовується на стороні клієнта, його можна визначити і на стороні клієнта. Приклад jQuery:$('html').attr('ng-app', 'dataManager');
Farahmand

@Fari Я думав це зробити, але послідовність навантажень вийшла хитрою. Якщо я можу контролювати розміщення attr, щоб це конкретно відбулося до ініціалізації AngularJS, то ваша ідея може бути чудовою. Поки що я не зайшов так далеко в кролячу нору.
drobertson

1

Ви можете використовувати PHP для додавання динамічного контенту до ng-appатрибуту.

У своєму \templates\yourtemplate\index.phpфайлі змініть

<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 ?>">

Використовуючи такий підхід, мені потрібно було б змінити головний шаблон для кожної сторінки, яку я хотів додати. Це буде працювати, але це дуже непросто, оскільки я додаю більше сторінок і ng-додатків. Я шукаю більше способу додати атрибут, подібний до того, як ми вставляємо посилання сценарію в бібліотеку javascript. Чи можна це зробити?
drobertson

1
можливо, системний плагін був би найпростішим способом. Він може маніпулювати виведеним HTML безпосередньо перед тим, як подавати його клієнтові, і мати всі дані сеансу, щоб визначити, які атрибути підходять саме вам.
Ріккардо Зорн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.