Eine maßgeschneiderte Native App: Bestellen Sie mit 4D for Mobile

4D v19 R6 und v19 R7 bieten zwei interessante Funktionen für 4D for Mobile. Sitzungen und die Anzeige von Webseiten, die vom 4D Server in Ihrer nativen mobilen Anwendung bereitgestellt werden. Aber haben Sie auch an die Möglichkeiten gedacht, die sich ergeben, wenn Sie beides kombinieren?

Dieser Blogbeitrag zeigt Ihnen eine dieser Möglichkeiten. Wir werden sehen, wie man eine einfache App erstellt, die es mobilen Nutzern ermöglicht, Bestellungen bei ihrer Einkaufszentrale aufzugeben, um ihren Bestand zu konsolidieren:

Shopping Cart HDI

Probieren Sie es mit dem obigen HDI einfach selbst aus 🙂

PROJEKT-EDITOR-SEITE

Mit dieser Demo-App werden wir sehen, wie einfach es ist:

  • Hinzufügen von Packungen zu einem Warenkorb mithilfe einer primären Aktion und einer Session-Speicherung
  • Visualisierung des Warenkorbs mithilfe einer voreingestellten Aktion zum Öffnen der URL
  • Die Möglichkeit, Pakete aus dem Warenkorb zu entfernen

 

Zu diesem Zweck müssen wir zwei Aktionen aus dem Abschnitt Aktion erstellen:

Aktion „In den Warenkorb legen“

Erstellen Sie zunächst eine Aktion „In den Warenkorb legen“, eine einfache Aktion ohne Parameter. Mit dieser Aktion können Sie eine Aktionsanforderung vom mobilen Gerät aus senden und direkt die Datenbankmethode On Mobile App Action mit dem erforderlichen Kontext aufrufen.

Um diese Aktionen zu erstellen, müssen Sie lediglich eine neue Basisaktion erstellen, die Parameter aus der unteren Tabelle der Parameter entfernen und den Bereich „Current entity“ auswählen (da wir ein bestimmtes Produkt zum Warenkorb hinzufügen wollen).

Voreingestellte Aktion „Url öffnen“

Wir müssen eine voreingestellte Aktion „URL öffnen“ mit einem Tabellenbereich erstellen. Geben Sie den 4D Serverpfad in das entsprechende Feld ein. Geben wir zum Beispiel „/cart.shtml“ ein.

blank

In der Datenbankmethode Mobile App Action

Klicken Sie dann auf die Schaltfläche Erstellen, um die Datenbankmethode On Mobile App Action zu erstellen. Dadurch wird automatisch ein Case erstellt, in dem alle Ihre Aktionen bereits eingetragen sind.

Fügen Sie dann etwas Code zu Ihrer Datenbankmethode On Mobile App Action hinzu!

  • Zunächst wollen wir prüfen, ob die Produkte, die wir in den Warenkorb legen wollen, noch vorrätig sind.
  • Wenn ja, fügen Sie ein Produktobjekt als Collection in den Session-Speicher ein.
  • Wenn das Produktobjekt bereits in der Sammlung vorhanden ist, soll die Menge erhöht werden.
  • Wenn das Produkt korrekt zum Session-Speicher hinzugefügt wurde, wollen wir den Produktbestand in unserer Datenbank verringern.
  • Schließlich fordern wir die App-Daten auf, neu geladen zu werden.

 

#DECLARE($request : Object) : Object
var $productExist : Boolean
var $product; $response; $status : Object
var $mobileData : Collection
var $entity : 4D.Entity
$response:=New object
$action:=MobileAppServer.Action.new($request)
Case of 
 : ($request.action="addToCart")  
  If (Session.storage.mobileData=Null)   
   $mobileData:=New shared collection   
   Use (Session.storage)    
    Session.storage.mobileData:=$mobileData    
   End use    
  Else    
   $mobileData:=Session.storage.mobileData   
  End if   
  $entity:=ds[$request.context.dataClass]\
   .query("ID = "+String($request.context.entity.primaryKey))\
   .first()  
  // CHECK IF STOCK > 0
  If ($entity.Stock>0)   
   If ($mobileData.length>0)    
    $product:=$mobileData.query("Name = :1"; $entity.Name).pop()
    $productExist:=$product#Null    
    If ($productExist)     
     Use ($mobileData)      
      $product.Quantity:=$product.Quantity+1
      $product.Price:=($entity.Price)*($product.Quantity)      
     End use      
    End if 
   End if    
   If (Not($productExist))    
    $product:=New shared object(\
     "Name"; $entity.Name; \
     "Picture"; $entity.Picture; \
     "Quantity"; 1; \
     "Price"; $entity.Price)    
    Use ($mobileData)     
     $mobileData.push($product)     
    End use 
   End if    
   $entity.Stock:=$entity.Stock-1
   $status:=$entity.save()   
   If ($status.success)    
    $response.success:=True
    $response.dataSynchro:=True
    $response.statusText:="Well done 👍\n"\
    +$entity.Name+" has been added to your cart!"    
   Else     
    $response.statusText:="Bad luck 🫤\n"\
    +$entity.Name+" has not been added to your cart!"    
   End if    
  Else    
   // STOCK = 0
   $response.dataSynchro:=True
   $response.statusText:="Bad luck 👎\n"\
   +"No more stock available for this product!"   
  End if   
 Else 
  // Unknown action
  $response.statusText:="Unknown action: "+$request.action
