Flag of Ukraine
SymfonyCasts stands united with the people of Ukraine

¡Hola Configuración de Layouts+!

Video not working?

It looks like your browser may not support the H264 codec. If you're using Linux, try a different browser or try installing the gstreamer0.10-ffmpeg gstreamer0.10-plugins-good packages.

Thanks! This saves us from needing to use Flash or encode videos in multiple formats. And that let's us get back to making more videos :). But as always, please feel free to message us.

¡Hola amigos! Me alegro mucho de que estéis aquí conmigo, porque este tutorial trata de algo divertido, genial y bastante poderoso. No, no se trata de un felino enmascarado que lucha contra el crimen y que tiene superpoderes, aunque eso sería genial. Este tutorial trata sobre el paquete Netgen Layouts.

¿Qué es Layouts?

Esta biblioteca existe desde hace años, pero hace poco que la he probado. Layouts es, sencillamente, una forma de tomar cualquier aplicación Symfony existente y añadir la capacidad de reorganizar dinámicamente la organización de tus páginas sobre la marcha a través de una sección de administración... incluyendo la adición de nuevo contenido dinámico. Es una mezcla muy interesante de una aplicación Symfony normal con controladores y plantillas Twig... además de funciones de gestión de contenidos que puedes activar página por página. A mí me gusta especialmente el enfoque de la opción

¿Quién necesita diseños?

¿Por qué te tomarías la molestia de usar Layouts en tu aplicación Symfony? Bueno, no todos los proyectos lo necesitan. Pero si un usuario administrador necesita poder hacer cambios en la organización de tu sitio y su contenido, entonces esto es para ti. Esto incluye poder añadir y cambiar colecciones de elementos -como productos destacados- justo en el centro de una página existente, reorganizar el contenido de una plantilla Twig más arriba o más abajo en la página, añadir un contenido personalizable completamente nuevo a una página o crear páginas de destino temporales y permitir que todo esto lo hagan los usuarios normales. Puedes aprovechar Layouts para una sola página de tu sitio, dejando que todo lo demás sea una aplicación normal de Symfony, o todas las páginas de tu sitio pueden utilizarlo. Como he dicho, puedes optar por los Layouts como mejor te parezca.

Configuración del proyecto

Podría seguir y seguir, pero probablemente sea mejor ver la magia de Layouts en acción. Es súper divertido jugar con él, así que definitivamente deberías descargar el código del curso desde esta página y codificar junto a mí. Cuando descomprimas el archivo, encontrarás un directoriostart/ con el mismo código que ves aquí. Abre este archivo README.mdpara ver todos los detalles de la configuración. Yo ya he ido a mi terminal, he instalado mis activos Node mediante

yarn install

y he ejecutado:

yarn watch

para construir mis archivos CSS y JS. Pero todo eso es sólo para que nuestra aplicación y este tutorial sean más realistas. Layouts no requiere que usemos Encore y no se mete con nuestro CSS y JS en absoluto.

De todos modos, el último paso en el README es abrir otra pestaña del terminal y ejecutar

symfony serve -d

para iniciar un servidor web en https://127.0.0.1:8000 - Voy a hacer trampas y hacer clic en eso. Y... hola nuevo proyecto paralelo: ¡es Bark & Bake! Escucha, los perros están bastante cansados de nuestros perezosos intentos de cocina canina. ¿Problemas crujientes? No, gracias. Así que hemos construido este sitio para inspirar a la gente a ser los mejores chefs que puedan ser... para sus perros.

Se trata de una aplicación Symfony bastante tradicional con algunos controladores y algunas plantillas Twig. También tiene dos entidades: Una entidad User para la seguridad, y una entidad Recipe. En el sitio, tenemos una página de inicio que muestra las últimas y mejores recetas, una sección de recetas y la posibilidad de abrir una receta específica, para que podamos seguirla en la cocina. Eso es todo. Esto de las habilidades no está implementado en absoluto todavía.

Así que, aparte de poder editar los detalles de cada receta a través de un área de administración, ¡este es un sitio estático! ¡Es hora de cambiar eso! Pronto podremos tomar esta página de inicio -que está escrita mediante un controlador y una plantilla Symfony normales... como puedes ver aquí- y utilizar diseños para insertar contenido y reorganizar cosas de forma dinámica

Instalar los layouts

Así que vamos a instalar Layouts. Busca tu terminal y ejecuta:

composer require netgen/layouts-standard

Esto descargará varios paquetes, incluyendo un par de bundles nuevos. Cuando termine, ejecuta

git status

para ver que también nos ha proporcionado dos nuevos archivos de rutas, que añaden algunas rutas de administración que vamos a ver en unos minutos.

Ejecuta las migraciones

Layouts también requiere algunas tablas adicionales de la base de datos donde se almacena la información sobre los diseños que crearemos, así como cualquier contenido personalizado que vayamos a poner en ellos. Veremos todo eso en la sección de administración de Diseños en un minuto. Para añadir las tablas necesarias, desplázate hacia arriba y copia esta ingeniosa línea doctrine:migrations:migrate.

