Autor: Mathias Lipowski

Customizing Bootstrap 4 without changing the core files

A simple instruction to customize the Bootstrap 4.0 using SASS and Autoprefixer.

But why? You can either…

  1. download the compiled version of Bootstrap or
  2. use the source of Bootstrap 4 and compile a custom version or
  3. use the CDN server

When you choose number 2, then it’s necessary to use SASS for compiling the style sheet and Autoprefixer for CSS vendor prefixing. And this is how to get a customized version of Bootstrap:

First make sure, you’ve installed SASS and Node.js.

Then create an empty folder my_directory with the following folders and files:

my_directory
+- node_modules [folder]
+- custom.scss
+- package.json

The node_modules folder is required for some node.js modules. custom.css will hold all your customized stylesheets and package.json is used for some node.js package settings. You will see this later.

Now it’s time to load the current version of Bootstrap. Download the source of Bootstrap 4 and extract the zip to the folder /node_modules/bootstrap/.

Point your terminal to my_directory and install some node.js modules with the following command:

npm install postcss-cli autoprefixer npm-run-all

Now you can open the custom.scss file and add some costumized styles. This file can look like this:

// Custom.scss

$mixable: #ca0027;

$colors: (
 "mixable": $mixable,
);
$theme-colors: (
 "primary": $mixable
);

// Required
@import "node_modules/bootstrap/scss/bootstrap";

In this simple example, we just set a new color and use this color as primary color. A more detailed description on how to customize your theme can be found in the Bootstrap docs.

Let’s say we have made all of our customizations, so let’s open the empty file package.json. Add the following lines, which are required to combine your custom stylesheet and the Bootstrap source:

{
  "scripts": {
    "style":"sass custom.scss | postcss --use autoprefixer -o custom.css",
    "style-min":"sass custom.scss --style compressed | postcss --use autoprefixer -o custom.min.css",
    "all":"npm-run-all --parallel style style-min"
  }
}

This file contains three scripts, which can be executed like this:

To create the output file custom.css:

npm run style

To create a compressed output file custom.min.css:

npm run style-min

And to create both files at once:

npm run all

That’s it. Keep in mind, that this will just compile the stylesheet. To compile the javascript, you should refer to the Bootstrap docs and the build tools there.

CakePHP 3: Benutzername oder Email zum Anmelden mit AuthComponent verwenden

In den Einstellungen der AuthComponent lässt sich festlegen, welches Feld der Datenbank für das Login verwendet werden soll. Hier kann allerdings nur ein einzelner Wert angegeben werden (bspw. username oder email). Um jedoch bei der Eingabe des Logins sowohl Benutzername, als auch Email zu erlauben, kann man die Einstellung zur Laufzeit (also beim Aufruf des Controllers) anpassen und das entsprechende Feld setzen. Und zwar wie folgt:

src/Controller/AppController.php

use Cake\Controller\Controller;

class AppController extends Controller
{
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('Flash');
        $this->loadComponent('Auth', [
            'authenticate' => [
                'Form' => [
                    'fields' => ['username' => 'username', 'password' => 'password'],
                ]
            ],
        ]);
    }
}

src/Controller/UsersController.php

use App\Controller\AppController;
use Cake\Validation\Validation;

class UsersController extends AppController
{
    public function login()
    {
        if ($this->request->is('post')) {

            if (Validation::email($this->request->getData('username'))) {
                $this->Auth->config('authenticate', [
                    'Form' => [
                        'fields' => ['username' => 'email']
                    ]
                ]);
                $this->Auth->constructAuthenticate();
                $this->request->data['email'] = $this->request->getData('username');
            }

            $user = $this->Auth->identify();

            if ($user) {
                $this->Auth->setUser($user);
                return $this->redirect($this->Auth->redirectUrl());
            }

            $this->Flash->error(__('Invalid combination of username/email and password.'));
        }
    }
}

src/Template/Users/login.ctp

<php
echo $this->Flash->render('auth');
echo $this->Form->create();

echo $this->Form->input('username');
echo $this->Form->input('password');

echo $this->Form->button(__('Login'));
echo $this->Form->end();
?>

Visual Studio / C#: „Für die angegebene Kultur oder die neutrale Kultur konnten keine Ressourcen gefunden werden.“

Übernimmt man Resourcen aus einem anderen Projekt, dann kann es vorkommen, dass die normalerweise automatisch erstellte Datei Resources.Designer.cs nicht mehr erstellt/aktualisiert wird und damit zu dem Fehler „Für die angegebene Kultur oder die neutrale Kultur konnten keine Ressourcen gefunden werden.“ führt. So lässt sich das Problem lösen:

  1. Die Datei Resources.Designer.cs löschen
  2. Die Eigentschaften der Datei Resources.resx aufrufen
  3. Unter Benutzerdefiniertes Tool den Wert ResXFileCodeGenerator eintragen
  4. Rechtsklick auf die Datei Resources.resx und „Benutzerdefiniertes Tool ausführen“ auswählen.

Damit wird die Datei Resources.Designer.cs neu erstellt und der Kompilierungsvorgang sollte ohne Fehler ausgeführt werden können.

