Utiliser Bootstrap dans une partie d’une page

J’ai eu a créer une page avec Bootstrap dans un site n’utilisant pas Bootstrap

Bootstrap gérant l’apparence de toute la page, il fallait l’isoler dans une classe pour ne pas créer de conflits

Voici comment procéder :

  1. Télécharger la version compilée de Bootstrap
  2. Installer LESS
    npm install -g less
  3. Créer un fichier prefix.less dans le dossier du css de Bootstrap
    .bootstrap {
        @import (less) 'bootstrap.css';
    }
  4. Exécuter en ligne de commande
    lessc --math=strict prefix.less bootstrap-prefixed.css

    Vous aurez donc un fichier bootstrap-prefixed.css avec toutes les règles incluses dans une classe .bootstrap

  5. Il y a quelques corrections à apporter au début du fichier bootstrap-prefixed.css au niveau des règles appliquées à  :root  et body  :
    enlever .bootstrap  de :root  et remplacer.bootstrap body  par .bootstrap

Et voilà, vous pouvez utiliser ce fichier pour avoir le style de Bootstrap dans un élément ayant la classe .bootstrap.

Cela pouvait surement se faire en sass et j’aurais préféré, Bootstrap utilisant Sass, mais je n’ai pas trouvé de méthode simple.

Sources :

Supprimer les notices du mode debug de PrestaShop

Le mode debug de PrestaShop 1.7 fonctionne trop bien. Par défaut il s’arrête sur toutes les erreurs, avertissement ou notice, ce qui fait que quand un problème, même minime, se trouve en amont de ce que vous voulez corriger, le système s’arrête avant la partie qui vous intéresse.

Par exemple avec PHP 7.4, Doctrine utilisé par PrestaShop affiche un Warning : https://github.com/doctrine/DoctrineORMModule/issues/579 ce qui empêche tout débogage.

Pour corriger tout cela, il faut dire à Symfony quelles erreurs afficher :

On a 2 fichiers à modifier « classes/controller/FrontController.php » et « admin/index.php » dans les deux cas il faut remplacer

Debug::enable();
Code language: CSS (css)

par

Debug::enable(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_WARNING);
Code language: PHP (php)

en adaptant le paramètre à ce qu’on veut. La documentation est ici : https://www.php.net/error_reporting

Il peut être utile de modifier aussi « config/defines.inc.php » en remplaçant

@error_reporting(E_ALL | E_STRICT);
Code language: PHP (php)

par

@error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_WARNING);
Code language: PHP (php)

Supprimer un site WordPress

Voici un script qui supprime un site WordPress. C’est une adaptation de Supprimer une boutique PrestaShop. Il suffit de le placer à la racine du site en FTP ou autre et de le visiter avec son navigateur.

⚠ Le script supprime le répertoire de WordPress avec tous ses fichiers et sous répertoires et toutes les tables de la base de données qui ont le préfixe de WordPress.

⚠⚠ Le script ne demande pas de confirmation. Vous le lancez, il supprime tout.

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$root = dirname(__FILE__);
$server = false;
$user = false;
$password = false;
$database = false;
$prefix = false;

if (file_exists($root.'/wp-config.php')) {
    include $root.'/wp-config.php';
    $server = DB_HOST;
    $user = DB_USER;
    $password = DB_PASSWORD;
    $database = DB_NAME;
    $prefix = $table_prefix;
} else {
    die();
}

if (!$server || !$user || !$database || !$prefix) {
    die();
}

dropTables($server, $user, $password, $database, $prefix);
rrmdir($root);
mkdir($root);

