Account created on 11 July 2010, almost 15 years ago
#

Merge Requests

More

Recent comments

🇺🇦Ukraine khiminrm

Can't find what causes the bug. But noticed that it not happens if I return empty results just before $value = $style->getField($row->index, $field_id); in Selective::getOids() like this:

          return [];
          $value = $style->getField($row->index, $field_id);
     

If I add return []; after $value = $style->getField($row->index, $field_id);, the error appears again. So during rendering somehow the drupalSettings receives newly generated view_dom_id and cached.

I've just used custom fix to remove doubled view_dom_id:

function my_module_js_settings_alter(array &$settings, AttachedAssetsInterface $assets) {
  if (empty($settings['views']['ajaxViews']) || count($settings['views']['ajaxViews']) == 1) {
    return;
  }
  // Fix bug with doubled view_dom_id for views with selective filters.
  $view_name_display_dom_ids = [];
  foreach ($settings['views']['ajaxViews'] as $dom_id => $ajax_view) {
    $view_name_display_dom_ids[$ajax_view['view_name']][$ajax_view['view_display_id']][] = $dom_id;
  }
  foreach ($view_name_display_dom_ids as $displays) {
    foreach ($displays as $dom_ids) {
      if (count($dom_ids) > 1) {
        unset($settings['views']['ajaxViews'][$dom_ids[0]]);
      }
    }
  }
}

But would be nice to fix source of the issue.

🇺🇦Ukraine khiminrm

@joelpittet thanks! you was right. I've debugged js and received error in parseQueryString in line:
key = decodeURIComponent(pair[0].replace(/\+/g, ' '));

I've created patch to fix that and it looks like it fixes the error.

🇺🇦Ukraine khiminrm

I've faced with the same issue. Any solution?

🇺🇦Ukraine khiminrm

When exposed form in block, all attributes including classes are moved from the form to the block. In the latest patch only form is replaced. It can produce some bugs. For example if using better_exposed_filters and exclude text fields from autosubmit, it will not work after ajax replace of the exposed form https://git.drupalcode.org/project/better_exposed_filters/-/blob/7.0.x/j.... So it would be better to replace block and not only form.
So we need to improve somehow this:
$response->addCommand(new ReplaceCommand("form[id^=\"views-exposed-form-$view_id\"]", $this->renderer->render($exposed_form)));

🇺🇦Ukraine khiminrm

When using multiple instances of the exposed form block for the same view on one page, both forms are updated but only for one of them the behaviors are attached. Any ideas how to fix that?

🇺🇦Ukraine khiminrm

This patch fixes only views in blocks, but not exposed forms in blocks as in https://www.drupal.org/project/drupal/issues/3032353 Exposed forms in a block are not currently updated when Ajax filtering is executed Needs work , right?
Trying to find out how to fix conflicts between patches from both issues and apply to project I'm working on now.

🇺🇦Ukraine khiminrm

@david-urban

I didn't notice such bug, but I haven't not tested on Core 11.x yet.
Maybe try to check template for the view. It could be that footer and pagination are outside the view's main 'div' wrapper.
You can check also ViewAjaxController how it replaces content during ajax call so you will have idea what actually is replaced on a page.

I've another one bug https://www.drupal.org/node/3163299 and those patch conflicts with this one in similar lines of code. Have not tried yet though. Trying to compare both patches. I hope those issue's patch will work for all cases.

🇺🇦Ukraine khiminrm

attaching patch for the 3.0.0 with the fix and condition from 3.0.x-dev

🇺🇦Ukraine khiminrm

