First, if vendor
directory has not been created, you have to install composer dependencies using:
composer install
You can install this plugin into your CakePHP application using composer.
The recommended way to install composer packages is:
composer require bedita/web-tools
This helper provides some methods to setup Custom Elements with some app variables in order to initialize client side JavaScript components. It aims to avoid the generation of inline JS dictionaries or variables using declarative assignments to HTML nodes. String and numeric values are added as node attributes, while objects and arrays using inline scripts.
Create a js file in the webroot/js
which contains the Custom Element definition:
webroot/js/components/awesome-video.js
class AwesomeVideo extends HTMLElement {
connectedCallback() {
this.video = document.createElement('video');
this.video.src = this.getAttribute('src');
this.appendChild(this.video);
}
}
customElements.define('awesome-video', AwesomeVideo);
Now you can initialize the element in a twig template:
templates/Pages/document.twig
{{ WebComponents.element('awesome-video', { src: attach.uri }, 'components/awesome-video') }}
You can also extends native tags in order to setup simple interactions with the is
method:
webroot/js/components/awesome-table.js
class AwesomeTable extends HTMLElement {
connectedCallback() {
this.addEventListener('click', (event) => {
let th = event.target.closest('[sort-by]');
if (th) {
this.sortBy(th.getAttribute('sort-by'));
}
}):
}
sortBy(field) {
// ...
}
}
customElements.define('awesome-table', AwesomeTable, { extends: 'table' });
templates/Pages/users.twig
<table {{ WebComponents.is('awesome-table', {}, 'components/awesome-table')|raw }}>
<thead>
<th>Email</th>
<th>Name</th>
</thead>
<tbody>
{% for user in users %}
<tr>
<td>{{ user.attributes.email }}</td>
<td>{{ user.attributes.name }}</td>
</tr>
{% endfor %}
</tbody>
</table>