Drupal 7 Search API перехватывает зарегистрированный обратный вызов Класс не запущен - PullRequest
0 голосов
/ 12 марта 2019

Я довольно новичок в PHP (за исключением незначительных попыток много лет назад) и в Drupal 7. Я смотрю в проект с использованием API поиска и пытаюсь исключить некоторые файлы из моего поискового индекса. Чтобы добиться этого, я перешел по этой ссылке .

Но это не сработает. Параметр изменения не отображается в конфигурации индекса файла API поиска. Я добавил следующие два файла:

search_exclude_webform_files.module

<?php
/*
 * Implements hook_search_api_alter_callback_info()
 */
function search_exclude_webform_files_search_api_alter_callback_info() {
    // Adds a filter to exclude private files from the index
    $callbacks['exclude_private_files'] = array(
        'name' => t('Exclude private files'),
        'description' => t('Excludes private webform files from being indexed in search'),
        'class' => 'SearchApiExcludeWebformFiles',
        'weight' => 100,
    );
    return $callbacks;
}

callback_private_webform_files.inc

<?php

/**
 * @file
 * Contains SearchApiExcludeWebformFiles.
 */


/**
 * The following class is used to provide file filtering for webform files. It ensures
 * they are not indexed by Search.
 */
class SearchApiExcludeWebformFiles extends SearchApiAbstractAlterCallback {


    // This filter is only available on file entities
    public function supportsIndex(SearchApiIndex $index) {
//        return $index->getEntityType() === 'file';
        return true;
    }


    // For each file item that is indexed if the URI field contains the private
    // prefix, do not index the file by unsetting it
    public function alterItems(array &$items) {
        foreach ($items as $k => $item) {
            if (strpos($item->uri, 'private://webform') !== false || strpos($item->uri, 'files/private/webform') !== false || strpos($item->uri, 'files/webform') !== false) {
                unset($items[$k]);
            }
        }
    }
}

Хук активируется, и я могу найти обратный вызов из первого файла, зарегистрированного в массиве обратных вызовов search_api. Однако зарегистрированный класс SearchApiExcludeWebformFiles никогда не адресуется. Другие встроенные изменения (я пробовал несколько пользовательских изменений, таких как пользовательский контент) работают, это означает, что я могу активировать их в любом индексе API поиска, если я просто верну true в функции supportsIndex. Как вы можете видеть, я просто возвращаю истину и в этом, но все же, он не отображается ни в одном из моих индексов API поиска.

Я что-то упустил из-за правильной регистрации класса SearchApiExcludeWebformFiles? Или есть что-то еще, что мешает выполнению этой настройки?

Спасибо и приветствия.

1 Ответ

0 голосов
/ 13 марта 2019

После взаимной замены многих компонентов и частей модуля я пришел к следующему выводу: Drupal не любит дополнительные файлы, кроме .module.Я заново вставил весь свой класс в файл search_exclude_webform_files.module.Таким образом, класс можно найти.Мой файл модуля теперь выглядит так:

<?php

/*
 * Implements hook_search_api_alter_callback_info()
 */

function search_exclude_webform_files_search_api_alter_callback_info() {
    // Adds a filter to exclude private files from the index
    $callbacks['search_api_exclude_webform_files'] = array(
        'name' => t('Exclude private webform files'),
        'description' => t('Excludes private webform files from being indexed in search'),
        'class' => 'SearchApiAlterExcludeFormFiles',
    );
    return $callbacks;
}

/**
 * The following class is used to provide file filtering for webform files. It ensures
 * they are not indexed by Search.
 */
class SearchApiAlterExcludeFormFiles extends SearchApiAbstractAlterCallback {


    // This filter is only available on file entities
    public function supportsIndex(SearchApiIndex $index) {
        return $index->getEntityType() === 'file';
    }


    // For each file item that is indexed if the URI field contains the private
    // prefix, do not index the file by unsetting it
    public function alterItems(array &$items) {
        foreach ($items as $k => $item) {
            if (strpos($item->uri, 'private://webform') !== false || strpos($item->uri, 'files/private/webform') !== false || strpos($item->uri, 'files/webform') !== false) {
                unset($items[$k]);
            }
        }
    }
}

Я также изменил имя массива и имя класса, но расположение было последним шагом, который помог мне.

...