prezly/draft-php

PHP 实现的 Draft.js 内容状态模型,允许在服务器端处理 Draft.js 生成的内容。

2.0.2 2022-09-14 12:07 UTC

This package is auto-updated.

Last update: 2024-09-14 16:24:14 UTC


README

PHP 实现的 Draft.js 内容状态模型,允许在服务器端处理 Draft.js 生成的内容。

Tests Status

目录

使用方法

读取 ContentState JSON

// raw JSON content state coming from Draft.js frontend
$json = '{
    "blocks":[
        {
           "key": "7si2a",
           "text": "Say hello to world!",
           "type": "unstyled",
           "depth": 0,
           "inlineStyleRanges": [
               {
                    "style": "BOLD",
                    "offset": 0,
                    "length": 9
               }
           ],
           "entityRanges": [
               {
                    "key": "0",
                    "offset": 0,
                    "length": 9
               }
           ],
           "data": {}
         }
    ],
    "entityMap":{
        "0":{
            "type":"link",
            "mutability":"MUTABLE",
            "data":{
               "href":"https://www.prezly.com/"
            }
        }
    }
}';

// convert raw JSON state to ContentState model object 
$contentState = \Prezly\DraftPhp\Converter::convertFromJson($json);
// or
$rawState = json_decode($json); // Note: raw state should be an stdClass object, not an associative array
$contentState = \Prezly\DraftPhp\Converter::convertFromRaw($rawState);

var_dump($contentState);
/*
  Prezly\DraftPhp\Model\ContentState {
    -_blocks: array:1 [
      0 => Prezly\DraftPhp\Model\ContentBlock {#1507
        -_key: "7si2a"
        -_type: "unstyled"
        -_text: "Say hello to world!"
        -_characterList: array:19 [
          0 => Prezly\DraftPhp\Model\CharacterMetadata {#1506
            -_style: ["BOLD"]
            -_entity: "0"
          }
          1 => Prezly\DraftPhp\Model\CharacterMetadata {#1506}
          2 => Prezly\DraftPhp\Model\CharacterMetadata {#1506}
          3 => Prezly\DraftPhp\Model\CharacterMetadata {#1506}
          4 => Prezly\DraftPhp\Model\CharacterMetadata {#1506}
          5 => Prezly\DraftPhp\Model\CharacterMetadata {#1506}
          6 => Prezly\DraftPhp\Model\CharacterMetadata {#1506}
          7 => Prezly\DraftPhp\Model\CharacterMetadata {#1506}
          8 => Prezly\DraftPhp\Model\CharacterMetadata {#1506}
          9 => Prezly\DraftPhp\Model\CharacterMetadata {#1490
            -_style: []
            -_entity: null
          }
          10 => Prezly\DraftPhp\Model\CharacterMetadata {#1490}
          11 => Prezly\DraftPhp\Model\CharacterMetadata {#1490}
          12 => Prezly\DraftPhp\Model\CharacterMetadata {#1490}
          13 => Prezly\DraftPhp\Model\CharacterMetadata {#1490}
          14 => Prezly\DraftPhp\Model\CharacterMetadata {#1490}
          15 => Prezly\DraftPhp\Model\CharacterMetadata {#1490}
          16 => Prezly\DraftPhp\Model\CharacterMetadata {#1490}
          17 => Prezly\DraftPhp\Model\CharacterMetadata {#1490}
          18 => Prezly\DraftPhp\Model\CharacterMetadata {#1490}
        ]
        -_depth: 0
        -_data: []
      }
    ]
    -_entityMap: array:1 [
      0 => Prezly\DraftPhp\Model\EntityInstance {#1505
        -_type: "link"
        -_mutability: "MUTABLE"
        -_data: array:1 [
          "href" => "https://www.prezly.com/"
        ]
      }
    ]
  }
 */
 
var_dump($contentState->blocks[0]->characterList[0]);
/*
  Prezly\DraftPhp\Model\CharacterMetadata {#1506
    -_style: ["BOLD"]
    -_entity: "0"
  }
*/

var_dump($contentState->getEntity($contentState->blocks[0]->characterList[0]->entity));
/*
  Prezly\DraftPhp\Model\EntityInstance {#1505
    -_type: "link"
    -_mutability: "MUTABLE"
    -_data: array:1 [
      "href" => "https://www.prezly.com/"
    ]
  }
*/

将 ContentState 序列化为 JSON

// convert raw JSON state to ContentState model object 
$contentState = \Prezly\DraftPhp\Converter::convertFromJson($json);

$serializedJson = \Prezly\DraftPhp\Serializer::serialize($contentState);
// or
$serializedJson = json_serialize($contentState); 

// now $json is equivalent to $serializedJson (formatting and order may differ though)
// see SerializerTest for examples

实现说明

  1. ContentState 现在包含一个 $entityMap 属性,并且有 ->getEntity(string $entityKey) 方法。这种做法允许将所有来自 JSON 的数据封装到一个单独的对象中,然后用于渲染。

    拥有全局静态实体池(如在原生 Draft.js 实现和 Draft.js 模型另一个 PHP 端口中的实现)并不那么有用。全局状态会在你需要在一个 PHP 进程中渲染多个内容状态时阻碍你。此外,它还使测试变得复杂。

  2. 所有模型类都是不可变的。这是通过将所有数据存储在私有属性中,只提供获取器作为公共 API(getXxxx 方法 + 魔术 __get() 方法来模拟只读公共属性)来实现的。

其他实现

许可协议

MIT

致谢

Prezly 构建,🤘 — 为公关沟通量身定制的 CRM 软件