Maak zelf een (eenvoudige webhop)

Moeilijkheidsgraad

trefwoorden

Veel mensen willen iets te koop stellen, zonder daarvoor complexe modules en structuren te willen gebruiken. Met wat creativiteit kan je dit inderdaad maken.

Case: We verkopen pizza's. Elke pizza heeft variaties. Zo kan je de grootte en extra ingrediënten bestellen.

Test alles uit op https://project.freewebsite.be/pizza-s

Screen001752.png

Je kiest de grootte en desnoods de extra ingrediënten. De keuzemogelijkheden zijn per soort pizza anders! Een Frutti di Mare heeft andere ingrediënten dan een Hawaï. De prijs wordt onmiddellijk berekend.


Screen001753.png

Daarna bestel je aan de hand van een contactformulier. Alles staat automatisch ingevuld, behalve de persoonlijke gegevens natuurlijk. Automatisch wordt er een mail verstuurd, zowel naar ons als naar de klant.


Screen001754.png

De bestellingen komen reeds binnen.. kassa kassa..

Screen001755.png

Werkwijze

Maak een inhoudstype aan. Pizza grootte en Ingrediënten zijn taxonomievelden die de mogelijke variaties van het product (Pizza) bevatten. In welke groottes is de Pizza verkrijgbaar (vb klein groot) en welke ingrediënten worden er gebruikt.(hesp, kaas, ansjovis,...).

Keuze Grootte en Keuze Ingrediënt zijn velden die naar dezelfde woordenlijst verwijzen en die de klant zal gebruiken om de keuze te doen. Een prijstabel wordt met een tablefield getoond. Het veld 'Bestelling' is een tekstveld dat zal worden gebruikt om de knop te genereren met de link naar het bestel formulier (=contactformulier). Hier zullen we gebruik maken van de Prepopulate module om de keuze van de node over te dragen naar het contactformulier. Een contactformulier gebruik ik liever dan een nodeformulier omdat je kunt mailen naar de afzender (en naar ons) zonder Rules te moeten gebruiken. Het body veld zal gebruikt worden om een berekening te maken van de gekozen combinatie.

 

Screen001769.png

 

Maak 2 Pizza's aan als voorbeeld. Zet in het body veld (voorlopig) dit (PHP modus): </br></br><p><a style="color:white;background:grey;padding:5px;" href="/node/[node:nid]/edit">Bereken een andere combinatie</a></p>. Met de Token Filter module wordt hier de node id als variabele gebruikt. Het geeft een link om de inhoud te bewerken.

Geef aan anonieme gebruikers de toelating om de nodes te wijzigen. Met de Field Permission module hou je enkel de Keuze velden over om te wijzigen voor anonieme gebruikers. Het tabblad blok met Weergeven en Bewerken, zet je bij de blokken verborgen voor anonieme gebruikers.

Screen001773.png

Je krijgt dan dit:

Screen001770.png

Je ziet dat de keuze van de ingrediënten zich beperkt tot enkel de ingrediënten van de soort Pizza. Normaal gezien ga je alle ingrediënten van alle pizza's zien. Dit los je op door een referentie view te maken en als keuzelijst te gebruiken.

Screen001771.png
Screen001772.png

 

Maak nu een nieuw contactformulier aan met volgende extra velden:

Screen001774.png

Het bestellingsveld dat naar dit contactformulier verwijst ziet er zo uit:

<?php
$ingred1='[node:field_keuze_ingredient:0:entity]';
if("["== substr($ingred1,0,1)){
$ingred1=" ";
}
$ingred2='[node:field_keuze_ingredient:1:entity]';
if("["== substr($ingred2,0,1)){
$ingred2=" ";
}
$ingred3='[node:field_keuze_ingredient:2:entity]';
if("["== substr($ingred3,0,1)){
$ingred3=" ";
}
$ingred=$ingred1." ".$ingred2." ".$ingred3;

echo "<p><a style='color:white;background:grey;padding:5px;' href='https://project.freewebsite.be/contact/pizza_bestelling?edit[subject]=B… van een pizza [node:title]&edit[message]=Tegen welk uur zou je de bestelling willen?&edit[field_grootte]=[node:field_keuze_grootte:0:entity]&edit[field_extra_ingredienten]=".$ingred."'>Bestel de geselecteerde pizza</a></p>";

?>

