Funzioni dello schema
Funzioni dello schemaFunzioni PHP tramite lo Schema

Funzioni PHP tramite lo Schema

Included in the “Power Extensions” bundle

Questa estensione aggiunge campi e direttive allo schema GraphQL che espongono funzionalità comunemente presenti nei linguaggi di programmazione (come PHP).

Descrizione

I campi e le direttive di funzione sono utili per manipolare i dati una volta che sono stati recuperati, permettendoci di trasformare il valore di un campo nel modo desiderato e fornendoci potenti capacità di importazione/esportazione dei dati.

Questa query, che contiene una varietà di campi e direttive di funzione:

{
  _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"
    }
  }
}

Campi di Funzione

I campi di funzione sono Campi Globali, quindi vengono aggiunti a ogni singolo tipo nello schema GraphQL: in QueryRoot, ma anche in Post, User, ecc.

Questa è la lista dei campi di funzione.

_and

Restituisce un'operazione AND tra diverse proprietà booleane.

_arrayAddItem

Aggiunge un elemento all'array.

_arrayCombine

Crea un oggetto JSON utilizzando gli elementi di un array come chiavi e gli elementi di un altro array come valori.

_arrayChunk

Suddivide un array in blocchi.

_arrayDiff

Restituisce un array contenente tutti gli elementi del primo array che non sono presenti in nessuno degli altri array.

_arrayEncodeAsJSONString

Codifica un array in JSON come stringa.

_arrayFill

Crea un array riempito di valori.

_arrayFilter

Filtra gli elementi nulli o vuoti dell'array.

_arrayFlipToObject

Scambia tutte le chiavi numeriche con i loro valori associati in un array, restituendo un oggetto.

_arrayInnerJoinJSONObjectProperties

Riempie gli oggetti JSON all'interno di un array di destinazione con le proprietà di un oggetto JSON di un array di origine, dove una certa proprietà è la stessa per entrambi gli oggetti.

_arrayItem

Accede all'elemento nella posizione indicata dell'array.

_arrayJoin

Unisce tutte le stringhe di un array, utilizzando un separatore fornito.

_arrayKeys

Chiavi di un array.

_arrayLength

Numero di elementi in un array.

_arrayMerge

Unisce due o più array insieme.

_arrayPad

Riempie un array fino alla lunghezza specificata con un valore.

_arrayRandom

Seleziona casualmente un elemento tra quelli forniti.

_arrayRemoveFirst

Rimuove il primo elemento dell'array.

_arrayRemoveLast

Rimuove l'ultimo elemento dell'array.

_arrayReverse

Inverte un array.

_arraySearch

Cerca in quale posizione si trova un elemento nell'array. Se trovato, restituisce la sua posizione, altrimenti restituisce false.

_arraySetItem

Imposta un elemento in una determinata posizione dell'array.

_arraySlice

Estrae una porzione di un array.

_arraySplice

Rimuove una parte di un array e la sostituisce con qualcos'altro.

_arrayUnique

Filtra tutti gli elementi duplicati dell'array.

_date

Restituisce una stringa formattata secondo la stringa di formato indicata utilizzando il timestamp intero indicato (timestamp Unix) o l'ora corrente se non viene fornito alcun timestamp. In altre parole, timestamp è opzionale e per impostazione predefinita assume il valore di time() (fornito tramite il campo _time).

_echo

Ripete l'input così com'è, qualunque esso sia.

_equals

Indica se il risultato di un campo è uguale a un certo valore.

_floatCeil

Arrotonda un numero all'intero superiore più vicino.

_floatDivide

Divide un numero per un altro numero.

_greaterThan

Indica se numero1 > numero2.

_greaterThanOrEquals

Indica se numero1 >= numero2.

_if

Se una proprietà booleana è vera, esegue un campo, altrimenti esegue un altro campo.

_inArray

Indica se l'array contiene il valore.

_intAdd

Aggiunge un intero a un altro intero.

_intArraySum

Somma degli elementi interi dell'array.

_intMultiply

Moltiplica un intero per un altro intero.

_intSubtract

Sottrae un intero da un altro intero.

_isEmpty

Indica se un valore è vuoto.

_isNull

Indica se un valore è nullo.

_lowerThan

Indica se numero1 < numero2.

_lowerThanOrEquals

