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://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
Tonen aanbiedingen in WordPress page met PHP code
<?php
function xml_attribute($object, $attribute)
{
if(isset($object[$attribute]))
return (string) $object[$attribute];
}
$urlroot = ‘https://webshop.marti-orbak.nl‘;
$getinfo = ‘/GetInfo.aspx?Action=GetDiscountProducts&LocationCode=1’;
$xmlraw = file_get_contents($urlroot . $getinfo);
$xml=simplexml_load_string($xmlraw);
$xmldata = simplexml_load_string($xmlraw);
echo ‘<div id=”products” class=”row equalHeights-9″>’;
foreach($xmldata->DiscountItem as $item)
{ ?>
<div class=”col-sm-16 col-md-8 col-lg-4 product product-<?php echo $item[‘ProductId’] ?> discount”>
<a data-toggle=”modal” data-target=”#productid-<?php echo $item[‘ProductId’] ?>”>
<div class=”image-block”>
<img src=”<?php echo $urlroot . $item[‘Image’] ?>”>
<?php
$urlroot = ‘https://webshop.marti-orbak.nl‘;
$getinfo = ‘/getinfo.aspx?action=getproductinfo&LocationCode=1&productid=’ . $item[‘ProductId’] .’&Date=’ . $item[‘DiscountStartDate’] .”;
$xmlraw = file_get_contents($urlroot . $getinfo);
$xml=simplexml_load_string($xmlraw);
$xmldata = simplexml_load_string($xmlraw);?>
<div class=”price”>
<div class=”price-inner”>€ <?php echo $xmldata->Product->Subcode[‘PriceIn’] ?></div>
</div>
</div>
<div class=”content-block”>
<?php
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 ‘<div class=”date”><strong>Aanbieding</strong> ‘ . $startdateNew . ‘ t/m ‘ . $enddateNew .'</div>’;
?>
<h2><?php echo $item[‘Name’] ?></h2>
</div>
</a>
</div>
<?php }
echo ‘</div>’;
echo ‘<div id=”modals”>’;
$urlroot = ‘https://webshop.marti-orbak.nl‘;
$getinfo = ‘/GetInfo.aspx?Action=GetDiscountProducts&LocationCode=1’;
$xmlraw = file_get_contents($urlroot . $getinfo);
$xml=simplexml_load_string($xmlraw);
$xmldata = simplexml_load_string($xmlraw);
foreach($xmldata->DiscountItem as $item)
{ ?>
<?php
$urlroot = ‘https://webshop.marti-orbak.nl‘;
$getinfo = ‘/GetInfo.aspx?Action=GetProductInfo&LocationCode=1&ProductId=’ . $item[‘ProductId’] .’&Date=’ . $item[‘DiscountStartDate’] .”;
$xmlraw = file_get_contents($urlroot . $getinfo);
$xml=simplexml_load_string($xmlraw);
$xmldata = simplexml_load_string($xmlraw);
foreach($xmldata->Product as $item)
{ ?>
<div class=”modal fade product discount” id=”productid-<?php echo $item[‘Id’] ?>”>
<div class=”modal-dialog modal-lg”>
<div class=”modal-content”>
<div class=”modal-body”>
<div class=”close” data-dismiss=”modal”>
<img src=”<?php echo get_template_directory_uri(); ?>/images/icon-cross.svg” width=”20″ height=”20″ alt=”Sluit menu”>
</div>
<div class=”container-fluid”>
<div id=”product-content” class=”row equalHeights-5″>
<div class=”col-md-8″>
<div class=”image-block”>
<img src=”<?php echo $urlroot . $item[‘Image’] ?>”>
<div class=”price”>
<div class=”price-inner”>€ <?php echo $xmldata->Product->Subcode[‘PriceIn’] ?></div>
</div>
</div>
</div>
<div class=”col-md-8 content-block”>
<div class=”content-block-inner”>
<h2><?php echo $item[‘Name’] ?></h2>
<p><?php echo $item[‘Description’] ?></p>
<a class=”button” href=”https://webshop.marti-orbak.nl/AddProduct.aspx?ProductCode=<?php echo $item[‘Code’] ?>&Subcode=000&Amount=1″>Voeg toe aan winkelmand</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<?php }
?>
<?php }
echo ‘</div>’;
?>
Voorbeelden
http://debakkersmolen.nl/#products | http://debakkersmolen.nl/ontbijtservice | http://roodenrijs.hosting16.troublefree.nl | http://hilvers.pixel-development.nl