Field method trick - Use collections

Problem

When using the field method in Kirby, the field method can only take one field.

$page->my_field()->my_method( $my_args );

In my case I had a whole collection of fields that I wanted to use.

Solution - Use collections

The template

You are allowed to use a field that does not exist. That way you can kind of set up your own function like this:

echo $page->get()->collection( array( 'field_key1', 'field_key2' ) );

get() should be a field, but it can be empty or not set. In this case the field does not exist in the content, but the collection() method is still called. It takes two field keys to be used in the method.

The collection method

The collection method has two field keys in the $array attribute. In this example it just loops them into an $out string which is returned to the template.

field::$methods['collection'] = function( $field, $array ) {
	$out = '';
	foreach( $array as $item  ) {
		$out .= $field->page->$item() . ' ';
	}
	$field->value = $out;
	return $field;
};

If you want to try it out, make sure you have the fields add field_key1 and field_key2 in your content.

Sidenote - Use whatever field key you want

The code below would also work because what_ever_i_want is kind of ignored, as long as you don’t have that field in your content.

echo $page->what_ever_i_want()->collection( array( 'field_key1', 'field_key2' ) );

Benefits

  • It’s a Kirby way of manipulating multiple fields.
  • Because the field method always include the $page object, it does not need to be sent to the method. That is used to extract the two fields by their field keys.
  • get() is kind of ignored and you can use whatever you want except built in functions and field keys.

Feedback?