Esto es genial. Los paquetes de layouts vienen con migraciones... y esto las ejecuta. Pega este comando, pero si utilizas la configuración de la base de datos de Docker que describimos en el LÉEME - yo lo hago - entonces modifica esto para que empiece consymfony console para que pueda inyectar las variables de entorno de Docker que apuntan a nuestra base de datos:

symfony console doctrine:migrations:migrate --configuration=vendor/netgen/layouts-core/migrations/doctrine.yml

Y... ¡perfecto! Una advertencia es que estas migraciones están escritas específicamente para MySQL. Por ahora, Layouts sólo admite MySQL.

Ignorar las tablas personalizadas

En su mayor parte, Layouts va a gestionar por completo todas las tablas que acabamos de añadir: no necesitamos hacer nada con ellas. Pero ahora que existen en nuestra base de datos, si añadiéramos una nueva entidad y generáramos una migración para ella... la migración intentaría eliminar todas las tablas de Netgen Layouts. ¡Observa! Ejecuta:

symfony console doctrine:schema:update --dump-sql --complete

Esto imita la generación de una migración, y... ¡sí! Quiere soltar todas las tablas de Diseños. Para solucionarlo, entra en config/packages/doctrine.yaml y, endbal, añade schema_filter, y pasa una expresión regular... que puedes copiar de la documentación de Layouts:

doctrine:
dbal:
... lines 3 - 7
schema_filter: ~^(?!nglayouts_)~
... lines 9 - 44

¡Perfecto! Con esto, si volvemos a ejecutar el comando doctrine:schema:update de nuevo...

symfony console doctrine:schema:update --dump-sql --complete

Está limpio, excepto por doctrine_migration_versions. Pero, no te preocupes: el comandomake:migration es lo suficientemente inteligente como para no dejar caer su propia tabla.

Bien, Netgen Layouts está instalado y tiene las tablas de la base de datos que necesita. Si volvemos a actualizar nuestro sitio ahora... ¡felicidades! No ha cambiado absolutamente nada, aunque tenemos un bonito icono de la barra de herramientas de depuración web aquí abajo del que hablaremos más adelante.

Esto, de nuevo, es una de las grandes cosas de Layouts. Al instalarlo no se apodera de tu aplicación. Layouts no se utiliza en absoluto para representar esta página.

A continuación, vamos a sumergirnos en el área de administración de Layouts para crear nuestro primer diseño. Luego, veremos cómo interactúa con las páginas reales de nuestro sitio.

Leave a comment!

16
Login or Register to join the conversation
Tac-Tacelosky Avatar
Tac-Tacelosky Avatar Tac-Tacelosky | posted hace 2 días

This looks like an awesome tool. Starting at the end (the 'finish' folder in the source), I'd like to see the final site with data. But there are no layouts. I see there's a nglayouts:import console command, butt I don't the see layouts from this tutorial there. Is it possible to get those layouts, so I can see it running locally without having to manually create each layout? Or am I missing something during the setup.

Reply

Hey Tac,

Are you sure you're in the finish/ code? Are you sure you're looking at the course download code of this exact tutorial? I just downloaded the zip archive of the course project code and I can see "src/Layouts/" and "templates/nglayouts/" folders with files inside.

Please, double check you're in the correct folder.

Cheers!

Reply
Joris-Mak Avatar
Joris-Mak Avatar Joris-Mak | posted hace 7 meses

Starting now, I'm excited to see what this does.

In our agency we do Symfony or Drupal... and in a lot of projects which we start as Symfony, we end up doing 'a little bit of CMS-alike functionality'. So I've been looking for some bundle or something to add something simple to an existing project.

Recently, Sulu was made Symfony 6.x compatible, so I jumped on it. And I'm very, very happy with the CMS part. The documentation is a bit sketchy, but that might be because I'm used to the Symfony pages :wink:.

But that Sulu Admin that is written as a single React app is a bit of a downer. It means we either need to ship with two admins, one for our normal admin stuff (using custom code, or Easy Admin, or whatever) and then one for the CMS part. Yes, it can be extended, but with quite some scaffolding and then you 'only' get a simple CRUD style, like a data table with an add/edit form. That often won't be enough in the real world, and that means writing custom React views to add something to the admin...while I prefer to keep it in twig / php, or at least use my Vue expertise... but to learn React just to extend an CMS admin...

Reply

Hey Joris!

Thanks for sharing your thoughts about Sulu, and yea... I got your point, it's a bummer to be forced to learn new technology just because a third-party library is not flexible enough.
I hope you like Netgens, and let us know what you think about it once you've finished with the tutorial ;)

Cheers!

Reply

Hi Ryan!
What about license agreement of code in example? Can I customize it for any reason of use?

Reply

Hey Tasatko,

