Wanted to limit the number of options in the select element to the selected one in filter settings form, that was not done so I did it.

Note :
In views original "in operator" filter handler I got most of the code from I saw this comment for the reduce method :
" // Because options may be an array of strings, or an array of mixed arrays
// and strings (optgroups) or an array of objects, we have to
// step through and handle each one individually."
As I was not sure we do need it in this views integration I did a much simpler reduce method, if I was wrong, feel free to let me know and I'll mostly copy / paste this method from original views handler.

I also did one cosmetic change :) "is one of " changed to "Is one of" as in original views handler (same for "Is not one ...").

Here is the diff (patch attached to issue):

12,13d11
< private $value_form_type = 'checkboxes';
<
19,20c17,18
< '=' => t('Is one of'),
< '<>' => t('Is not one of'),
---
> '=' => t('is one of'),
> '<>' => t('is not one of'),
25,83d22
< * Set reduce option to FALSE by default.
< */
< public function expose_options() {
< parent::expose_options();
< $this->options['expose']['reduce'] = FALSE;
< }
<
< /**
< * Define the form for exposed handler option reduce.
< */
< public function expose_form(&$form, &$form_state) {
< parent::expose_form($form, $form_state);
< $form['expose']['reduce'] = array(
< '#type' => 'checkbox',
< '#title' => t('Limit list to selected items'),
< '#description' => t('If checked, the only items presented to the user will be the ones selected here.'),
< '#default_value' => !empty($this->options['expose']['reduce']), // safety
< );
< }
<
< /**
< * Define reduce definition.
< */
< public function option_definition() {
< $options = parent::option_definition();
< $options['expose']['contains']['reduce'] = array('default' => FALSE);
< return $options;
< }
<
< /**
< * Reduce the options according the selection.
< */
< private function reduce_value_options() {
< $options = array();
< foreach ($this->definition['options'] as $id => $option) {
< if (isset($this->options['value'][$id])) {
< $options[$id] = $option;
< }
< }
< return $options;
< }
<
< /**
< * Save set checkboxes.
< */
< public function value_submit($form, &$form_state) {
< // Drupal's FAPI system automatically puts '0' in for any checkbox that
< // was not set, and the key to the checkbox if it is set.
< // Unfortunately, this means that if the key to that checkbox is 0,
< // we are unable to tell if that checkbox was set or not.
<
< // Luckily, the '#value' on the checkboxes form actually contains
< // *only* a list of checkboxes that were set, and we can use that
< // instead.
<
< $form_state['values']['options']['value'] = $form['value']['#value'];
< }
<
< /**
87,97d25
< $options = array();
< if (empty($form_state['exposed'])) {
< // Add a select all option to the value form.
< $options = array('all' => t('Select all'));
< }
< if (!empty($this->options['expose']['reduce']) && !empty($form_state['exposed'])) {
< $options += $this->reduce_value_options($form_state);
< }
< else {
< $options += $this->definition['options'];
< }
99c27
< '#type' => $this->value_form_type,
---
> '#type' => 'select',
101c29
< '#options' => $options,
---
> '#options' => $this->definition['options'],

Support from Acquia helps fund testing for Drupal Acquia logo

Comments

aleksey.tk’s picture

subscribing

drunken monkey’s picture

Status: Needs review » Needs work

Please don't post the diff text directly, but only attach it. Also, use git diff or diff -up to create patches – your patch can't be applied.

jbguerraz’s picture

Hello Drunken Monkey,
Yep, sorry for that mistake, here-attached is the proper git diff patch.
Have a good weekend.

jbguerraz’s picture

Status: Needs work » Needs review
drunken monkey’s picture

Still not quite perfect. For one, you should always use the module's root directory as the base directory for the diff. Also, your patch was reversed.
But since those two problems can easily be corrected, I was now able to apply your patch.

Otherwise, this seems to work fine. Great work, thanks!
Just keep in mind to never (unless absolutely necessary) use "private", but always "protected" to keep things reasonably extendable / overridable.
Attached is a proper patch, with this little issue resolved and some comments fixed.

jbguerraz’s picture

Thanks & You're welcome. What's the next step ? Should I simply GIT commit it ? Or still need to wait for others to review it ? Or...
I'm not sure about the patching process as you can see (even if I had read before different drupal.org articles about it).

drunken monkey’s picture

We wait a few days whether anyone else wants to comment and then I commit this (giving you credit in the commit message). You can't commit (or, rather, push) to other people's projects, so I have to do this for you.

drunken monkey’s picture

Status: Needs review » Fixed

Actually, we have already waited a few days. So just committed this.
Thanks again!

jbguerraz’s picture

You're welcome. Btw, FYI, I planned to add a "default" option to select what item have to be selected by default, will purpose it to the community when it'll be done.

Status: Fixed » Closed (fixed)

Automatically closed -- issue fixed for 2 weeks with no activity.