Jump to content

Limit Repeater


Robin S
 Share

Recommended Posts

LimitRepeater

Allows restrictions and limits to be placed on Repeater fields.

For any Repeater field you can limit the number of items that may be added and also prevent the use of drag-sorting, toggling of published state, and the trashing of items. There is also an option to hide the clone button when the limit is reached.

Usage

Install the LimitRepeater module.

Since v0.2.0 the module settings are configured at Setup > Fields > [your Repeater field]. The settings are contained within the "Restrictions" fieldset on the "Details" tab.

Module config

Please note that the restrictions limits are applied in Page Edit with CSS/JS so should not be considered tamper-proof.

Setting restrictions via a hook

Besides setting restrictions in the field settings, you can also apply or modify restrictions by hooking LimitRepeater::checkRestrictions. This allows for more focused restrictions, for example, applying restrictions depending on the template of the page being edited or depending on the role of the user.

The checkRestrictions() method receives the following arguments:

  • $field This Repeater field
  • $inputfield This Repeater inputfield
  • $page The page that is open in ProcessPageEdit

The method returns an array of restrictions for the Repeater field. An example of a returned array:

Restrictions

Example hook

Prevent non-superusers from trashing any items in "my_repeater_field":

$wire->addHookAfter('LimitRepeater::checkRestrictions', function(HookEvent $event) {
    $field = $event->arguments('field');
    $restrictions = $event->return;
    if($field->name === 'my_repeater_field' && !$this->user->isSuperuser()) {
        $restrictions['notrash'] = true;
    }
    $event->return = $restrictions;
});

Upgrading from < v0.2.0

There are two major changes to be aware of when upgrading from earlier versions of the module.

  1. The settings are no longer defined on the module config page, but rather in the field settings of each Repeater field: Setup > Fields > [your Repeater field]. If you visit the module config page you'll find shortcuts to the settings for each Repeater field.
  2. In earlier versions you could apply restrictions to a particular role. This is still possible but is now handled by hooking LimitRepeater::checkRestrictions as this is a more flexible and powerful approach. If you were applying restrictions to a particular role or roles you'll need to add hook code to achieve the same effect after you upgrade the module. See the hook information above in this readme.

 

https://github.com/Toutouwai/LimitRepeater
http://modules.processwire.com/modules/limit-repeater/

  • Like 12
Link to comment
Share on other sites

Very useful! I use it in combination with opening hours. For this reason I have created a repeater with 7 repeats (one for each day). In this case it prevents the customer from deleting or draging a weekday from the repeater list.

Screenshot_6.jpg

  • Like 7
Link to comment
Share on other sites

Its only here for creating the label and will not be displayed as a field in the template (see field settings below). I only use it to enter the day of the week (fe Monday). As you can see in my previous post every repeater has the name of the day in the repeater label.

Field settings of the hidden field:

Screenshot_8.jpg

 

  • Like 1
Link to comment
Share on other sites

  • 1 month later...
  • 1 month later...
  • 1 year later...

@Robin S Thanks for this very useful module!

I've not yet dug into its internals, but before I do, I'd like to know if it would it be possible to control the "trashability" of a repeater entry based on a value within it?  (I have a hidden field in one of my repeaters and I'd like to prevent deletion of items if that field is non-blank.)

Is the module ajax calling to check for conditions or is everything pushed into client-side JS?

Link to comment
Share on other sites

Hi @netcarver,

Right now the module can't do that. It's on my to-do list to update this module so that it has a hookable method that would allow the sort of thing you're wanting to do, but not sure when I'll get around to that.

For now you could use a hook to hide/disable the trash icon, similar to what I described in this topic:

In /site/ready.php:

$wire->addHookAfter('InputfieldFieldset::render', function(HookEvent $event) {
    /* @var $fieldset InputfieldFieldset */
    $fieldset = $event->object;
    $attr = $fieldset->wrapAttr();
    // Fieldsets in a Repeater inputfield have a data-page attribute
    if(isset($attr['data-page'])) {
        // Get the Repeater item
        $p = $this->pages((int) $attr['data-page']);
        if($p->hidden_field != '') $fieldset->addClass('no-trash');
    }
});

In some custom admin CSS:

/* Hide and disable the trash icon while keeping its space in the layout */
.no-trash .InputfieldRepeaterTrash { visibility:hidden; pointer-events:none; }

You could use display:none instead if you're not worried about the icon alignment.

  • Like 3
Link to comment
Share on other sites

  • 5 months later...
1 hour ago, PWaddict said:

If I create a process module with a repeater field, will I be able to limit it with your module?

As far as I know, it's not possible to use a repeater field in a Process module. A repeater is necessarily a combination of fieldtype and inputfield whereas a Process module can only contain inputfields.

  • Thanks 1
Link to comment
Share on other sites

  • 1 month later...

v0.2.0 of this module has been released, and because it is a fairly major rewriting of the module there are a couple of things to be aware of before upgrading:

1. The settings are no longer defined on the module config page, but rather in the field settings of each Repeater field: Setup > Fields > [your Repeater field]. If you visit the module config page you'll find shortcuts to the settings for each Repeater field.

2. In earlier versions you could apply restrictions to a particular role. This is still possible but is now handled by hooking LimitRepeater::checkRestrictions as this is a more flexible and powerful approach. If you were applying restrictions to a particular role or roles you'll need to add hook code to achieve the same effect after you upgrade the module. See the hook information in the updated readme.

  • Like 3
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...