End case 
return $response

Dann wollen wir unseren Einkaufswagen auf einer Webseite anzeigen, die von unserer Stocks-App aus zugänglich ist, und die Möglichkeit bieten, Produkte aus dem Einkaufswagen zu entfernen.

Werfen wir also einen Blick auf unsere Warenkorb-Webseite…

WEBSEITE

Wir müssen einige Dinge implementieren, um unseren Einkaufswagen unseren Bedürfnissen entsprechend darzustellen:

  • Abrufen der Session.storage.mobileData-Sammlung und Anzeige eines Artikels pro Tabellenzeile unter Verwendung von 4D-Tags:
<table id="products">
  <tr>
    <th>Produkt</th>
    <th>Menge</th>
    <th>Preis</th>
    <th></th>
  </tr>
    <!--#4DEACH $product in Session.storage.mobileData-->
  <tr>
    <td>
      <!--#4DTEXT $Produkt.Name-->
    </td>
    <td>
      <!--#4DTEXT $Produkt.Menge-->
    </td>
    <td>
      <!--#4DTEXT $Produkt.Preis--><b>$</b>
    </td>
    <td>
      <input type="button" value="Löschen" onclick="RemoveRecord(this)">
    </td>
  </tr>
  <!--#4DENDEACH-->
</table>
  • Fügen Sie eine Javascript-Funktion zum Schließen der nativen App-Ansicht aus der Webansicht hinzu und rufen Sie sie beim Klicken auf die Schaltfläche „Schließen“ auf:
<script>
    function closeFunc() {
      $4d.mobile.dismiss();
    }
</script>
  • Fügen Sie eine Javascript-Funktion hinzu, um eine Tabellenzeile zu entfernen (entfernen Sie ein Produktelement aus der Produktsammlung, die in Session.storage verfügbar ist) :
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
    function RemoveRecord(element) {
      var rowJavascript = element.parentNode.parentNode;
      var rowjQuery = $(element).closest("tr");

      var request = $.ajax({
          method: "POST",
          url: "4DACTION/deleteMethod",
          data: {
              index: rowJavascript.rowIndex - 1
          }
      });
      request.done(function(resultat) {
        window.location.reload();
      });
    }
</script>
  • Schließlich müssen wir eine Projektmethode deleteMethod erstellen und sie in der Funktion RemoveRecord aufrufen, nachdem wir den zu löschenden Index abgerufen haben, der es uns ermöglicht, ein Element aus dem Warenkorb und aus der Sammlung Session.storage.mobileData zu löschen:
ARRAY TEXT($var1; 0)
ARRAY TEXT($var2; 0)

WEB GET VARIABLES($var1; $var2)
$indexToRemove:=Find in array($var1; "index")

If ($indexToRemove>0)
$productIndex:=Num($var2{$indexToRemove})
	
Use (Session.storage.mobileData)
$mobileData:=Session.storage.mobileData
$mobileData.remove($productIndex)
End use 
End if 

Was ist mit Android?

Um die Android-App zu erhalten, müssen Sie wie üblich zum Projekt-Editor zurückkehren, das Android-Ziel auswählen und auf die Schaltfläche Build klicken! Sie erstellen ein einziges 4D Mobile Projekt, um iOS und Android Apps zu erhalten. Erinnern Sie sich?

Hier ist das Endergebnis für Android:

blank

Wie Sie sehen, können Sie mit der Benutzersitzung und den von 4D bereitgestellten Webseiten einige faszinierende Anwendungsfälle abdecken!

Jetzt sind Sie an der Reihe; teilen Sie Ihre Erfahrungen mit uns im Forum! Ich freue mich darauf, Ihr Szenario zu lesen.

David Azancot
4D for iOS Product Owner - David Azancot kam 2017 als Product Owner zum 4D Produktteam. Er ist verantwortlich für das Schreiben der User Stories und deren Umsetzung in funktionale Spezifikationen. Zu seinen Aufgaben gehört es auch, dafür zu sorgen, dass die Implementierungen der Funktionen den Bedürfnissen der Kunden entsprechen. David hat einen MBA-Abschluss in Marketing, Internet und Mobilität vom Leonard De Vinci Institute und begann seine Karriere 2011 bei einem mobilen Start-up-Unternehmen, das später von Madvertise (einer mobilen Marketinggruppe) übernommen wurde. Da er sich leidenschaftlich für mobile Schnittstellen interessiert, war er die erste Wahl, um 2015 interaktive mobile Werbeformate für die Gruppe zu entwickeln. Parallel dazu entwickelt David seit 2012 seine eigenen iOS- und Android-Applikationen.