Làm cách nào để thêm Khối mã cụ thể (và CSS) - Cách _right_?


9

Vì vậy, tôi đã dành hàng giờ đồng hồ hàng giờ để googling, đọc, nghiên cứu ect, nhưng không ai (kể cả Alan Storm!) Đã đánh vần điều này với tôi. Có vẻ như toàn bộ internet quan tâm đến việc thêm JS hoặc CSS vào một trang cụ thể của Magento 2, nhưng điều tôi đang tìm kiếm là thêm JS / CSS vào một khối cụ thể .

Vì vậy, đây là câu hỏi của tôi một cách ngắn gọn:

Cách tốt nhất để thêm JS (và thêm CSS) vào một khối cụ thể , để nếu khối đó hiện diện trên trang (*) thì JS / CSS được tải, nếu khối đó không có, không có CSS ​​/ JS? ?

* Điều này có nghĩa là bất kỳ khối nào cũng có thể được thiết lập, trên một trang / mẫu thông qua layout.xml, trên một trang tùy chỉnh từ mô-đun của tôi, thông qua phương thức toHtml của một khối / trang hoặc quan trọng nhất là một khối được nhúng trong WYSIWYG của một danh mục / mô tả sản phẩm / Khối CMS / Trang CMS.

Tôi đã đọc ALOT về những bài viết tuyệt vời của Alan (Kudos một lần nữa cho anh chàng này !!), chưa kể đến những bài viết khác về điều này , tuy nhiên tôi có cảm giác mọi người muốn thêm vào một trang, một trang cụ thể, không phải ở đâu khối được sử dụng.

Tôi cảm thấy tôi quen thuộc với các kỹ thuật khác nhau tuy nhiên tôi có thể đang thiếu một cái gì đó ở đây vì vậy tôi muốn có sự đồng thuận từ cộng đồng, cũng như một chút bài đăng ký cho tất cả các giao diện người dùng thông qua các nhà phát triển đầy đủ ngoài kia đang tìm kiếm câu hỏi tương tự và cân nhắc các lựa chọn như tôi.

Trước đây, trong Magento 1, tôi sẽ tìm đến hàm tạo khối, lấy bố cục, lấy tham chiếu đầu và gọi addJs / addCss ở đó hoặc nếu có thể sử dụng các phương thức trong layout.xml. Điều này có nghĩa là JS đã được "thêm" vào danh sách thay đổi trên hàm tạo khối (trước khi mức chủ đề sẽ xuất ra khối đầu). Nhưng điều này dường như không thể bây giờ.

