Schema Functions
Schema FunctionsPHP Functions via Schema

PHP Functions via Schema

Included in the “Power Extensions” bundle

Esta extensión añade campos y directivas al esquema GraphQL que exponen funcionalidades comúnmente encontradas en los lenguajes de programación (como PHP).

Descripción

Los campos y directivas de función son útiles para manipular los datos una vez se han recuperado, permitiéndonos transformar el valor de un campo de cualquier forma que se necesite, y otorgándonos potentes capacidades de importación/exportación de datos.

Esta consulta, que contiene una variedad de campos y directivas de función:

{
  _intAdd(add: 15, to: 56)
  _intArraySum(array: [1, 2, 3, 4, 5])
 
  _arrayJoin(array: ["Hello", "to", "everyone"], separator: " ")
  _arrayItem(array: ["one", "two", "three", "four", "five"], position: 3)
  _arraySearch(array: ["uno", "dos", "tres", "cuatro", "cinco"], element: "tres")
  _arrayUnique(array: ["uno", "dos", "uno", "tres", "cuatro", "dos", "cinco", "dos"])
  _arrayMerge(arrays: [["uno", "dos", "uno"], ["tres", "cuatro", "dos", "cinco", "dos"]])
  _arrayDiff(arrays: [["uno", "dos"], ["tres", "cuatro", "dos"]])
  _arrayAddItem(array: ["uno", "dos"], value: "tres")
  _arraySetItem(array: ["uno", "dos"], index: 0, value: "tres")
  _arrayKeys(array: ["uno", "dos", "tres"])
  _arrayLength(array: ["uno", "dos", "tres"])
 
  _strRegexFindMatches(regex: "/https?:\\/\\/([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\\.[a-zA-Z]{2,})/", string: "In website https://gatographql.com there is more information")
  
  _strReplace(search: "https://", replaceWith: "http://", in: "https://gatographql.com")
  _strReplaceMultiple(search: ["https://", "gato"], replaceWith: ["http://", "dog"], in: "https://gatographql.com")
  _strRegexReplace(searchRegex: "/^https?:\\/\\//", replaceWith: "", in: "https://gatographql.com")
  _strRegexReplaceMultiple(searchRegex: ["/^https?:\\/\\//", "/([a-z]*)/"], replaceWith: ["", "$1$1"], in: "https://gatographql.com")
  
  _strStartsWith(search: "orld", in: "Hello world")
  _strEndsWith(search: "orld", in: "Hello world")
  _strUpperCase(text: "Hello world")
  _strLowerCase(text: "Hello world")
  _strTitleCase(text: "Hello world")
 
 
  falseToTrue: _echo(value: false) @boolOpposite
  trueToFalse: _echo(value: true) @boolOpposite
  plusOne: _echo(value: 2) @intAdd(number: 1)
  objectAddEntry: _echo(value: {
    user: "Leo",
    contact: {
      email: "leo@test.com"
    }
  })
    @objectAddEntry(key: "phone", value: "+0929094229", underPath: "contact")
    @objectAddEntry(key: "methods", value: {}, underPath: "contact")
    @objectAddEntry(key: "card", value: true, underPath: "contact.methods")
  upperCase: _echo(value: "Hello world") @strUpperCase
  lowerCase: _echo(value: "Hello world") @strLowerCase
  titleCase: _echo(value: "Hello world") @strTitleCase
  append: _echo(value: "Hello world") @strAppend(string: "!!!")
  prepend: _echo(value: "Hello world") @strPrepend(string: "!!!")
  arraySplice: _echo(value: ["uno", "dos", "tres"]) @arraySplice(offset: 1)
  arraySpliceWithLength: _echo(value: ["uno", "dos", "tres"]) @arraySplice(offset: 1, length: 1)
  arraySpliceWithReplacement: _echo(value: ["uno", "dos", "tres"]) @arraySplice(offset: 1, replacement: ["cuatro", "cinco"])
  arraySpliceWithLengthAndReplacement: _echo(value: ["uno", "dos", "tres"]) @arraySplice(offset: 1, length: 1, replacement: ["cuatro", "cinco"])
  arrayUnique: _echo(value: ["uno", "dos", "uno", "tres", "cuatro", "dos", "cinco", "dos"]) @arrayUnique
  arrayMerge: _echo(value: ["uno", "dos", "uno"]) @arrayMerge(with: ["tres", "cuatro", "dos", "cinco", "dos"])
  arrayDiff: _echo(value: ["uno", "dos"]) @arrayDiff (against: ["tres", "cuatro", "dos"])
  arrayFilter: _echo(value: ["uno", "dos", null, "tres", "", "dos", []]) @arrayFilter
  objectKeepProperties: _echo(value: { user: "Leo", email: "leo@test.com" } )
    @objectKeepProperties(
      keys: ["user"]
    )
}

