fiedsch / contao-components
Requires
- php: >=5.6
- contao-community-alliance/composer-plugin: ~2.4 || ~3.0
- contao/core-bundle: ~3.5 || ~4.4
- symfony/expression-language: ~2.7 || ~2.8 || ~3.2 || ~3.4
- symfony/yaml: ~2.7 || ~2.8 || ~3.2 || ~3.4
README
已弃用!请使用 fiedsch/contao-jsonwidget
代替。
小部件
JSON小部件
可以在DCA文件中使用 jsonWidget
来创建一个包含JSON字符串的文本字段。保存时将检查该字符串是否为有效的JSON。小部件使用 JSON_PRETTY_PRINT
显示JSON字符串,以便于阅读者进行检查。
示例:扩展成员
$GLOBALS['TL_DCA']['tl_member']['fields']['json_data'] = [ 'inputType' => 'jsonWidget', 'label' => &$GLOBALS['TL_LANG']['tl_member']['json_data'], 'eval' => ['tl_style'=>'long', 'decodeEntities'=>true, 'allowHtml'=>true ], 'sql' => "blob NULL", ]; // Add json_data to $GLOBALS['TL_DCA']['tl_member']['palettes']['default'] // where ever you like
eval
中的其他有效选项与 textarea
相同(因为 WidgetJSON
扩展了 TextArea
),只是设置 rte
将被忽略,因为提供的编辑器在此处没有意义。
如何使用?
如上例扩展 tl_member
。然后创建一个扩展Contao的 MemberModel
的 ExtendedMemberModel
。在魔法方法 __set()
和 _get
中,您可以拦截存储在 json_data
中的“字段”。Fiedsch\JsonGetterSetterTrait
会处理这一点。
// models/ExtendedMemberModel.php namespace Contao; class ExtendedMemberModel extends \MemberModel { // let __set() and __get take care of the JSON data use \Fiedsch\JsonGetterSetterTrait; /** * The column name we selected for the `jsonWidget` in the example above * @var string */ protected static $strJsonColumn = 'json_data'; }
// config/config.php $GLOBALS['TL_MODELS']['tl_member'] = 'Contao\ExtendedMemberModel';
// config/autoload.php // ... ClassLoader::addClasses( [ // ... 'Contao\ExtendedMemberModel' => 'system/modules/your_extension/models/ExtendedMemberModel.php', // ... ] ); // ...
最后...
$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();
辅助类
读取YAML配置文件(主要实验性)
use Fiedsch\YamlConfigHelper; $defaults = [ 'messages' => [ 'de' => 'Guten Tag', 'fr' => 'Bonjour', 'en' => 'Hello', ] ]; $config = new YamlConfigHelper('files/config/config.yaml', $defaults);
如果 files/config/config.yml
不存在,它将使用(可选参数)$defaults
中指定的数据创建。
messages: de: 'Guten Tag' fr: 'Bonjour' en: 'Hello'
使用如下 YamlConfigHelper
实例 $config
$config->getEntry('data.messages.de'); // 'Guten Tag' $config->getEntry('data.messages.es'); // null
假设如预期的那样 files/config/config.yaml
存在并包含
messages: de: 'Guten Morgen' fr: 'Bonjour' en: 'Good Morning'
您将得到
$config->getEntry('data.messages.de'); // 'Guten Morgen' $config->getEntry('data.messages.es'); // null
$defaults
中的数据将被忽略。不会合并从配置文件读取的内容和指定的 $defaults
!
有关使用Symfony的 ExpressionLanguage
的详细信息,请参阅 https://symfony.com.cn/doc/current/components/expression_language.html
指定默认值
如上所示的配置数据
$config->getEntry('data.messages.es'); // null $config->getEntry('data.messages.es', "¡buenos días!"); // "¡buenos días!"
数据类型
如上所示的配置文件
$config->getEntry('data.messages'); /* object(stdClass)#233 (3) { ["de"]=> string(12) "Guten Morgen" ["fr"]=> string(7) "Bonjour" ["en"]=> string(12) "Good Morning" } */
返回一个 stdClass
实例。如果您需要将数据作为 array
使用,必须将其类型转换为 array
(array)$config->getEntry('data.messages'); /* array(3) { ["de"]=> string(12) "Guten Morgen" ["fr"]=> string(7) "Bonjour" ["en"]=> string(12) "Good Morning" } */
请注意
使用
$config = new YamlConfigHelper('files/sompe/path/to/a/file.yaml');
请注意,除非路径中的某个文件夹(例如 files/sompe/path/to/a/
)被 .htaccess
文件(Contao后端中的锁形图标)保护,否则 file.yaml
是公开可访问的(在Contao 3中)。
如果您想使文件可由Contao后端用户编辑
- 请将其放置在(位于)
files/
(的一个子文件夹下) - 将文件扩展名设置为
.yaml
,这样Contao的语法高亮功能就会被触发(使用.yml
扩展名则不会发生这种情况) - 将
yaml
添加到 Contao 的“可编辑文件类型”列表中(在系统设置中找到)