Hauptmenü

Werkzeuge

Kategorien

Archiv

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);