Schema Functions
Schema FunctionsFonctions PHP via le Schéma

Fonctions PHP via le Schéma

Included in the “Power Extensions” bundle

Cette extension ajoute des champs et des directives au schéma GraphQL qui exposent des fonctionnalités couramment présentes dans les langages de programmation (comme PHP).

Description

Les champs et directives de fonction sont utiles pour manipuler les données une fois qu'elles ont été récupérées, nous permettant de transformer la valeur d'un champ de la manière souhaitée, et nous accordant de puissantes capacités d'import/export de données.

Cette requête, contenant une variété de champs et directives de fonction :

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

...produit :

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

Champs de Fonction

Les champs de fonction sont des Champs Globaux, ils sont donc ajoutés à chaque type du schéma GraphQL : dans QueryRoot, mais aussi dans Post, User, etc.

Voici la liste des champs de fonction.

_and

Retourne une opération AND parmi plusieurs propriétés booléennes.

_arrayAddItem

Ajoute un élément au tableau.

_arrayCombine

Crée un objet JSON en utilisant les éléments d'un tableau comme clés, et les éléments d'un autre tableau comme valeurs.

_arrayChunk

Divise un tableau en morceaux.

_arrayDiff

Retourne un tableau contenant tous les éléments du premier tableau qui ne sont présents dans aucun des autres tableaux.

_arrayEncodeAsJSONString

Encode un tableau en JSON sous forme de chaîne.

_arrayFill

Crée un tableau rempli de valeurs.

_arrayFilter

Filtre les éléments nuls ou vides du tableau.

_arrayFlipToObject

Échange toutes les clés numériques avec leurs valeurs associées dans un tableau, en retournant un objet.

_arrayInnerJoinJSONObjectProperties

Remplit les objets JSON à l'intérieur d'un tableau cible avec des propriétés d'un objet JSON d'un tableau source, où une certaine propriété est la même pour les deux objets.

_arrayItem

Accède à l'élément à la position donnée dans le tableau.

_arrayJoin

Joint toutes les chaînes d'un tableau, en utilisant un séparateur fourni.

_arrayKeys

Clés d'un tableau.

_arrayLength

Nombre d'éléments dans un tableau.

_arrayMerge

Fusionne deux tableaux ou plus ensemble.

_arrayPad

Remplit un tableau jusqu'à la longueur spécifiée avec une valeur.

_arrayRandom

Sélectionne aléatoirement un élément parmi ceux fournis.

_arrayRemoveFirst

Supprime le premier élément du tableau.

_arrayRemoveLast

Supprime le dernier élément du tableau.

_arrayReverse

Inverse un tableau.

_arraySearch

Recherche à quelle position un élément est placé dans le tableau. S'il est trouvé, retourne sa position, sinon retourne false.

_arraySetItem

Définit un élément à une position donnée du tableau.

_arraySlice

Extrait une tranche d'un tableau.

_arraySplice

Supprime une portion d'un tableau et la remplace par autre chose.

_arrayUnique

Filtre tous les éléments dupliqués du tableau.

_date

Retourne une chaîne formatée selon la chaîne de format donnée en utilisant le timestamp entier donné (timestamp Unix) ou l'heure actuelle si aucun timestamp n'est fourni. En d'autres termes, timestamp est optionnel et prend par défaut la valeur de time() (fournie via le champ _time).

_echo

Répète l'entrée telle quelle, quelle qu'elle soit.

_equals

Indique si le résultat d'un champ est égal à une certaine valeur.

_floatCeil

Arrondit un nombre à l'entier supérieur.

_floatDivide

Divise un nombre par un autre nombre.

_greaterThan

Indique si nombre1 > nombre2.

_greaterThanOrEquals

Indique si nombre1 >= nombre2.

_if

Si une propriété booléenne est vraie, exécute un champ, sinon exécute un autre champ.

_inArray

Indique si le tableau contient la valeur.

_intAdd

Ajoute un entier à un autre entier.

_intArraySum

Somme des éléments entiers du tableau.

_intMultiply

Multiplie un entier par un autre entier.

_intSubtract

Soustrait un entier d'un autre entier.

_isEmpty

Indique si une valeur est vide.

_isNull

Indique si une valeur est nulle.

_lowerThan

Indique si nombre1 < nombre2.