...produce:

{
  "data": {
    "_intAdd": 71,
    "_intArraySum": 15,
    "_arrayJoin": "Hello to everyone",
    "_arrayItem": "four",
    "_arraySearch": 2,
    "_arrayUnique": [
      "uno",
      "dos",
      "tres",
      "cuatro",
      "cinco"
    ],
    "_arrayMerge": [
      "uno",
      "dos",
      "uno",
      "tres",
      "cuatro",
      "dos",
      "cinco",
      "dos"
    ],
    "_arrayDiff": [
      "uno"
    ],
    "_arrayAddItem": [
      "uno",
      "dos",
      "tres"
    ],
    "_arraySetItem": [
      "tres",
      "dos"
    ],
    "_arrayKeys": [
      0,
      1,
      2
    ],
    "_arrayLength": 3,
    "_strRegexFindMatches": [
      [
        "https:\/\/gatographql.com"
      ],
      [
        "gatographql.com"
      ]
    ],
    "_strReplace": "http://gatographql.com",
    "_strReplaceMultiple": "http://doggraphql.com",
    "_strRegexReplace": "gatographql.com",
    "_strRegexReplaceMultiple": "gatographqlgatographql.comcom",
    "_strStartsWith": false,
    "_strEndsWith": true,
    "_strUpperCase": "HELLO WORLD",
    "_strLowerCase": "hello world",
    "_strTitleCase": "Hello World",
    "falseToTrue": true,
    "trueToFalse": false,
    "plusOne": 3,
    "objectAddEntry": {
      "user": "Leo",
      "contact": {
        "email": "leo@test.com",
        "phone": "+0929094229",
        "methods": {
          "card": true
        }
      }
    },
    "upperCase": "HELLO WORLD",
    "lowerCase": "hello world",
    "titleCase": "Hello World",
    "append": "Hello world!!!",
    "prepend": "!!!Hello world",
    "arraySplice": [
      "uno"
    ],
    "arraySpliceWithLength": [
      "uno",
      "tres"
    ],
    "arraySpliceWithReplacement": [
      "uno",
      "cuatro",
      "cinco"
    ],
    "arraySpliceWithLengthAndReplacement": [
      "uno",
      "cuatro",
      "cinco",
      "tres"
    ],
    "arrayUnique": [
      "uno",
      "dos",
      "tres",
      "cuatro",
      "cinco"
    ],
    "arrayMerge": [
      "uno",
      "dos",
      "uno",
      "tres",
      "cuatro",
      "dos",
      "cinco",
      "dos"
    ],
    "arrayDiff": [
      "uno"
    ],
    "arrayFilter": [
      "uno",
      "dos",
      "tres",
      "dos"
    ],
    "objectKeepProperties": {
      "user": "Leo"
    }
  }
}

Campos de Función

Los campos de función son Campos Globales, por lo que se añaden a cada tipo del esquema GraphQL: en QueryRoot, pero también en Post, User, etc.

Esta es la lista de campos de función.

_and

Devuelve una operación AND entre varias propiedades booleanas.

_arrayAddItem

Añade un elemento al array.

_arrayCombine

Crea un objeto JSON usando los elementos de un array como claves, y los elementos de otro array como valores.

_arrayChunk

Divide un array en trozos.

_arrayDiff

Devuelve un array que contiene todos los elementos del primer array que no están presentes en ninguno de los otros arrays.

_arrayEncodeAsJSONString

Codifica un array en JSON como un string.

_arrayFill

Crea un array rellenado con valores.

_arrayFilter

Filtra los elementos null o vacíos del array.

_arrayFlipToObject

Intercambia todas las claves numéricas con sus valores asociados en un array, devolviendo un objeto.

_arrayInnerJoinJSONObjectProperties

Rellena los objetos JSON dentro de un array objetivo con propiedades de un objeto JSON de un array origen, donde una determinada propiedad es la misma para ambos objetos.

_arrayItem

Accede al elemento en la posición dada del array.

_arrayJoin

