{blog}


  • Validate date in format YYYY-MM-DD

    Validate date in format YYYY-MM-DD

    A simple JS function to validate that a date string in the format YYYY-MM-DD is a valid date. Will validate that the day is correct for the given month, including leap years

    /**
    * Validate that a date string in the format YYYY-MM-DD is a valid date
    * @param dateString (YYYY-MM-DD)
    * @returns {boolean}
    */
    function isValidDate(dateString) {
    
    // Date format: YYYY-MM-DD
    var datePattern = /^([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))/;
    
    // Check if the date string format is a match
    var matchArray = dateString.match(datePattern);
    if (matchArray == null) {
    return false;
    }
    
    // Remove any non digit characters
    var cleanDateString = dateString.replace(/\D/g, '');
    
    // Parse integer values from date string
    var year = parseInt(cleanDateString.substr(0, 4));
    var month = parseInt(cleanDateString.substr(4, 2));
    var day = parseInt(cleanDateString.substr(6, 2));
    
    // Define number of days per month
    var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    
    // Adjust for leap years
    if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) {
    daysInMonth[1] = 29;
    }
    
    // check month and day range
    if (month < 1 || month > 12 || day < 1 || day > daysInMonth[month - 1]) {
    return false;
    }
    
    // You made it through!
    return true;
    }
    JavaScript

  • Validate Swedish personnummer and organisationsnummer

    Validate Swedish personnummer and organisationsnummer

    JavaScript functions for validating Swedish personal identity numbers (personnummer), and organisation numbers (organisationsnummer). The functions for personal identity number will also validate co-ordination number (samordningsnummer).

    /**
     * Validate a 10 digit swedish personnummer
     * @param pnr
     * @returns {boolean|boolean}
     */
    function validatePersonnummer(pnr) {
        let personummer = cleanDigitString(pnr);
        if (personummer.length > 10) {
            return false;
        }
    
        return isValidLuhn(personummer) && isPersonnummerDate(personummer);
    }
    
    function validateOrganisationNumber(orgnr) {
        let orgnumber = cleanDigitString(orgnr);
    
        if (orgnumber.length < 10 || orgnumber.length > 12 || orgnumber.length === 11) {
            console.log(orgnumber.length);
        }
    
        return isValidLuhn(orgnumber);
    }
    
    /**
     * Remove any non digit characters
     * @param digitString
     * @returns {*}
     */
    function cleanDigitString(digitString) {
        return digitString.replace(/\D/g, '');
    }
    
    /**
     * Check if date is valid for personnummer
     * @param pnr
     * @returns {boolean}
     */
    function isPersonnummerDate(pnr) {
        let year = parseInt(pnr.substring(0, 2));
        let month = parseInt(pnr.substring(2, 4));
        let day = parseInt(pnr.substring(4, 6));
    
        // Check year and month values
        if (year < 0 || year > 99 || month < 0 || month > 12) {
            return false;
        }
    
        let daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    
        // Adjust for leap years
        if (year % 400 === 0 || (year % 100 !== 0 && year % 4 === 0)) {
            daysInMonth[1] = 29;
        }
    
        // Check that day is within range
        let dayIsValid = day > 0 && day <= daysInMonth[month - 1];
    
        // If day is outside range, check if it's +60 for samordningsnummer
        if (!dayIsValid) {
            dayIsValid = day > 60 && day <= daysInMonth[month - 1] + 60;
        }
    
        return dayIsValid;
    }
    
    /**
     * Check if last digit of number is vald Luhn control digit
     * @param pnr
     * @returns {boolean}
     */
    function isValidLuhn(pnr) {
        let number;
        let checksum = 0;
        for (let i = pnr.length - 1; i >= 0; i--) {
            number = parseInt(pnr.charAt(i));
            if (i % 2 === 1) {
                checksum += number;
            } else {
                checksum += (number * 2) > 9 ? (number * 2) - 9 : number * 2;
            }
        }
    
        return checksum % 10 === 0;
    }
    JavaScript

  • Laravel with SSL through Cloudflare on Heroku.

    Laravel with SSL through Cloudflare on Heroku.

    I deployed a Laravel app on Heroku, using Cloudflare for SSL. As a quick note, here’s how I did it.

    1. Deploy the app on Heroku and make sure everything works fine using the heroku app url.
    2. Add the domain names to your app in Heroku (in the settings tab for the app). Make sure you add both the root domain and www if you’re using it (example.com, www.example.com). Don’t activate SSL in Heroku.
    3. Add the site to your Cloudflare account (choose the free plan, when asked).
    4. Point your domain to Cloudflare by changing the name servers  (at the registrars control panel) to the ones Cloudflare gives you when adding the site.
    5. Wait for the name server changes to go through. It will be notified under the Overview tab on Cloudflare. When this is done you will administer the domain records on Cloudflare instead of your domain regristrar.
    6. Remove all the DNS records you don’t need, under the DNS tab in Cloudflare.  For the next step to work you need to remove the A records for the root domain – since you won’t point it to an IP address, but a domain on Heroku.
    7. Point Cloudflare to your Heroku app by adding cname records pointing to the Heroku app url.
      Like this.

      Type: CNAME
      Name: jymden.com
      Domain name: myapp.herokuapp.com


      Type: CNAME
      Name: www
      Domain name: myapp.herokuapp.com


    8. In Cloudflare, go to the Crypto tab. Set SSL to Full:
    9. Make sure your Universal SSL certificate is activated. This will happen automatically a little while after adding the site to Cloudflare (up to 24 hours, but usually faster).  When it’s activated you’ll see it a bit down in the Crypto tab, like this:
    10. Prepare your Laravel app to use https by adding this to the boot function AppServiceProvider.php (App/Providers):
    
    public function boot(UrlGenerator $url)
    {
      if (env('APP_ENV') !== 'local') {
        $url->forceSchema('https');
      }
    }
    
    PHP

    NOTE: if you’re using Laravel 5.4 or higher it’s forceScheme instead of forceSchema

    Also, you need to set your Laravel environment variable APP_ENV to production (or at least something else than local). Do this in the Heroku app settings tab.

  • Now try to enter your site with https. It might take a while for it to kick in.
  • When you see that https is working correctly, go in to the Page Rules tab in Cloudflare. Click Create Page Rule and add the rule to always use https for the domain. Use wildcards to cover all urls. Like this:
  • Drink coffee.

  • Use include method in IE

    Use include method in IE

    Here’s a hack for using the includes method also in the horrible Internet Explorer.

    if (!String.prototype.includes) {
      String.prototype.includes = function() {
        "use strict";
        return String.prototype.indexOf.apply(this, arguments) !== -1;
      };
    }
    JavaScript


  • Serve Laravel to the web

    Serve Laravel to the web

    This will make your Laravel instance available on the web. Make sure your router have port 80 forwarded to your machine. Also make sure no other server applications is blocking the port.

    php artisan serve --host 0.0.0.0 --port 80
    Bash


  • Sort array of objects by property value

    Sort array of objects by property value

    usort($myArray, function ($a, $b) {
        return strcmp($a->myPropery, $b->myPropery);
    });
    PHP

    Sort by predefined order:

    $predefinedOrder = [1, 5, 2, 6];
    
    usort($arrayOfObjects, function ($a, $b) use ($predefinedOrder) {
    
        $flipped = array_flip($predefinedOrder);
        $left = $flipped[$a->myPropery];
        $right = $flipped[$b->myPropery];
        return $left >= $right;
    });
    PHP


  • Add column to table in Laravel

    Add column to table in Laravel

    Create migration in console:

    php artisan make:migration add_mycolumn_to_mytable
    Bash

    Use Schema::table() to access existing table (instead of Schema::create() for creating new tables)

    public function up()
    {
        Schema::table('mytable', function($table) {
            $table->text('mycolumn');
        });
    }
    public function down()
    {
        Schema::table('mytable', function($table) {
            $table->dropColumn('mycolumn');
        });
    }
    PHP

    Then run migrations:

    php artisan migrate
    Bash

  • Allow Composer to connect to http/https

    Allow Composer to connect to http/https

    If you have problems with Composer not allowing to update to http-connections add this to composer.json (not recommended to keep in production)

    config : {
      "secure-http" : false
    }
    JSON


  • (WordPress) Generate post title from custom field

    I had a custom post type that only used custom fields, so I needed to generate a post title from there.
    Here’s one way. You can if course chain as many if else as you want to check other types.

    functions.php
    [php]
    function custom_post_type_title($post_id)
    {
    global $wpdb;
    if (get_post_type($post_id) == ‘staff’) {
    $name = get_post_custom_values(‘name’);
    $title = $name[0];
    $where = array(‘ID’ => $post_id);
    $wpdb->update($wpdb->posts, array(‘post_title’ => $title), $where);
    }
    }

    add_action(‘save_post’, ‘custom_post_type_title’);

    [/php]


  • Laravel helpful plugins

    Laravel helpful plugins

    Generate Seed from Database
    https://github.com/orangehill/iseed

    Generate Migrations from Database:
    https://github.com/Xethron/migrations-generator