J3.x

Difference between revisions of "Adding custom fields/Overrides"

From Joomla! Documentation

< J3.x:Adding custom fields
(Marked for translation)
Line 1: Line 1:
{{section portal heading|icon=edit|title=How to use custom fields in your overrides}}
+
<noinclude><languages /></noinclude>
{{J3.x:Adding_custom_fields/TOC/en}}
+
{{section portal heading|icon=edit|title=<translate>How to use custom fields in your overrides</translate>}}
 
+
{{J3.x:Adding_custom_fields/TOC/<noinclude>en</noinclude>}}
 
+
<translate>
 
+
== How to use custom fields in your overrides ==
 
+
</translate>
== How to use custom fields in your overrides ==  
 
  
 +
<translate>
 
=== Introduction ===
 
=== Introduction ===
 +
</translate>
  
The real power of custom fields is that you can use it in your own overrides. Here is a example of how you can do that.
+
<translate>The real power of custom fields is that you can use it in your own overrides. Here is a example of how you can do that.</translate>
  
 +
<translate>
 
=== Getting custom fields in your override ===
 
=== Getting custom fields in your override ===
 +
</translate>
  
Basically you have all the custom fields corresponding to the current item accessible via a new property in your <code>$item</code> variable called <code>jcfields</code>.
+
<translate>Basically you have all the custom fields corresponding to the current item accessible via a new property in your <code>$item</code> variable called <code>jcfields</code>.</translate>
The <code>$item->jcfields</code> property is a array that holds the following data per field, where one field looks like this example:
+
<translate>The <code>$item->jcfields</code> property is a array that holds the following data per field, where one field looks like this example:</translate>
  
 
<source lang="php">
 
<source lang="php">
Line 87: Line 90:
 
</source>
 
</source>
  
 +
<translate>
 
=== Render the field using the FieldsHelper ===
 
=== Render the field using the FieldsHelper ===
 +
</translate>
  
To render the field you can use <code>FieldsHelper::render()</code> by passing the needed values.
+
<translate>To render the field you can use <code>FieldsHelper::render()</code> by passing the needed values.</translate>
  
 
<source lang="php">
 
<source lang="php">
Line 107: Line 112:
 
</source>
 
</source>
  
 +
<translate>
 
==== Example code for the override using the FieldsHelper ====
 
==== Example code for the override using the FieldsHelper ====
 +
</translate>
  
 
<source lang="PHP">
 
<source lang="PHP">
Line 118: Line 125:
 
<?php endforeach ?>
 
<?php endforeach ?>
 
</source>
 
</source>
 
+
<translate>
 
==== Example code for a raw override ====
 
==== Example code for a raw override ====
 +
</translate>
  
 
<source lang="PHP">
 
<source lang="PHP">
Line 128: Line 136:
 
</source>
 
</source>
  
 +
<translate>
 
=== <code>$item->jcfields</code> does not contain the fields I need ===
 
=== <code>$item->jcfields</code> does not contain the fields I need ===
 +
</translate>
  
The <code>jcfields</code> property is generated using the plugin event <code>onContentPrepare</code> by passing the context of the fields. The fields plugin than reads the fields from the database and adds the values to the jcfields property.
+
<translate>The <code>jcfields</code> property is generated using the plugin event <code>onContentPrepare</code> by passing the context of the fields. The fields plugin than reads the fields from the database and adds the values to the jcfields property.</translate>
 
+
<translate>
So please make sure that the component you use also implements the <code>onContentPrepare</code> event with the context you use for the fields.
+
So please make sure that the component you use also implements the <code>onContentPrepare</code> event with the context you use for the fields.</translate>
  
If you use the core components this should work out of the box.
+
<translate>If you use the core components this should work out of the box.</translate>
  
  
 
<div class="row">  
 
<div class="row">  
 
<div class="large-6 columns">{{Basic button|S:MyLanguage/J3.x:Adding_custom_fields/Implement_into_your_component|
 
<div class="large-6 columns">{{Basic button|S:MyLanguage/J3.x:Adding_custom_fields/Implement_into_your_component|
Prev: Implement into your component|class=expand success}}</div>
+
<translate>Prev: Implement into your component</translate>|class=expand success}}</div>
  
 
</div>
 
</div>
 
__NOTOC__
 
__NOTOC__
 
<noinclude>
 
<noinclude>
[[Category:Tutorials]]
+
<translate>[[Category:Tutorials]]
 
[[Category:Custom Fields]]
 
[[Category:Custom Fields]]
 
[[Category:Beginners]]
 
[[Category:Beginners]]
Line 150: Line 160:
 
[[Category:Component_Development]]
 
[[Category:Component_Development]]
 
[[Category:Joomla! 3.x]]
 
[[Category:Joomla! 3.x]]
[[Category:Joomla! 3.7]]
+
[[Category:Joomla! 3.7]]</translate>
 
</noinclude>
 
</noinclude>

Revision as of 12:13, 18 April 2017

Other languages:
Bahasa Indonesia • ‎Deutsch • ‎English • ‎Nederlands • ‎español • ‎français • ‎italiano • ‎中文(中国大陆)‎ • ‎中文(台灣)‎

How to use custom fields in your overrides


How to use custom fields in your overrides[edit]

Introduction[edit]

The real power of custom fields is that you can use it in your own overrides. Here is a example of how you can do that.

Getting custom fields in your override[edit]

Basically you have all the custom fields corresponding 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[edit]

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[edit]

// 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[edit]

<?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[edit]

The jcfields property is generated using the plugin event onContentPrepare by passing the context of the fields. The fields plugin than reads the fields from the database and adds the values to the jcfields property. So please make sure that the component you use also implements the onContentPrepare event with the context you use for the fields.

If you use the core components this should work out of the box.