gstreamer0.10-ffmpeg
gstreamer0.10-plugins-good
packages.
Estoy bastante seguro de que nuestro nuevo item_view
está configurado correctamente. Tenemositem\value_type: contentful_entry
, que sé que es correcto... y luego estamos utilizando contentful\content_type
ajustado a skill
para que esto sólo afecte a las habilidades:
netgen_layouts: | |
... lines 2 - 12 | |
view: | |
item_view: | |
... lines 15 - 21 | |
# default = frontend | |
default: | |
... lines 24 - 28 | |
contentful_entry/skill: | |
template: '@nglayouts/item/contentful_entry/skill.html.twig' | |
match: | |
item\value_type: 'contentful_entry' | |
contentful\content_type: 'skill' | |
... lines 34 - 41 |
Pero... parece que no funciona en el frontend. Antes, cuando ejecutamosdebug:config
, vimos que el problema reside en el orden de la configuración. Layouts lee de arriba abajo cuando decide qué "vista" utilizar. Así que mira ésta primero, ve que la value_type
es contentful_entry
... y simplemente se detiene. Para solucionarlo, tenemos que invertir nuestra configuración.
Vale, entonces... ¿por qué está en este orden para empezar? ¿Por qué nuestra configuración aparece al final? Esto se debe a la forma en que Symfony carga la configuración: primero carga la configuración del bundle - como la del paquete Contentful o Layouts - y luego carga nuestros archivos de configuración. Y ese suele ser el orden que queremos Nos permite anular la configuración establecida en los bundles.
Pero en este caso, queremos lo contrario. ¿Cómo lo conseguimos? Pidiendo a Symfony que preañada nuestra configuración.
En el directorio config/
, crea un nuevo directorio llamado prepends/
y mueve la configuración de Netgen Layouts a él. Esto evitará que Symfony cargue ese archivo de la forma normal: vamos a cargarlo manualmente.
El siguiente paso es un poco técnico. En src/
, crea una clase "extensión" llamada, qué tal, AppExtension
. Voy a pegar el código: puedes cogerlo del bloque de código de esta página:
... lines 1 - 2 | |
namespace App; | |
use Symfony\Component\Config\Resource\FileResource; | |
use Symfony\Component\DependencyInjection\ContainerBuilder; | |
use Symfony\Component\DependencyInjection\Extension\Extension; | |
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; | |
use Symfony\Component\Yaml\Yaml; | |
class AppExtension extends Extension implements PrependExtensionInterface | |
{ | |
public function load(array $configs, ContainerBuilder $container) | |
{ | |
} | |
public function prepend(ContainerBuilder $container) | |
{ | |
$configFile = __DIR__ . '/../config/prepends/netgen_layouts.yaml'; | |
$config = Yaml::parse((string) file_get_contents($configFile)); | |
$container->prependExtensionConfig('netgen_layouts', $config['netgen_layouts']); | |
$container->addResource(new FileResource($configFile)); | |
} | |
} |
Esto carga nuestro archivo de configuración de forma normal... excepto que se le añadirá una extensión.
Paso final. Para llamar a este método, abre la clase Kernel
. Después deuse MicroKernelTrait
, añade configureContainer as baseConfigureContainer
:
... lines 1 - 10 | |
class Kernel extends BaseKernel | |
{ | |
use MicroKernelTrait { configureContainer as baseConfigureContainer; } | |
... lines 14 - 20 | |
} |
Esto añade el método configureContainer
de MicroKernelTrait
a esta clase como haría normalmente un trait... excepto que lo renombra abaseConfigureContainer
. Hacemos esto para poder definir nuestro propio métodoconfigureContainer()
. Copia la firma configureContainer()
del trait, pégala, pulsa "OK" para añadir las sentencias use
y luego llama a$this->baseConfigureContainer()
pasando por $container
, $loader
y $builder
:
... lines 1 - 5 | |
use Symfony\Component\Config\Loader\LoaderInterface; | |
use Symfony\Component\DependencyInjection\ContainerBuilder; | |
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; | |
... lines 9 - 10 | |
class Kernel extends BaseKernel | |
{ | |
... lines 13 - 14 | |
private function configureContainer(ContainerConfigurator $container, LoaderInterface $loader, ContainerBuilder $builder): void | |
{ | |
$this->baseConfigureContainer($container, $loader, $builder); | |
... lines 18 - 19 | |
} | |
} |
El método configureContainer()
del trait se encarga de cargarservices.yaml
y todos los archivos de config/packages/
. Todo eso son cosas buenas que queremos seguir haciendo. Pero después de hacer eso, añade una cosa más: $builder->registerExtension(new AppExtension())
:
... lines 1 - 10 | |
class Kernel extends BaseKernel | |
{ | |
... lines 13 - 14 | |
private function configureContainer(ContainerConfigurator $container, LoaderInterface $loader, ContainerBuilder $builder): void | |
{ | |
$this->baseConfigureContainer($container, $loader, $builder); | |
$builder->registerExtension(new AppExtension()); | |
} | |
} |
De nuevo, sí, esto es fastidiosamente técnico. Pero gracias a estas dos piezas, nuestra configuraciónnetgen_layouts.yaml
estará preconfigurada.
¡Compruébalo! Vuelve a ejecutar el comando debug:config
:
php ./bin/console debug:config netgen_layouts view.item_view
Desplázate hacia arriba y... ¡sí! ¡Nuestra configuración está ahora arriba! Y cuando actualizamos... ¡woohoo! ¡Vemos el texto!
A continuación: vamos a hacer que esta plantilla se muestre exactamente igual que las habilidades codificadas. A continuación, crearemos una segunda plantilla de elementos para personalizar la representación del tipo de contenido "Anuncio" de Contentful.
"Houston: no signs of life"
Start the conversation!
// 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
}
}