Şema eğitimi
Şema eğitimiDers 7: İçeriği toplu olarak uyarlama

Ders 7: İçeriği toplu olarak uyarlama

Bu eğitim dersi, tek bir GraphQL isteğiyle birden fazla gönderinin başlığını, içeriğini ve özetini güncelleyerek içeriği toplu olarak uyarlar.

Bu GraphQL queries'nin çalışması için, endpoint'e uygulanan Şema Yapılandırması'nın İç İçe Mutations özelliğinin etkinleştirilmiş olması gerekir.

Aşağıdaki GraphQL queries, birden fazla gönderinin verilerini alır, her biri için title, content ve excerpt alanlarında arama ve değiştirme işlemi uygular, bunları mutation için girdi olarak uyarlar ve tüm sonuçları sözlük biçiminde tek bir dinamik değişken olan $postInputs içine aktarır. Biçim şu şekildedir:

{
  "${post ID}": {
    "title": "${adapted post title}",
    "excerpt": "${adapted post excerpt}"
  },
  // repeat for all other posts ...
}

mutation işleminde, bu girişlerin her biri daha sonra _objectProperty aracılığıyla alınır (${post ID} anahtar olarak kullanılarak) ve gönderiyi güncellemek için input olarak iletilir:

query TransformAndExportData(
  $limit: Int! = 5,
  $offset: Int! = 0,
  $replaceFrom: [String!]!
  $replaceTo: [String!]!
) {
  posts: posts(
    pagination: { limit: $limit, offset: $offset }
    sort: { by: ID, order: ASC }
  ) {
    rawTitle
    rawContent
    rawExcerpt
      @strReplaceMultiple(
        search: $replaceFrom
        replaceWith: $replaceTo
        affectAdditionalFieldsUnderPos: [1, 2]
      )
      @deferredExport(
        as: "postAdaptedSources"
        type: DICTIONARY
        affectAdditionalFieldsUnderPos: [1, 2]
      )
  }
}
 
query AdaptDataForMutationInput
  @depends(on: "TransformAndExportData")
{
  postInputs: _echo(value: $postAdaptedSources)
    @underEachJSONObjectProperty(
      passValueOnwardsAs: "adaptedSource",
      affectDirectivesUnderPos: [1, 2, 3, 4]
    )
      @applyField(
        name: "_objectProperty",
        arguments: {
          object: $adaptedSource,
          by: {
            key: "rawTitle"
          }
        },
        passOnwardsAs: "adaptedTitle"
      )
      @applyField(
        name: "_objectProperty",
        arguments: {
          object: $adaptedSource,
          by: {
            key: "rawExcerpt"
          }
        },
        passOnwardsAs: "adaptedExcerpt"
      )
      @applyField(
        name: "_objectProperty",
        arguments: {
          object: $adaptedSource,
          by: {
            key: "rawContent"
          }
        },
        passOnwardsAs: "adaptedContent"
      )
      @applyField(
        name: "_echo",
        arguments: {
          value: {
            title: $adaptedTitle,
            excerpt: $adaptedExcerpt,
            contentAs: {
              html: $adaptedContent
            }
          }
        },
        setResultInResponse: true
      )
    @export(as: "postInputs")
}
 
mutation UpdatePost(
  $limit: Int! = 5,
  $offset: Int! = 0
)
  @depends(on: "AdaptDataForMutationInput")
{
  adaptedPosts: posts(
    pagination: { limit: $limit, offset: $offset }
    sort: { by: ID, order: ASC }
  ) {
    id
    postInput: _objectProperty(
      object: $postInputs,
      by: { key: $__id }
    ) @remove
    update(input: $__postInput) {
      status
      errors {
        __typename
        ...on ErrorPayload {
          message
        }
      }
      post {
        title
        content
        excerpt
      }
    }
  }
}
  • Field on Field eklentisi, _objectProperty ile çağrıldığında JSON nesnesindeki ($adaptedSource olarak iletilen) her öğeden özellikleri çıkaran ve ardından _echo ile bu özelliklerle birlikte karşılık gelen JSON girdisini oluşturan @applyField direktifini sağlar
  • İşlev alanlarına ek olarak, PHP Functions via Schema eklentisi, @strReplaceMultiple gibi "işlev direktifleri" aracılığıyla da işlevsellik sağlar
  • Çok Alanlı Direktifler etkinleştirildiğinde, affectAdditionalFieldsUnderPos argümanı aracılığıyla ek alanların göreli konumlarını belirterek bir direktifi birden fazla alana uygulayabiliriz
  • Bir direktifi belirli bir alana uygularken ve ardından değerini dışa aktarırken, @export yerine @deferredExport kullanmak gerekir
  • Çok Alanlı Direktifler ile @export (veya @deferredExport) birlikte kullanıldığında, dışa aktarılan değer tüm alanları içeren bir JSON nesnesidir
  • Post.update mutation'ı, şemada yalnızca İç İçe Mutations özelliği etkinleştirildiğinde kullanılabilir