Forum
Field type with a pair tag
Hello,
Before I get into it, this thread is here for discussion. So if you are an add-on developer, feel free to join the discussion. Input from Perch support is always welcome.
I have recently created a gallery field type that behaves in a similar way to repeaters, but it has other features that makes managing a variable number of images a bit easier than repeaters. The point is, the field type, similar to repeaters, accepts custom fields per item.
Template handlers, as far as I know, don't render the fields in edit forms. They are only used for output. So I couldn't use the following to add custom fields per item:
<perch:gallery id="images">
<perch:gallery id="image" type="image" label="Image">
<perch:gallery id="title" type="text" label="Title">
<perch:gallery id="unicorn" type="checkbox" value="1" label="Unicorn">
</perch:gallery>
What I ended up doing is:
- Use a single tag to render the field type in edit forms
- Use an attribute (called
repeater
) to point to another template that has additional fields - Render the additional fields from the template
- Use a repeater tag for output
<!--* This is used for editing *-->
<perch:content id="gallery" type="gallery" label="Gallery" repeater="content/_gallery.html" suppress>
<!--* This is used for output only *-->
<perch:repeater id="gallery">
<perch:template path="content/_gallery.html">
</perch:repeater>
This works and I'm ok with the workflow. The part that I wish to improve is (3).
At the moment I'm checking the field types in repeater="content/_gallery.html"
and only rendering basic types like text
, textarea
and checkbox
. So basically:
$Form = $API->get('Form');
$Form->text($input_id, $value, $classes);
This works, but means I need to add support for each field type myself which is not ideal.
This also mean these fields may behave differently when added by my field type. For example, the textarea
field in my field type can't use any editors since I'm only rendering it as a regular text box and nothing else.
Questions / points to discuss:
(1) Edit form approach: Template handlers (pair tag) VS a single tag for editing plus a repeater for output. Is using template handlers even an option in the context of edit forms?
(2) Considering the approach I used, is there a better way to render the additional fields? Ideally any installed field type (built-in or third-party) can be used without me checking what type it is and rendering it myself.
I've had a discussion with another developer about this. The discussion was more about the use case of such a field type than the technical approach. So in case others are thinking it too:
What's the point of the custom field type here?
The field type allows the editor to add multiple images at once (new or existing) instead of clicking "add item" then adding the image, then clicking "add item" and adding the image, and so on.
It also has a grid view in which all the additional fields are hidden (so the editor only sees the thumbnails) which can make it easier to reorder the images.
Why not use the Perch Gallery app (or build your custom gallery app) and pull in the images from there?
This suggested workflow works, but not necessarily ideal.
If I have some 50+ Shop products and I want to add 4-8 images to each product, having something like a repeater to add a smaller number of images directly to the product is easier than:
albumlist
So what I'm trying to say is that what this field type solves and what an app like Perch Gallery solves are different things. Not to mention that the Perch Gallery app doesn't fully use Perch's asset resource system.
Now back to the original subject:
I like the sound of this.
Does this exist? The ability to add multiple images in one go would be very useful.
Template handlers aren't used in edit forms, but field types are. It's fairly simple for me to add the ability for a field type to register tag pairs it's interested in handling.
Yes, field types do this. If you know what type you want you can invoke a new field type and tell it to render its fields.
That would be handy! Does this mean adding something like the following would be enough for the field to be added to the edit form?
And would I be correct to assume that there would be a way to get the tags inside tag pairs?
Ah this should make things easier. When I do this I see the input fields are added with empty
id
. Is there a way for me to set it in this context?