Tutorial dello schema
Tutorial dello schemaLezione 6: Cerca, sostituisci e salva di nuovo

Lezione 6: Cerca, sostituisci e salva di nuovo

Questa lezione del tutorial fornisce esempi di adattamenti di contenuto che prevedono la ricerca e la sostituzione, e il successivo salvataggio della risorsa nel DB.

L'estensione PHP Functions via Schema fornisce i seguenti campi di "ricerca e sostituzione":

  • _strReplace: Sostituisce una stringa con un'altra stringa
  • _strReplaceMultiple: Sostituisce un elenco di stringhe con un altro elenco di stringhe
  • _strRegexReplace: Cerca la stringa da sostituire utilizzando un'espressione regolare
  • _strRegexReplaceMultiple: Cerca le stringhe da sostituire utilizzando un elenco di espressioni regolari
  • _strArrayReplace: Sostituisce una stringa con un'altra stringa in un array
  • _strArrayReplaceMultiple: Sostituisce un elenco di stringhe con un altro elenco di stringhe in un array

Cerca e sostituisci una stringa

Questa query GraphQL recupera un articolo, sostituisce tutte le occorrenze di una stringa con un'altra nel contenuto e nel titolo dell'articolo, e salva nuovamente l'articolo:

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

Per eseguire la query, forniamo il dizionario di variables con le stringhe da cercare e sostituire:

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

Cerca e sostituisci più stringhe

È la stessa query di cui sopra, ma utilizzando _strReplaceMultiple possiamo sostituire un elenco di stringhe con un altro elenco di stringhe:

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

Il dizionario di variables riceve ora un elenco di stringhe da cercare e sostituire:

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

Questa query GraphQL esegue una ricerca e sostituzione con regex per aggiungere link mancanti nel contenuto HTML dell'articolo:

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

Tutti gli URL non circondati da un tag anchor, come:

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

...ricevono il corrispondente tag <a> attorno ad essi (rimuovendo anche il dominio dal testo e aggiungendo un target per aprire in una nuova finestra), diventando:

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

Sostituire HTTP con HTTPS

Questa query GraphQL sostituisce tutti gli URL http con https nelle sorgenti delle immagini 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
    }
  }
}