I need this feature too.
As a quick solution I've taken javascript from the facet's module soft-limit.js, modified it to use hardcoded limit, labels, selectors and used it in custom theme. But still need to exclude some filters.

  function softLimit() {
    // Soft limit.
    var limit = 15;
    var zero_based_limit = (limit - 1);
    var facetsList = $('..bef-checkboxes');

    // Hide facets over the limit.
    facetsList.each(function () {
      var allLiElements = $(this).find('.form-check');
      $(once('applysoftlimit', allLiElements.slice(zero_based_limit + 1))).hide();
    });

    // Add "Show more" / "Show less" links.
    $(once('applysoftlimit', facetsList.filter(function () {
      return $(this).find('.form-check').length > limit;
    }))).each(function () {
      var facet = $(this);
      var showLessLabel = Drupal.t('Show less');
      var showMoreLabel = Drupal.t('Show more');
      $('<a href="#" class="facets-soft-limit-link"></a>')
        .text(showMoreLabel)
        .on('click', function () {
          if (facet.find('.form-check:hidden').length > 0) {
            facet.find('.form-check:gt(' + zero_based_limit + ')').slideDown();
            facet.find('.form-check:lt(' + (zero_based_limit + 2) + ') a, .form-check:lt(' + (zero_based_limit + 2) + ') input').focus();
            $(this).addClass('open').text(showLessLabel);
          }
          else {
            facet.find('.form-check:gt(' + zero_based_limit + ')').slideUp();
            $(this).removeClass('open').text(showMoreLabel);
          }
          return false;
        }).insertAfter($(this));
    });
  }
🇺🇦Ukraine khiminrm

Looks like I've found solution how to get min and max values regardless active other filter.
By making additional query without other active facets in custom query type processor's build() method:

  /**
   * {@inheritdoc}
   */
  public function build() {
    $field_identifier = $this->facet->getFieldIdentifier();
    $execute_additional_query = FALSE;
    // Check if there are any other active facet filters,
    // if yes - we need to unset them and execute additional query to get min and max.
    $new_query = clone $this->query->getOriginalQuery();
    $condition_groups = &$new_query->getConditionGroup()->getConditions();
    foreach ($condition_groups as $group_key => $condition_group) {
      if (!($condition_group instanceof ConditionGroupInterface)) {
        continue;
      }
      $tags = $condition_group->getTags();
      if (empty($tags) || $condition_group->hasTag('facet:' . $field_identifier)) {
        continue;
      }
      $has_facet_tags = FALSE;
      foreach ($tags as $tag) {
        if (str_starts_with($tag, 'facet:')) {
          $has_facet_tags = TRUE;
          break;
        }
      }
      if (!$has_facet_tags) {
        continue;
      }
      $conditions = &$condition_group->getConditions();
      foreach ($conditions as $key => $condition) {
        if ($condition instanceof ConditionInterface &&
          $condition->getField() !== $field_identifier) {
          unset($conditions[$key]);
          $execute_additional_query = TRUE;
          if (!count($conditions)) {
            unset($condition_groups[$group_key]);
          }
        }
      }
    }

    if ($execute_additional_query) {
      $facets = $this->query->getOption('search_api_facets');
      $new_query->setOption('search_api_facets', [$field_identifier => $facets[$field_identifier]]);
      $new_query->setProcessingLevel(QueryInterface::PROCESSING_NONE);
      $new_query->getOption('search_api_view', NULL);
      $this->results = $new_query->execute()->getExtraData('search_api_facets')[$field_identifier] ?? [];
    }

    parent::build();
  }
🇺🇦Ukraine khiminrm

Hi!
Is there any ready solution for the facets exposed filters to be able to create date range filter?

🇺🇦Ukraine khiminrm

I've created patch for the bef_sliders.js
I've using custom widget plugin which extends Sliders widget and adding configs for the tooltips like:

    $form[$filter_id]['#attached']['drupalSettings']['better_exposed_filters']['slider_options'][$filter_id]['tooltips'] = TRUE;
    $form[$filter_id]['#attached']['drupalSettings']['better_exposed_filters']['slider_options'][$filter_id]['tooltips_value_suffix'] = '$';
🇺🇦Ukraine khiminrm

Added small fix to have 'fieldset' wrapper around the filter.

🇺🇦Ukraine khiminrm

Removed better_exposed_filters from the dependencies as had error during applying patch with composer install

🇺🇦Ukraine khiminrm

Created patch with the bef widget plugin 'Glossary AZ'. So after adding facet exposed filter for the glossary field, configure exposed form to use better_exposed_filters and for the filter use 'Glossary AZ'. The plugin is based on the Links widget from the bef module. Tried to re-use as much code as possible.

