Funkcje PHP via Schema
To rozszerzenie dodaje pola i dyrektywy do schematu GraphQL, które udostępniają funkcjonalności powszechnie spotykane w językach programowania (takich jak PHP).
Opis
Pola i dyrektywy funkcji są przydatne do manipulowania danymi po ich pobraniu, umożliwiając transformację wartości pola w dowolny wymagany sposób i zapewniając potężne możliwości importu/eksportu danych.
Ta query, zawierająca różnorodne pola i dyrektywy funkcji:
{
_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"]
)
}...daje wynik:
{
"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"
}
}
}Pola Funkcji
Pola funkcji są Polami Globalnymi, dlatego są dodawane do każdego typu w schemacie GraphQL: w QueryRoot, ale także w Post, User itd.
Poniżej znajduje się lista pól funkcji.
_and
Zwraca wynik operacji AND na kilku właściwościach logicznych.
_arrayAddItem
Dodaje element do tablicy.
_arrayCombine
Tworzy obiekt JSON używając elementów jednej tablicy jako kluczy i elementów innej tablicy jako wartości.
_arrayChunk
Dzieli tablicę na fragmenty.
_arrayDiff
Zwraca tablicę zawierającą wszystkie elementy z pierwszej tablicy, które nie są obecne w żadnej z pozostałych tablic.
_arrayEncodeAsJSONString
Koduje tablicę jako ciąg JSON.
_arrayFill
Tworzy tablicę wypełnioną wartościami.
_arrayFilter
Usuwa elementy null lub puste z tablicy.
_arrayFlipToObject
Zamienia wszystkie klucze numeryczne na powiązane z nimi wartości w tablicy, zwracając obiekt.
_arrayInnerJoinJSONObjectProperties
Wypełnia obiekty JSON wewnątrz tablicy docelowej właściwościami z obiektu JSON tablicy źródłowej, gdzie określona właściwość jest taka sama dla obu obiektów.
_arrayItem
Uzyskuje dostęp do elementu na podanej pozycji w tablicy.
_arrayJoin
Łączy wszystkie ciągi znaków z tablicy, używając podanego separatora.
_arrayKeys
Klucze tablicy.
_arrayLength
Liczba elementów w tablicy.
_arrayMerge
Scala dwie lub więcej tablic razem.
_arrayPad
Uzupełnia tablicę do określonej długości wartością.
_arrayRandom
Losowo wybiera jeden element z podanych.
_arrayRemoveFirst
Usuwa pierwszy element tablicy.
_arrayRemoveLast
Usuwa ostatni element tablicy.
_arrayReverse
Odwraca tablicę.
_arraySearch
Wyszukuje pozycję elementu w tablicy. Jeśli zostanie znaleziony, zwraca jego pozycję, w przeciwnym razie zwraca false.
_arraySetItem
Ustawia element na danej pozycji tablicy.
_arraySlice
Wyodrębnia wycinek tablicy.
_arraySplice
Usuwa fragment tablicy i zastępuje go czymś innym.
_arrayUnique
Usuwa wszystkie zduplikowane elementy z tablicy.
_date
Zwraca ciąg znaków sformatowany zgodnie z podanym formatem, używając podanego całkowitego timestamp (znacznika czasu Unix) lub bieżącego czasu, jeśli nie podano znacznika czasu. Innymi słowy, timestamp jest opcjonalny i domyślnie przyjmuje wartość time() (dostarczaną przez pole _time).
_echo
Powtarza dane wejściowe, niezależnie od ich rodzaju.
_equals
Wskazuje, czy wynik pola jest równy określonej wartości.
_floatCeil
Zaokrągla liczbę w górę do najbliższej wyższej liczby całkowitej.
_floatDivide
Dzieli liczbę przez inną liczbę.
_greaterThan
Wskazuje, czy liczba1 > liczba2.
_greaterThanOrEquals
Wskazuje, czy liczba1 >= liczba2.
_if
Jeśli właściwość logiczna jest prawdziwa, wykonuje jedno pole; w przeciwnym razie wykonuje inne pole.
_inArray
Wskazuje, czy tablica zawiera daną wartość.
_intAdd
Dodaje liczbę całkowitą do innej liczby całkowitej.
_intArraySum
Suma całkowitych elementów tablicy.
_intMultiply
Mnoży liczbę całkowitą przez inną liczbę całkowitą.
_intSubtract
Odejmuje liczbę całkowitą od innej liczby całkowitej.
_isEmpty
Wskazuje, czy wartość jest pusta.
_isNull
Wskazuje, czy wartość jest null.
_lowerThan
Wskazuje, czy liczba1 < liczba2.
_lowerThanOrEquals
Wskazuje, czy liczba1 <= liczba2.
_makeTime
Zwraca znacznik czasu Unix odpowiadający podanym argumentom. Ten znacznik czasu to długa liczba całkowita zawierająca liczbę sekund między Epoką Unix (1 stycznia 1970 00:00:00 GMT) a podanym czasem.
Wszelkie pominięte lub null opcjonalne argumenty zostaną ustawione na bieżącą wartość zgodnie z lokalną datą i godziną.
_not
Zwraca przeciwną wartość właściwości logicznej.
_notEmpty
Wskazuje, czy wartość nie jest pusta.
_notEquals
Wskazuje, czy dwie wartości nie są sobie równe.
_notInArray
Wskazuje, czy tablica nie zawiera danej wartości.
_notNull
Wskazuje, czy wartość nie jest null.
_objectAddEntry
Dodaje wpis do obiektu.
_objectEncodeAsJSONString
Koduje obiekt jako ciąg JSON.
_objectFilter
Usuwa elementy null lub puste z obiektu.
_objectFlip
Odwraca klucze i wartości w obiekcie JSON.
_objectIntersectKey
Oblicza część wspólną obiektów używając kluczy do porównania.
_objectKeepProperties
Zachowuje tylko określone właściwości w obiekcie JSON.
_objectMerge
Scala dwa lub więcej obiektów razem.
_objectProperties
Pobiera właściwości obiektu JSON.
_objectProperty
Pobiera właściwość z obiektu JSON.
_objectRemoveEntry
Usuwa wpis z obiektu JSON.
_objectRemoveProperties
Usuwa jeden lub więcej wpisów z obiektu JSON.
_objectValues
Pobiera wartości z obiektu JSON.
_or
Zwraca wynik operacji OR na kilku właściwościach logicznych.
_propertyExistsInJSONObject
Wskazuje, czy właściwość istnieje w obiekcie JSON.
_propertyIsSetInJSONObject
Wskazuje, czy właściwość istnieje i nie jest null w obiekcie JSON.
_sprintf
Zastępuje symbole zastępcze w ciągu znaków podanymi wartościami.
_strAppend
Dołącza ciąg znaków do innego ciągu.
_strArrayReplace
Zastępuje ciąg znaków innym ciągiem w tablicy.
_strArrayReplaceMultiple
Zastępuje listę ciągów znaków inną listą ciągów w tablicy.
_strContains
Wskazuje, czy ciąg znaków zawiera inny ciąg.
_strDecodeJSONObject
Dekoduje ciąg znaków do obiektu JSON lub zwraca null, jeśli jest to niemożliwe.
_strDecodeList
Dekoduje ciąg znaków do tablicy (dowolnego typu) lub zwraca null, jeśli jest to niemożliwe.
_strEndsWith
Wskazuje, czy ciąg znaków kończy się innym ciągiem.
_strLength
Długość ciągu znaków.
_strLowerCase
Przekształca ciąg znaków na małe litery.
_strPad
Uzupełnia ciąg znaków do określonej długości innym ciągiem.
_strPos
Pozycja podciągu w ciągu znaków lub null, jeśli nie znaleziono.
_strRegexFindMatches
Wykonuje wyrażenie regularne w celu wyodrębnienia wszystkich dopasowań z ciągu znaków.
_strRegexReplace
Wykonuje wyrażenie regularne w celu wyszukania i zastąpienia ciągu znaków.
_strRegexReplaceMultiple
Wykonuje wyrażenia regularne w celu wyszukania i zastąpienia ciągów znaków.
_strRepeat
Powtarza ciąg znaków.
_strReplace
Zastępuje ciąg znaków innym ciągiem.
_strReplaceMultiple
Zastępuje listę ciągów znaków inną listą ciągów.
_strReverse
Odwraca ciąg znaków.
_strShuffle
Losowo przetasowuje ciąg znaków.
_strStartsWith
Wskazuje, czy ciąg znaków zaczyna się od innego ciągu.
_strStripSlashes
Zwraca ciąg znaków z usuniętymi ukośnikami odwrotnymi. (\' staje się ' itd.) Podwójne ukośniki odwrotne (\\) stają się pojedynczym ukośnikiem odwrotnym (\).
_strSubstr
Zwraca część ciągu znaków.
_strTitleCase
Przekształca ciąg znaków do formatu title case.
_strToTime
Przetwarza prawie dowolny tekstowy opis daty i czasu w języku angielskim na znacznik czasu Unix.
_strTrim
Usuwa białe znaki (lub inne znaki) z początku i końca ciągu znaków.
_strUpperCase
Przekształca ciąg znaków na wielkie litery.
_strWordCount
Liczba słów w ciągu znaków.
_time
Zwraca bieżący czas.
Dyrektywy Funkcji
Poniżej znajduje się lista dyrektyw funkcji.
@arrayAddItem
Dodaje element do tablicy.
@arrayDiff
Oblicza różnicę z inną tablicą.
@arrayFilter
Usuwa elementy null lub puste z tablicy.
@arrayMerge
Scala tablicę z inną tablicą.
@arrayPad
Uzupełnia tablicę do określonej długości wartością.
@arrayRemoveFirst
Usuwa pierwszy element tablicy.
@arrayRemoveLast
Usuwa ostatni element tablicy.
@arrayReverse
Odwraca tablicę.
@arraySetItem
Ustawia element na danej pozycji tablicy.
@arraySlice
Wyodrębnia wycinek tablicy.
@arraySplice
Usuwa fragment tablicy i zastępuje go czymś innym.
@arrayUnique
Usuwa wszystkie zduplikowane elementy z tablicy.
@boolOpposite
Konwertuje wartość logiczną na jej przeciwieństwo.
@floatDivide
Dzieli wartość pola przez liczbę zmiennoprzecinkową.
@intAdd
Dodaje liczbę całkowitą do wartości pola.
@intMultiply
Mnoży liczbę całkowitą przez wartość pola.
@intSubtract
Odejmuje liczbę całkowitą od wartości pola.
@objectAddEntry
Dodaje wpis do obiektu JSON.
@objectFilter
Usuwa elementy null lub puste z obiektu.
@objectKeepProperties
Zachowuje tylko określone właściwości z obiektu JSON.
@objectRemoveEntry
Usuwa wpis z obiektu JSON.
@objectRemoveProperties
Usuwa określone właściwości z obiektu JSON.
@setNull
Ustawia wartość pola jako null.
@strAppend
Dołącza ciąg znaków na końcu ciągu w wartości pola.
@strLowerCase
Konwertuje ciąg znaków na małe litery.
@strPad
Uzupełnia ciąg znaków do określonej długości innym ciągiem.
@strPrepend
Dołącza ciąg znaków na początku ciągu w wartości pola.
@strRegexReplace
Wykonuje wyrażenie regularne w celu wyszukania i zastąpienia ciągu znaków (zob. dokumentacja funkcji PHP preg_replace).
@strRegexReplaceMultiple
Wykonuje wyrażenia regularne w celu wyszukania i zastąpienia listy ciągów znaków (zob. dokumentacja funkcji PHP preg_replace).
@strRepeat
Powtarza ciąg znaków.
@strReplace
Zastępuje ciąg znaków innym ciągiem.
@strReplaceMultiple
Zastępuje listę ciągów znaków inną listą ciągów.
@strReverse
Odwraca ciąg znaków.
@strShuffle
Losowo przetasowuje ciąg znaków.
@strStripSlashes
Zwraca ciąg znaków z usuniętymi ukośnikami odwrotnymi. (\' staje się ' itd.) Podwójne ukośniki odwrotne (\\) stają się pojedynczym ukośnikiem odwrotnym.
@strSubstr
Zwraca część ciągu znaków.
@strTitleCase
Konwertuje ciąg znaków do formatu title case.
@strTrim
Usuwa białe znaki (lub inne znaki) z początku i końca ciągu znaków.
@strUpperCase
Konwertuje ciąg znaków na wielkie litery.
Przykłady
Pola Funkcji
Choć mamy pole Post.hasComments, może być potrzebna wartość przeciwna. Zamiast tworzyć nowe pole Post.notHasComments (co wymagałoby edycji kodu PHP), możemy użyć funkcji Field to Input, aby przekazać wartość z hasComments jako dane wejściowe do pola not, obliczając w ten sposób nową wartość zawsze w ramach query GraphQL:
{
posts {
id
hasComments
notHasComments: _not(value: $__hasComments)
}
}Możemy stosować pola funkcji wielokrotnie, aby wykonać bardziej złożone obliczenia, takie jak generowanie pola summary na podstawie wartości z innych pól:
{
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
)
}
}W połączeniu z rozszerzeniem HTTP Client możemy dynamicznie generować endpoint API do połączenia (na podstawie danych z naszej witryny), a następnie wyodrębnić określone pole ze zwróconych danych:
{
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"
}
)
}
}...dając wynik:
{
"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"
}
]
}
}Dyrektywy Funkcji
Jeśli ta query:
query {
posts {
title
}
}...daje te wyniki:
{
"data": {
"posts": [
{
"title": "Hello world!"
},
{
"title": "lovely weather"
}
]
}
}...to ta query:
query {
posts {
title @strUpperCase
}
}...da wynik:
{
"data": {
"posts": [
{
"title": "HELLO WORLD!"
},
{
"title": "LOVELY WEATHER"
}
]
}
}