Una aplicación nativa hecha a medida: Hacer pedidos con 4D para móviles

Traducido automáticamente de Deepl

4D v19 R6 y v19 R7 trajeron dos funcionalidades interesantes a 4D for Mobile. Sesiones y mostrar páginas web servidas por el servidor 4D en su aplicación móvil nativa. Pero, ¿ha pensado en las posibilidades que se obtienen al combinar ambas?

Este blog post le mostrará una de estas posibilidades. Vamos a ver cómo construir una aplicación sencilla que permita a los usuarios móviles realizar pedidos a su central de compras para consolidar su stock:

Carrito de la compra IDH

No dudes en probarlo tú mismo con el IDH anterior 🙂

LADO DEL EDITOR DE PROYECTOS

Con esta aplicación de demostración, vamos a ver lo sencillo que es :

  • Añadir paquetes a un carrito utilizando una acción primaria y un almacenamiento de Sesión
  • Visualizar el carrito usando una acción preestablecida de abrir URL
  • Dar la posibilidad de eliminar paquetes del carrito

 

Para ello, necesitamos crear dos acciones desde la sección Acción :

Acción Añadir al carro

En primer lugar, cree una acción «añadir al carro «, una acción simple sin ningún parámetro. Esta acción le permitirá enviar una solicitud de acción desde el dispositivo móvil y llamar directamente al método de base de datos On Mobile App Action con el contexto necesario.

Para crear estas acciones, sólo tienes que crear una nueva acción básica, eliminar los parámetros de la tabla inferior de parámetros y seleccionar el ámbito de entidad Actual (ya que queremos añadir un producto específico al carrito).

acción preestablecida de abrir url

Necesitamos crear una acción preestablecida de abrir URL con un ámbito de Tabla. Introduzca la ruta del servidor 4D en el campo dedicado. Introduzcamos «/cart.shtml» por ejemplo.

blank

En el método de base de datos Mobile App Action

Luego haga clic en el botón Create para crear el método de base de datos On Mobile App Action. Esto creará automáticamente un Caso con todas sus acciones ya rellenadas.

Luego, agregue algo de código a su método de base de datos On Mobile App Action.

  • Primero, queremos comprobar si quedan existencias de los productos que queremos añadir al carrito.
  • Si es así, añade un objeto producto como elemento de la colección en el almacenamiento de la Sesión.
  • Si el objeto producto ya existe en la colección, queremos incrementar la cantidad.
  • A continuación, cuando el producto se haya añadido correctamente al almacenamiento de la Sesión, queremos disminuir la cantidad de productos en nuestra base de datos.
  • Finalmente, pedimos que se recarguen los datos de la aplicación.
#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

A continuación queremos visualizar nuestro carrito en una página web accesible desde la pantalla de nuestra aplicación Stocks y dar la posibilidad de eliminar productos del carrito.

Echemos un vistazo a la página web de nuestro carrito…

PÁGINA WEB

Tenemos que implementar varias cosas para mostrar nuestro carrito para satisfacer nuestras necesidades :

  • Obtener la colección Session.storage.mobileData y mostrar un artículo por fila de la tabla utilizando etiquetas 4D:
<table id="products">
  <tr>
    <th>Producto</th>
    <th>Cantidad</th>
    <th>Precio</th>
    <th></th>
  </tr>
    <!--#4DEACH $producto en Session.storage.mobileData-->
  <tr>
    <td>
      <!--#4DTEXT $producto.Nombre-->
    </td>
    <td>
      <!--#4DTEXT $producto.Cantidad-->
    </td>
    <td>
      <!--#4DTEXT $producto.Precio--><b>$</b>
    </td>
    <td>
      <input type="button" value="Eliminar" onclick="EliminarRegistro(this)">
    </td>
  </tr>
  ¡<!
</tabla>
  • Añadir una función javascript para cerrar la vista de la app nativa desde la webview y llamarla al pulsar el botón cerrar :
<script>
    function closeFunc() {
      $4d.mobile.dismiss();
    }
</script>
  • Añadir una función javascript para eliminar una fila de la tabla (eliminar un elemento de producto de la colección de productos disponibles en el almacenamiento Session.) :
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript"></script>
    function EliminarRegistro(elemento) {
      var rowJavascript = element.parentNode.parentNode;
      var rowjQuery = $(element).closest("tr");

      var request = $.ajax({
          método: "POST",
          url: "4DACTION/deleteMethod",
          datos: {
              index: rowJavascript.rowIndex - 1
          }
      });
      request.done(function(resultat) {
        window.location.reload();
      });
    }
</script>
  • Por último, necesitamos crear un método de proyecto deleteMethod y llamarlo en la función RemoveRecord después de haber recuperado el índice a borrar que nos permitirá eliminar un elemento del carrito y de la colección Session.storage.mobileData:
ARRAY TEXT($var1; 0)
ARRAY TEXT($var2; 0)

WEB GET VARIABLES($var1; $var2)
$indexToRemove:=Buscar en array($var1; "index")

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

¿Qué pasa con Android?

¡Como de costumbre, para obtener la aplicación Android, sólo tienes que volver al editor de proyectos, seleccionar el objetivo Android y hacer clic en el botón Build! Construye un único proyecto 4D mobile para obtener las aplicaciones iOS y Android. ¿Te acuerdas?

Aquí está el resultado final en Android :

blank

Como puede ver, ¡utilizar tanto la sesión de usuario como las páginas web servidas por 4D puede cubrir algunos casos de uso fascinantes!

Es su turno; ¡comparta el suyo con nosotros en el foro! Esperamos leer su escenario.

David Azancot
• Propietario de Producto 4D for iOS - David Azancot se unió al equipo de Producto 4D como Propietario de Producto en 2017. Está a cargo de escribir las historias de usuario y traducirlas en especificaciones funcionales. Su papel también incluye asegurarse de que las implementaciones de funcionalidades satisfagan las necesidades de los clientes. David se graduó con un MBA en Mercadeo, Internet y Movilidad en el Instituto Leonard De Vinci y comenzó su carrera en 2011 con una empresa móvil de nueva creación, posteriormente adquirida por Madvertise (un grupo de mercadeo móvil). Apasionado de las interfaces móviles, fue la elección natural para desarrollar formatos de anuncios móviles interactivos para el grupo en 2015. Paralelamente, David desarrolla sus propias aplicaciones para iOS y Android desde 2012.