PHP Functions via Schema
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"
}
]
}
}