Правильный способ добавить атрибуты в 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-app. Есть ли правильный способ сделать это в Joomla?

В настоящее время я импортирую AngularJS, используя следующее:

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

Спасибо за любую помощь, которую вы можете оказать.

drobertson
источник
Как вы добавляете 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>
Дробертсон
Извините за искаженный код. Я не мог понять, как заставить блок кода выглядеть правильно за 5 минут, которые мне пришлось редактировать.
Дробертсон
@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());
    }
}
Farahmand
источник
Спасибо, это то, что я искал. Я буду работать над системным плагином. В краткосрочной перспективе возможно ли сделать то же самое из PHP, встроенного в саму статью?
Дробертсон
DOMDocument очень чувствителен к структуре HTML. Если не удается загрузить документ, он в значительной степени дает сбой, и нет способа восстановить небольшую ошибку HTML. Я предпочитаю прямой preg_replace .
Анибал
@DougRobertson AFAIK, нет, это невозможно. Кстати, я не знаком с AngularJS, но если атрибут используется на стороне клиента, вы можете определить его и на стороне клиента. Пример jQuery:$('html').attr('ng-app', 'dataManager');
Farahmand
@Fari Я подумал об этом, но последовательность загрузок стала хитрой. Если я смогу управлять размещением атрибута так, чтобы это происходило до инициализации AngularJS, тогда ваша идея может быть отличной. До сих пор я не зашел так далеко в кроличью нору.
Дробертсон
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 ?>">
johanpw
источник
Используя этот подход, мне нужно будет изменить основной шаблон для каждой страницы, которую я хочу добавить. Это будет работать, но это очень громоздко, так как я добавляю больше страниц и ng-app (s). Я больше ищу способ добавить атрибут, аналогичный тому, как мы вставляем ссылку на скрипт в библиотеку javascript. Есть какой-либо способ сделать это?
Дробертсон
1
возможно, системный плагин будет самым простым способом. Он может манипулировать визуализированным html непосредственно перед его передачей клиенту и иметь все доступные данные сеанса, чтобы определить, какие атрибуты вам подходят.
Риккардо Цорн