// https://stackoverflow.com/questions/1589278/sql-deleting-tables-with-prefix#1589324
// https://stackoverflow.com/a/10664265/2530962
function dropTables($server, $user, $password, $database, $prefix)
{
    $link = mysqli_connect($server, $user, $password, $database);
    $query = 'SET SESSION group_concat_max_len = 999999999;
    SELECT CONCAT( \'DROP TABLE \', GROUP_CONCAT(table_name) , \';\' )
        AS statement FROM information_schema.tables
        WHERE table_schema = \''.mysqli_real_escape_string($link, $database).'\'
            AND table_name LIKE \''.mysqli_real_escape_string($link, $prefix).'%\';';
    if (mysqli_multi_query($link, $query)) {
        do {
            if ($result = mysqli_store_result($link)) {
                while ($row = mysqli_fetch_array($result)) {
                    $drop_query = $row[0];
                }
                mysqli_free_result($result);
            }
        } while (mysqli_more_results($link) && mysqli_next_result($link));
    }

    // echo 'MySQL "'.$drop_query.'"'.PHP_EOL;
    mysqli_query($link, $drop_query);
}

// https://stackoverflow.com/questions/3338123/how-do-i-recursively-delete-a-directory-and-its-entire-contents-files-sub-dir#3338133
function rrmdir($dir)
{
    if (is_dir($dir)) {
        $objects = scandir($dir);
        foreach ($objects as $object) {
            if ($object != "." && $object != "..") {
                if (is_dir($dir."/".$object)) {
                    rrmdir($dir."/".$object);
                } else {
                    // echo 'Delete '.$dir."/".$object.'    ';
                    if (unlink($dir."/".$object)) {
                        // echo 'OK';
                    } else {
                        // echo 'ERROR';
                    }
                    // echo PHP_EOL;
                }
            }
        }
        // echo 'Delete '.$dir.'    ';
        if (rmdir($dir)) {
            // echo 'OK';
        } else {
            // echo 'ERROR';
        }
        // echo PHP_EOL;
    }
}

 

Electron sucks

Voilà pourquoi les applications basées sur Electron m’énervent autant.
Atom a moins de fonctionnalités que l’éditeur Delphi que j’utilisais dans les années 90 mais rame plus que lui sur un ordinateur énormément plus puissant .
Je ne comprend pas comment on peut le préférer à Sublime text.

Activer les hooks dans une page CMS PrestaShop

Normalement le contenu des pages CMS est statique dans PrestaShop mais il peut être utile d’y afficher un module pour mettre les dernières réductions, un formulaire d’inscription ou n’importe quoi.

Pour cela il faut modifier le fichier cms.tpl du thème de la boutique.

{$cms->content}

devient

{assign var="cms_content" value=$cms->content}
{include file="string:$cms_content"}

ça permet au contenu d’être interprété par Smarty avant l’affichage et on peut donc mettre les appels aux hooks dans sa page CMS sous la forme {hook h=’displayCarousel’}  (voir la doc).

En fait cela permet aussi d’utiliser toute la syntaxe de Smarty, les foreach , include  et tout le reste

Ne pas utiliser de champs FLOAT dans MySQL

En fait je ne sais pas pourquoi les float existent, c’est que des sources de bugs.

Il y a quelques années j’ai fait un champ float dans une table et aujourd’hui 1er bug parce que MySQL transforme 27.264957 en 27.265 dans ce champ et l’arrondi devient 27.27 au lieu de 27.26. Et la compta elle aime pas.

Donc la morale c’est : Pas de float, que des decimal

Vider un dossier en PHP

J’utilise ce script pour vider un dossier rapidement. C’est pratique quand on a seulement un accès FTP et qu’on doit démarrer un nouveau projet.

Il faut le déposer dans le dossier à vider, le lancer avec le navigateur et tout est supprimé.

<?php
/**
* Delete all files and subfolders in the current folder
* I use it to start a new project
* Be careful : There is no confirmation, this script deletes everything it can, including itself
*/

// https://stackoverflow.com/a/17161106/2530962 php glob - scan in subfolders for a file
function rglob($pattern, $flags = 0) {
    $files = (array) glob($pattern, $flags);
    foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) {
        $files = array_merge($files, rglob($dir.'/'.basename($pattern), $flags));
    }
    return $files;
}
// https://stackoverflow.com/a/33059445/2530962 Get all file all subfolders and all hidden file with glob
// https://stackoverflow.com/a/13468943/2530962 Deleting all files from a folder using PHP?

// this line returns warnings because unlink can't delete folders. There will be deleted after
array_map('unlink', rglob(dirname(__FILE__)."/{,.}[!.,!..]*",GLOB_MARK|GLOB_BRACE));

$folders = array_reverse(rglob(dirname(__FILE__)."/{,.}[!.,!..]*",GLOB_MARK|GLOB_BRACE));
array_map('rmdir', $folders);