_lowerThanOrEquals

Indique si nombre1 <= nombre2.

_makeTime

Retourne le timestamp Unix correspondant aux arguments donnés. Ce timestamp est un entier long contenant le nombre de secondes entre l'Époque Unix (1er janvier 1970 00:00:00 GMT) et l'heure spécifiée.

Tout argument optionnel omis ou nul sera défini à la valeur actuelle selon la date et l'heure locales.

_not

Retourne la valeur opposée d'une propriété booléenne.

_notEmpty

Indique si la valeur n'est pas vide.

_notEquals

Indique si les deux valeurs ne sont pas égales.

_notInArray

Indique si le tableau ne contient pas la valeur.

_notNull

Indique si la valeur n'est pas null.

_objectAddEntry

Ajoute une entrée à l'objet.

_objectEncodeAsJSONString

Encode un objet en JSON sous forme de chaîne.

_objectFilter

Filtre les éléments nuls ou vides de l'objet.

_objectFlip

Inverse les clés et les valeurs d'un objet JSON.

_objectIntersectKey

Calcule l'intersection d'objets en utilisant les clés pour la comparaison.

_objectKeepProperties

Conserve uniquement des propriétés spécifiques dans l'objet JSON.

_objectMerge

Fusionne deux objets ou plus ensemble.

_objectProperties

Récupère les propriétés d'un objet JSON.

_objectProperty

Récupère une propriété d'un objet JSON.

_objectRemoveEntry

Supprime une entrée de l'objet JSON.

_objectRemoveProperties

Supprime une ou plusieurs entrées de l'objet JSON.

_objectValues

Récupère les valeurs d'un objet JSON.

_or

Retourne une opération OR parmi plusieurs propriétés booléennes.

_propertyExistsInJSONObject

Indique si une propriété existe dans un objet JSON.

_propertyIsSetInJSONObject

Indique si une propriété existe et n'est pas null dans un objet JSON.

_sprintf

Remplace des espaces réservés à l'intérieur d'une chaîne par les valeurs fournies.

_strAppend

Ajoute une chaîne à une autre chaîne.

_strArrayReplace

Remplace une chaîne par une autre chaîne dans un tableau.

_strArrayReplaceMultiple

Remplace une liste de chaînes par une autre liste de chaînes dans un tableau.

_strContains

Indique si une chaîne contient une autre chaîne.

_strDecodeJSONObject

Décode une chaîne en un objet JSON, ou retourne null si ce n'est pas possible.

_strDecodeList