Une todos los strings en un array, usando un separador proporcionado.

_arrayKeys

Claves de un array.

_arrayLength

Número de elementos en un array.

_arrayMerge

Une dos o más arrays juntos.

_arrayPad

Rellena un array hasta la longitud especificada con un valor.

_arrayRandom

Selecciona aleatoriamente un elemento de los proporcionados.

_arrayRemoveFirst

Elimina el primer elemento del array.

_arrayRemoveLast

Elimina el último elemento del array.

_arrayReverse

Invierte un array.

_arraySearch

Busca en qué posición está colocado un elemento en el array. Si se encuentra, devuelve su posición, en caso contrario devuelve false.

_arraySetItem

Establece un elemento en alguna posición del array.

_arraySlice

Extrae un trozo de un array.

_arraySplice

Elimina una porción de un array y la reemplaza con algo más.

_arrayUnique

Filtra todos los elementos duplicados del array.

_date

Devuelve un string formateado según el string de formato dado usando el timestamp entero dado (timestamp Unix) o la hora actual si no se da timestamp. En otras palabras, timestamp es opcional y por defecto es el valor de time() (proporcionado mediante el campo _time).

_echo

Devuelve la entrada tal cual, sea lo que sea.

_equals

Indica si el resultado de un campo es igual a un determinado valor.

_floatCeil

Redondea un número al siguiente entero más alto.

_floatDivide

Divide un número por otro número.

_greaterThan

Indica si number1 > number2.

_greaterThanOrEquals

Indica si number1 >= number2.

_if

Si una propiedad booleana es true, ejecuta un campo, si no, ejecuta otro campo.

_inArray

Indica si el array contiene el valor.

_intAdd

Suma un entero a otro número entero.

_intArraySum

Suma de los elementos enteros del array.

_intMultiply

Multiplica un entero con otro número entero.

_intSubtract

Resta un entero de otro número entero.

_isEmpty

Indica si un valor está vacío.

_isNull

Indica si un valor es null.

_lowerThan

Indica si number1 < number2.

_lowerThanOrEquals

Indica si number1 <= number2.

_makeTime

Devuelve el timestamp Unix correspondiente a los argumentos dados. Este timestamp es un entero largo que contiene el número de segundos entre el Unix Epoch (1 de enero de 1970 00:00:00 GMT) y el tiempo especificado.

Cualquier argumento opcional omitido o null se establecerá al valor actual según la fecha y hora locales.

_not

Devuelve el valor opuesto de una propiedad booleana.

_notEmpty

Indica si el valor no está vacío.

_notEquals

Indica si los dos valores no son iguales entre sí.

_notInArray

Indica si el array no contiene el valor.

_notNull

Indica si el valor no es null.

_objectAddEntry

Añade una entrada al objeto.

_objectEncodeAsJSONString

Codifica un objeto en JSON como un string.

_objectFilter

Filtra los elementos null o vacíos del objeto.

_objectFlip

Invierte las claves y valores en un objeto JSON.

_objectIntersectKey

Calcula la intersección de objetos usando claves para la comparación.

_objectKeepProperties

Mantiene propiedades específicas solo en el objeto JSON.

_objectMerge

Une dos o más objetos juntos.

_objectProperties

Recupera las propiedades en un objeto JSON.

_objectProperty

Recupera una propiedad de un objeto JSON.

_objectRemoveEntry

Elimina una entrada del objeto JSON.

_objectRemoveProperties

Elimina una o más entradas del objeto JSON.

_objectValues

Recupera los valores en un objeto JSON.

_or

Devuelve una operación OR entre varias propiedades booleanas.

_propertyExistsInJSONObject

Indica si una propiedad existe en un objeto JSON.

_propertyIsSetInJSONObject

Indica si una propiedad existe y no es null en un objeto JSON.

_sprintf

Reemplaza placeholders dentro de un string con valores proporcionados.

_strAppend

Añade un string al final de otro string.

_strArrayReplace

Reemplaza un string con otro string en un array.

_strArrayReplaceMultiple

Reemplaza una lista de strings con otra lista de strings en un array.

_strContains

Indica si un string contiene otro string.

_strDecodeJSONObject

Decodifica un string en un objeto JSON, o devuelve null si no es posible.

_strDecodeList

Decodifica un string en un array (de cualquier tipo), o devuelve null si no es posible.

_strEndsWith

Indica si un string termina con otro string.

_strLength

Longitud del string.