I'm afraid I don't fully understand your question. Do you mean if you can use the code used in this tutorial in other places?

Reply

Hey Tasatko,

Sorry for my super late reply, the holidays got in the middle. Feel free to use our code samples :)

Cheers!

1 Reply
Ruslan Avatar

HI ,
I get small issue:
when I run :
composer require netgen/layouts-standard
I got this error:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1310720 bytes) in /workspaces/netGen/vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php on line 71

php -i | grep memory_limit
memory_limit => 128M => 128M

Should I set more limit?

Reply
Victor Avatar Victor | SFCASTS | Ruslan | posted hace 8 meses | HIGHLIGHTED

Hey Ruslan,

Yep, you should :) 128M is too little for CLI when you try to run composer require/update commands. Actually, there is a better way, check the official docs to know more options how to fix it: https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors

Cheers!

2 Reply
Ruslan Avatar

Hi Victor,
Thank for that advice, it's helpful.

BR.
Ruslan.

Reply

Hey Ruslan,

Great, thanks for confirming it helped :)

Cheers!

Reply
Richard Avatar

Hi, I'd like so much to go on in this course but i'm stuck with this error :
Unable to find file "@LiveComponentBundle/Resources/config/routing/live_component.xml". [...]
I first downloaded the source code of the course : 'start'.

I did adjust the .env file to fit MySQL for Mac OS (credentials : root:root, base:'layouts')
Followed scrupulously the readMe text and I updated the vendor folder with composer and installed yarn.
Then yarn watch and start the php server.

Last, whether I include "docker-compose up -d" or not, I get this error.
Unable to find file "@LiveComponentBundle/Resources/config/routing/live_component.xml"
Same thing with the 'finish' folder :-(
What did I missed ?

Thanks for attention, Richard.

Reply

Hey @Richard!

Ah, I know the issue! Since you did a composer update, also do a composer recipes:update symfony/ux-live-component. Your upgrade probably upgraded you to the latest LiveComponents package, and a config file moved around in that version (updating the recipe will update the path to that config file).

Cheers!

Reply
Richard Avatar
Richard Avatar Richard | weaverryan | posted hace 8 meses | edited

I had to complete with a

composer recipes:install symfony/ux-live-component --force -v

but, anyway it's working now.
Bonne soirée.

1 Reply

Yes, you're right about those flags. I'm glad it's working now! I'm the one who made that change on live components, so it's my own fault 😜

1 Reply
Cat in space

"Houston: no signs of life"
Start the conversation!

What PHP libraries does this tutorial use?

// composer.json
{
    "require": {
        "php": ">=8.1.0",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "babdev/pagerfanta-bundle": "^3.7", // v3.7.0
        "doctrine/doctrine-bundle": "^2.7", // 2.7.0
        "doctrine/doctrine-migrations-bundle": "^3.2", // 3.2.2
        "doctrine/orm": "^2.13", // 2.13.3
        "easycorp/easyadmin-bundle": "^4.4", // v4.4.1
        "netgen/layouts-contentful": "^1.3", // 1.3.2
        "netgen/layouts-standard": "^1.3", // 1.3.1
        "pagerfanta/doctrine-orm-adapter": "^3.6",
        "sensio/framework-extra-bundle": "^6.2", // v6.2.8
        "stof/doctrine-extensions-bundle": "^1.7", // v1.7.0
        "symfony/console": "5.4.*", // v5.4.14
        "symfony/dotenv": "5.4.*", // v5.4.5
        "symfony/flex": "^1.17|^2", // v2.2.3
        "symfony/framework-bundle": "5.4.*", // v5.4.14
        "symfony/monolog-bundle": "^3.0", // v3.8.0
        "symfony/proxy-manager-bridge": "5.4.*", // v5.4.6
        "symfony/runtime": "5.4.*", // v5.4.11
        "symfony/security-bundle": "5.4.*", // v5.4.11
        "symfony/twig-bundle": "5.4.*", // v5.4.8
        "symfony/ux-live-component": "^2.x-dev", // 2.x-dev
        "symfony/ux-twig-component": "^2.x-dev", // 2.x-dev
        "symfony/validator": "5.4.*", // v5.4.14
        "symfony/webpack-encore-bundle": "^1.15", // v1.16.0
        "symfony/yaml": "5.4.*", // v5.4.14
        "twig/extra-bundle": "^2.12|^3.0", // v3.4.0
        "twig/twig": "^2.12|^3.0" // v3.4.3
    },
    "require-dev": {
        "doctrine/doctrine-fixtures-bundle": "^3.4", // 3.4.2
        "symfony/debug-bundle": "5.4.*", // v5.4.11
        "symfony/maker-bundle": "^1.47", // v1.47.0
        "symfony/stopwatch": "5.4.*", // v5.4.13
        "symfony/web-profiler-bundle": "5.4.*", // v5.4.14
        "zenstruck/foundry": "^1.22" // v1.22.1
    }
}
userVoice