table http://drupaladictos.es/ es Tablas | Creación programáticamente en Drupal 9 http://drupaladictos.es/curso/programacion-drupal/tablas-creacion-programaticamente-en-drupal-9 <span class="field field--name-title field--type-string field--label-hidden">Tablas | Creación programáticamente en Drupal 9</span> <div class="field field--name-field-contenidos-cap-gratis field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <style>#video-only-974 .play-btn:hover::after { border-left: 15px solid #1fd7d9; transform: scale(20); border-left: 15px solid #fff; } #video-only-974 .play-btn::before { border: 5px solid #1fd7d9; } #video-only-974 .play-btn { background: radial-gradient(#1fd7d9 50%, rgba(66, 109, 202, 0.4) 52%); }</style> <div class="paragraph paragraph--type--video-only paragraph--view-mode--default" id="vol-974"> <section id="video-only-974" class="about area-padding video-block-wrapper"> <div class="col video-box"> <div class="portada"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-07/portada-gratuito-grande_2.jpg?itok=8dBQYXT7" class="img-fluid" alt=""> <div class="field field--name-vo-youtube-video field--type-entity-reference field--label-visually_hidden"> <div class="field__label visually-hidden">Video de Youtube</div> <div class="field__item"><article class="media media--type-remote-video media--view-mode-diapositiva-1200x650"> <div class="field field--name-field-media-oembed-video field--type-string field--label-visually_hidden"> <div class="field__label visually-hidden">URL de Video remoto</div> <div class="field__item"><div class="modal micromodal-slide" id="modal-media-695-0-field-media-oembed-video" aria-hidden="true"> <div class="modal__overlay" tabindex="-1" data-micromodal-close> <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-media-695-0-field-media-oembed-video-content"> <a class="modal__btn" data-micromodal-close aria-label="Close this dialog window">X</a> <main class="modal__content" id="modal-media-695-0-field-media-oembed-video-content"> <div class="videoWrapper"><iframe src="/media/oembed?url=https%3A//youtu.be/gunodhU9itA&amp;max_width=0&amp;max_height=0&amp;hash=SC4EcU9-gYxF9FkOuB35MGOofcm357IhVqq0Q3w7og4" frameborder="0" allowtransparency="" class="media-oembed-content" title="Time Value of Money"></iframe></div> </main> </div> </div> </div> <div><a class="myButton" data-micromodal-trigger="modal-media-695-0-field-media-oembed-video"><span class="btn play-btn">.</span></a></div> </div> </div> </article> </div> </div> </div> </div> </section> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--text-only paragraph--view-mode--default" id="txonly-1176" style="background-color: ;border: solid px;border-color: #096ba0;border-radius: 5px;padding: 10px;"> <div class="clearfix text-formatted field field--name-to-text field--type-text-long field--label-visually_hidden"> <div class="field__label visually-hidden">Texto</div> <div class="field__item"><p>     A veces, cuando trabajamos en proyectos web utilizando Drupal, nos encontraremos con la necesidad de añadir en un solo módulo, todos los elementos que vamos a utilizar, ya sea porque se trate de un proyecto existente al que vamos a agregar una nueva funcionalidad, o por que este desarrollo pueda implementarse en varios proyectos a la vez, compartiéndolo con otros miembros del equipo de trabajo o de una comunidad de desarrolladores.</p> <p>     Ya hemos explicado <a href="/actualidad/como-crear-un-modulo-en-drupal-9" target="_blank">Cómo crear un módulo en Drupal 9</a> y además ya tienes los conocimientos necesarios para saber <a href="/actualidad/como-crear-formularios-programaticamente-en-drupal-9" target="_blank">Cómo crear formularios programáticamente en Drupal 9</a>, por lo tanto, el próximo paso, antes de desarrollar módulos más complejos, sería descubrir la forma de añadir tablas en tu base de datos, para que puedas controlar los elementos que instalarás relacionados con tu módulo.</p> <p>     Por esta razón, hoy nos enfocaremos en la implementación de los requerimientos necesarios para crear, programáticamente, una o varias tablas, dependiendo de la necesidad que tengas para tu proyecto, utilizando el hook_schema(), dentro del archivo install en nuestro proyecto Drupal 9. </p> <h2>Requisitos:</h2> <ul><li><a href="/actualidad/como-crear-un-modulo-en-drupal-9" target="_blank">Cómo crear un módulo en Drupal 9</a> </li> </ul><h2>Cómo crear tablas programáticamente en Drupal 9</h2> <p>    Hoy aprenderemos a utilizar el archivo "<strong>MIMODULO.install</strong>" dentro de nuestro módulo personalizado. Si ponemos atención en la manera de implementarlo dentro de nuestros proyectos, tendremos el conocimiento suficiente para crear módulos más complejos, que nos permitirán la creación de contenidos directamente dentro de la base de datos de Drupal.</p> <p>     Un ejemplo práctico, que explicaremos en otro artículo y su respectivo video, sería un módulo que al instalarse, además de crear una tabla, con la configuración necesaria para guardar la información sobre los participantes a un curso, nos añadiera un formulario de inscripción, conectado a esta tabla, con el cual los usuarios pudieran rellenarla directamente.</p> <h3>       Paso 1 Creación de tu módulo:</h3> <p>          Lo primero que deberías saber es cómo crear un módulo personalizado. Esencialmente para este ejemplo, lo que necesitarás será una carpeta con el nombre de tu módulo y dentro el archivo con el nombre del módulo y la extensión, eje.: "mimodulo.info.yml"</p> <pre> name: Mi tabla description: 'Crea una tabla' package: drupaladicto type: module core_version_requirement: ^8.8.0 || ^9.0 </pre> <h3>     Paso  2 Creación del archivo .install:</h3> <p>     En el archivo "MIMODULO.install", es donde tendremos que indicarle a Drupal la configuración para que pueda crear nuestra tabla, para ello utilizaremos el <a href="https://api.drupal.org/api/drupal/core%21modules%21file%21file.install/9.0.x" target="_blank">"hook_schema()"</a>, que se encargará de interpretar los datos y creará dicha tabla.</p> <pre> /** * Implment hook_schema() */ function mi_tabla_schema() { $schema['mitabla'] = array( 'description' =&gt; 'Guarda los datos de los participantes', 'fields' =&gt; array( 'pid' =&gt; array( 'type' =&gt; 'serial', 'not null' =&gt; TRUE, 'description' =&gt; 'Primary Key: Identificador único del participante.', ), 'uid' =&gt; array( 'type' =&gt; 'int', 'not null' =&gt; TRUE, 'default' =&gt; 0, 'description' =&gt; "Creador de usuarios {users}.uid", ), 'nombre' =&gt; array( 'type' =&gt; 'varchar', 'length' =&gt; 255, 'not null' =&gt; TRUE, 'default' =&gt; '', 'description' =&gt; 'Nombre del participante.', ), 'apellido' =&gt; array( 'type' =&gt; 'varchar', 'length' =&gt; 255, 'not null' =&gt; TRUE, 'default' =&gt; '', 'description' =&gt; 'Apellido del participante.', ), 'edad' =&gt; array( 'type' =&gt; 'int', 'not null' =&gt; TRUE, 'default' =&gt; 0, 'size' =&gt; 'tiny', 'description' =&gt; 'Edad del participante.', ), ), 'primary key' =&gt; array('pid'), 'indexes' =&gt; array( 'nombre' =&gt; array('nombre'), 'apellido' =&gt; array('apellido'), 'edad' =&gt; array('edad'), ), ); return $schema; }</pre> <h3>     Explicación:</h3> <p>          En la primera parte del hook_schema(), estamos definiendo el nombre de la tabla dentro de un array global, que es nuestro esquema $schema['mi_tabla'] = [ ], dentro de este array general, tendremos dos elementos fundamentales, que son el campo con la descripción de la tabla y a continuación otro array general, llamado "'fields' =&gt; array()", que será donde iremos añadiendo todos los campos, con sus respectivos atributos, como tipo de campo, si es nulo, si tendrá valor por defecto, etc.</p> <pre> $schema['mitabla'] = array( 'description' =&gt; 'Guarda los datos de los participantes', 'fields' =&gt; array( 'pid' =&gt; array( 'type' =&gt; 'serial', 'not null' =&gt; TRUE, 'description' =&gt; 'Primary Key: Identificadro único del participante.', ), 'uid' =&gt; array( 'type' =&gt; 'int', 'not null' =&gt; TRUE, 'default' =&gt; 0, 'description' =&gt; "Creator user's {users}.uid", ), 'nombre' =&gt; array( </pre> <p>     Luego de definir todos los campos, encontraremos en la parte inferior del "hook_schema()", el lugar donde definiremos la clave primaria de nuestra tabla, acompañada de los índices.</p> <pre> ), 'primary key' =&gt; array('pid'), 'indexes' =&gt; array( 'nombre' =&gt; array('nombre'), 'apellido' =&gt; array('apellido'), 'edad' =&gt; array('edad'), ),</pre> <p>     Por último, y no menos importante, está el retorno del esquema, que es quien permitirá verdaderamente que Drupal pueda ejecutar toda la información que hemos añadido en el mismo.</p> <pre> ); return $schema; } </pre> <h3>     Opcional Creación de datos por defecto:</h3> <p>          Para nuestro ejemplo, además de implementar el hook_schema() y generar nuestra tabla, hemos decidido añadir además, algunos datos por defecto, que se colocarán en sus respectivos campos, al momento de instalar nuestro módulo.</p> <p>         Para realizar esta operación, hemos implementado el <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Extension%21module.api.php/function/hook_install/9.0.x">"hook_install()" target="_blank"</a>, que se ejecutará una vez se haya ejecutado el hook_schema() y esté generada nuestra tabla.</p> <pre> /** * hook_install() */ function mi_tabla_install() { $values = [ [ 'nombre' =&gt; 'Pepito', 'apellido' =&gt; 'Pérez', 'edad' =&gt; 30, 'uid' =&gt; 1, ], [ 'nombre' =&gt; 'Ana', 'apellido' =&gt; 'Medina', 'edad' =&gt; 28, 'uid' =&gt; 1, ], ]; $database = \Drupal::database(); $query = $database-&gt;insert('mitabla')-&gt;fields(['nombre', 'apellido', 'edad', 'uid']); foreach ($values as $participante) { $query-&gt;values($participante); } $query-&gt;execute(); }</pre> <h3>     Explicación:</h3> <p>     En la primera parte de este "hook_install()", estamos pasándole a drupal los valores que se añadirán a los campos de nuestra tabla, dentro del array "$values = [ ] ", debes asegurarte que cada campo corresponde, con los que haz definido en dentro del $schema[ ].</p> <pre> $values = [ [ 'nombre' =&gt; 'Pepito', 'apellido' =&gt; 'Pérez', 'edad' =&gt; 30, 'uid' =&gt; 1, ], [ 'nombre' =&gt; 'Ana', 'apellido' =&gt; 'Medina', 'edad' =&gt; 28, 'uid' =&gt; 1, ], ];</pre> <p>     En la siguiente parte, utilizando el servicio "\Drupal::database();", realizamos una consulta a la base de datos y mediante un insert, añadimos a la tabla, los campos correspondientes dentro del array fields, luego recorremos todos valores, utilizando el foreach y por último, ejecutamos la consulta.</p> <pre> $database = \Drupal::database(); $query = $database-&gt;insert('mitabla')-&gt;fields(['nombre', 'apellido', 'edad', 'uid']); foreach ($values as $participante) { $query-&gt;values($participante); } $query-&gt;execute();</pre> </div> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Jue, 09/03/2023 - 08:22</span> Thu, 09 Mar 2023 07:22:16 +0000 webmaster 289 at http://drupaladictos.es Symfony Postgree | Datatype mismatch: 7 ERROR:  column "xxx" cannot be cast automatically to type boolean http://drupaladictos.es/snippet/symfony-postgree-datatype-mismatch-7-error-column-xxx-cannot-be-cast-automatically-type <span class="field field--name-title field--type-string field--label-hidden">Symfony Postgree | Datatype mismatch: 7 ERROR:  column &quot;xxx&quot; cannot be cast automatically to type boolean</span> <div class="clearfix text-formatted field field--name-field-snippet-descripcion field--type-text-long field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>Cuando trabajas con Symfony y Postgree, es posible que al intentar cambiar el tipo de valor para una tabla o para una columna, te encuentres con este error, que no te permitirá realizar la actualización al ejecutar el comando <em><strong>doctrine:migrations:migrate</strong></em>.</p> <pre> SQLSTATE[42804]: Datatype mismatch: 7 ERROR: column "xxx" cannot be cast automatically to type boolean HINT: You might need to specify "USING xxx::boolean".</pre> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mié, 01/03/2023 - 10:29</span> <div class="clearfix text-formatted field field--name-field-instrucciones field--type-text-long field--label-above"> <div class="field__label">Instrucciones</div> <div class="field__item"><p>Para solucionar este fallo sigue los siguientes pasos:</p> <ol><li>Asegúrate de haber generado la actualización para tu archivo dentro de la carpeta migrations. Deberías tener una archivo con un nombre parecido a este <pre> Version20220727100245.php</pre> </li> <li>Abre el archivo con tu editor, y busca la columna relacionada con el cambio de tipo que haz intentado realizar.</li> <li>Añade el texto sugerido por el mensaje, al final de la línea donde declaras el tipo de valor para tu columna o tabla. Ej.: <pre> $this-&gt;addSql('ALTER TABLE setting ALTER insurance TYPE BOOLEAN <strong>USING insurance::boolean</strong>');</pre> </li> <li>Vuelve a ejecutar el comando para generar tus tablas en la base de datos</li> </ol></div> </div> <div class="clearfix text-formatted field field--name-field-codigo field--type-text-long field--label-hidden field__item"><pre> ** * Auto-generated Migration: Please modify to your needs! */ final class Version20220727100245 extends AbstractMigration { public function getDescription(): string { return ''; } public function up(Schema $schema): void { // this up() migration is auto-generated, please modify it to your needs $this-&gt;addSql('ALTER TABLE setting ALTER insurance TYPE BOOLEAN USING insurance::boolean'); $this-&gt;addSql('ALTER TABLE setting ALTER insurance DROP DEFAULT'); } public function down(Schema $schema): void { // this down() migration is auto-generated, please modify it to your needs $this-&gt;addSql('CREATE SCHEMA public'); $this-&gt;addSql('ALTER TABLE setting ALTER insurance TYPE BOOLEAN USING insurance::boolean'); $this-&gt;addSql('ALTER TABLE setting ALTER insurance DROP DEFAULT'); } } </pre> </div> <div class="field field--name-field-snippet-paginador field--type-image field--label-above"> <div class="field__label">Paginador</div> <div class="field__item"> <img src="/sites/default/files/imagenes/snippets/snippet-pager_107.png" width="100" height="100" alt="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> <div class="field field--name-field-categoria-snippet field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/categoria/symfony" hreflang="es">symfony</a></div> <div class="field__item"><a href="/categoria/symfony-6" hreflang="es">symfony 6</a></div> <div class="field__item"><a href="/categoria/postgree" hreflang="es">postgree</a></div> <div class="field__item"><a href="/categoria/database" hreflang="es">database</a></div> <div class="field__item"><a href="/categoria/base-de-datos" hreflang="es">base de datos</a></div> <div class="field__item"><a href="/categoria/entidades" hreflang="es">entidades</a></div> <div class="field__item"><a href="/categoria/tablas" hreflang="es">tablas</a></div> <div class="field__item"><a href="/categoria/table" hreflang="es">table</a></div> </div> </div> <div class="field field--name-field-portada-snippet field--type-entity-reference field--label-above"> <div class="field__label">Portada</div> <div class="field__item"><article class="media media--type-imagen media--view-mode-default"> </article> </div> </div> Wed, 01 Mar 2023 09:29:28 +0000 webmaster 132 at http://drupaladictos.es Crear tabla por defecto al instalar un módulo Drupal 8 http://drupaladictos.es/snippet/crear-tabla-por-defecto-al-instalar-un-modulo-drupal-8 <span class="field field--name-title field--type-string field--label-hidden">Crear tabla por defecto al instalar un módulo Drupal 8</span> <div class="clearfix text-formatted field field--name-field-snippet-descripcion field--type-text-long field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>Este código te ayudará a generar una tabla, con tu módulo personalizado en Drupal.</p> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mié, 01/03/2023 - 08:52</span> <div class="clearfix text-formatted field field--name-field-instrucciones field--type-text-long field--label-above"> <div class="field__label">Instrucciones</div> <div class="field__item"><h3>Para instalar una o varias tablas por defecto en Drupal 8...</h3> <p>1.- Creamos el archivo .install dentro de nuestro módulo.</p> <p>2.- Creamos el "Esquema" o estructura de las tablas, campos y relaciones <a href="https://bit.ly/2XgXszl">Ver cómo aquí</a></p> </div> </div> <div class="field field--name-field-snippet-paginador field--type-image field--label-above"> <div class="field__label">Paginador</div> <div class="field__item"> <img src="/sites/default/files/imagenes/snippets/snippet-pager_61.png" width="100" height="100" alt="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> <div class="field field--name-field-categoria-snippet field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/categoria/table" hreflang="es">table</a></div> <div class="field__item"><a href="/categoria/tablas" hreflang="es">tablas</a></div> <div class="field__item"><a href="/categoria/custom-module" hreflang="es">custom module</a></div> <div class="field__item"><a href="/categoria/modulos" hreflang="es">módulos</a></div> <div class="field__item"><a href="/categoria/modulo" hreflang="es">modulo</a></div> <div class="field__item"><a href="/categoria/programacion" hreflang="es">programacion</a></div> <div class="field__item"><a href="/categoria/php" hreflang="es">php</a></div> <div class="field__item"><a href="/categoria/desarrollo" hreflang="es">desarrollo</a></div> </div> </div> <div class="field field--name-field-portada-snippet field--type-entity-reference field--label-above"> <div class="field__label">Portada</div> <div class="field__item"><article class="media media--type-imagen media--view-mode-default"> </article> </div> </div> Wed, 01 Mar 2023 07:52:45 +0000 webmaster 86 at http://drupaladictos.es Crear tabla programáticamente Drupal 8 http://drupaladictos.es/snippet/crear-tabla-programaticamente-drupal-8 <span class="field field--name-title field--type-string field--label-hidden">Crear tabla programáticamente Drupal 8</span> <div class="clearfix text-formatted field field--name-field-snippet-descripcion field--type-text-long field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>Algunas veces quieres crear tus propias tablas, dentro de tus proyectos de drupal. Para ello necesitarás la ayuda de un módulo personalizado.</p> <p>Si quieres saber cómo crear un módulo personalizado</p> <p>Puedes ver el video de cómo crear tablas programáticamente, <a href="/actualidad/como-crear-tablas-programaticamente-en-drupal-9">haciendo clic aquí</a></p> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mié, 01/03/2023 - 08:51</span> <div class="clearfix text-formatted field field--name-field-codigo field--type-text-long field--label-hidden field__item"><pre> //Esto crea un renderizado que aparecerá como una tabla con su paginador... $build[ 'Ejemplo_tabla' ] = [ '#rows'=&gt; $rows, '#header' =&gt; [t('Nombre'), t('Apellido'),t('E-mail')], '#type' =&gt; 'table', '#empty' =&gt; t('No Content Available'), ]; $build['pager'] =[ '#type' =&gt; 'pager', '#weight' =&gt; 10, ];</pre> </div> <div class="field field--name-field-snippet-paginador field--type-image field--label-above"> <div class="field__label">Paginador</div> <div class="field__item"> <img src="/sites/default/files/imagenes/snippets/snippet-pager_60.png" width="100" height="100" alt="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> <div class="field field--name-field-categoria-snippet field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/categoria/tablas" hreflang="es">tablas</a></div> <div class="field__item"><a href="/categoria/table" hreflang="es">table</a></div> <div class="field__item"><a href="/categoria/programacion" hreflang="es">programacion</a></div> <div class="field__item"><a href="/categoria/custom-module" hreflang="es">custom module</a></div> <div class="field__item"><a href="/categoria/module" hreflang="es">module</a></div> <div class="field__item"><a href="/categoria/modulos" hreflang="es">módulos</a></div> </div> </div> <div class="field field--name-field-portada-snippet field--type-entity-reference field--label-above"> <div class="field__label">Portada</div> <div class="field__item"><article class="media media--type-imagen media--view-mode-default"> </article> </div> </div> Wed, 01 Mar 2023 07:51:27 +0000 webmaster 85 at http://drupaladictos.es