Drupal

Override Form Twig Templates in Drupal 8+ (example: Commerce Cart Form)

Sometimes you want to add a layout to a Drupal form, but the form.html.twig has only the “children” variable by default, which holds rendered markup.

In order to make single form components available in the Twig template, you have to use hook_theme().

Firstly, thanks to Ruslan Piskarov, whose article pushed me in the right direction: https://makedrupaleasy.com/articles/drupal-10-how-render-any-form-twig-template

As an example, I use the Drupal Commerce „Cart Form“, which basically holds all contents on the cart page (views_form_commerce_cart_form_default).

In your THEMENAME.theme file, add hook_theme() like so:

/**
 * Implements hook_theme().
 */
function drowl_child_theme($existing, $type, $theme, $path) {
  return [
    'views_form_commerce_cart_form_default' => [
      'render element' => 'form',
      'path' => $path . '/templates/commerce/cart',
    ],
  ];
}

‚views_form_commerce_cart_form_default‘ needs to be your BASE_FORM_ID.

The ‚render element‘ is the name of the render array variable.

The path is optional, if you are fine with putting the template right into your „templates“ folder.

In this example, the resulting Twig file needs to be /templates/commerce/cart/views-form-commerce-cart-form-default.html.twig.

The template looks like this:

{#
/**
  * @file
  * Default theme implementation for a 'form' element.
  *
  * Available variables
  * - attributes: A list of HTML attributes for the wrapper element.
  * - children: The child elements of the form.
  *
  * @see template_preprocess_form()
  *
  * @ingroup themeable
  */
#}

{# {{ dump(form) }} #}
<div class="commerce-cart">
  <form{{ attributes }}>
    <div class="row">
      <div class="col col-md-8">
        <div class="commerce-cart__line-item-box">
          {{ form|without(
            'footer',
            'actions',
            'paypal_smart_payment_buttons'
          ) }}
        </div>
      </div>
      <div class="col col-md-4 commerce-cart__actions-sum">
        {{ form.actions }}
        <a href="/" class="btn btn-outline-dark btn--block">{{ 'Products Overview'|t }}</a>
        {{ form.paypal_smart_payment_buttons }}
        {{ form.footer }}
      </div>
    </div>
  </form>
</div>

Thats it, happy coding!

Extend a Module Library in a Module (like libraries-extend in Themes)

Motorcycly with fully packed trailer

In Drupal Themes its very easy to extend existing libraries using the themes .info (and .libraries) file. This ain’t possible in a Mobule .info file. So we need a hook to do this:

/**
 * Implements hook_library_info_alter()
 * - Extend some module libraries we support or require for MY_MODULE
 */
function MY_MODULE_library_info_alter(&$libraries, $extension) {
  if ($extension == 'views_bulk_operations' && isset($libraries['frontUi'])) {
    // Extend existing library views_bulk_operations/adminUi
    // Important! That a library is listed by this hook, doesn't mean the library is attached, it just means its registered.
    $libraries['frontUi']['dependencies'][] = 'MY_MODULE/MY_LIBRARY_NAME';
  }
}

    Drupal Mimemail Module (HTML Mails, Newsletter, …) unwanted attachment.dat *Update*

    In a current project we ran into a curious problem, every HTML Mail has an file attachment named „attachment.dat“.

    After some research in the „mimemail.theme.inc“ (function „template_preprocess_mimemail_message()“), we figured out that the problem is located inside the $css content.

    In our case the implementation of the google webfont produces this issue (@import url(http://fonts.googleapis.com/css?family=Open+Sans:400italic,600italic,400,600)). Basicly @import has to work inside html mails, so mimemail seems to do something wrong here?

    Whatever. We can work around this problem, using the <link …> – implemantation inside the mimemail-message.tpl file instead of the declaration directly inside the css code.

     

      Remove Drupals .menu-position-link menu items (Menu Position module)

      Menu Position is a great Drupal Module to get the .active-trail class in the menu, without adding eg. all news article nodes to the it.

      The only problem is a „placeholder“ link created instead, class: „.menu-position-link“. It seems this is technically necessary.

      Here is a little jQuery function to remove the element itself, the container menu (if its the only item) and fix the causing classes. You may have to alter it a bit.

      Remove the console.logs before using it on productive environment!

      $('.menu', context).children('li.active-trail').each(function() {
        var menuChildCount = $(this).children('.menu').children('li').length;
        var $menuPosLinkParent = $(this).find('.menu-position-link').parent();
        if ($menuPosLinkParent.length) {
          console.log('Found one - childcount:' + menuChildCount);
          console.log($menuPosLinkParent);
          if (($menuPosLinkParent).hasClass('last')) {
            console.log('Its the last item.');
            // If its the last link move class .last to the menu item before 
            $menuPosLinkParent.prev('li').addClass('last');
          }
          if (menuChildCount === 1) {
            console.log('Its the only item.');
            // If menu position link is the only menu-item, remove parent trails .expanded 
            $menuPosLinkParent.parents('li.active-trail.expanded').removeClass('expanded');
            $menuPosLinkParent.parent('.menu').remove();
            console.log('Removed it.');
          } else {
            $menuPosLinkParent.remove();
            console.log('Removed it.');
          }
        }
      });

        HTML5 Video in Drupal – Video.js + Video.js Filter

        Für ein aktuelles Projekt bestand die Notwendigkeit, auf einfachem Weg HTML5 Videos in den Content einpflegen zu müssen. Hierzu nutzen wir die Module Video.js und Video.js Filter, ersteres stellt die Video.js Library (Achtung! Nicht die Library von Github nutzen, sondern die der Video.js Website) zur Verfügung, zweiteres stellt einen Textfilter zur Verfügung der es ermöglicht einen String mit Parametern einzupflegen. Zusätzlich setzen wir das File Entity Modul für den Dateiupload ein.

        Problem ist hier nur, dass Videos in einem FTP Folder gespeichert werden müssen, was für viele Kunden zu umständlich ist. Der Upload erfolgt nun also über das benannte File Entity Modul, welches Dateien direkt ins File Verzeichnis lädt. Problem an der Stelle: In den Einstellungen des Video.js Filter Moduls lassen sich nur Unterverzeichnisse innerhalb von Files angeben. 

        Einfacher Trick an der Stelle: Da das Pfad Feld in den Video.js Filter Settings nicht leer bleiben darf, kann einfach ein „/“ eingetragen werden. Damit wird dann direkt das files Verzeichnis angesprochen.

        Alternativ steht noch das File Entity Path Modul zur Verfügung, was dann die Angabe von Unterordnern beim Dateiupload erlaubt.

        Noch ein Tipp zur generellen Nutzung: Es reicht folgende Angabe aus [videojs:{webks_beispielvideo.mp4|webks_beispielvideo.webm| … }] der Pfad wird automatisch durch die entsprechenden Settings des Video.js Filter Moduls ergänzt.

          Einstieg: Drupal & SASS + Compass (mit Prepro und Sassy)

          Der Einstieg in das Thema ist nicht ganz so leicht gemacht, daher hier eine kleine Zusammenfassung.

          Die Grundsätzlichen Möglichkeiten mit dem CSS Preprocessor zu arbeiten: Lokale Ruby Installation aufsetzen (http://thesassway.com/beginner/getting-started-with-sass-and-compass) und die daraus generierten .css Files auf den Webserver laden (für die Entwicklung in meinen Augen völliger Käse, außer man bindet den entsprechenden FTP Folder als Netzlaufwerk ein. Die Möglichkeit der direkten „Portierung“ zu CSS Files bietet SASS). Vorteil dieser Variante ist schlicht und ergreifend, dass man die tatsächliche SASS Lib nutzt und nicht die PHP Portierung.

          Wir wollten uns die zusätzliche Pflege lokaler Software und den Aufwand der Einrichtung allerdings schenken und setzen so auf die komplette online Variante mit den Modulen https://drupal.org/project/sassyhttps://drupal.org/project/prepro und der Library https://github.com/richthegeek/phpsass.

          Update: Inzwischen sind wir auf eine lokale Lösung mit Prepros umgestiegen, den Sync auf den Server erledigt unser Standard Tool WinSCP mit Hilfe der keepuptodate-Funktion, was inzwischen göttlich funktioniert. Die Entscheidung zum Umstieg erfolgte aufgrund etlicher Fehler in der PHP Portierung von SASS. Im kommerziellen Umfeld ist das nur mit Einschränkungen zu genießen. 

          Die Einrichtung…

          … sollte jedem Drupalisten leicht von der Hand gehen: Module aktivieren, Lib in den vom Modul geforderten Ordner packen, aktivieren (nicht das Sassy Compass integration – Modul übersehen!), prepro konfigurieren. Dann die .SCSS / .Sass Files im .info file des Themes eintragen und loslegen.

          Ein paar „Fakten“:

          • SCSS ist für Einsteiger einfacher zu erlernen
          • SASS ist etwas kompakter zu schreiben
          • Die PHPSass Portierung des eigentlichen Ruby Projekts Sass ist sicher nicht perfekt, aber läuft im großen und ganzen rund genug um damit arbeiten zu können.
          • Compass ist in der PHPSass portierung bereits enthalten (die schönste Erklärung zu Compass ist sicher der Vergleich zu Javascript und jQuery – Compass ist ähnlich hilfreich, stellt vordefinierte @mixins zur Verfügung. .

          Schöne Dokumente zum Thema:

          Hilfreiche Tools

          Verfügbare Editoren

          • Ich nutze Netbeans, welches in der aktuellen Dev Version (NetBeans IDE Dev (Build 201309191137)) SASS / SCSS ohne weitere Module unterstützt (die Alternative ist das folgende Plugin: http://plugins.netbeans.org/plugin/34929 – welches bei mir allerdings nur unzureichend funktionierte)
          • Empfohlen wird weiterhin http://www.sublimetext.com/

          Du brauchst Unterstützung bei deinem Drupal Webdesign-Projekt? Sprich uns an.

            Drupal: Custom Panel Layout Plugin (AT-Theme)

            Eine eigentlich einfache Sache, bei der aber kleine Unachtsamkeiten dazu führen können dass das Layout Plugin garnicht, oder nur unvollständig funktioniert.

            Hier die Vorgehensweise:

            1. Eine passende Basis für das zu erstellende Layout auswählen
            2. Diese aus dem AT-Core Theme (layouts/panels) in das eigene Theme übernehmen (gleiche Unterordner)
            3. Namen des Ordners und der Dateien entsprechend anpassen (z. B. two_col_brick zu two_col_custom)
            4. Alle Dateien öffnen und dort per Suchen & Ersetzen ebenfalls den alten Namen durch den neuen ersetzen
            5. Den Funktionsnamen auf das eigene Theme anpassen („adaptivetheme“ gegen den eigenen Themenamen ersetzen“)
            6. Nun den *.tpl.php File anpassen wie er benötigt wird (es können natürlich neue Inhaltsbereiche / Variablen ergänzt werden ACHTUNG! Die Funktionsnamen dürfen eine Länge von 32 Zeichen nicht überschreiten! )
            7. Als nächstes den *.inc File anpassen und die ggf. hinzugefügten Variablen aus dem letzten Schritt ergänzen
            8. Optional: Das Thumbnail zur Voransicht des Layouts anpassen und austauschen
            9. Den theme.info File bearbeiten. Einfach für jeden Gerätetyp unter „Responsive Panels“ entsprechend das eigene Layout anfügen
            10. Weiterhin muss im theme.info File folgendes ergänzt werden: „plugins[panels][layouts] = layouts/panels“ (der Pfad kann im Grunde natürlich frei gewählt werden)
            11. Cache leeren, Panel Layout auswählen, fertig!

            Für NICHT AT-Panel-Layouts läuft das ganze im Grunde identisch, die Quelle ist nur eine Andere –> „/sites/all/modules/contrib/panels/plugins/layouts“

             

             

              webks.de: Relaunch

              Ein hartes Stück Arbeit war das, aber es hat sich gelohnt. Unsere rundum erneuerte Unternehmenswebsite http://www.webks.de ist online. Wie auch schon einige unserer Kundenseiten, komplett responsive, dank CSS Media-Queries. Technisch setzen wir selbstverständlich auf eine Drupal 7 Lösung. 

              So selten man für die eigenen Websites inzwischen Zeit findet, folgt nun – möglichst zeitnah – ebenfalls der Relaunch unserer Drupal Themenseite DROWL.de. Selbstverständlich ebenfalls stark verschlankt und responsive.

              Zum Ende natürlich noch ein frohes neues Jahr 2013, allen Lesern viel Erfolg und alles Gute im neuen Jahr!

                webks: Responsive Module Plugin for jQuery

                Ein großes Problem beim gestalten von Oberflächen für Mobilgeräte, stellen Tabellen dar. Tabellen sind aufgrund ihres „Wesens“ schon gänzlich ungeeignet für schmale Displays, viele Spalten, platzraubender Inhalt. Und so nehmen sich Tabellen den Platz welchen Sie benötigen, mit der Folge das sie über die Website hinausragen und der User nach rechts scrollen muss, Katastrophe.

                Zusammen mit meinem Kollegen Julian Pustkuchen bei webks: websolutions kept simple haben wir nun eine jQuery Lösung entwickelt, welche für Jedermann kostenfrei zum Download bereitsteht.

                Anregungen und Wünsche zur Optimierung des Moduls nehmen wir selbstverständlich gerne entgegen.