Hauptmenü

Werkzeuge

Kategorien

Archiv

Einhell

Rootline / Breadcrumb eines WordPress Menüs

Erstellt in Allgemein am 3. August 2021 vom Daschmi

Mit folgender Funktion kann man die Rootline / Breadcrumb eines WordPress Menüs bilden. Die Einträge im Menü sollten dabei nur einmal vorhanden sein, sonst ist der Pfad nicht eindeutig.

abstract class Nav {
		
    public static function getRootline(string $menu_location): array {
    
        $arMenuLocations = \get_nav_menu_locations();                
        $menuID = $arMenuLocations[$menu_location];
        $arNav = \wp_get_nav_menu_items($menuID);

        $arRootline = [];
        
        foreach ($arNav as $nav_item) {
            
            if ($nav_item->type === 'post_type' && get_the_ID() === intval($nav_item->object_id)) {
                
                $arRootline[] = $nav_item;
                
                while (intval($nav_item->menu_item_parent) !== 0) {
                    
                    foreach ($arNav as $sub_nav_item) {
                        
                        if (intval($sub_nav_item->ID) === intval($nav_item->menu_item_parent)) {
                            
                            $arRootline[] = $sub_nav_item;
                            
                            $nav_item = $sub_nav_item;
                            
                            break;
                            
                        }
                        
                    }
                    
                }
                
            }

        }
        
        array_reverse($arRootline);
        
        return $arRootline;
        
    }
    
} 

Beispielhafte Anwendung der Funktion

$arRootline = Nav::getRootline('main_menu');

Javascript forEach Schleife abbrechen

Erstellt in Javascript am 1. August 2021 vom Daschmi

Ein Callback der an eine forEach Funktion übergeben wurde kann die Schleife nicht mit return oder break beenden. Es geht aber über das Nutzen einer Exception.

try {
    			
    BigIPBlock.forEach(function(ip, long, index) {
    
        console.log(index, ip);
        
        if (index > 255) throw new Error();
    
    });

} catch (E) {
    
    console.log('To much IPs in block.');
    
}

Weiter Anker Scroll mit VanillaJS

Erstellt in Javascript am 30. Juli 2021 vom Daschmi

Mit folgenden Vanilla JS Code Schnipsel scrollen die Anker Links smart zu den Zielen.

for (let element of document.querySelectorAll('a[href^="#"]')) {
        
    element.addEventListener('click', (event) => {
        
        event.preventDefault();
        
        let hash = element.getAttribute('href');
        let target = document.getElementById(hash.substr(1));
        
        if (target !== null) {
        
            let rect = target.getBoundingClientRect();
            let top = (window.pageYOffset || document.documentElement.scrollTop) + rect.top;
                
            let offset = 92;
            
            window.scrollTo({
                top: top - offset,
                behavior: "smooth"
            });

        }
        
    });
    
}

Längen- und Breitengrad über Nominatim/Openstreetmap ermitteln

Erstellt in Allgemein am 21. Juli 2021 vom Daschmi

Mit folgender einfachen Klasse kann man aus einer Adresse die Längen-/Breitengrade ermitteln. Genutzt wird die Nominatim API. Nutzungsbedingungen der Nominatim API.

abstract class Nominatim {
    
    public static function getLongLatFromAddress(string $strAddress): array {
        
        $ch = curl_init();
        
        curl_setopt($ch, CURLOPT_URL, 'https://nominatim.openstreetmap.org/search?q=' . urlencode($strAddress). '&format=json&polygon=1&addressdetails=1');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_REFERER, 'https://sonnenberggmbh.de/');

        $output = curl_exec($ch);

        curl_close($ch);  
        
        $output = @json_decode($output, true);
            
        if (is_array($output) && isset($output[0])) return [
            'long' => $output[0]['lon'],
            'lat' => $output[0]['lat'],
            'raw' => $output 
        ]; else return [
            'long' => null,
            'lat' => null,
            'raw' => null
        ];
                    
    }
    
}

Anwendung:

$result = Nominatim::getLongLatFromAddress('Burgscheidungen');

echo "Längen-/Breitengrad: ".$result['long'].' / '.$result['lat'];

Nummer parallel hochzählen mit Datei Lock

Erstellt in PHP am 15. April 2021 vom Daschmi

Mit folgender php Funktion kann man eine Nummer ohne Datenbank hochzählen. Mittels flock wird sichergestellt, dass die Nummer nicht von parallelen Prozessen doppelt vergeben wird.

/**
  * @return int
  * @throws Exception
  */
function setNumber(): int {

    $file = dirname(__FILE__).'/number.txt';
    $number = 0;

    if (!file_exists($file)) {

        $fp = fopen($file, "w");

    } else {

        $fp = fopen($file, "r+");

        while (!flock($fp, LOCK_SH)) { }

        $number = intval(fread($fp, filesize($file)));

        flock($fp, LOCK_UN);

    }

    rewind($fp);

    $number ++;

    while ((!flock($fp, LOCK_EX))) { }

    ftruncate($fp, 0);
    fwrite($fp, strval($number));
    fflush($fp);
    flock($fp, LOCK_UN);

    fclose($fp);

    return $number;

}

