Cách thích hợp để thêm thuộc tính vào thẻ HTML của trang Joomla?


11

Tôi đang sử dụng AngularJS để thêm một số chức năng nâng cao hơn vào một số trang bài viết Joomla của tôi. Trên các trang này, tôi cần thêm thuộc tính ng-app vào <HTML>thẻ trên trang của mình. Hiện tại thẻ HTML bình thường cho các trang Joomla (v3.3) của tôi trông như thế này;

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

và tôi cần nó để trông như thế này;

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

Điều này cần phải có một chút năng động vì các trang khác nhau có thể cần một chỉ thị ng-app khác nhau. Có một cách thích hợp để làm điều này trong Joomla?

Tôi hiện đang nhập AngularJS bằng cách sử dụng như sau:

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

Cảm ơn bạn cho bất kỳ sự giúp đỡ bạn có thể cung cấp.


Hiện tại bạn đang thêm AngularJS như thế nào và chỉ những trang đó?
David Fritsch

Tôi đang thêm AngularJS vào các trang đó bằng một khối mã PHP đơn giản. Đây là mã được sử dụng; <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

Xin lỗi cho mã sai. Tôi không thể tìm ra làm thế nào để khối mã trông đúng trong 5 phút tôi phải chỉnh sửa nó.
drobertson

@DougRobertson - Bạn chỉ có thể cập nhật câu hỏi của bạn cho mã được cập nhật;) Tôi đã chỉnh sửa câu hỏi của bạn cho phù hợp
Lodder

Câu trả lời:


5

Bạn có thể tạo một systemplugin như thế này:

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

Cảm ơn, đây là những gì tôi đang tìm kiếm. Tôi sẽ làm việc trên các plugin hệ thống. Trong ngắn hạn, có thể làm điều tương tự từ PHP được nhúng trong chính bài viết không?
drobertson

DOMDocument rất nhạy cảm với cấu trúc Html. Nếu không tải được tài liệu, nó sẽ thất bại theo cách lớn và không có cách nào để khôi phục một lỗi Html nhỏ. Tôi thích một preg numplace thẳng .
Anibal

@DougRobertson AFAIK, không, điều đó là không thể. BTW Tôi không quen thuộc với AngularJS, nhưng nếu thuộc tính được sử dụng ở phía máy khách, bạn cũng có thể định nghĩa nó ở phía máy khách. Một ví dụ về jQuery:$('html').attr('ng-app', 'dataManager');
Farahmand

@Fari Tôi đã cân nhắc việc đó, nhưng trình tự tải trở nên khó khăn. Nếu tôi có thể kiểm soát vị trí của attr để nó đặc biệt xảy ra trước khi AngularJS khởi tạo thì ý tưởng của bạn có thể là một ý tưởng tuyệt vời. Cho đến nay tôi đã không nhận được điều đó xuống lỗ thỏ.
drobertson

1

Bạn có thể sử dụng PHP để thêm nội dung động vào ng-appthuộc tính.

Trong \templates\yourtemplate\index.phptập tin của bạn , thay đổi

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

đến

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

Sử dụng phương pháp này tôi sẽ cần sửa đổi mẫu chính cho mỗi trang tôi muốn thêm. Nó sẽ hoạt động, nhưng nó rất khó sử dụng khi tôi thêm nhiều trang và ng-app (s). Tôi đang tìm kiếm thêm một cách để thêm một thuộc tính tương tự như cách chúng ta chèn một tham chiếu tập lệnh vào thư viện javascript. Có cách nào để làm điều này?
drobertson

1
có thể một plugin hệ thống sẽ là cách dễ nhất. Nó có thể thao tác html được kết xuất ngay trước khi phục vụ nó cho máy khách và có sẵn tất cả dữ liệu phiên để xác định thuộc tính nào phù hợp với bạn.
Riccardo Zorn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.