I've also included fixes from the https://www.drupal.org/project/search_api_glossary/issues/3492668#commen... 🐛 TypeError: Cannot access offset of type string on string Active

🇺🇦Ukraine khiminrm

First, we need this fix https://www.drupal.org/project/search_api_glossary/issues/3492668#commen... 🐛 TypeError: Cannot access offset of type string on string Active

Second, we need to apply theming to existing widget e.g. disable items without results or we need to create custom widget plugin, maybe for the better_exposed_filter.

🇺🇦Ukraine khiminrm

added first fixes there https://www.drupal.org/project/search_api_glossary/issues/3492668#commen... 🐛 TypeError: Cannot access offset of type string on string Active

Looks like it's progress. Now we need to apply styles for the widget or create custom new one.

Closing this ticket for now. Will work in the related issues for the search_api_glossary.

🇺🇦Ukraine khiminrm

Maybe it would be better to create some abstract base class for the plugins, move supportsFacet() to it and extend the class by the existing processor plugins.

🇺🇦Ukraine khiminrm

I will try to improve conditions in the supportsFacet() methods of the search_api_glossary module's facet processor plugins and then create exposed form widget with correct items styles. Related issue https://www.drupal.org/project/search_api_glossary/issues/3497960 🐛 When using Facets Exposed Filters the Glossary AZ is not available Active .

🇺🇦Ukraine khiminrm

I think the patch is wrong.
The processor plugins will not apply to any facet with these fixes.

In case of using exposed filters and trying to configure a facet filter $facet->getWidget() returns '' string.
When configuring facet in old way e.g. on facet create/edit page the same code returns associative array with 'type' and 'config' elements.

I think we need to improve code of the supportsFacet() in such way so it will work in both cases. And we could fix this https://www.drupal.org/project/search_api_glossary/issues/3497960 🐛 When using Facets Exposed Filters the Glossary AZ is not available Active

Trying to fix it now...

🇺🇦Ukraine khiminrm

Changed code to get labels from the value options of the selective filter.

🇺🇦Ukraine khiminrm

Added small fix to remove new lines from the value.

🇺🇦Ukraine khiminrm

After testing and debugging other cases, I've reverted almost all changes and just improved one condition as $field->getValue($row); can return FALSE when value of a field is empty. In Drupal\views\Plugin\views\field::getValue():

    if ($field_item_definition->getFieldStorageDefinition()->getCardinality() == 1) {
      return reset($values);
    }

And added one more

        if (is_null($key)) {
          continue;
        }

just in case the code inif (!is_scalar($key) || $key === FALSE) { returns NULL for the $key.

🇺🇦Ukraine khiminrm

I've noticed that current solution doesn't work when we have initial value for the exposed form's param in a URL. For example we have redirected to the ajax views page from search form on a site from another page. And then we change search keyword which have been submitted by ajax. So I've improved the patch by using query params from the AJax request, but path from the referrer.

🇺🇦Ukraine khiminrm

Hi!
I've faced with similar issue today when tried to update composer lock file.

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires drupal/core-recommended == 10.2.6.0 -> satisfiable by drupal/core-recommended[10.2.6].
    - roave/security-advisories dev-latest conflicts with twig/twig <1.44.8|>=2,<2.16.1|>=3,<3.14.
    - drupal/core-recommended 10.2.6 requires twig/twig ~v3.8.0 -> satisfiable by twig/twig[3.8 (alias of v3.14.0)].
    - Root composer.json requires roave/security-advisories == dev-latest -> satisfiable by roave/security-advisories[dev-latest].

How I can fix it with this version of the Drupal core without removing roave/security-advisories?
I've tried to apply patch from the https://git.drupalcode.org/project/drupal/-/merge_requests/9461.diff, but composer couldn't apply the patch.
We should wait when the fixes will be merged and update the core on next release?
Maybe we can use some temp solution until update?

Thanks!

🇺🇦Ukraine khiminrm

@smustgrave thanks for the reply!

But I didn't write about jQuery. I've just compared code in bef_sliders.js between 6.0.x and 7.0.x and they look similar, no? but the issue exists and I'm not sure this is somehow related to jQuery.

I've just created some draft code to set form state values for the field in custom validation function for the exposed form and looks like it works. But not sure maybe there can be better solution.

My draft temp solution:

function _my_test_module_exposed_validate(&$form, FormStateInterface $form_state) {
  $values = $form_state->getValues();
  if (!isset($values['price_range'])) {
    return;
  }
  $options_min = $form['price_range']['#attached']['drupalSettings']['better_exposed_filters']['slider_options']['price_range']['min'];
  $options_max = $form['price_range']['#attached']['drupalSettings']['better_exposed_filters']['slider_options']['price_range']['max'];
  if ($options_min == $values['price_range']['min'] && $options_max == $values['price_range']['max']) {
    $values['price_range']['min'] = '';
    $values['price_range']['max'] = '';
    $form_state->setValues($values);
  }
}

🇺🇦Ukraine khiminrm

@mably thanks a lot for adding these fixes! sorry I can't re-test it right now. I hope it will work as expected. Thanks again!

🇺🇦Ukraine khiminrm

@mably thanks!

In our case we're using exposed form block with autocomplete search from one view in header of a site and another exposed form block in sidebar region on the views page (another one view). So there are two different exposed form blocks on one page. I know that there can be rare cases when on one page we can have even multiple exposed forms for the same view e.g. to show some filters above the view's results and other filters in sidebar etc.

🇺🇦Ukraine khiminrm

I see that committed fixes don't include fixes to get correct exposed to submit in case when there are multiple exposed form blocks from different views on one page. I mentioned about it in https://www.drupal.org/project/views_filters_summary/issues/3345403#comm... 🐛 Remove link removes all filters Fixed and added some additional code changes to fix it. So in current dev version we potentially can face with the same issue.

🇺🇦Ukraine khiminrm

Faced with the same as described in #5 🐛 'Selected 0 items in this view' displayed instead of the total item count Needs review . In my case the views used style https://www.drupal.org/project/views_secondary_row so class 'vbo-table' wasn't added in function views_bulk_operations_preprocess_views_view_table(&$variables). And in frontUI.js the var $viewsTables = $('.vbo-table', $vboForm); was null. I've added the class in custom theme's preprocess and it fixed the bug for me. It worked with and without the patch. I hope it will help someone else in similar cases.

🇺🇦Ukraine khiminrm

Partially I was able to fix it. Need to find solution how to run custom code with setting pre-defined 'list' only before user changes the selection.

🇺🇦Ukraine khiminrm

Removed some lines from the patch which are related to another issue.

🇺🇦Ukraine khiminrm

I've noticed some other bugs e.g. not empty value when twig debug is enabled (so I've moved striping tags earlier and added removing new lines in a value), also noticed errors when $key is not numeric but Entity Storage is selected and I think we need to improve logic when we need to build empty value
$value = $this->t('Empty (@key)', ['@key' => empty($$sub_key) ? json_encode($sub_key) : $sub_key]);

🇺🇦Ukraine khiminrm

I've noticed similar bug described there https://www.drupal.org/project/views_filters_summary/issues/3378822 🐛 Alter means of testing if a view is ajax-enabled Needs review . I had destination parameter in URL and the page was reload on clicking links in the filters summary. So I've updated javascript and added some more specific selectors for the submit buttons:

🇺🇦Ukraine khiminrm

I used patch from #2 with patch from https://www.drupal.org/project/views_selective_filters/issues/3469960 Add support for the multiple value reference fields? Active .

🇺🇦Ukraine khiminrm

And updated selector in javascript in case if there are multiple exposed forms for the same view on one page

🇺🇦Ukraine khiminrm

I've improved a little the exposed form selector to be more precise.

🇺🇦Ukraine khiminrm

Noticed bug. when after last the patch the exposed filter block has been refreshed - the exposed form is not submitted by Ajax second time - with page reload.

🇺🇦Ukraine khiminrm

I've fixed bug with empty "exposed_form_display" mentioned in #45

🇺🇦Ukraine khiminrm