Er wordt gretig gebruik gemaakt van de Prepopulate module. De eerste stappen zijn een controle of de drie ingrediënten inderdaad als extra werden aangevraagd. Indien dit niet gebruikt werd blijft de code van de token module bestaan en begint de variabele met een [.

Prepopulate heeft last van de Drupal Cache. Als de bezoeker een tweede keuze maakt,zal de eerste getoond worden. Je lost dit op door een blokje te voorzien op de Contactformulieren die er zo uit ziet:  <?php   \Drupal::service('page_cache_kill_switch')->trigger();   ?>

Berekening

Vorm de tabel (met een beetje Excel lukt dit prima) om tot een één op één tabel, waarbij elke keuze een uniek prijs heeft. Maak een inhoudstype en lees dit in met Feeds. Zoveel makkelijker..

  Hawaï Frutti di mare
afmeting basis hesp mozarella ananas salami basis mosseltjes ansjovis scampi's mozarella
small                       10,00 €           1,00 €                                                       1,00 €        1,50 €               1,20 €             12,00 €                     1,50 €           1,20 €        1,80 €                1,20 €
large                       15,00 €           2,00 €                                                       2,00 €        2,50 €               2,20 €             18,00 €                     2,50 €           2,20 €        3,80 €                2,90 €

 

Het resultaat:

Hawaï small basis     10,00 €
Hawaï small hesp        1,00 €
Hawaï small mozarella        1,00 €
Hawaï small ananas        1,50 €
Hawaï small salami        1,20 €
Hawaï large basis     15,00 €
Hawaï large hesp        2,00 €
Hawaï large mozarella        2,00 €
Hawaï large ananas        2,50 €
Hawaï large salami        2,20 €
Frutti di mare small basis     12,00 €
Frutti di mare small mosseltjes        1,50 €
Frutti di mare small ansjovis        1,20 €
Frutti di mare small scampi's        1,80 €
Frutti di mare small mozarella        1,20 €
Frutti di mare large basis     18,00 €
Frutti di mare large mosseltjes        2,50 €
Frutti di mare large ansjovis        2,20 €
Frutti di mare large scampi's        3,80 €
Frutti di mare large mozarella        2,90 €

 

Het bodyveld gebruik voor deze berekening. Ik maak gebruik van php én de tokenfilter om de variabelen vanuit Drupal in te lezen.

<?php
$titel='[node:title]';
$grootte='[node:field_keuze_grootte:entity:name]'; 
if("["== substr($grootte,0,1)){
$grootte=" ";
echo "geen pizzagrootte geselecteerd";
}

if ($grootte!=" "){

$extra='[node:field_keuze_ingredient:0:entity:name]';
if("["== substr($extra,0,1)){
$extra=" ";
}
$extra2='[node:field_keuze_ingredient:1:entity:name]';
if("["== substr($extra2,0,1)){
$extra2=" ";
}
$extra3='[node:field_keuze_ingredient:2:entity:name]';
if("["== substr($extra3,0,1)){
$extra3=" ";
}

$zoekterm=$titel." ".$grootte. " ". $extra;
$zoekterm2=$titel." ".$grootte. " ". $extra2;
$zoekterm3=$titel." ".$grootte. " ". $extra3;
$titelbasis=$titel." ".$grootte." basis";
if($extra!=" "){
$string = "Prijsberekening voor ".$titel." ".$grootte." met extra ".$extra;
}
else{
echo "Prijsberekening voor ".$titel." ".$grootte." : €";
}
if($extra2!=" "){
$string= $string." en ".$extra2;
}
if($extra3!=" "){
$string= $string." en ".$extra3;
}
 $nids = \Drupal::entityQuery('node')->condition('type','pizza_prijzen')->execute();
 $nodes =  \Drupal\node\Entity\Node::loadMultiple($nids); 

$extraprijs=0;

foreach ($nids as $nid) {
  $node = \Drupal\node\Entity\Node::load($nid); 
  $title = $node->title->value;

if($titelbasis==$title){
//echo "titelbasis gevonden";
 $basisprijs = $node->field_prijs->value;
}

  if ($zoekterm==$title){
    $extraprijs = $extraprijs + $node->field_prijs->value;   
}
 if ($zoekterm2==$title){
    $extraprijs = $extraprijs + $node->field_prijs->value;   
}
 if ($zoekterm3==$title){
    $extraprijs = $extraprijs + $node->field_prijs->value;   
}

}  
 $totaalprijs= $basisprijs + $extraprijs;
    echo $string." €".$totaalprijs;
}
?>
</br></br><p><a style="color:white;background:grey;padding:5px;" href="/node/[node:nid]/edit">Bereken een andere combinatie</a></p>