_strLowerCase

Transforma un string a minúsculas.

_strPad

Rellena un string hasta una determinada longitud con otro string.

_strPos

Posición de un substring dentro del string, o null si no se encuentra.

_strRegexFindMatches

Ejecuta una expresión regular para extraer todas las coincidencias de un string.

_strRegexReplace

Ejecuta una expresión regular para buscar y reemplazar un string.

_strRegexReplaceMultiple

Ejecuta expresiones regulares para buscar y reemplazar strings.

_strRepeat

Repite un string.

_strReplace

Reemplaza un string con otro string.

_strReplaceMultiple

Reemplaza una lista de strings con otra lista de strings.

_strReverse

Invierte un string.

_strShuffle

Mezcla aleatoriamente un string.

_strStartsWith

Indica si un string empieza con otro string.

_strStripSlashes

Devuelve un string con las barras invertidas eliminadas. (\' se convierte en ' y así sucesivamente.) Las barras invertidas dobles (\\) se convierten en una sola barra invertida (\).

_strSubstr

Devuelve parte de un string.

_strTitleCase

Transforma un string a capitalización de título.

_strToTime

Parsea casi cualquier descripción textual de fecha en inglés a un timestamp Unix.

_strTrim

Elimina espacios en blanco (u otros caracteres) del inicio y final de un string.

_strUpperCase

Transforma un string a mayúsculas.

_strWordCount

Número de palabras en el string.

_time

Devuelve la hora actual.

Directivas de Función

Esta es la lista de directivas de función.

@arrayAddItem

Añade un elemento al array.

@arrayDiff

Calcula la diferencia con otro array.

@arrayFilter

Filtra los elementos null o vacíos del array.

@arrayMerge

Une el array con otro array.

@arrayPad

Rellena un array hasta la longitud especificada con un valor.

@arrayRemoveFirst

Elimina el primer elemento del array.

@arrayRemoveLast

Elimina el último elemento del array.

@arrayReverse

Invierte un array.

@arraySetItem

Establece un elemento en alguna posición del array.

@arraySlice

Extrae un trozo de un array.

@arraySplice

Elimina una porción de un array y la reemplaza con algo más.

@arrayUnique

Filtra todos los elementos duplicados del array.

@boolOpposite

Convierte un bool a su valor opuesto.

@floatDivide

Divide el valor del campo por un número float.

@intAdd

Suma un número entero al valor del campo.

@intMultiply

Multiplica un número entero con el valor del campo.

@intSubtract

Resta un número entero del valor del campo.

@objectAddEntry

Añade una entrada al objeto JSON.

@objectFilter

Filtra los elementos null o vacíos en un objeto.

@objectKeepProperties

Mantiene solo propiedades específicas del objeto JSON.

@objectRemoveEntry

Elimina una entrada del objeto JSON.

@objectRemoveProperties

Elimina propiedades específicas del objeto JSON.

@setNull

Establece el valor del campo como null.

@strAppend

Añade algún string al final del string en el valor del campo.

@strLowerCase

Convierte un string a minúsculas.

@strPad

Rellena un string hasta una determinada longitud con otro string.

@strPrepend

Añade algún string al principio del string en el valor del campo.

@strRegexReplace

Ejecuta una expresión regular para buscar y reemplazar un string (ver documentación para la función PHP preg_replace).

@strRegexReplaceMultiple

Ejecuta expresiones regulares para buscar y reemplazar una lista de strings (ver documentación para la función PHP preg_replace).

@strRepeat

Repite un string.

@strReplace

Reemplaza un string con otro string.

@strReplaceMultiple

Reemplaza una lista de strings con otra lista de strings.

@strReverse

Invierte un string.

@strShuffle

Mezcla aleatoriamente un string.

@strStripSlashes

Devuelve un string con las barras invertidas eliminadas. (\' se convierte en ' y así sucesivamente.) Las barras invertidas dobles (\\) se convierten en una sola barra invertida.

@strSubstr

Devuelve parte de un string.

@strTitleCase

Convierte un string a capitalización de título.

@strTrim

Elimina espacios en blanco (u otros caracteres) del inicio y final de un string.

@strUpperCase

Convierte un string a mayúsculas.

Ejemplos

Campos de Función

Aunque tenemos un campo Post.hasComments, podríamos necesitar el valor opuesto. En lugar de crear un nuevo campo Post.notHasComments (para el cual tendríamos que editar código PHP), podemos usar la funcionalidad Field to Input para pasar el valor de hasComments como entrada a un campo not, calculando así el nuevo valor siempre dentro de la consulta GraphQL:

{
  posts {
    id
    hasComments
    notHasComments: _not(value: $__hasComments)
  }
}

Podemos aplicar campos de función múltiples veces para realizar un cálculo más complejo, como generar un campo summary basado en los valores de otros campos:

{
  posts {
    id
    content @remove
    shortContent: _strSubstr(string: $__content, offset: 0, length: 150) @remove
    excerpt @remove
    isExcerptEmpty: _isEmpty(value: $__excerpt) @remove
    summary: _if(
      condition: $__isExcerptEmpty
      then: $__content
      else: $__excerpt
    )
  }
}

En combinación con la extensión HTTP Client, podemos generar dinámicamente un endpoint de API al que conectarnos (basado en los datos de nuestro sitio), y luego extraer algún campo específico de los datos devueltos:

{
  users(
    pagination: { limit: 2 },
    sort: { order: ASC, by: ID }
  ) {
    id
    
    # Dynamically generate endpoint for the user
    endpoint: _arrayJoin(values: [
      "https://newapi.getpop.org/wp-json/wp/v2/users/",
      $__id,
      "?_fields=name,avatar_urls"
    ])
    
    # Retrieve the endpoint data
    endpointData: _sendJSONObjectItemHTTPRequest(input: { url: $__endpoint } )
 
    # Extract specific information
    userAvatar: _objectProperty(
      object: $__endpointData,
      by: {
        path: "avatar_urls.48"
      }
    )
  }
}

...produciendo:

{
  "data": {
    "users": [
      {
        "id": 1,
        "endpoint": "https://newapi.getpop.org/wp-json/wp/v2/users/1?_fields=name,avatar_urls",
        "endpointData": {
          "name": "leo",
          "avatar_urls": {
            "24": "https://secure.gravatar.com/avatar/b28085726ee66e49f08be16ad668efd5?s=24&d=mm&r=g",
            "48": "https://secure.gravatar.com/avatar/b28085726ee66e49f08be16ad668efd5?s=48&d=mm&r=g",
            "96": "https://secure.gravatar.com/avatar/b28085726ee66e49f08be16ad668efd5?s=96&d=mm&r=g"
          },
          "_links": {
            "self": [
              {
                "href": "https://newapi.getpop.org/wp-json/wp/v2/users/1"
              }
            ],
            "collection": [
              {
                "href": "https://newapi.getpop.org/wp-json/wp/v2/users"
              }
            ]
          }
        },
        "userAvatar": "https://secure.gravatar.com/avatar/b28085726ee66e49f08be16ad668efd5?s=48&d=mm&r=g"
      },
      {
        "id": 2,
        "endpoint": "https://newapi.getpop.org/wp-json/wp/v2/users/2?_fields=name,avatar_urls",
        "endpointData": {
          "name": "themedemos",
          "avatar_urls": {
            "24": "https://secure.gravatar.com/avatar/7554514b65216821eeacde0fdcd6c6e6?s=24&d=mm&r=g",
            "48": "https://secure.gravatar.com/avatar/7554514b65216821eeacde0fdcd6c6e6?s=48&d=mm&r=g",
            "96": "https://secure.gravatar.com/avatar/7554514b65216821eeacde0fdcd6c6e6?s=96&d=mm&r=g"
          },
          "_links": {
            "self": [
              {
                "href": "https://newapi.getpop.org/wp-json/wp/v2/users/2"
              }
            ],
            "collection": [
              {
                "href": "https://newapi.getpop.org/wp-json/wp/v2/users"
              }
            ]
          }
        },
        "userAvatar": "https://secure.gravatar.com/avatar/7554514b65216821eeacde0fdcd6c6e6?s=48&d=mm&r=g"
      }
    ]
  }
}

Directivas de Función

Si esta consulta:

query {
  posts {
    title
  }
}

...produce estos resultados:

{
  "data": {
    "posts": [
      {
        "title": "Hello world!"
      },
      {
        "title": "lovely weather"
      }
    ]
  }
}

...entonces esta consulta:

query {
  posts {
    title @strUpperCase
  }
}

...producirá:

{
  "data": {
    "posts": [
      {
        "title": "HELLO WORLD!"
      },
      {
        "title": "LOVELY WEATHER"
      }
    ]
  }
}