Así que he pasado literalmente horas en horas buscando en Google, leyendo, estudiando ect, pero nadie (¡ni siquiera Alan Storm!) Me lo ha explicado. Parece que todo Internet está interesado en agregar JS o CSS a una página en particular de Magento 2, pero lo que estoy buscando es agregar JS / CSS a un bloque en particular .
Entonces, aquí está mi pregunta en pocas palabras:
¿Cuál es la mejor manera de agregar JS (y adicionalmente CSS) a un bloque en particular , de modo que si el bloque está presente en la página (*) se carga JS / CSS, si el bloque no está allí, no hay CSS / JS? ?
* Esto significa que en cualquier momento se puede configurar un bloque, en una página / plantilla a través de layout.xml, en una página personalizada desde mi módulo, a través del método toHtml de un bloque / página o, lo más importante, un bloque incrustado en un WYSIWYG de una categoría / descripción del producto / CMS Block / CMS Page.
He leído MUCHOS artículos geniales de Alan (¡Felicitaciones de nuevo a este tipo!), Sin mencionar las resmas de otros artículos sobre esto , sin embargo, tengo la sensación de que todos quieren agregar a una página, una página específica, no donde sea que Se utiliza el bloque.
Siento que estoy familiarizado con las diversas técnicas, sin embargo, es posible que me falte algo aquí, así que me gustaría un consenso de la comunidad, así como tal vez un poco de una señal para todos los participantes en el frente a los desarrolladores de pila completa que buscan preguntas similares y reflexionando sobre las opciones como soy.
Anteriormente, en Magento 1, buscaba el constructor de bloques, obtenía el diseño, obtenía la referencia principal y llamaba a addJs / addCss allí, o si era posible, usaba los métodos en el layout.xml. Esto significaría que JS fue "agregado" a la lista de recursos en el constructor de bloques (antes de que el nivel del tema produjera el bloque principal). Pero esto no parece posible ahora.
He leído sobre cómo agregar JS / CSS (esto no es un simple "¿cómo lo hago ???" esto es más concisa "¿cuál es la forma correcta / mag2 ???") y estoy familiarizado con estos tecnicas:
- /view/[areafont>/layout/[default/page_idfont>.xml técnica, utilizando los
<head></head>
elementos raíz - Agregar un bloque Head a mi módulo, agregado a head.additional, con algún tipo de lógica con respecto a si mi bloque está cargado
- usando \ Asset \ GroupedCollection y \ Asset \ Repository Objects para inyectar desde el custructor de una página / plantilla (aunque esto no parece ork con bloques), ¿potencialmente el orden de carga?
- Usando RequireJS y aplicando una configuración requireJS a mi módulo
¿Me he perdido algo?
Uno cree que la forma correcta sería usar la biblioteca RequireJS y los atributos x-magento-init o simplemente un script con una require("my_module", function(){ ... })
sintaxis en un script en línea. ¿Pero esto me parece torpe? Tendría que configurar scripts para cargar scripts, me veo obligado a incorporar al menos algunos de mis JS, sin embargo, parece la forma más segura de decir "aquí está mi bloque, ahora necesita un poco de JS", introduciendo esto en mi phtml.
Sin embargo, realmente me gustaría poder hacer esto a través de PHP, como programador de backend / stack, idealmente me gustaría encapsular el JS y (idealmente) permitir que mi equipo front-end escriba esto como lo deseen. En resumen, cuide la carga (Back End Dev to Frond End Dev "aquí está el phtml, anule el tema si lo desea, del mismo modo, aquí está el archivo js, sus libs dependientes y aquí está el CSS para el bloque").
Esto sugiere el __construct
método con dependencias inyectadas en el sistema de activos. Sin embargo, no puedo hacer que esto funcione, esto parece confirmarse en el artículo rápido de Alan Storms aquí: Magento Quickies: Magento 2: Agregar archivos de activos frontend mediante programación
Tenga en cuenta el cierre de sesión "Entonces, cualquier idea de crear bloques que lleven sus activos frontend con ellos está fuera de la ventana". ... fastidio :(
Gracias a todos por tomarse el tiempo de leer y considerar . ¡Espero escuchar sus respuestas!
PD> Obviamente, este es StackExchange, así que marcaré la respuesta como el mejor curso para lo que estoy tratando de lograr (bloquear la carga de recursos específicos), sin embargo, me esforzaré por enumerar también como referencias en la parte inferior de mi publicación todas y cada una de las respuestas que se suman a la discusión o sugieren una solución sólida!