Webshop development snippets 2018-10-15T22:09:38+00:00

EXTRAvestiging webshop development snippets

Naast een voorbeeld EV webshop integratie website waarin een voorbeeld gegeven wordt hoe een EV webshop in een PHP website geïntegreerd kan worden en een PHP voorbeeld-website waar een aantal code voorbeelden zijn te vinden, vindt u hieronder enkele extra code voorbeelden om gegevens uit de EV webshop te halen en te bewerken. Alle voorbeelden zijn in PHP.

Aanbiedingsformaat converteren naar een Nederlandse datum

De XML geeft een simpel datumformaat terug in de vorm YYYYMMDD zodat altijjd duidelijk is wat de datum is. Hieronder een code-snippet om de datum in een Nederlands formaat te converteren. (Met dank aan Michael van ThreeOnline.nl)

setlocale(LC_TIME, 'nl_NL');
$startdate = $item['DiscountStartDate'];
$startdateObj = DateTime::createFromFormat('Ymd', $startdate);
$startdateNew = strftime("%A %e %B %Y", strtotime($startdateObj->format('Y-M-d')));
 
$enddate = $item['DiscountEndDate'];
$enddateObj = DateTime::createFromFormat('Ymd', $enddate);
$enddateNew = strftime("%A %e %B %Y", strtotime($enddateObj->format('Y-M-d')));
 
echo '<span><strong>Aanbieding</strong> ' . $startdateNew . ' t/m ' . $enddateNew .'</span>';

Laat de hoofd-assortimenten zien

Dit voorbeeld haalt de hoofd-assortimenten op en laat deze zien. (Met dank aan Michael van ThreeOnline.nl)

        function xml_attribute($object, $attribute)
        {
            if(isset($object[$attribute]))
            return (string) $object[$attribute];
        }
       
        $urlroot = 'https://webshop.lekkerversbrood.nl';
        $getinfo = '/GetInfo.aspx?Action=GetMainAssortiments';
        $xmlraw = file_get_contents($urlroot . $getinfo);
        $xml=simplexml_load_string($xmlraw) or die("Error: Ontvangen XML is niet correct!");

        $xmldata = simplexml_load_string($xmlraw);
        foreach($xmldata->Assortiment as $item)
        { 
              echo '
<div>' . $item['Name'] . '</div>

';
              echo '
<div>' . $urlroot . '' . $item['Image'] . '</div>

';
        }

Forceer session_id() bij aanroepen iFrame

Om ervoor te zorgen dat het winkelwagentje en de iFrame webshop dezelfde data bevatten, dient de sessie-ID hetzelfde te zijn. Door de parameter ‘SessionId=###’ mee te geven bij het aanroepen van een webshop page, kun je dat organiseren.

Optie 1: Aanpassen advanced-iframe plugin 

Zodra webshop in een iFrame aangeroepen wordt, kan de sessie-ID meegegeven worden door de volgende code op regel 230 van plugin bestand ‘…\advanced-iframe\includes\advanced-iframe-main-iframe.php’ te plaatsen. Live-voorbeeld op http://roodenrijsphp.extravestiging.nl


// MLV20180907
// Append the SessionId of the calling website to the iFrame.
// More informatie at : https://www.extravestiging.nl/webshop-tools
$SessionId = session_id();
if (Empty($SessionId))
{
  // The Session is not started yet
  session_start();
  $SessionId = session_id();
}

// Create the SessionId parameter to append to the URL
$SessionIdAppend = 'SessionId=' . $SessionId;

// Check if we have to use a ? or &amp;
if (strpos($src, '?') > 0)
{
  $SessionIdAppend = '&' . $SessionIdAppend;
}
else
{
  $SessionIdAppend = '?' . $SessionIdAppend;
}

// Add the sessionId to the src
$src .= $SessionIdAppend;

// Debug the new URL to the page to see if it is OK
// $html .= 'iFrame URL = ' . $src;

