簡體   English   中英

Twig 將字符串變量渲染為數組

[英]Twig render string variable as array

我們正在使用樹枝渲染引擎,用有效載荷數據填充 json。

或者換句話說:

{
    "payload": {
        "sld": "{{sld}}",
        "tld": "{{tlds}}"
    }
}

我正在循環所有變量並“渲染”這些值。 當一切都是字符串時,它工作得很好


{
    "payload": {
        "sld": "test",
        "tld": "com"
    }
}

但是,如果任何樹枝變量是數組,它就會崩潰。 或者換句話來說:

{{tlds}} 是數組 === ["com", "net"]

因為它存儲在 json 中,所以我不能在沒有字符串引號“”的情況下編寫它。

預期的結果應該是:

{
    "payload": {
        "sld": "test",
        "tld": ["com", "net"]
    }
}

你能幫我解決方案或解決方法嗎?

正如評論中所指出的,您應該為此使用內置的json_encode過濾器。
也就是說,這樣做只會導致你的 JSON 對象的 HTML 編碼版本。 為了克服這個問題,您還必須使用raw過濾器。

所以用這個 Twig 襯里:

{{ data | json_encode() | raw }}

和數據如:

$data = [
  [
    "payload" => [
      "sld" => "test",
      "tld" => "com"
    ]
  ],
  [
    "payload" => [
      "sld" => "test",
      "tld" => [
        "com",
        "net"
      ]
    ]
  ]
];

這會給你這個 JSON(為了可讀性而美化):

[
   {
      "payload":{
         "sld":"test",
         "tld":"com"
      }
   },
   {
      "payload":{
         "sld":"test",
         "tld":[
            "com",
            "net"
         ]
      }
   }
]

所有這些都可以在這里測試: https : //twigfiddle.com/i604iv

經過一些測試和頭腦風暴,我決定刪除樹枝渲染器並將其遷移到更簡單的版本。

長話短說,這將呈現所有 {{variable.something}} 之類的語法,並將使用有效負載中的相應值填充它。

如果該值是一個數組,它將對它進行 json 編碼,然后對其進行解碼,以實現請求的功能。


 private function renderVariables(array $variables = [], array $payload = [])
    {
        $rendered = [];

        foreach ($variables as $key => $value) {
            if (is_array($value)) {
                $rendered[$key] = $this->renderVariables($value, $payload);
            } else {
                $rendered[$key] = $this->replaceMarkdown($value, $payload);

                if (strpos($rendered[$key], '[') !== false || strpos($rendered[$key], '{') !== false) {
                    $rendered[$key] = json_decode($rendered[$key]);
                }
            }
        }
        return $rendered;
    }

    public function replaceMarkdown(string $param, array $argv)
    {
        return preg_replace_callback('/\{\%\s*(.*)\s*\%\}|\{\{(?!%)\s*((?:[^\s])*)\s*(?<!%)\}\}/i',
            function ($field) use ($argv) {
                $field = $field[2];

                if (strpos($field, '.') !== false) {
                    $fields = explode('.', $field);
                } else {
                    $fields = array($field);
                }

                $currentData = $argv; # we should take care for magic before foreach

                foreach ($fields as $currentField) {
                    if (isset($currentData[$currentField])) {
                        $currentData = $currentData[$currentField];
                    } else {
                        return $field . '-not-found';
                    }

                }
                if (is_array($currentData)) {
                    $currentData = json_encode($currentData);
                }
                return (string)$currentData;
            }, $param);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM