J3.x

添加自定义字段/覆盖

From Joomla! Documentation

< J3.x:Adding custom fields
This page is a translated version of the page J3.x:Adding custom fields/Overrides and the translation is 88% complete.
Outdated translations are marked like this.
Other languages:
Bahasa Indonesia • ‎Deutsch • ‎English • ‎Nederlands • ‎español • ‎français • ‎italiano • ‎中文(中国大陆)‎ • ‎中文(台灣)‎


如何在您的重写中使用自定义字段?


如何在您的重写中使用自定义字段?

介绍

定制字段的真正强大之处在于,您可以在自己的重写中使用它。这里有一个例子,教你如何做到这一点。

在覆盖中获取定制字段。

基本上,所有自定义字段都对应于当前项目,通过您的新属性可访问。 $item 变量 jcfields. 这 $item->jcfields 属性是一个数组,它包含每个字段的以下数据,其中一个字段看起来像这个例子:

Array
(
    [4] => stdClass Object
        (
            [id] => 4
            [title] => article-editor
            [name] => article-editor
            [checked_out] => 0
            [checked_out_time] => 0000-00-00 00:00:00
            [note] => 
            [state] => 1
            [access] => 1
            [created_time] => 2017-04-07 12:08:59
            [created_user_id] => 856
            [ordering] => 0
            [language] => *
            [fieldparams] => Joomla\Registry\Registry Object
                (
                    [data:protected] => stdClass Object
                        (
                            [buttons] => 
                            [width] => 
                            [height] => 
                            [filter] => 
                        )

                    [initialized:protected] => 1
                    [separator] => .
                )

            [params] => Joomla\Registry\Registry Object
                (
                    [data:protected] => stdClass Object
                        (
                            [hint] => 
                            [render_class] => 
                            [class] => 
                            [showlabel] => 1
                            [disabled] => 0
                            [readonly] => 0
                            [show_on] => 
                            [display] => 2
                        )

                    [initialized:protected] => 1
                    [separator] => .
                )

            [type] => editor
            [default_value] => 
            [context] => com_content.article
            [group_id] => 0
            [label] => article-editor
            [description] => 
            [required] => 0
            [language_title] => 
            [language_image] => 
            [editor] => 
            [access_level] => Public
            [author_name] => Super User
            [group_title] => 
            [group_access] => 
            [group_state] => 
            [value] => Bar
            [rawvalue] => Bar
        )

)

使用FieldsHelper渲染字段

要呈现可使用的字段 FieldsHelper::render() 通过传递所需的值。

/**
 * Renders the layout file and data on the context and does a fall back to
 * Fields afterwards.
 *
 * @param   string  $context      The context of the content passed to the helper
 * @param   string  $layoutFile   layoutFile
 * @param   array   $displayData  displayData
 *
 * @return  NULL|string
 *
 * @since  3.7.0
 */
public static function render($context, $layoutFile, $displayData)

使用FieldsHelper的覆盖的示例代码

// Load the FieldsHelper
<?php JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php'); ?>

<?php foreach ($this->item->jcfields as $field) : ?>
	// Render the field using the fields render method
	<?php echo FieldsHelper::render($field->context, 'field.render', array('field' => $field)); ?>
<?php endforeach ?>

一个原始覆盖的示例代码

<?php foreach ($this->item->jcfields as $field) : ?>
	// Render the field using the fields render method
	<?php echo $field->label . ':' . $field->value; ?>
<?php endforeach ?>

$item->jcfields 我需要不包含的字段

The jcfields 属性是使用插件事件生成的 onContentPrepare 通过传递字段的上下文。字段插件比从数据库读取字段并将值添加到jcfields属性中。

因此,请确保您使用的组件也实现了onContentPrepare事件与您用于字段的上下文。

如果您使用的是核心组件,那么这应该能够解决问题。


加载单个字段

为了向您的内容添加单个字段,首先使用“Name”字段为您的自定义字段选择特定的名称,该字段将用于直接在覆盖代码中引用您的字段。在 Options 标签, 选择NoAutomatic Display 字段,以防止它自动显示在任何一个标准位置。

然后,为了在重写中启用对自定义字段的直接访问,请将代码放在文件的开头。您应该对每个想要放置单个定制字段的覆盖PHP文件执行此操作。

<?php foreach($item->jcfields as $jcfield)
     {
          $item->jcFields[$jcfield->name] = $jcfield;
     }
?>

最后,您应该在想要显示的字段标签或值的位置添加字段放置代码。

要将“标签的字段添加到您的覆盖,请插入下面的代码, 替换 name-of-field 以字段的名称。

<?php echo $item->jcFields['name-of-field']->label; ?>

要将字段的“值”添加到您的覆盖,请插入下面的代码,替换name-of-field 以字段的名称。

<?php echo $item->jcFields['name-of-field']->rawvalue; ?>

您可以将此代码添加到覆盖的任何部分。示例:一个div的内容,即srcimg 标签,在CSS类属性中,等等。