Tutorial skema
Tutorial skemaPelajaran 6: Cari, ganti, dan simpan kembali

Pelajaran 6: Cari, ganti, dan simpan kembali

Pelajaran tutorial ini memberikan contoh adaptasi konten yang melibatkan pencarian dan penggantian, lalu menyimpan kembali sumber daya ke DB.

Ekstensi PHP Functions via Schema menyediakan field-field "cari dan ganti" berikut:

  • _strReplace: Mengganti sebuah string dengan string lain
  • _strReplaceMultiple: Mengganti daftar string dengan daftar string lain
  • _strRegexReplace: Mencari string yang akan diganti menggunakan ekspresi reguler
  • _strRegexReplaceMultiple: Mencari string-string yang akan diganti menggunakan daftar ekspresi reguler
  • _strArrayReplace: Mengganti sebuah string dengan string lain dalam sebuah array
  • _strArrayReplaceMultiple: Mengganti daftar string dengan daftar string lain dalam sebuah array

Cari dan ganti sebuah string

Query GraphQL ini mengambil sebuah post, mengganti semua kemunculan suatu string dengan string lain pada konten dan judul post, lalu menyimpan post tersebut kembali:

query GetPostData(
  $postId: ID!
  $replaceFrom: String!,
  $replaceTo: String!
) {
  post(by: { id: $postId }) {
    title
    adaptedPostTitle: _strReplace(
      search: $replaceFrom
      replaceWith: $replaceTo
      in: $__title
    )
      @export(as: "adaptedPostTitle")
 
    rawContent
    adaptedRawContent: _strReplace(
      search: $replaceFrom
      replaceWith: $replaceTo
      in: $__rawContent
    )
      @export(as: "adaptedRawContent")
  }
}
 
mutation UpdatePost($postId: ID!)
  @depends(on: "GetPostData")
{
  updatePost(input: {
    id: $postId,
    title: $adaptedPostTitle,
    contentAs: { html: $adaptedRawContent },
  }) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    post {
      id
      title
      rawContent
    }
  }
}

Untuk menjalankan query, kita menyediakan kamus variables dengan string-string yang akan dicari dan diganti:

{
  "postId": 1,
  "replaceFrom": "Old string",
  "replaceTo": "New string"
}

Cari dan ganti beberapa string

Ini adalah query yang sama seperti di atas, namun dengan menggunakan _strReplaceMultiple kita dapat mengganti daftar string dengan daftar string lain:

query GetPostData(
  $postId: ID!
  $replaceFrom: [String!]!,
  $replaceTo: [String!]!
) {
  post(by: { id: $postId }) {
    title
    adaptedPostTitle: _strReplaceMultiple(
      search: $replaceFrom
      replaceWith: $replaceTo
      in: $__title
    )
      @export(as: "adaptedPostTitle")
 
    rawContent
    adaptedRawContent: _strReplaceMultiple(
      search: $replaceFrom
      replaceWith: $replaceTo
      in: $__rawContent
    )
      @export(as: "adaptedRawContent")
  }
}
 
mutation UpdatePost($postId: ID!)
  @depends(on: "GetPostData")
{
  updatePost(input: {
    id: $postId,
    title: $adaptedPostTitle,
    contentAs: { html: $adaptedRawContent },
  }) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    post {
      id
      title
      rawContent
    }
  }
}

Kamus variables kini menerima daftar string yang akan dicari dan diganti:

{
  "postId": 1,
  "replaceFrom": ["Old string 2", "Old string 2"],
  "replaceTo": ["New string1", "New string 2"]
}

Menambahkan tautan yang hilang

Query GraphQL ini melakukan pencarian dan penggantian dengan regex untuk menambahkan tautan yang hilang pada konten HTML post:

query GetPostData($postId: ID!) {
  post(by: { id: $postId }) {
    id
    rawContent
    adaptedRawContent: _strRegexReplace(
      searchRegex: "#\\s+((https?)://(\\S*?\\.\\S*?))([\\s)\\[\\]{},;\"\\':<]|\\.\\s|$)#i"
      replaceWith: "<a href=\"$1\" target=\"_blank\">$3</a>$4"
      in: $__rawContent
    )
      @export(as: "adaptedRawContent")
  }
}
 
mutation UpdatePost($postId: ID!)
  @depends(on: "GetPostData")
{
  updatePost(input: {
    id: $postId,
    contentAs: { html: $adaptedRawContent },
  }) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    post {
      id
      title
      rawContent
    }
  }
}

Semua URL yang tidak dikelilingi tag anchor, seperti:

<p>Visit my website: https://mysite.com.</p>

...akan ditambahkan tag <a> yang sesuai di sekelilingnya (sekaligus menghapus domain dari teks, dan menambahkan target untuk membuka di jendela baru), menjadi:

<p>Visit my website: <a href="https://mysite.com" target="_blank">mysite.com</a>.</p>

Mengganti HTTP dengan HTTPS

Query GraphQL ini mengganti semua URL http dengan https pada sumber gambar HTML:

query GetPostData($postId: ID!) {
  post(by: {id: $postId}) {
    id
    rawContent
    adaptedRawContent: _strRegexReplace(
      searchRegex: "/<img(\\s+)?([^>]*?\\s+?)?src=([\"'])http:\\/\\/(.*?)/"
      replaceWith: "<img$1$2src=$3https://$4$3"
      in: $__rawContent
    )
      @export(as: "adaptedRawContent")
  }
}
 
mutation UpdatePost($postId: ID!)
  @depends(on: "GetPostData")
{
  updatePost(input: {
    id: $postId,
    contentAs: { html: $adaptedRawContent },
  }) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    post {
      id
      title
      rawContent
    }
  }
}