Alan Degeri Iterasyonu ve Manipulasyonu
GraphQL semasina, dizi ve nesne alanlarinin deger ogelerini iterasyon yaparak manipule etmek icin meta yonergeler eklenmistir:
@underArrayItem@underJSONObjectProperty@underEachArrayItem@underEachJSONObjectProperty@objectClone
@underArrayItem
@underArrayItem, ic ice yonergenin dizideki belirli bir oge uzerinde uygulanmasini saglar.
Asagidaki query'de, kategori adlarini iceren dizideki yalnizca ilk oge buyuk harfe donusturulur:
query {
posts {
categoryNames
@underArrayItem(index: 0)
@strUpperCase
}
}...uretilir:
{
"data": {
"posts": {
"categoryNames": [
"NEWS",
"sports"
]
}
}
}@underJSONObjectProperty
@underJSONObjectProperty, ic ice yonergenin sorgulanan JSON nesnesinden bir girdi almasini saglar.
Bu yonerge, ozellikle harici bir API sorgulandiktan sonra istenen bir veriyi cikarmak ve manipule etmek icin kullanislidir; bu API'nin buyuk olasilikla genel bir JSONObject tipi olacaktir (HTTP Client uzantisindaki _sendJSONObjectItemHTTPRequest fonksiyon alani kullanildiginda oldugu gibi).
Asagidaki query'de, WP REST API'den gelen bir JSON nesnesi elde ediyoruz ve yanitanin type ozelligini manipule etmek, buyuk harfe donusturmek icin @underJSONObjectProperty kullaniyoruz:
query {
postData: _sendJSONObjectItemHTTPRequest(input: {
url: "https://newapi.getpop.org/wp-json/wp/v2/posts/1/?_fields=id,type,title,date"
})
@underJSONObjectProperty(by: { key: "type" })
@strUpperCase
}Bu sonucu uretecektir:
{
"data": {
"postData": {
"id": 1,
"date": "2019-08-02T07:53:57",
"type": "POST",
"title": {
"rendered": "Hello world!"
}
}
}
}JSON nesnesinin ilk seviyesinde bulunan bir ozelligi isaret etmek icin "key" almanin yani sira, bu yonerge ayrica nesnenin ic yapisinda gezinmek icin "path" de alabilir; seviyeler arasinda ayirici olarak . kullanilir.
Asagidaki query'de, bir gonderi icin WP REST API ucu "title.rendered" ozelligini saglamaktadir. O gercek alt ogeye gidebilir ve baslik biciminde yazima donusturebiliriz:
query {
postData: _sendJSONObjectItemHTTPRequest(input: {
url: "https://newapi.getpop.org/wp-json/wp/v2/posts/1/?_fields=id,type,title,date"
})
@underJSONObjectProperty(by: { path: "title.rendered" })
@strTitleCase
}Bu sonucu uretecektir:
{
"data": {
"postData": {
"id": 1,
"date": "2019-08-02T07:53:57",
"type": "post",
"title": {
"rendered": "HELLO WORLD!"
}
}
}
}@underEachArrayItem
@underEachArrayItem, sorgulanan varliktaki bir alanin dizi ogelerini tek tek gecer ve her birinde ic ice yonergeleri calistirir.
Ornegin, Post.categoryNames alani [String] tipindedir. @underEachArrayItem kullanarak kategori adlari uzerinde iterasyon yapabilir ve @strTranslate yonergesini uygulayabiliriz.
Bu query'de, gonderi kategorileri Ingilizceden Fransizca'ya cevrilir:
query {
posts {
id
title
categoryNames
@underEachArrayItem
@strTranslate(
from: "en",
to: "fr"
)
}
}...uretilir:
{
"data": {
"posts": [
{
"id": 662,
"title": "Explaining the privacy policy",
"categoryNames": [
"Non classé"
]
},
{
"id": 28,
"title": "HTTP caching improves performance",
"categoryNames": [
"Avancé"
]
},
{
"id": 25,
"title": "Public or Private API mode, for extra security",
"categoryNames": [
"Ressource",
"Blog",
"Avancé"
]
}
]
}
}@underEachArrayItem, iterasyon yapilan ogeinin hem indeksini hem de degerini, passIndexOnwardsAs ve passValueOnwardsAs yonerge argumanlari araciligiyla ic ice yonergelerine dinamik degisken olarak iletebilir.
Bu query, $index ve $value dinamik degiskenlerinin kullanimini gostermektedir:
{
_echo(value: ["first", "second", "third"])
@underEachArrayItem(
passIndexOnwardsAs: "index"
passValueOnwardsAs: "value"
)
@applyField(
name: "_echo"
arguments: {
value: {
index: $index,
value: $value
}
},
setResultInResponse: true
)
}Sonuc sudur:
{
"data": {
"_echo": [
{
"index": 0,
"value": "first"
},
{
"index": 1,
"value": "second"
},
{
"index": 2,
"value": "third"
}
]
}
}@underEachArrayItem, filter->by parametresi araciligiyla iterasyon yapilacak dizi konumlarini da sinirlandirabilir; bu parametre include veya exclude girislerinden birini kabul edebilir.
Bu query:
{
including: _echo([
"first",
"second",
"third"
])
@underEachArrayItem(
filter: {
by: {
include: [0, 2]
}
}
)
@strUpperCase
excluding: _echo([
"first",
"second",
"third"
])
@underEachArrayItem(
filter: {
by: {
exclude: [0, 2]
}
}
)
@strUpperCase
}...uretir:
{
"data": {
"including": [
"FIRST",
"second",
"THIRD"
],
"excluding": [
"first",
"SECOND",
"third"
]
}
}@underEachJSONObjectProperty
@underEachJSONObjectProperty, @underEachArrayItem ile benzerdir; ancak JSONObject ogeler uzerinde calismaktadir.
Bu query'de, JSON nesnesindeki tum girdiler uzerinde iterasyon yaparak null olan girdileri bos bir dizeyle degistiriyoruz:
{
_echo(
value: {
first: "hello",
second: "world",
third: null
}
)
@underEachJSONObjectProperty
@default(value: "")
}...uretilir:
{
"data": {
"_echo": {
"first": "hello",
"second": "world",
"third": ""
}
}
}@underEachJSONObjectProperty, iterasyon yapilan anahtar ve degeri, passKeyOnwardsAs ve passValueOnwardsAs yonerge argumanlari araciligiyla ic ice yonergelerine dinamik degisken olarak iletebilir.
Bu query, $key ve $value dinamik degiskenlerinin kullanimini gostermektedir:
{
_echo(value: {
uno: "first",
dos: "second",
tres: "third"
})
@underEachJSONObjectProperty(
passKeyOnwardsAs: "key"
passValueOnwardsAs: "value"
)
@applyField(
name: "_echo"
arguments: {
value: {
key: $key,
value: $value
}
},
setResultInResponse: true
)
}Sonuc sudur:
{
"data": {
"_echo": {
"uno": {
"key": "uno",
"value": "first"
},
"dos": {
"key": "dos",
"value": "second"
},
"tres": {
"key": "tres",
"value": "third"
}
}
}
}@underEachJSONObjectProperty, filter->by parametresi araciligiyla iterasyon yapilacak JSON nesnesi anahtarlarini da sinirlandirabilir; bu parametre includeKeys veya excludeKeys girislerinden birini kabul edebilir.
Bu query:
{
includingKeys: _echo(value: {
uno: "first",
dos: "second",
tres: "third"
})
@underEachJSONObjectProperty(
filter: {
by: {
includeKeys: ["uno", "tres"]
}
}
)
@strUpperCase
excludingKeys: _echo(value: {
uno: "first",
dos: "second",
tres: "third"
})
@underEachJSONObjectProperty(
filter: {
by: {
excludeKeys: ["uno", "tres"]
}
}
)
@strUpperCase
}...uretir:
{
"data": {
"includingKeys": {
"uno": "FIRST",
"dos": "second",
"tres": "THIRD"
},
"excludingKeys": {
"uno": "first",
"dos": "SECOND",
"tres": "third"
}
}
}@objectClone
JSON nesnelerine alan cozumleyicilerde referans yoluyla erisilebilir (nesneyi kopyalayarak/cogelterek degil). Bu durumda, JSON nesnesi degistirildiginde, bu degisiklik bu JSON nesnesini alan tum alanlar tarafindan gorulebilir.
Bu durum Block.attributes alaniyla gecerlidir:
{
posts {
blocks(filterBy: { include: "core/heading" } ) {
attributes
}
}
}...su sonucu uretir:
{
"data": {
"posts": [
{
"blocks": [
{
"attributes": {
"content": "Image Block (Full width)",
"level": 2
}
},
{
"attributes": {
"content": "Gallery Block",
"level": 2
}
}
]
}
]
}
}Asagidaki query'de, originalAttributes yalnizca ozellikleri alirken, transformedAttributes ayrica content ozelligini Fransizca'ya cevrecektir:
{
posts {
blocks(filterBy: { include: "core/heading" } ) {
originalAttributes: attributes
transformedAttributes: attributes
@underJSONObjectProperty(by: { key: "content" })
@strTranslate(to: "fr")
}
}
}Ancak, sorgulanan Block varligi hem originalAttributes hem de transformedAttributes uzerinde ayni JSON nesnesine referans verdigi icin, sonraki alanin gerceklestirdigi donusumler onceki alani da etkileyecektir (bu, query'de gorunduklerinin siralamasindan bagimsizdir).
Sonuc olarak, her iki alan da Fransizca'ya cevirilir:
{
"data": {
"posts": [
{
"blocks": [
{
"originalAttributes": {
"content": "Bloc d'image (pleine largeur)",
"level": 2
},
"transformedAttributes": {
"content": "Bloc d'image (pleine largeur)",
"level": 2
}
},
{
"originalAttributes": {
"content": "Bloc Galerie",
"level": 2
},
"transformedAttributes": {
"content": "Bloc Galerie",
"level": 2
}
}
]
}
]
}
}transformedAttributes alanina @objectClone yonergesini ekleyerek bu sorundan kacinilebiliriz; boylece degisiklikler klonlanmis bir JSON nesnesi uzerinde gerceklestirilir:
{
posts {
blocks(filterBy: { include: "core/heading" } ) {
originalAttributes: attributes
transformedAttributes: attributes
@objectClone
@underJSONObjectProperty(by: { key: "content" })
@strTranslate(to: "fr")
}
}
}...uretilir:
{
"data": {
"posts": [
{
"blocks": [
{
"originalAttributes": {
"content": "Image Block (Full width)",
"level": 2
},
"transformedAttributes": {
"content": "Bloc d'image (pleine largeur)",
"level": 2
}
},
{
"originalAttributes": {
"content": "Gallery Block",
"level": 2
},
"transformedAttributes": {
"content": "Bloc Galerie",
"level": 2
}
}
]
}
]
}
}Daha fazla ornek
Bu query'de, @underEachArrayItem, @underJSONObjectProperty'yi kapsarken, o da @strUpperCase'i kapsar ve WP REST API araciligiyla elde edilen birden fazla gonderi girdisi icin "title.rendered" ozelligini buyuk harfe donusturur:
query {
postListData: _sendJSONObjectCollectionHTTPRequest(
url: "https://newapi.getpop.org/wp-json/wp/v2/posts/?per_page=3&_fields=id,type,title,date"
)
@underEachArrayItem
@underJSONObjectProperty(by: { path: "title.rendered" })
@strUpperCase
}...uretilir:
{
"data": {
"postListData": [
{
"id": 1692,
"date": "2022-04-26T10:10:08",
"type": "post",
"title": {
"rendered": "MY BLOGROLL"
}
},
{
"id": 1657,
"date": "2020-12-21T08:24:18",
"type": "post",
"title": {
"rendered": "A TALE OF TWO CITIES – TEASER"
}
},
{
"id": 1499,
"date": "2019-08-08T02:49:36",
"type": "post",
"title": {
"rendered": "COPE WITH WORDPRESS: POST DEMO CONTAINING PLENTY OF BLOCKS"
}
}
]
}
}