Décode une chaîne en un tableau (de n'importe quel type), ou retourne null si ce n'est pas possible.

_strEndsWith

Indique si une chaîne se termine par une autre chaîne.

_strLength

Longueur de la chaîne.

_strLowerCase

Transforme une chaîne en minuscules.

_strPad

Remplit une chaîne jusqu'à une certaine longueur avec une autre chaîne.

_strPos

Position d'une sous-chaîne dans la chaîne, ou null si non trouvée.

_strRegexFindMatches

Exécute une expression régulière pour extraire toutes les correspondances d'une chaîne.

_strRegexReplace

Exécute une expression régulière pour rechercher et remplacer une chaîne.

_strRegexReplaceMultiple

Exécute des expressions régulières pour rechercher et remplacer des chaînes.

_strRepeat

Répète une chaîne.

_strReplace

Remplace une chaîne par une autre chaîne.

_strReplaceMultiple

Remplace une liste de chaînes par une autre liste de chaînes.

_strReverse

Inverse une chaîne.

_strShuffle

Mélange aléatoirement une chaîne.

_strStartsWith

Indique si une chaîne commence par une autre chaîne.

_strStripSlashes

Retourne une chaîne avec les barres obliques inversées supprimées. (\' devient ' et ainsi de suite.) Les doubles barres obliques inversées (\\) sont transformées en une seule barre oblique inversée (\).

_strSubstr

Retourne une partie d'une chaîne.

_strTitleCase

Transforme une chaîne en capitalisation de titre.

_strToTime

Analyse presque n'importe quelle description textuelle de date-heure en anglais en un timestamp Unix.

_strTrim

Supprime les espaces blancs (ou autres caractères) du début et de la fin d'une chaîne.

_strUpperCase

Transforme une chaîne en majuscules.

_strWordCount

Nombre de mots dans la chaîne.

_time

Retourne l'heure actuelle.

Directives de Fonction

Voici la liste des directives de fonction.

@arrayAddItem

Ajoute un élément au tableau.

@arrayDiff

Calcule la différence avec un autre tableau.

@arrayFilter

Filtre les éléments nuls ou vides du tableau.

@arrayMerge

Fusionne le tableau avec un autre tableau.

@arrayPad

Remplit un tableau jusqu'à la longueur spécifiée avec une valeur.

@arrayRemoveFirst

Supprime le premier élément du tableau.

@arrayRemoveLast

Supprime le dernier élément du tableau.

@arrayReverse

Inverse un tableau.

@arraySetItem

Définit un élément à une position donnée du tableau.

@arraySlice

Extrait une tranche d'un tableau.

@arraySplice

Supprime une portion d'un tableau et la remplace par autre chose.

@arrayUnique

Filtre tous les éléments dupliqués du tableau.

@boolOpposite

Convertit un booléen en sa valeur opposée.

@floatDivide

Divise la valeur du champ par un nombre flottant.

@intAdd

Ajoute un entier à la valeur du champ.

@intMultiply

Multiplie un entier par la valeur du champ.

@intSubtract

Soustrait un entier de la valeur du champ.

@objectAddEntry

Ajoute une entrée à l'objet JSON.

@objectFilter

Filtre les éléments nuls ou vides d'un objet.

@objectKeepProperties

Conserve uniquement des propriétés spécifiques de l'objet JSON.

@objectRemoveEntry

Supprime une entrée de l'objet JSON.

@objectRemoveProperties

Supprime des propriétés spécifiques de l'objet JSON.

@setNull

Définit la valeur du champ comme null.

@strAppend

Ajoute une chaîne à la fin de la chaîne dans la valeur du champ.

@strLowerCase

Convertit une chaîne en minuscules.

@strPad

Remplit une chaîne jusqu'à une certaine longueur avec une autre chaîne.

@strPrepend

Ajoute une chaîne au début de la chaîne dans la valeur du champ.

@strRegexReplace

Exécute une expression régulière pour rechercher et remplacer une chaîne (voir documentation de la fonction PHP preg_replace).

@strRegexReplaceMultiple

Exécute des expressions régulières pour rechercher et remplacer une liste de chaînes (voir documentation de la fonction PHP preg_replace).

@strRepeat

Répète une chaîne.

@strReplace

Remplace une chaîne par une autre chaîne.

@strReplaceMultiple

Remplace une liste de chaînes par une autre liste de chaînes.

@strReverse

Inverse une chaîne.

@strShuffle

Mélange aléatoirement une chaîne.

@strStripSlashes

Retourne une chaîne avec les barres obliques inversées supprimées. (\' devient ' et ainsi de suite.) Les doubles barres obliques inversées (\\) sont transformées en une seule barre oblique inversée.

@strSubstr

Retourne une partie d'une chaîne.

@strTitleCase

Convertit une chaîne en capitalisation de titre.

@strTrim

Supprime les espaces blancs (ou autres caractères) du début et de la fin d'une chaîne.

@strUpperCase

Convertit une chaîne en majuscules.

Exemples

Champs de Fonction

Bien que nous ayons un champ Post.hasComments, nous pourrions avoir besoin de la valeur opposée. Au lieu de créer un nouveau champ Post.notHasComments (pour lequel il faudrait modifier le code PHP), nous pouvons utiliser la fonctionnalité Field to Input pour passer la valeur de hasComments en entrée d'un champ not, calculant ainsi la nouvelle valeur toujours dans la requête GraphQL :

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

Nous pouvons appliquer des champs de fonction plusieurs fois pour effectuer un calcul plus complexe, comme générer un champ summary basé sur les valeurs d'autres champs :

{
  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 combinaison avec l'extension HTTP Client, nous pouvons générer dynamiquement un endpoint d'API auquel se connecter (basé sur les données de notre site), puis extraire un champ spécifique des données retournées :

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

...produisant :

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

Directives de Fonction

Si cette requête :

query {
  posts {
    title
  }
}

...produit ces résultats :

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

...alors cette requête :

query {
  posts {
    title @strUpperCase
  }
}

...produira :

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