Unarten im Netz – oder: wie werde ich meine Besucher los

Wer kennt sie noch, die guten alten Popups: kleine Browserfenster, die sich über den Browser gelegt haben. Und das meist, um Werbung anzuzeigen. Diese Zeiten sind zum Glück vorbei, da aktuelle Browser diese von Haus aus unterdrücken.

Doch es gibt eine neue Methode, um Benutzer auf einer Webseite abzuschrecken und zu verjagen: Inline-Overlays (also kleine „Popups“ innerhalb der Webseite oder auch Modals genannt). Mit diesen wird der Nutzer meist nach der Emailadresse gefragt, um einen Newsletter zu abonnieren. Ok, ist nicht ganz so nervig wie ein blinkendes Werbe-Popup, aber dennoch unterbricht es den Lesefluss. Und dies meist dann, wenn man sich gerade am Anfang eines Artikels befindet, aus versehen den Mauszeiger aus dem Browserfenster bewegt oder etwas zurück scrollt, um Inhalte erneut zu lesen. Also bei Aktivitäten, die vermuten lassen, dass man das Fenster schließen möchte.

Aber warum? Eine Einschätzung zur Nutzerfreundlichkeit: 0 von 10. Der Nutzer bekommt teilweise nicht einmal die Möglichkeit, den Inhalt zu lesen und soll sich davor schon entscheiden einen Newsletter zu abonnieren. Meines Erachtens mehr abschreckend als nützlich. Denn in den heutigen Zeiten, in denen man immer noch sehr viel Spam im Postfach findet, wird es immer schwerer an Email-Adressen zu kommen.

Aber auch hier hilft Qualität statt Quantität: es wäre sinnvoller sich auf guten Inhalt zu konzentrieren, als zwanghaft zu versuchen, die Leute zu einem Newsletter zu überreden. Also liebe Webmaster: bitte lasst es!

LaTeX: overfull \hbox mit draft sichtbar machen

LaTeX stellt einen Entwurfsmodus bereit, über den sich weitere Informationen im erzeugten Dokument anzeigen lassen. Der Modus lässt sich mit dem optionalen Argument draft wie folgt aktivieren:

\documentclass[draft]{...}

Dieser Modus bietet zwei Vorteile:

Übervolle Textboxen (overfull \hbox), also Textboxen welche nicht innerhalb der definierten Seitenränder umbrechen, werden durch eine schwarze Linie hervorgehoben (siehe Grafik). Diese Markierung wird bei Text, Abbildungen und auch Tabellen angezeigt.

Eingebettete Grafiken werden nicht in der Ausgabe angezeigt. Hier wird nur ein Rahmen, sowie Pfad und Name der Datei angezeigt. Dieser Effekt kann auch über das Argument draft des graphicx-Paketes erzielt werden.

\usepackage[draft]{graphicx}

LaTeX: d.h. oder d.\,h.? z.B. oder z.\,B.?

Grundsätzlich sollte jede Abkürzung zwischen den einzelnen Teilen ein geschütztes Leerzeichen enthalten, damit die Abkürzung durch Zeilentrennung nicht auseinandergerissen wird. In LaTeX wird das geschützte Leerzeichen mit \, gesetzt. Es sollte also heißen:

d.\,h. und z.\,B.

Laut Friedrich Forssman und Ralf de Jong – Detailtypografie:

Abkürzungen mit Binnenpunkt müssen innerhalb der Abkürzung mit einem geschützten Flexiblen Leerzeichen versehen werden. […] Nach der Abkürzung erfolgt ein normaler Wortzwischenraum.

LaTeX: hervorheben von Text mit \emph oder \textit?

Wie sollte man Text in LaTeX hervorheben? Kurz gesagt: \emph eignet sich besser als \textit und das aus zwei Gründen.

Erstens, \emph — der LaTeX Philosophie folgend, dass logisches Markup vom Inhalt getrennt werden sollte — betont den Sinn, dass es sich um eine Hervorhebung handelt, während \textit diesen Gedanken mit dem Setzen einer Schriftart (kursiv) vermischt. Entscheidet man sich im Laufe der Dokumentenerstellung die Schriftart zu wechseln (z.B. in eine schräge römische Schriftart), dann lässt sich die Anpassung mit \emph als Hervorhebung sehr einfach anpassen. Dahingegen müsste man alle Vorkommen von \textit händisch suchen und ersetzen, um den damit gekennzeichneten Text vom Rest des Dokuments abzuheben. \textit würde in dem Fall auch eher zu Verwirrungen führen.

Zweitens, und vielleicht von geringerer Bedeutung: man kann mit \emph eine Hervorhebung in der Hervorhebung erstellen. So lässt sich beispielsweise ein Wort oder eine Wortgruppe in einem Satz hervorheben, der bereits hervorgehoben wird. Die innere \emph Anweisung schaltet dann automatisch um, um den text „sichtbar“ zu machen. Das ist bedeutend einfacher, als Texte innerhalb von \textit mit anderen Schriftarten/Schriftanweisungen von Hand hervorzuheben.

Bildnachweis: unsplash.com