Optie 2: Aanpassen advanced iframe instellingen bestand 

Een andere optie is om in de website een eigen variabele te definieren en deze in de advanced iframe settings te gebruiken bij het aanroepen van de webshop. Hieronder een voorbeeld hoe dat gedaan kan worden.

Optie 3: Bij elke call de sessie-id toevoegen 

Hieronder voorbeeld code vanuit een werkende implementatie van de EV webshop integratie ter illustratie. Sommige variabelen dienen zelf gecreerd te worden alvorens dit voorbeeld zal werken.

$sessionID = safeSessionForEXTRAvestiging(session_id());

$response = get_web_page(get_variabele('EXTRAvestiging_url').'/GetInfo.aspx?Action=SetSessionId&SessionId='.$sessionID.'&SessionOrigin=' .lcms::thisconfig('url_home'));

$cookiesIn='ASP.NET_SessionId='.$sessionID;

$response = get_web_page(get_variabele('EXTRAvestiging_url').'/AddProduct.aspx?ProductId='
    .$ProductId.'&Subcode='.$Subcode.'&Amount='.$Amount.'&SessionId='.$sessionID.'&SessionOrigin='
    .lcms::thisconfig('url_home'),
    $cookiesIn);

function get_web_page( $url, $cookiesIn = '' ){
    $options = array(
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => true,     //return headers in addition to content
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 10,      // timeout on connect
        CURLOPT_TIMEOUT        => 10,      // timeout on response
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
        CURLINFO_HEADER_OUT    => true,
        CURLOPT_SSL_VERIFYPEER => true,     // Validate SSL Certificates
        CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
        CURLOPT_COOKIEFILE     => ""
    );
    if($cookiesIn!=''){
        $options[CURLOPT_HTTPHEADER]=array("Cookie: {$cookiesIn}");
    }


    $ch      = curl_init( $url );
    curl_setopt_array( $ch, $options );
    $rough_content = curl_exec( $ch );
    $err     = curl_errno( $ch );
    $errmsg  = curl_error( $ch );
    $header  = curl_getinfo( $ch );
    curl_close( $ch );

    $header_content = substr($rough_content, 0, $header['header_size']);
    $body_content = trim(str_replace($header_content, '', $rough_content));
    $pattern = "#Set-Cookie:\\s+(?<cookie>[^=]+=[^;]+)#m";
    preg_match_all($pattern, $header_content, $matches);
    $cookiesOut = implode("; ", $matches['cookie']);

    $header['errno']   = $err;
    $header['errmsg']  = $errmsg;
    $header['headers']  = $header_content;
    $header['content'] = $body_content;
    $header['cookies'] = $cookiesOut;
    return $header;
}

function safeSessionForEXTRAvestiging($session_id){
    $session_id = substr($session_id,0,24);
    $session_id = str_replace(['6','7','8','9'],['1','2','3','4'],$session_id);
    return $session_id;
}

Verversen winkelmandje in parent-page

Zodra de EV webshop in de iFrame geladen is, is het nodig om de parent-page te laten weten wanneer er een product is toegevoegd zodat het winkelmandje op de parent-page geupdate kan worden. Het meest gemakkelijke is om de winkelmand te verversen zodra de inhoud van de iFrame veranderd. Dit is simpel op te lossen met de volgende jQuery functie:

$('iframe#EVWebshop').on("load", function()
{
  fillExternalCart(true);
});

De functie fillExternalCart doet vervolgens een Ajax call die de inhoud van het winkelwagentje ophaalt via ……/GetInfo?Action=GetShoppingcartContents.
Er zijn niet heel veel paginawissels binnen het iFrame in de praktijk dus de overhead is beperkt. Een werkend voorbeeld vindt u op http://hilversphp.extravestiging.nl

Voorbeelden


http://debakkersmolen.nl/#products | http://debakkersmolen.nl/ontbijtservice | http://roodenrijs.hosting16.troublefree.nl | http://hilvers.pixel-development.nl