ermilov / draft-php
PHP 实现的 Draft.js ContentState 模型,允许服务器端处理 Draft.js 生成的内容。PHP 5.6 降级版本
1.1.1
2017-03-23 15:48 UTC
Requires
- php: ^7.0
- ext-mbstring: *
Requires (Dev)
- phpunit/phpunit: ~5.6
- prezly/code-style: dev-master
This package is not auto-updated.
Last update: 2024-09-26 18:41:30 UTC
README
PHP 实现的 Draft.js ContentState 模型,允许服务器端处理 Draft.js 生成的内容。
目录
使用方法
读取 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
实现说明
-
ContentState 现在持有一个
$entityMap属性,并有一个->getEntity(string $entityKey)方法。这种做法允许将来自 JSON 的所有数据封装到单个对象中,然后用于渲染。全局静态实体池(如原生 Draft.js 实现和 Draft.js 模型的另一个 PHP 端口)并不那么有用。全局状态会在你需要在一个 PHP 进程中渲染多个内容状态时阻碍你。此外,它也使测试复杂化。
-
所有模型类都是不可变的。这是通过将所有数据存储在私有属性中并只提供获取器作为公共 API(
getXxxx方法 + 魔法__get()方法来模拟只读公共属性)来实现的。
其他实现
- webstronauts/draft-php — Draft.js 模型规范的逐行移植,经过良好测试
许可证
致谢
由 Prezly 构建,这是一款专为公关沟通打造的 CRM 软件