Nativní aplikace na míru: Objednávejte pomocí 4D pro mobilní zařízení

Automaticky přeloženo z Deepl

4D v19 R6 a v19 R7 přinesly do 4D pro mobilní zařízení dvě zajímavé funkce. Relace a zobrazování webových stránek obsluhovaných serverem 4D v nativní mobilní aplikaci. Přemýšleli jste ale o možnostech, které získáte, když obě tyto funkce zkombinujete?

Tento příspěvek na blogu vám jednu z těchto možností ukáže. Ukážeme si, jak vytvořit jednoduchou aplikaci, která umožní mobilním uživatelům zadávat objednávky do centrálního nákupu a konsolidovat tak své zásoby:

Nákupní košík HDI

Neváhejte a vyzkoušejte si to sami s výše uvedeným HDI 🙂

STRANA EDITORU PROJEKTU

Na této ukázkové aplikaci si ukážeme, jak jednoduché je :

  • Přidat balení do košíku pomocí primární akce a úložiště relací
  • Vizualizovat košík pomocí přednastavené akce otevřít URL adresu
  • Poskytnout možnost odebrat balíčky z košíku

 

K tomu potřebujeme vytvořit dvě akce ze sekce Akce :

Akci Přidat do košíku

Nejprve vytvořte akci „Přidat do košíku„, jednoduchou akci bez parametrů. Tato akce umožní odeslat požadavek na akci z mobilního zařízení a přímo zavolat databázovou metodu On Mobile App Action s potřebným kontextem.

Pro vytvoření těchto akcí stačí vytvořit novou základní akci, odstranit parametry z dolní tabulky parametrů a vybrat obor Aktuální entita (protože chceme do košíku přidat konkrétní produkt).

Přednastavená akce otevřít url

Potřebujeme vytvořit přednastavenou akci otevřít URL s oborem Tabulka. Do vyhrazeného pole zadejte cestu k serveru 4D. Zadejme například „/cart.shtml“.

blank

V databázové metodě akce mobilní aplikace

Poté kliknutím na tlačítko Vytvořit vytvoříme databázovou metodu On Mobile App Action. Tím se automaticky vytvoří Případ se všemi již vyplněnými akcemi.

Poté do své databázové metody On Mobile App Action přidejte kód!

  • Nejprve chceme zkontrolovat, zda u produktů, které chceme přidat do košíku, zbývají skladové zásoby.
  • Pokud ano, přidáme objekt produktu jako položku kolekce do skladu relace.
  • Pokud již objekt produktu v kolekci existuje, chceme zvýšit jeho množství.
  • Poté, když byl produkt správně přidán do úložiště Session, chceme snížit skladovou zásobu produktu v naší databázi.
  • Nakonec jsme požádali o opětovné načtení dat aplikace.
#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

Poté chceme vizualizovat náš košík na webové stránce přístupné z obrazovky aplikace Stocks a dát možnost odebrat produkty z košíku.

Podívejme se tedy na naši webovou stránku s košíkem…

WEBOVÁ STRÁNKA

Pro zobrazení našeho košíku musíme implementovat několik věcí, které budou vyhovovat našim potřebám :

  • Získat kolekci Session.storage.mobileData a zobrazit jednu položku na řádek tabulky pomocí značek 4D:
<table id="products">
  <tr>
    <th>Produkt</th>
    <th>Množství</th>
    <th>Cena</th>
    <th></th>
  </tr>
    <!--#4DEACH $product in Session.storage.mobileData-->
  <tr>
    <td>
      <!--#4DTEXT $product.Name-->
    </td>
    <td>
      <!--#4DTEXT $product.Quantity-->
    </td>
    <td>
      <!--#4DTEXT $product.Price--><b>$</b>
    </td>
    <td>
      <input type="button" value="Smazat" onclick="RemoveRecord(this)">
    </td>
  </tr>
  <!--#4DENDEACH-->
</table>
  • Přidejte javascriptovou funkci pro zavření nativního zobrazení aplikace z webového zobrazení a zavolejte ji při kliknutí na tlačítko zavřít :
<script>
    function closeFunc() {
      $4d.mobile.dismiss();
    }
</script>
  • Přidání javascriptové funkce pro odebrání řádku tabulky (odebrání položky produktu z kolekce produktů dostupné v Session. storage) :
<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>
  • Nakonec musíme vytvořit metodu projektu deleteMethod a zavolat ji ve funkci RemoveRecord poté, co jsme získali index k odstranění, který nám umožní odstranit prvek z košíku a z kolekce Session.storage.mobileData:
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 

A co systém Android?

Jako obvykle se pro získání aplikace pro Android stačí vrátit do editoru projektu, vybrat cíl Android a kliknout na tlačítko Build! Pro získání aplikací pro iOS a Android sestavíte jeden jediný projekt 4D mobile. Pamatujete si?

Zde je konečný výsledek v systému Android :

blank

Jak vidíte, použití uživatelské relace i webových stránek obsluhovaných aplikací 4D může pokrýt několik fascinujících případů použití!

Teď je řada na vás; podělte se s námi na fóru o ty vaše! Těšíme se na váš scénář.

David Azancot
• 4D for iOS Product Owner • David Azancot se připojil k týmu 4D Product jako Product Owner v roce 2017. Má na starosti psaní uživatelských příběhů a jejich převod do funkčních specifikací. Jeho role také zahrnuje zajištění toho, aby implementace funkcí vyhovovaly potřebám zákazníků. David graduoval jako MBA v marketingu, internetu a mobilitě na Institutu Leonarda Da Vinciho a svou kariéru zahájil v roce 2011 u začínající mobilní společnosti, kterou později získala Madvertise (skupina mobilního marketingu). S nadšením pro mobilní rozhraní byl přirozenou volbou pro vývoj interaktivních mobilních reklamních formátů pro skupinu v roce 2015. Zároveň David od roku 2012 vyvíjí vlastní aplikace pro iOS a Android.