🍣

Input value \"page\" contains a non-scalar value.への対処

2024/04/30に公開

概要

以下の記事で、同エラーへの対応を行いました。

https://zenn.dev/nakamura196/articles/f6f67af358259d

ただし、上記の対応を行なっても、エラーを解決することができないケースがありましたので、追加の対応を記載します。

エラーの内容

エラーの内容は以下です。特に、jsonapi_search_api_facetsを有効化した際に発生しました。

{
"jsonapi": {
"version": "1.0",
"meta": {
"links": {
"self": {
"href": "http://jsonapi.org/format/1.0/"
}
}
}
},
"errors": [
{
"title": "Bad Request",
"status": "400",
"detail": "Input value \"page\" contains a non-scalar value.",
"links": {
"via": {
"href": "http://localhost:61117/web/jsonapi/index/document?page%5Blimit%5D=24&sort=field_id"
},
"info": {
"href": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1"
}
},
"source": {
"file": "/app/vendor/symfony/http-kernel/HttpKernel.php",
"line": 83
},
"meta": {
"exception": "Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException: Input value \"page\" contains a non-scalar value. in /app/vendor/symfony/http-foundation/InputBag.php:38\nStack trace:\n#0 /app/web/modules/contrib/facets/src/Plugin/facets/url_processor/QueryString.php(92): Symfony\\Component\\HttpFoundation\\InputBag->get('page')\n#1 /app/web/modules/contrib/facets/src/Plugin/facets/processor/UrlProcessorHandler.php(76): Drupal\\facets\\Plugin\\facets\\url_processor\\QueryString->buildUrls(Object(Drupal\\facets\\Entity\\Facet), Array)\n#2 /app/web/modules/contrib/facets/src/FacetManager/DefaultFacetManager.php(339):
...

対応

そこで、上記で言及されている以下のファイルについて、buildUrlsを修正しました。

/modules/contrib/facets/src/Plugin/facets/url_processor/QueryString.php
<?php

namespace Drupal\facets\Plugin\facets\url_processor;

use Drupal\Core\Cache\UnchangingCacheableDependencyTrait;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
use Drupal\facets\Event\ActiveFiltersParsed;
use Drupal\facets\Event\QueryStringCreated;
use Drupal\facets\Event\UrlCreated;
use Drupal\facets\FacetInterface;
use Drupal\facets\UrlProcessor\UrlProcessorPluginBase;
use Drupal\facets\Utility\FacetsUrlGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request;

use Drupal\jsonapi\Query\OffsetPage; // 追加

/**
 * Query string URL processor.
 *
 * @FacetsUrlProcessor(
 *   id = "query_string",
 *   label = @Translation("Query string"),
 *   description = @Translation("Query string is the default Facets URL processor, and uses GET parameters, for example ?f[0]=brand:drupal&f[1]=color:blue")
 * )
 */
class QueryString extends UrlProcessorPluginBase {

  ...

  /**
   * {@inheritdoc}
   */
  public function buildUrls(FacetInterface $facet, array $results) {
    // No results are found for this facet, so don't try to create urls.
    if (empty($results)) {
      return [];
    }

    // First get the current list of get parameters.
    $get_params = $this->request->query;

    // When adding/removing a filter the number of pages may have changed,
    // possibly resulting in an invalid page parameter.

    /*
    // コメントアウト
    if ($get_params->has('page')) {
      $current_page = $get_params->get('page');
      $get_params->remove('page');
    }
    */

    // 追加
    if ($get_params->has(OffsetPage::KEY_NAME)) {
      $page_params = $get_params->all(OffsetPage::KEY_NAME);
      unset($page_params[OffsetPage::OFFSET_KEY]);
      $get_params->set(OffsetPage::KEY_NAME, $page_params);
    }

上記の修正は、以下のファイルを参考に、Drupal\jsonapi\Query\OffsetPageを追加して、pageの処理を修正しました。

/modules/contrib/jsonapi_search_api/modules/jsonapi_search_api_facets/src/Plugin/facets/url_processor/JsonApiQueryString.php

まとめ

上記の対応により、エラーは発生しなくなりましたが、正しい対応か自信がありませんので、参考にされる際はご注意ください。

参考になりましたら幸いです。

Discussion