I see that the VBO is already deleted. So we need other solution. Updated also https://www.drupal.org/project/views_bulk_operations/issues/3469974 🐛 There are no checkboxes when the views_selective_filters filter is added. Active

Ideas?

🇺🇦Ukraine khiminrm

I see that VBO field is already deleted before executing $view_copy.
Maybe we can introduce some new view property e.g. do_not_init_vbo_form so other modules like views_selective_filters can use it?

and we could have condition like?

   // Don't initialize if view has been built from VBO action processor or other modules which do need to init VBO form.
    if (!empty($this->view->views_bulk_operations_processor_built) || !empty($this->view->do_not_init_vbo_form)) {
      return;
    }

🇺🇦Ukraine khiminrm

I think I've found some draft solution on local test site. Improve condition in ViewsBulkOperationsBulkForm::init():

    // Don't initialize if view has been built from VBO action processor.
    if (!empty($this->view->views_bulk_operations_processor_built) || !empty($this->view->selective_handler_signature)) {
      return;
    }

So we need somehow remove VBO field from $view_copy before executing it in Drupal\views_selective_filters\Plugin\views\filter\Selective::getOids().

Any ideas how it would be better to do?

Thanks!

🇺🇦Ukraine khiminrm

I think I've found some draft solution on local test site. Improve condition in ViewsBulkOperationsBulkForm::init():

    // Don't initialize if view has been built from VBO action processor.
    if (!empty($this->view->views_bulk_operations_processor_built) || !empty($this->view->selective_handler_signature)) {
      return;
    }

So we need somehow remove VBO field from $view_copy before executing it

🇺🇦Ukraine khiminrm

another one noticed bug. with added selective filters the bulk operations checkboxes have disappeared from the view :((

🇺🇦Ukraine khiminrm

weird, when I add sorting by product variation SKU - I have expected two rows in results of the $view_copy for the filter. Without sorting - 1 row. But in original views results I always get 2 results regardless there is or not sorting.

🇺🇦Ukraine khiminrm

I've partially fixed it with a draft quick patch. The filter contains values now - separate terms as options. But for some reason $view_copy->result contains only one first row, so I don't have values from the second row in the results of the view.

🇺🇦Ukraine khiminrm

I agree with #32. On a site with a lot of entities I can't even add and configure the filter. We need some better solution if it's possible.

🇺🇦Ukraine khiminrm

I've fixed dependency injection, module dependencies and other noticed code issues. Please, re-view and test.

🇺🇦Ukraine khiminrm

khiminrm made their first commit to this issue’s fork.

🇺🇦Ukraine khiminrm

attaching a patch for 1.0 for those who is using this patch https://www.drupal.org/project/advancedqueue/issues/2918866#comment-1561... Add support for unique jobs Fixed

🇺🇦Ukraine khiminrm

Created new issue https://www.drupal.org/project/advancedqueue/issues/3460188 🐛 In some cases the duplicated jobs are created Active

🇺🇦Ukraine khiminrm

Hi!

When testing the patch, I've noticed that it's not always working properly.

I will try to explain. I've tested it with commerce_recurring.
The job payload is simple: ['order_id' => $order->id()]
So I've run the 'Commerce Recurring' cron job to process a recurring order. The job has created two queue items:
with types commerce_recurring_order_close and commerce_recurring_order_renew with payload {"order_id":"230185"}.
Then I've run the 'Advanced Queue' cron job. It has processed the queue items. One of them was failed due to another issue not related to this one. And another one was successfully processed. So I had two queue items with states failure and

success</code at those moment.
But after running the  'Commerce Recurring' cron job again, two new queue items with the same payload and fingerprint were created. So the items were duplicated.
And if ran the the  'Commerce Recurring' cron job again without running the the 'Advanced Queue' cron job before it, the duplicates are not created, because the items had state <code>queued

and they were found as duplicated.

So, I think we should remove condition where we check only two states in the getDuplicateJobs() method:
->condition('state', [Job::STATE_QUEUED, Job::STATE_PROCESSING, Job::STATE_FAILURE], 'IN');

Please, review and re-test if possible. I'm attaching the updated patch from #125 for 1.0 and interdiff.

Thanks in advance!

Production build 0.71.5 2024