2016-10-09 7 views
1

У меня есть база данных, которая использовалась в исследовательских целях. К сожалению, во время этого исследования алгоритму было позволено слишком долго действовать, что непреднамеренно создавало повторяющиеся термины таксономии вместо повторного использования исходного TID для первого экземпляра термина.Drupal: Условия слияния таксономии с массивными дубликатами

Чтобы исправить это, была предпринята попытка использовать модули «term_merge» и «taxonomy_manager». «term_merge» предлагает интерфейс для удаления дубликатов, и он может похвастаться возможностью устанавливать ограничения на количество терминов, которые он загружает, в качестве времени, чтобы предотвратить исчерпание предела памяти сервера базы данных. Однако в моем случае использования я даже не могу загрузить экран конфигурации, расположенный в/admin/structure/taxonomy/[My-Vocabulary]/merge, а тем более интерфейс дубликатов, найденный в/admin/structure/taxonomy/[My -Vocabulary]/merge/duplicates, так как оба из них исчерпывают ограничение памяти, несмотря на то, что указанный предел установлен на 1024M.

Чтобы обойти это, я написал специальный модуль, который вызывает функцию term_merge, найденную в модуле term_merge. Поскольку в этом проекте есть только один узел, который использует словарь таксономии, я могу смело написать свою собственную логику для слияния повторяющихся терминов без использования функций, предоставляемых модулем term_merge, но я хотел бы использовать его, поскольку он предназначен для этой цели и, теоретически, позволяет более безопасный процесс.

Мой модуль обеспечивает обратный вызов страницы, а также логику для получения списка идентификаторов TID, которые ссылаются на дублированный термин таксономии. Вот код, который содержит вызов функции term_merge:

//Use first element, with lowest TID value, as the 'trunk' 
// which all other terms will be merged into 

$trunk = $tids[0]; 

//Remove first element from branch array, to ensure the trunk 
//is not being merged into itself 

array_shift($tids); 

//Set the merge settings array, similarly to the default values 
//which are given in _term_merge_batch_process of term_merge.batch.inc 

$merge_settings = array(
    'term_branch_keep' => FALSE, 
    'merge_fields' => array(), 
    'keep_only_unique' => TRUE, 
    'redirect' => -1, 
    'synonyms' => array(), 
); 

term_merge($tids, $trunk, $merge_settings); 

Это не приводит ни к каким присоединяемых условиях, и не предоставляет каких-либо ошибок или уведомлений в Watchdog или журналов веб-сервера.

Я также пробовал вызов term_merge для каждого отдельного дублирующего TID, который нужно объединить, вместо того, чтобы использовать массив TID в целом.

Я был бы признателен за любые материалы о том, как лучше всего использовать функции term_merge программно, или альтернативу, которая позволит мне удалить много повторяющихся терминов из большой базы данных, где некоторые термины имеют тысячи дубликатов.

Для справки, здесь комментарии, которые содержат информацию о параметрах, принятых в term_merge, найденных в term_merge.module складочного модуля term_merge:

/** 
* Merge terms one into another using batch API. 
* 
* @param array $term_branch 
* A single term tid or an array of term tids to be merged, aka term branches 
* @param int $term_trunk 
* The tid of the term to merge term branches into, aka term trunk 
* @param array $merge_settings 
* Array of settings that control how merging should happen.  Currently 
* supported settings are: 
*  - term_branch_keep: (bool) Whether the term branches should not be 
*  deleted, also known as "merge only occurrences" option 
*  - merge_fields: (array) Array of field names whose values should be 
*  merged into the values of corresponding fields of term trunk (until 
*  each field's cardinality limit is reached) 
*  - keep_only_unique: (bool) Whether after merging within one field only 
*  unique taxonomy term references should be kept in other entities. If 
*  before merging your entity had 2 values in its taxonomy term reference 
*  field and one was pointing to term branch while another was pointing to 
*  term trunk, after merging you will end up having your entity 
*  referencing to the same term trunk twice. If you pass TRUE in this 
*  parameter, only a single reference will be stored in your entity after 
*  merging 
*  - redirect: (int) HTTP code for redirect from $term_branch to 
*  $term_trunk, 0 stands for the default redirect defined in Redirect 
*  module. Use constant TERM_MERGE_NO_REDIRECT to denote not creating any 
*  HTTP redirect. Note: this parameter requires Redirect module enabled, 
*  otherwise it will be disregarded 
*  - synonyms: (array) Array of field names of trunk term into which branch 
*  terms should be added as synonyms (until each field's cardinality limit 
*  is reached). Note: this parameter requires Synonyms module enabled, 
*  otherwise it will be disregarded 
*  - step: (int) How many term branches to merge per script run in batch. If 
*  you are hitting time or memory limits, decrease this parameter 
*/ 

ответ

0

Казалось бы, так как функция term_merge была разработана намерение, которое будет использоваться в функции для обработки представлений форм, мой пользовательский модуль использует его таким образом, что batch_process не может быть вызван.

Явный вызов следующие решает эту:

batch_process() 

Никакие аргументы не должны быть переданы функции.

+0

Вы можете принять свой собственный ответ, если вы считаете это решение. – pal4life