Show Menu
TEMAS×

Creación de extensiones personalizadas

Generalmente, al implementar un proyecto, tiene código personalizado tanto en AEM como en Adobe Campaign. Con el uso de la API existente, puede llamar a su código personalizado en Adobe Campaign desde AEM o desde AEM a Adobe Campaign. Este documento describe cómo hacerlo.

Requisitos previos

Debe tener instalado lo siguiente:
  • Adobe Experience Manager
  • Adobe Campaign 6.1

Ejemplo 1: AEM a Adobe Campaign

La integración estándar entre AEM y Campaign se basa en JSON y JSSP (JavaScript Server Page). Estos archivos JSSP se pueden encontrar en la consola Campaña y todos comienzan con amc (Adobe Marketing Cloud).
Para ver este ejemplo, consulte Geometrixx , que está disponible en Uso compartido de paquetes.
En este ejemplo, creamos un nuevo archivo JSSP personalizado y lo llamamos desde el lado de AEM para recuperar el resultado. Se puede utilizar, por ejemplo, para recuperar datos de Adobe Campaign o para guardarlos en Adobe Campaign.
  1. En Adobe Campaign, para crear un nuevo archivo JSSP, haga clic en el icono Nuevo .
  2. Escriba el nombre de este archivo JSSP. En este ejemplo, utilizamos cus:custom.jssp (lo que significa que estará en el espacio de nombres cus ).
  3. Coloque el siguiente código dentro del archivo jssp:
    <%
    var origin = request.getParameter("origin");
    document.write("Hello from Adobe Campaign, origin : " + origin);
    %>
    
    
  4. Guarde su trabajo. El trabajo restante se realiza en AEM.
  5. Cree un servlet sencillo en el lado de AEM para llamar a este JSSP. En este ejemplo, suponemos lo siguiente:
    • La conexión funciona entre AEM y Campaign
    • El servicio de nube de campañas está configurado en /content/geometrixx-outdoors El objeto más importante de este ejemplo es GenericCampaignConnector , que le permite llamar (obtener y publicar) archivos jssp en el lado de Adobe Campaign.
    Este es un pequeño fragmento de código:
    @Reference
    private GenericCampaignConnector campaignConnector;
    ...
    Map<String, String> params = new HashMap<String, String>();
    params.put("origin", "AEM"); 
    CallResults results = campaignConnector.callGeneric("/jssp/cus/custom.jssp", params, credentials);
    return results.bodyAsString();
    
    
  6. Como puede ver en este ejemplo, debe pasar las credenciales a la llamada. Esto se puede obtener mediante el método getCredentials(), donde se pasa una página que tiene configurado el servicio de nube de Campaign.
    // page containing the cloudservice for Adobe Campaign
    Configuration config = campaignConnector.getWebserviceConfig(page.getContentResource().getParent());
    CampaignCredentials credentials = campaignConnector.retrieveCredentials(config);
    
    
El código completo es el siguiente:
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;

import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.day.cq.mcm.campaign.CallResults;
import com.day.cq.mcm.campaign.CampaignCredentials;
import com.day.cq.mcm.campaign.GenericCampaignConnector;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;
import com.day.cq.wcm.api.PageManagerFactory;
import com.day.cq.wcm.webservicesupport.Configuration;

@SlingServlet(paths="/bin/campaign", methods="GET")
public class CustomServlet extends SlingSafeMethodsServlet {

 private final Logger log = LoggerFactory.getLogger(this.getClass());
 
 @Reference
 private GenericCampaignConnector campaignConnector;
 
 @Reference
 private PageManagerFactory pageManagerFactory;

 @Override
 protected void doGet(SlingHttpServletRequest request,
   SlingHttpServletResponse response) throws ServletException,
   IOException {
  
  PageManager pm = pageManagerFactory.getPageManager(request.getResourceResolver());
  
  Page page = pm.getPage("/content/geometrixx-outdoors");
  
  String result = null;
  if ( page != null) {
   result = callCustomFunction(page);
  }
  if ( result != null ) {
   PrintWriter pw = response.getWriter();
   pw.print(result);
  }
 }
 
 private String callCustomFunction(Page page ) {
  try {
   Configuration config = campaignConnector.getWebserviceConfig(page.getContentResource().getParent());
   CampaignCredentials credentials = campaignConnector.retrieveCredentials(config);
   
   Map<String, String> params = new HashMap<String, String>();
   params.put("origin", "AEM");
   CallResults results = campaignConnector.callGeneric("/jssp/cus/custom.jssp", params, credentials);
   return results.bodyAsString();
  } catch (Exception e ) {
   log.error("Something went wrong during the connection", e);
  }
  return null;
  
 }

}

Ejemplo 2: Adobe Campaign para AEM

AEM ofrece API predeterminadas para recuperar los objetos disponibles en cualquier lugar de la vista del explorador siteadmin.
Para ver este ejemplo, consulte Geometrixx , que está disponible en Uso compartido de paquetes.
Para cada nodo del explorador hay una API vinculada a él. Por ejemplo, para el nodo:
la API es:
El final de la dirección URL .1.json se puede reemplazar por .2.json , .3.json , según el número de subniveles que le interese obtener. Para obtener todos ellos, se puede utilizar la palabra clave infinito :
Ahora, para consumir la API, debemos saber que AEM, de forma predeterminada, utiliza la autenticación básica.
Una biblioteca JS con el nombre amcIntegration.js está disponible en 6.1.1 (compilación 8624 y posterior) que implementa esa lógica entre otras.

Llamada de API de AEM

loadLibrary("nms:amcIntegration.js");
 
var cmsAccountId = sqlGetInt("select iExtAccountId from NmsExtAccount where sName=$(sz)","aemInstance")
var cmsAccount = nms.extAccount.load(String(cmsAccountId));
var cmsServer = cmsAccount.server;
 
var request = new HttpClientRequest(cmsServer+"/content/campaigns/geometrixx.infinity.json")
aemAddBasicAuthentication(cmsAccount, request);
request.method = "GET"
request.header["Content-Type"] = "application/json; charset=UTF-8";
request.execute();
var response = request.response;