fiedsch/contao-jsonwidget

Contao开源CMS后端表单的小部件

安装次数: 19,322

依赖者: 2

建议者: 0

安全: 0

星标: 6

关注者: 1

分支: 1

开放性问题: 0

类型:contao-bundle

0.8.3 2024-01-02 14:15 UTC

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的 MemberModelExtendedMemberModel。在魔法方法 __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": {} }