2016-10-09 3 views
1

J'ai une base de données qui a été utilisée à des fins de recherche. Malheureusement, au cours de cette recherche, un algorithme a été autorisé à agir trop longtemps, créant par inadvertance des termes de taxonomie en double au lieu de réutiliser le TID original pour la première instance d'un terme.Drupal: Fusion de termes de taxonomie avec des doublons massifs

Afin de corriger cela, une tentative a été faite pour utiliser les modules "term_merge" et "taxonomy_manager". "term_merge" offre une interface pour supprimer les doublons et il se vante de pouvoir fixer des limites sur le nombre de termes qu'il charge à la fois pour éviter d'épuiser la limite de mémoire du serveur de base de données. Avec mon cas d'utilisation, cependant, je ne suis même pas capable de charger l'écran de configuration situé dans/admin/structure/taxonomy/[My-Vocabulary]/merge, et encore moins l'interface des doublons trouvée dans/admin/structure/taxonomy/[My -Vocabulaire]/fusionner/dupliquer, car ces deux derniers épuisent la limite de mémoire malgré que cette limite soit fixée à 1024M. Pour contourner ce problème, j'ai écrit un module personnalisé qui appelle la fonction term_merge trouvée dans le module term_merge. Comme il n'y a qu'un seul paquet de nœuds dans ce projet qui utilise le vocabulaire de taxonomie en question, je suis capable d'écrire ma propre logique pour fusionner des termes en double sans avoir à utiliser les fonctions fournies par le module term_merge, mais j'aimerais en faire usage car il est conçu à cette fin et, théoriquement, permet un processus plus sûr.

Mon module fournit un rappel de page ainsi qu'une logique pour obtenir une liste de TID qui se réfèrent à un terme de taxonomie dupliqué. Voici le code qui contient l'appel à la fonction 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); 

Cela ne résulte pas en des termes fusionnés, et ne fournit aucune erreur ou avis dans Chien de garde ou les journaux de serveur Web.

J'ai également essayé d'appeler term_merge pour chaque TID dupliqué individuel à fusionner, plutôt que d'utiliser un tableau de TID dans son ensemble. J'apprécierais toute entrée sur la meilleure façon d'utiliser les fonctions term_merge par programme, ou une alternative qui me permettra de supprimer plusieurs termes en double d'une grande base de données où certains termes ont des milliers de doublons.

Pour référence, voici les commentaires qui fournissent des informations sur les paramètres pris en term_merge, trouvés dans term_merge.module du module term_merge contribué:

/** 
* 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 
*/ 

Répondre

0

Il semblerait que depuis a été développé avec la fonction term_merge l'intention qui serait utilisée dans une fonction pour gérer les soumissions de formulaire, mon module personnalisé l'utilise d'une manière où batch_process ne peut pas être appelé.

appelant Explicitement les résoud suivantes ceci:

batch_process() 

Aucun argument doivent être transmis à la fonction.

+0

Vous pouvez accepter votre propre réponse si vous croyez que c'est la solution. – pal4life