Indica se numero1 <= numero2.

_makeTime

Restituisce il timestamp Unix corrispondente agli argomenti forniti. Questo timestamp è un intero lungo contenente il numero di secondi tra l'Epoca Unix (1 gennaio 1970 00:00:00 GMT) e l'ora specificata.

Qualsiasi argomento opzionale omesso o nullo verrà impostato al valore corrente secondo la data e l'ora locali.

_not

Restituisce il valore opposto di una proprietà booleana.

_notEmpty

Indica se il valore non è vuoto.

_notEquals

Indica se i due valori non sono uguali tra loro.

_notInArray

Indica se l'array non contiene il valore.

_notNull

Indica se il valore non è null.

_objectAddEntry

Aggiunge una voce all'oggetto.

_objectEncodeAsJSONString

Codifica un oggetto in JSON come stringa.

_objectFilter

Filtra gli elementi nulli o vuoti dell'oggetto.

_objectFlip

Inverte le chiavi e i valori di un oggetto JSON.

_objectIntersectKey

Calcola l'intersezione di oggetti utilizzando le chiavi per il confronto.

_objectKeepProperties

Mantiene solo proprietà specifiche nell'oggetto JSON.

_objectMerge

Unisce due o più oggetti insieme.

_objectProperties

Recupera le proprietà di un oggetto JSON.

_objectProperty

Recupera una proprietà da un oggetto JSON.

_objectRemoveEntry

Rimuove una voce dall'oggetto JSON.

_objectRemoveProperties

Rimuove una o più voci dall'oggetto JSON.

_objectValues

Recupera i valori di un oggetto JSON.

_or

Restituisce un'operazione OR tra diverse proprietà booleane.

_propertyExistsInJSONObject

Indica se una proprietà esiste in un oggetto JSON.

_propertyIsSetInJSONObject

Indica se una proprietà esiste e non è null in un oggetto JSON.

_sprintf

Sostituisce i segnaposto all'interno di una stringa con i valori forniti.

_strAppend

Aggiunge una stringa a un'altra stringa.

_strArrayReplace

Sostituisce una stringa con un'altra stringa in un array.

_strArrayReplaceMultiple

Sostituisce una lista di stringhe con un'altra lista di stringhe in un array.

_strContains

Indica se una stringa contiene un'altra stringa.

_strDecodeJSONObject

Decodifica una stringa in un oggetto JSON, oppure restituisce null se non è possibile.

_strDecodeList

Decodifica una stringa in un array (di qualsiasi tipo), oppure restituisce null se non è possibile.

_strEndsWith

Indica se una stringa termina con un'altra stringa.

_strLength

Lunghezza della stringa.

_strLowerCase

Trasforma una stringa in minuscolo.

_strPad

Riempie una stringa fino a una certa lunghezza con un'altra stringa.

_strPos

Posizione di una sottostringa all'interno della stringa, oppure null se non trovata.

_strRegexFindMatches

Esegue un'espressione regolare per estrarre tutte le corrispondenze da una stringa.

_strRegexReplace

Esegue un'espressione regolare per cercare e sostituire una stringa.

_strRegexReplaceMultiple

Esegue espressioni regolari per cercare e sostituire stringhe.

_strRepeat

Ripete una stringa.

_strReplace

Sostituisce una stringa con un'altra stringa.

_strReplaceMultiple

Sostituisce una lista di stringhe con un'altra lista di stringhe.

_strReverse

Inverte una stringa.

_strShuffle

Mescola casualmente una stringa.

_strStartsWith

Indica se una stringa inizia con un'altra stringa.

_strStripSlashes

Restituisce una stringa con le barre rovesciate rimosse. (\' diventa ' e così via.) Le doppie barre rovesciate (\\) vengono trasformate in una singola barra rovesciata (\).

_strSubstr

Restituisce una parte di una stringa.

_strTitleCase

Trasforma una stringa in maiuscolo per le iniziali (title case).

_strToTime

Analizza quasi qualsiasi descrizione testuale di data e ora in inglese trasformandola in un timestamp Unix.

_strTrim

Rimuove gli spazi bianchi (o altri caratteri) dall'inizio e dalla fine di una stringa.

_strUpperCase

Trasforma una stringa in maiuscolo.

_strWordCount