Gutenberg Block über die BlockID/PostID finden

Erstellt in Allgemein am 3. April 2021 vom Daschmi

Mit folgender Funktion habe ich sensible Einstellungen aus einem Gutenberg Block ausgelesen, ohne diese über das Frontend übertragen zu müssen.

/**
 * Sucht einen Block anhand der blockId
 *
 * @param array $arBlocks
 * @param string $block_id
 *
 * @return false|array
 */
$search_block = function(array $arBlocks, string $block_id) use (&$search_block) {

    foreach ($arBlocks as $block) {

        if (($block['attrs']['blockId']??'') === $block_id) {

            return $block;

        }

        $sub = $search_block(($block['innerBlocks']??[]), $block_id);

        if ($sub !== false) return $sub;

    }

    return false;

};

$post = get_post($post_id);
$arBlocks = parse_blocks($post->post_content);

$block = $search_block($arBlocks, $blockId);

OpenStreetmap Karte mit OpenLayer ohne Zoom mit dem Scrollrad

Erstellt in Allgemein am 3. Februar 2021 vom Daschmi

Wenn man eine Karte von OpenStreetmap mit OpenLayer integriert, kann das Zoomen mit dem Mausrad stören. Abhilfe schafft eine Option brei den interactions:

interactions: ol.interaction.defaults( { mouseWheelZoom:false } 

Beispiel:

let map = new ol.Map({
    layers: [
        new ol.layer.Tile({
            source: new ol.source.OSM()
        }),
        new ol.layer.Vector({

        })
    ],
    view: new ol.View({
        center: ol.proj.fromLonLat([long, lat]),
        zoom: 16
    }),
    interactions: ol.interaction.defaults( { mouseWheelZoom:false } ),
    target: 'm1_map'
});

TextWithRotation und tFPDF / UTF8

Erstellt in Allgemein am 14. Januar 2021 vom Daschmi

Nutzt man die Erweiterung von FPDF für TextRotation (http://www.fpdf.org/en/script/script2.php) funktioniert diese nicht direkt mit tFPDF (http://www.fpdf.org/en/script/script92.php) und UTF8 Fonts. Folgende kleine Anpassung in der Funktion TextWithRotation löst das Problem:

function TextWithRotationUTF($x, $y, $txt, $txt_angle, $font_angle = 0) {

    $font_angle += 90 + $txt_angle;
    $txt_angle *= M_PI / 180;
    $font_angle *= M_PI / 180;

    $txt_dx = cos($txt_angle);
    $txt_dy = sin($txt_angle);
    $font_dx = cos($font_angle);
    $font_dy = sin($font_angle);

    if ($this->unifontSubset) {

        $txt2 = '('.$this->_escape($this->UTF8ToUTF16BE($txt, false)).')';
        foreach ($this->UTF8StringToArray($txt) as $uni)
        $this->CurrentFont['subset'][$uni] = $uni;

    } else {

        $txt2 = '('.$this->_escape($txt).')';

    }

    $s = sprintf('BT %.2f %.2f %.2f %.2f %.2f %.2f Tm %s Tj ET',
            $txt_dx, $txt_dy, $font_dx, $font_dy,
            $x*$this->k, ($this->h-$y)*$this->k, $txt2);

    if ($this->ColorFlag) $s = 'q '.$this->TextColor.' '.$s.' Q';

    $this->_out($s);

}

SCSS Mixin Helper für IE11 Flex Gap Support

Erstellt in Stylesheet CSS/SCSS am 11. Dezember 2020 vom Daschmi

Wer das Property gap für Flex Elemente nutzt (oder genutzt hat) und den Internet Explorer 11 noch unterstützen muss, kann mit folgenden SCSS Mixins einfach das gleiche Verhalten erzeugen.

@mixin ie11gapfixrow($gap) {
  & > * { margin-right:#{$gap}; &:last-child { margin-right:0; } }
}
@mixin ie11gapfixcolumn($gap) {
  & > * { margin-bottom:#{$gap}; &:last-child { margin-bottom:0; } }
}

Angewendet wird es dann einfach innrehalb SCSS Anweisungen

#catnav { display:flex; justify-content:flex-start; /*gap:1rem;*/ 
  @include ie11gapfixrow(1rem);
}

MD5 Hash rekursiv aus Verzeichnis ermitteln

Erstellt in PHP am 5. November 2020 vom Daschmi

Um mit PHP den MD5 Hash eines Verzeichnisses zu ermitteln kann folgende Funktion verwendet werden.

abstract class Md5Tool {

    public static function md5_dir(string $path): string {

        if (is_dir($path)) {

            foreach (scandir($path) as $entry) {
                
                if (!in_array($entry, ['.', '..'])) $arMd5[] = self::md5_dir($path.$entry);
                                    
            }
            
            return md5(implode('', $arMd5));
            
        } else {
            
            return md5_file($path);
            
        } 

    }
    
}

echo Md5Tool::md5_dir('/');