copy-paste
redirect-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: old-domain-redirect
namespace: my-namespace
annotations:
cert-manager.io/cluster-issuer: letsencrypt
nginx.ingress.kubernetes.io/permanent-redirect: https://new-domain.com$request_uri
nginx.ingress.kubernetes.io/ssl-redirect: 'true'
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: old-domain.com
tls:
- hosts:
- old-domain.com
secretName: old-domain.com-cert
13.11.2025 | Marc Hitscherich
Simple domain redirect in Kubernetes with nginx ingress
my_module.install
<?php
/**
* Change my_basefield max_length to 255.
*/
function my_module_update_10001() {
$entity_type_id = 'my_entity';
$field_name = 'my_basefield';
$field_length = 255;
/** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $schema_repository */
$schema_repository = \Drupal::service('entity.last_installed_schema.repository');
/** @var \Drupal\Core\Entity\EntityFieldManager $entity_field_manager */
$entity_field_manager = \Drupal::service('entity_field.manager');
/** @var Drupal\Core\Field\BaseFieldDefinition[] $base_field_definitions */
$base_field_definitions = $entity_field_manager->getBaseFieldDefinitions($entity_type_id);
$schema_repository->setLastInstalledFieldStorageDefinition($base_field_definitions[$field_name]);
$field_storage_definitions = $schema_repository->getLastInstalledFieldStorageDefinitions($entity_type_id);
// Update the serialized schema property.
$rc = new \ReflectionClass($field_storage_definitions[$field_name]);
$schema_property = $rc->getProperty('schema');
$schema_property->setAccessible(TRUE);
$schema = $field_storage_definitions[$field_name]->getSchema();
$schema['columns']['value']['length'] = $field_length;
$schema_property->setValue($field_storage_definitions[$field_name], $schema);
// Update the field definition in the last installed schema repository.
$schema_repository->setLastInstalledFieldStorageDefinitions($entity_type_id, $field_storage_definitions);
// Update the storage schema.
$key_value = \Drupal::keyValue('entity.storage_schema.sql');
$key_name = $entity_type_id . '.field_schema_data.' . $field_name;
$storage_schema = $key_value->get($key_name);
// Update all tables where the field is present.
foreach ($storage_schema as &$table_schema) {
$table_schema['fields'][$field_name]['length'] = $field_length;
}
$key_value->set($key_name, $storage_schema);
// Update the database tables where the field is part of.
$db = Drupal::database();
foreach ($storage_schema as $table_name => $table_schema) {
$db->schema()->changeField($table_name, $field_name, $field_name, $table_schema['fields'][$field_name]);
}
}
29.01.2026 | Marc Hitscherich
Increasing the length of a basefield with data
my_theme.theme
/**
* Implements hook_preprocess_HOOK() for layout.html.twig.
*/
function hook_preprocess_layout(&$variables) {
$layout = $variables['layout'];
foreach ($layout->getRegionNames() as $region_name) {
if (array_key_exists($region_name, $variables['content'])) {
uasort($variables['content'][$region_name], [\Drupal\Component\Utility\SortArray::class, 'sortByWeightProperty']);
}
}
}
12.12.2025 | Pascal Crott
Sort blocks inside layout regions by weight.
docker-compose.offline.yml
services:
web:
cap_drop:
- NET_RAW
19.03.2026 | Peter Gerken
Block raw network access for a container
my_module.module
<?php
/**
* Implements hook_theme_suggestions_HOOK_alter() for table.
*/
function hook_theme_suggestions_table_alter(array &$suggestions, array $variables): void {
if (empty($variables['attributes']['class'])) {
return;
}
if (is_array($variables['attributes']['class']) && in_array('ief-entity-table', $variables['attributes']['class'])) {
$suggestions[] = 'table__simple';
}
}
22.06.2026 | Pascal Crott
Gin: Make use of the simple table
custom_module.install
<?php
/**
* Update node title of all nodes.
*/
function custom_module_update_10001(&$sandbox) {
// Define you entity type.
$entity_type = 'node';
// Load the entity type manager service.
$entity_type_manager = \Drupal::service('entity_type.manager');
// Get the storage for the entity type.
$entity_storage = $entity_type_manager->getStorage($entity_type);
if (!isset($sandbox['total'])) {
$all_entity_ids = $entity_storage->getQuery()
->accessCheck()
->execute();
$sandbox['total'] = count($all_entity_ids);
$sandbox['current'] = 0;
if (empty($sandbox['total'])) {
$sandbox['#finished'] = 1;
return;
}
}
$entities_per_batch = 25;
$entity_ids = $entity_storage->getQuery()
->accessCheck()
->range($sandbox['current'], $entities_per_batch)
->execute();
if (empty($entity_ids)) {
$sandbox['#finished'] = 1;
return;
}
// Optionally, perform operations with the loaded entities.
// For example, load and modify each node and set a new title.
foreach ($entity_ids as $entity_id) {
$entity = $entity_storage->load($entity_id);
if ($entity->hasField('title')) {
$entity->setTitle('New Title');
}
$entity->save();
$sandbox['current']++;
}
\Drupal::messenger()
->addMessage($sandbox['current'] . ' users processed.');
if ($sandbox['current'] >= $sandbox['total']) {
$sandbox['#finished'] = 1;
}
else {
$sandbox['#finished'] = ($sandbox['current'] / $sandbox['total']);
}
}
21.05.2026 | Michael Ebert
Do bulk updates as a batch job
my_module.module
<?php
use Drupal\Component\Utility\Html;
use Drupal\Core\Form\FormStateInterface;
/**
* Implements hook_form_FORM_ID_alter() for 'views_exposed_form'.
*/
function hook_form_views_exposed_form_alter(&$form, FormStateInterface $form_state) {
// Configure the values to your needs.
$view_name = 'my_view';
$display_name = 'my_display';
$entity_type_id = 'taxonomy_term';
$reference_field = 'field_category';
// The field on the referenced entity.
$flag_on_reference_field = 'field_hide_on_exposed_form';
if ($form['#id'] == Html::getId("views-exposed-form-{$view_name}-{$display_name}")) {
$entity_storage = \Drupal::entityTypeManager()->getStorage($entity_type_id);
$options = &$form[$reference_field]['#options'];
foreach ($entity_storage->loadMultiple(array_keys($options)) as $id => $entity) {
if ($entity->hasField($flag_on_reference_field) && !$entity->{$flag_on_reference_field}->isEmpty()) {
unset($options[$id]);
}
}
}
}
12.02.2026 | Pascal Crott
Dynamically remove entity_reference value from views exposed filter via flag
open_details.js
let details = document.getElementsByTagName('details');
for (i = 0; i < details.length; ++i) {
details.item(i).open = true;
}
13.11.2025 | Peter Gerken
Open all HTML details elements via browser console
mysql8 to mariadb.sh
cat olddump.sql | sed -e s/uca1400_as_ci/utf8mb4_general_ci/ | gzip > newdump.sql.gz
12.03.2026 | Pascal Crott, Michael Böker