fiedsch / contao-jsonwidget
Contao开源CMS后端表单的小部件
Requires
- php: ^8.1
- ext-json: *
- contao/core-bundle: ^4.9 || ^5.1
- symfony/yaml: ^4.2 || ^5.0 || ^6.0
Requires (Dev)
- phpunit/phpunit: ^9.5
README
可以使用 jsonWidget
在DCA文件中创建一个包含JSON字符串的文本字段。在保存时,将检查该字符串是否是有效的JSON。该小部件以 JSON_PRETTY_PRINT
显示JSON字符串,以便用户更容易检查/找到错误。
yamlWidget
几乎相同,只是它使用YAML格式。
示例:扩展成员
DCA
$GLOBALS['TL_DCA']['tl_member']['fields']['json_data'] = [ 'inputType' => 'jsonWidget', 'label' => &$GLOBALS['TL_LANG']['tl_member']['json_data'], 'eval' => ['tl_class' => 'long', 'decodeEntities' => true], 'sql' => "blob NULL", ]; // Add json_data to $GLOBALS['TL_DCA']['tl_member']['palettes']['default'] // where ever you like
eval
中的其他有效选项与 textarea
相同(因为 WidgetJSON
扩展了 TextArea
),但设置 rte
将被忽略,因为提供的编辑器在这里没有意义。
如何使用JSON数据?
如上例扩展 tl_member
。然后创建一个扩展Contao的 MemberModel
的 ExtendedMemberModel
。在魔法方法 __set()
和 _get
中,您可以拦截存储在 json_data
中的 "字段"。Fiedsch\JsonWidgetBundle\JsonGetterSetterTrait
会处理这些。
// models/ExtendedMemberModel.php namespace Contao; use Fiedsch\JsonWidgetBundle\Traits\JsonGetterSetterTrait; class ExtendedMemberModel extends MemberModel { // let __set() and __get() take care of the JSON or YAML data (both at the same time will not work!) use JsonGetterSetterTrait; // or (see above!) use YamlGetterSetterTrait; /** * The column name we selected for the `jsonWidget` in the example above * @var string */ protected static $strJsonColumn = 'my_json_data_column'; /** * Same thing for the `yamlWidget` * @var string */ protected static $strYamlColumn = 'my_yaml_data_column'; }
// config/config.php $GLOBALS['TL_MODELS']['tl_member'] = 'Contao\ExtendedMemberModel';
使用模型
$member = \ExtendedMemberModel::findById(42); // access fields columns created by contao's default DCA printf("read member %s %s\n", $member->firstname, $member->lastname); // access a field stored in our JSON data column printf("transparently accessing a field from the JSON data ... '%s'\n", $member->whatever); // set values and store in database $member->a_key_for_a_scalar_value = "fourtytwo"; $member->key_for_an_array = ['an','array','containing','some','strings']; $member->save(); // Note that saving will lose comments in your YAML-data // as Symfony\Component\Yaml\Yaml will not save them
使用ACE进行YAML语法高亮显示
设置
'eval' => [ /* ... , */ 'rte'=>'ace|yaml'],
在字段DCA定义中。
快速简便的方法:添加所需的CSS规则,例如
.ace_comment { color: red !important; }
到您的 be_ace.html5
(如果您还没有自定义版本,请创建它)。或者:使用自定义后端样式并添加CSS规则。
设置JSON(或JAML)数据
如果您想一次性设置所有JSON(或YAML)数据,则不能使用
# In this example we assume $strJsonColumn = 'json_data'; $data = [ 'foo' => 1, 'bar' => 'baz ]; $model->json_data = $data; # will throw an exception
为此,您必须使用
$data = [ 'foo' => 1, 'bar' => 'baz ]; $model->setJsonColumnData(array $data); # or # $model->setYamlColumnData(array $data);
请注意,这种方式将覆盖之前设置的JSON(或YAML)数据。
请注意,在版本 0.5.0
中,setJsonColumnData([])
(设置空数据数组)的行为已更改。以前它创建 []
,现在在相应的数据库列中创建 {}
。
在版本 0.7.0
中,我们对此又进行了轻微的更改,以达到原始目标:强制存储空数组为对象({}
),仅在数据的最顶层。在较低级别,空数组将存储为数组([]
),而不是“空”对象({}
):比较版本 >= 0.7.0 的 { "foo": [] }
与版本 >= 0.5.0 且 < 0.7.0 的 { "foo": {} }
。