User:Zero24
From Joomla! Documentation
I'm a specialist for system integration in Germany. I'm involved with Joomla! since 2011.
- tobias.zulauf[at]community.joomla.org
- https://www.jah-tz.de
- https://github.com/zero-24
- https://volunteers.joomla.org/joomlers/tobias-zulauf
How to use custom fields in your overrides
Introduction
The real power of custom fields is that you can use it in your own overrides. Here is a example how you can do that.
Getting custom fields in your override
Basicly you have all custom fields coresponding to the current item accessible via a new property in your $item variable called jcfields.
The $item->jcfields property is a array that holds the following data per field, where one field looks like this example:
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
)
)
Render the field using the FieldsHelper
To render the field you can use FieldsHelper::render() by passing the needed values.
/**
* 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)
Example code for the override using the 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 ?>
Example code for a raw override
<?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 does not contain the fields I need
The jcfields property is generated using the plugin event onContentPrepare by passing the context of the fields. The fields plugin than read the fields from the database and add the values to the jcfields property.
So please make sure that the component you use implement also the onContentPrepare event with the context you use for the fields.
If you use the core components this should work out of the box.