Numero di parole nella stringa.

_time

Restituisce l'ora attuale.

Direttive di Funzione

Questa è la lista delle direttive di funzione.

@arrayAddItem

Aggiunge un elemento all'array.

@arrayDiff

Calcola la differenza con un altro array.

@arrayFilter

Filtra gli elementi nulli o vuoti dell'array.

@arrayMerge

Unisce l'array con un altro array.

@arrayPad

Riempie un array fino alla lunghezza specificata con un valore.

@arrayRemoveFirst

Rimuove il primo elemento dell'array.

@arrayRemoveLast

Rimuove l'ultimo elemento dell'array.

@arrayReverse

Inverte un array.

@arraySetItem

Imposta un elemento in una determinata posizione dell'array.

@arraySlice

Estrae una porzione di un array.

@arraySplice

Rimuove una parte di un array e la sostituisce con qualcos'altro.

@arrayUnique

Filtra tutti gli elementi duplicati dell'array.

@boolOpposite

Converte un booleano nel suo valore opposto.

@floatDivide

Divide il valore del campo per un numero a virgola mobile.

@intAdd

Aggiunge un intero al valore del campo.

@intMultiply

Moltiplica un intero per il valore del campo.

@intSubtract

Sottrae un intero dal valore del campo.

@objectAddEntry

Aggiunge una voce all'oggetto JSON.

@objectFilter

Filtra gli elementi nulli o vuoti di un oggetto.

@objectKeepProperties

Mantiene solo proprietà specifiche dall'oggetto JSON.

@objectRemoveEntry

Rimuove una voce dall'oggetto JSON.

@objectRemoveProperties

Rimuove proprietà specifiche dall'oggetto JSON.

@setNull

Imposta il valore del campo come null.

@strAppend

Aggiunge una stringa alla fine della stringa nel valore del campo.

@strLowerCase

Converte una stringa in minuscolo.

@strPad

Riempie una stringa fino a una certa lunghezza con un'altra stringa.

@strPrepend

Aggiunge una stringa all'inizio della stringa nel valore del campo.

@strRegexReplace

Esegue un'espressione regolare per cercare e sostituire una stringa (vedi documentazione della funzione PHP preg_replace).

@strRegexReplaceMultiple

Esegue espressioni regolari per cercare e sostituire una lista di stringhe (vedi documentazione della funzione PHP preg_replace).

@strRepeat

Ripete una stringa.

@strReplace

Sostituisce una stringa con un'altra stringa.

@strReplaceMultiple

Sostituisce una lista di stringhe con un'altra lista di stringhe.

@strReverse

Inverte una stringa.

@strShuffle

Mescola casualmente una stringa.

@strStripSlashes

Restituisce una stringa con le barre rovesciate rimosse. (\' diventa ' e così via.) Le doppie barre rovesciate (\\) vengono trasformate in una singola barra rovesciata.

@strSubstr

Restituisce una parte di una stringa.

@strTitleCase

Converte una stringa in maiuscolo per le iniziali (title case).

@strTrim

Rimuove gli spazi bianchi (o altri caratteri) dall'inizio e dalla fine di una stringa.

@strUpperCase

Converte una stringa in maiuscolo.

Esempi

Campi di Funzione

Sebbene disponiamo di un campo Post.hasComments, potremmo avere bisogno del valore opposto. Invece di creare un nuovo campo Post.notHasComments (per il quale dovremmo modificare il codice PHP), possiamo utilizzare la funzionalità Field to Input per passare il valore di hasComments in ingresso a un campo not, calcolando così il nuovo valore sempre all'interno della query GraphQL:

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

Possiamo applicare i campi di funzione più volte per eseguire un calcolo più complesso, come generare un campo summary basato sui valori di altri campi:

{
  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
    )
  }
}

In combinazione con l'estensione HTTP Client, possiamo generare dinamicamente un endpoint API a cui connetterci (basato sui dati del nostro sito), e quindi estrarre un campo specifico dai dati restituiti:

{
  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"
      }
    )
  }
}

...producendo:

{
  "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"
      }
    ]
  }
}

Direttive di Funzione

Se questa query:

query {
  posts {
    title
  }
}

...produce questi risultati:

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

...allora questa query:

query {
  posts {
    title @strUpperCase
  }
}

...produrrà:

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