Então, eu passei literalmente horas e horas pesquisando, lendo, estudando etc., mas ninguém (nem mesmo Alan Storm!) Me explicou isso. Parece que toda a Internet está interessada em adicionar JS ou CSS a uma página específica do Magento 2, mas o que estou procurando é adicionar JS / CSS a um bloco específico .
Então, aqui está a minha pergunta em poucas palavras:
Qual é a melhor maneira de adicionar JS (e adicionalmente CSS) a um bloco específico , para que, se o bloco estiver presente na página (*), o JS / CSS seja carregado, se o bloco não estiver lá, não haverá CSS / JS? ?
* Isso significa que qualquer lugar em que um bloco possa ser configurado, em uma página / modelo via layout.xml, em uma página personalizada do meu módulo, pelo método toHtml de um bloco / página ou, mais importante, em um bloco incorporado no WYSIWYG de uma categoria / descrição do produto / Bloco CMS / Página CMS.
Eu li vários ótimos artigos de Alan (parabéns de novo para esse cara !!), sem mencionar as resmas de outros artigos , mas tenho a sensação de que todos querem adicionar a uma página, uma página específica, nunca onde bloco é usado.
Sinto que estou familiarizado com as várias técnicas, no entanto, posso estar faltando alguma coisa aqui, por isso gostaria de obter um consenso da comunidade, bem como, talvez, um post de sinalização para todos os front-ends até os desenvolvedores de pilha cheia por aí procurando perguntas semelhantes e ponderando as opções como eu.
Anteriormente, no Magento 1, eu procurava no construtor de blocos, obtinha o layout, obtinha a referência principal e chamava addJs / addCss lá, ou, se possível, usava os métodos no layout.xml. Isso significaria que o JS foi "adicionado" à lista de recursos no construtor de blocos (antes que o nível do tema produzisse o bloco principal). Mas isso não parece possível agora.
Eu li sobre como proceder para adicionar JS / CSS (este não é um simples "como é que eu ???", este é um resumo mais "do que é a maneira correta / mag2 ???") e estou familiarizado com estes técnicas:
- /view/[area}/layout/[default/page_idExit.xml, usando os
<head></head>
elementos raiz - Adicionando um bloco Head ao meu módulo, adicionado em head.additional, com algum tipo de lógica sobre se meu bloco está carregado
- usando os objetos \ Asset \ GroupedCollection e \ Asset \ Repository para injetar do fabricante de uma página / modelo (embora isso não pareça estar com blocos), potencialmente a ordem de carregamento?
- Usando RequireJS e aplicando uma configuração requireJS ao meu módulo
Perdi alguma coisa ??
Acredita-se que a maneira correta seria usar a biblioteca RequireJS e os atributos x-magento-init ou apenas um script com uma require("my_module", function(){ ... })
sintaxe em um script embutido. Mas isso me parece desajeitado? Eu teria que configurar scripts para carregar scripts, sou forçado a incorporar pelo menos parte do meu JS, no entanto, parece a maneira mais sustentável de dizer "aqui está meu bloco, agora é necessário um pouco de JS", inserindo-o no meu phtml.
No entanto, eu realmente gostaria de poder fazer isso via PHP, como um programador de back-end / stack que eu gostaria idealmente de encapsular o JS de distância e (idealmente) permitir que minha equipe de front-end escreva isso como quiser. Resumindo, cuide do carregamento (Back Back Dev to Frond End Dev "aqui está o phtml, substitua o tema, se quiser, da mesma forma o arquivo js, suas bibliotecas dependentes e o CSS para o bloco").
Isso sugere o __construct
método com dependências injetadas no sistema de ativos. No entanto, não consigo fazer isso funcionar, isso parece confirmado no artigo rápido de Alan Storms aqui: Magento Quickies: Magento 2: Adicionando arquivos de recursos de front-end programaticamente
Observe a inscrição "Portanto, qualquer ideia de criar blocos que carregam seus recursos de front-end está fora da janela". ... chatice :(
Obrigado por reservar um tempo para ler e considerar . Estou ansioso para ouvir suas respostas!
PS> Obviamente, esse é o StackExchange, por isso vou marcar a resposta como o melhor caminho para o que estou tentando alcançar (bloquear o carregamento de recursos específicos). No entanto, tentarei também listar como referências na parte inferior do meu post todas e quaisquer respostas que aumentam a discussão ou sugerem uma solução sólida!