Tôi đã đọc về cách tiếp tục thêm JS / CSS (đây không phải là "làm thế nào để tôi ???" đơn giản hơn "đây là cách chính xác / mag2 ???") và quen thuộc với những điều này kỹ thuật:

  • /view/[area[/layout/[default/page_id[.xml kỹ thuật, sử dụng các <head></head>phần tử gốc
  • Thêm một khối Head vào mô-đun của tôi, được thêm vào head.additable, với một số loại logic liên quan đến việc nếu khối của tôi được tải
  • bằng cách sử dụng \ Asset \ GroupedCollection và \ Asset \ Rep Storage Object để tiêm từ người quản lý trang / Mẫu (điều này dường như không phù hợp với các khối), thực sự là thứ tự tải ??
  • Sử dụng RequireJS và áp dụng cấu hình requestJS cho mô-đun của tôi

Tôi có bỏ lỡ điều gì không ??

Mọi người tin rằng cách chính xác sẽ là sử dụng thư viện RequireJS và các thuộc tính x-magento-init hoặc chỉ một tập lệnh có require("my_module", function(){ ... })cú pháp trong tập lệnh nội tuyến. Nhưng điều này có vẻ klunky với tôi? Tôi sẽ phải thiết lập các tập lệnh để tải tập lệnh, buộc phải nội tuyến ít nhất một số mã JS của tôi, tuy nhiên có vẻ như cách nói dễ hiểu nhất "đây là khối của tôi, bây giờ yêu cầu tôi một số JS", bằng cách đưa mã này vào phtml của tôi.

Tuy nhiên, tôi thực sự muốn có thể thực hiện điều này thông qua PHP, với tư cách là một lập trình viên phụ trợ / ngăn xếp, tôi lý tưởng muốn gói gọn JS và (lý tưởng) cho phép nhóm mặt trước của tôi viết điều này như họ muốn. Nói ngắn gọn, hãy tải (Back End Dev đến Frond End Dev "đây là phtml, ghi đè trong chủ đề nếu bạn thích, tương tự như vậy là tập tin js, libs phụ thuộc của nó và đây là css cho khối").

Điều này cho thấy __constructphương pháp với Phụ thuộc được tiêm trên hệ thống Tài sản. Tuy nhiên tôi không thể làm việc này, điều này dường như được xác nhận trong bài viết nhanh của Alan Storms tại đây: Magento Quickies: Magento 2: Thêm tập tin tài sản Frontend theo lập trình

Lưu ý ký tắt "Vì vậy, bất kỳ suy nghĩ về việc tạo các khối mang tài sản frontend của họ với họ là ra khỏi cửa sổ." ... bummer :(

Cảm ơn các bạn đã dành thời gian để đọc và xem xét . Tôi mong muốn được nghe phản hồi của bạn!

Tái bút hoặc thêm vào cuộc thảo luận hoặc đề xuất một giải pháp vững chắc!

Câu trả lời:


5

Đối với js thì dễ dàng vì sử dụng magento 2 require.js.
Vì vậy, điều này có nghĩa là bạn có thể bao gồm một js khi bạn cần nó.

Một khối phải được kết xuất (trong hầu hết các trường hợp) bởi một mẫu.
Vì vậy, bạn cần thêm điều này trong mẫu của bạn:

<script type="text/javascript">
    require([
        "jquery",
        .... //any other js dependencies you have
        "Namespace_Module/js/filename_here"
    ], function(){
        //some js code here. 
        //if you don't need any additional js code just have an empty function
    });
</script>

Bây giờ tạo tập tin js của bạn view/adminhtml|frontend/web/js/filename_here.js, nơi có tất cả mã js của bạn.

require.js sẽ biết cách lấy tệp của bạn khi được yêu cầu.

Đối với các tập tin css tôi không biết nếu nó có thể.
Các tệp css sẽ chuyển đến headphần của trang, nhưng ví dụ: nếu bạn có khối của mình bên trong nội dung của trang cms như thế này {{block class="..." template="..."}}, khi nội dung của trang cms được xử lý, html đến thời điểm đó đã được hiển thị vì vậy bạn không thể thêm bất cứ thứ gì khác vào khối đầu thông qua php. Bạn có thể thử thêm nó vào mẫu như thế <style...nhưng đó không phải là điều bạn muốn (tôi giả sử).


Cảm ơn Marius, tôi đang khám phá tuyến requestJS là một trong những khả năng tôi đã liệt kê ở trên, nhưng cảm ơn bạn vì ví dụ về sự đồng ý! Tôi đồng ý tuy nhiên nó không cung cấp giải pháp cho vấn đề CSS, tuy nhiên đây có thể là một điểm câm do trình biên dịch Ít của Magento. Ngoài ra, nó khá trừu tượng nhưng tôi cho rằng chúng ta có thể sử dụng requestJS để tải JS của mình, từ đó có thể thêm một liên kết đến biểu định kiểu cho DOM, ít nhất là không đồng bộ !!!
cygnus kỹ thuật số

Trên thực tế, tôi tìm thấy điều này trên các trang requestjs, cách tải CSS bằng RequireJS! : notifyjs.org/docs/faq-advified.html#css
cygnus kỹ thuật số

@cygnusdigital. Đẹp. Vì vậy, vấn đề đã được giải quyết :)
Marius

Xin chào Marius, vâng, đúng và không, chắc chắn đây là một ứng cử viên tốt cho giải pháp, nó phù hợp với yêu cầu nên tôi cảm ơn bạn đã đóng góp, nhưng tôi đang tìm kiếm các cuộc thảo luận và giải pháp thay thế. Có lẽ tôi chỉ là một con khủng long, tuy nhiên tôi cảm thấy có nhiều sự đồng ý hơn khi tải JS / CSS trong một hàm tạo, tức là. "nếu khối được xây dựng / bao gồm, hãy thêm khối này vào đầu." : DI tự hỏi liệu có thể thêm điều kiện vào khối head.add điều kiện khi đang bay. (tức là thêm một khối đầu từ mô-đun của tôi vào head.additable ở giai đoạn xây dựng khối).
cygnus kỹ thuật số

bạn có thể làm điều đó với các khối thông thường được thêm vào thông qua các tệp bố cục, nhưng như tôi đã giải thích, bạn không thể thực hiện điều này đối với các khối có trong nội dung trang thông qua {{block}}các lệnh, bởi vì phần đầu đã được hiển thị khi lớp khối được khởi tạo.
Marius
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.