Minisuche mit Tom Select

In der 23. Contao Show zum Thema „Suche mirt Contao“ habe ich eine Mini-Suche vorgestellt, um beispielsweise Leistungen oder Standorte zu durchsuchen. Falls du die Show nicht gesehen hast, kannst du sie dir hier ansehen:

Schritte zur Umsetzung

1. Dateidownload

Das Script kannst du direkt von der Website herunterladen: tom-select.js.org

Du hast dabei die Wahl zwischen einem Komplettpaket inkl. aller Plugins oder der Basis-Variante. Die Basis-Variante ist für dieses Beispiel ausreichend.

2. Frontend-Modul anlegen und einbinden

Für unsere Suche legen wir ein Frontend-Modul von Typ Quick-Navigation an und binden es auf der Seite ein, auf der die Mini-Suche zu sehen sein soll. Als Referenzseite wählst du die entsprechende Oberseite aus, deren Unterseiten in der Suche aufgeführt werden sollen.

3. SCSS ins Projekt kopieren

Im folgenden Abschnitt findest du eine SCSS-Basisdatei, die ich in der Demo verwendet habe, um das Select-Feld auszublenden und stattdessen die Tom-Select Komponente zu gestalten:

// _tom-select.scss

//
// COMPONENTS/TOM-SELECT
// --------------------------------------------------

.nav--search {
  max-width: 20rem;
  
  &:has(.ts-wrapper) {
    .widget-submit {
      display: none;
    }
  }

  .ts-hidden-accessible {
    @include invisible;
  }
  .ts-wrapper {
    position: relative;
    
    &.has-items {
      input {
        display: none;
      }
    }
  }
  
  .ts-control {
    border-radius: var(--base-border-radius);
    border: var(--base-border);
    overflow: hidden;
    width: 100%;
    background-color: var(--color-white);
    padding: var(--base-spacing-unit-sm) var(--base-spacing-unit);
  
    input {
      width: 100%;
      border: none;
      background-color: transparent;
      padding: 0;
  
      &:focus {
        outline: none;
      }
    }
  
    .item {
      white-space: nowrap;
      padding: 0;
      background-color: var(--color-white);
      position: relative;
    }
  }
  
  .ts-dropdown {
    border: var(--base-border);
    border-top: none;
    background: var(--color-white);
    max-height: calc(7rem * var(--base-line-height));
    overflow-y: auto;
    padding: 0 0 0.5rem;
    border-radius: 0 0 var(--base-border-radius) var(--base-border-radius);
    position: absolute;
    z-index: 1001;
    width: 100%;
  
    .dropdown-header {
      position: sticky;
      top: 0;
      background: var(--color-white);
      color: var(--accent-color-dark);
      padding: 0.5rem 1rem;
  
      .dropdown-header-close {
        display: none;
      }
    }
  
    .no-results {
      padding: 0.5rem 1rem 0;
    }
  
    .option {
      cursor: pointer;
      padding: 0.25rem 1rem;
    }
  
    .active {
      background: var(--color-tint);
    }
  }
  
  .dropdown-active .ts-control {
    border-bottom-left-radius: 0;
    border-bottom-right-radius: 0;
  }
}

4. Template anlegen und aktivieren

Im letzten Schritt legst du ein Template an, in dem du das heruntergeladene Tom Select Script lädst und über Parameter konfigurierst.

<?php
// Template: js_tom-select.html5

// hier den Pfad zum heruntergerladenen tom select script angeben
?>
<script src="/files/theme/js/_tom-select.js"></script>
<script>
  document.addEventListener('DOMContentLoaded', function () {
    let tomselect = document.querySelector('.nav--search');

    if (tomselect) {
      let tomSelectInstance = new TomSelect(
        tomselect.querySelector('select.select'),
        {
          // Parameter
          searchField: ['text', 'value'], //durchsucht Label und den Wert der Select-Option
          placeholder: "Was suchen Sie?",
          // Ausgabe für no results found anpassen
          render: {
            no_results: (data, escape) => {
              return `<div class="no-results">Keine Ergebnisse gefunden.</div>`
            },
          },
          // umlaute nicht verarbeiten
          diacritics: false,
        }
      );
      
      // automatischer Aufruf der Seite, wenn eine Auswahl getroffen wird
      tomselect
        .querySelector('.select')
        .addEventListener('change', function () {
          this.closest('form').submit();
        });
    }    
  });
</script>

Außerdem musst du das Template über das Seitenlayout aktivieren.

Wenn du nun die Seite neu lädst und alles korrekt eingestellt hast, dann sollte das Select-Feld der Quick-Navigation verschwinden und stattdessen Das gestaltete Suchfeld von Tom Select JS zu sehen sein.

Hast du Fragen oder Anmerkungen zur Verwendung von Tom Select JS? Schreib uns gerne eine Nachricht.