1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830 |
- <?php
- /**
- *
- * @file
- * Taxonomy Manager Admin
- *
- * contains all forms and saving function for the Taxonomy Manager
- *
- */
- include_once DRUPAL_ROOT . "/modules/taxonomy/taxonomy.admin.inc";
- /**
- * list of vocabularies, which link to Taxonomy Manager interface
- */
- function taxonomy_manager_voc_list() {
- $output = l(t('Add new vocabulary'), 'admin/structure/taxonomy/add/vocabulary') . ' | ';
- $output .= l(t('Edit vocabulary settings'), 'admin/structure/taxonomy') . '<br /><br />';
- $vocabularies = taxonomy_get_vocabularies();
- $voc_list = array();
- foreach ($vocabularies as $vocabulary) {
- $voc_list[] = l($vocabulary->name, 'admin/structure/taxonomy_manager/voc/' . $vocabulary->machine_name);
- }
- if (!count($voc_list)) {
- $voc_list[] = t('No Vocabularies available');
- }
- $output .= theme('item_list', array('items' => $voc_list, 'title' => t('Vocabularies')));
- return $output;
- }
- /**
- * defines forms for taxonomy manager interface
- *
- * @param $voc vocabulary
- * @param $tid a term id, if not 0, displays term editing from for given tid on right side
- * @param $search_string a string to filter root level terms
- */
- function taxonomy_manager_form($form, &$form_state, $voc, $tid = 0, $filter = NULL) {
- // Check for confirmation forms.
- if (isset($form_state['confirm_delete'])) {
- return taxonomy_manager_term_confirm_delete($form, $form_state, $voc->vid);
- }
- // By default use tid from term data form, except it is submitted from the load-tid helper and the tree needs to be refreshed.
- if (isset($form_state['values']['tid']) && !(isset($form_state['triggering_element']['#value']) && $form_state['triggering_element']['#value'] == "load term" && $form_state['values']['load-tid-refresh-tree'])) {
- $tid = $form_state['values']['tid'];
- }
- elseif (isset($form_state['triggering_element']['#value']) && $form_state['triggering_element']['#value'] == "load term" && $form_state['values']['load-tid-refresh-tree']) {
- $tid = $form_state['values']['load-tid'];
- }
- $module_path = drupal_get_path('module', 'taxonomy_manager') . '/';
- $form['#attached']['css'][] = $module_path . 'css/taxonomy_manager.css';
- $form['#attached']['js'][] = $module_path . 'js/hideForm.js';
- $form['#attached']['js'][] = $module_path . 'js/updateWeight.js';
- $form['#attached']['js'][] = $module_path . 'js/termData.js';
- $form['#attached']['js'][] = array('data' => array('termData' => array('url' => url("admin/structure/taxonomy_manager/termdata/edit/" . $voc->vid))), 'type' => 'setting');
- $form['#attached']['js'][] = array('data' => array('updateWeight' => array('up' => 'edit-weight-up', 'down' => 'edit-weight-down', 'url' => url('admin/structure/taxonomy_manager/weight/'), 'disable_mouseover' => variable_get('taxonomy_manager_disable_mouseover', 0))), 'type' => 'setting');
- $form['#attached']['js'][] = array('data' => array('TMAjaxThrobber' => array('add' => TRUE)), 'type' => 'setting');
- $form['#attached']['js'][] = array('data' => array('taxonomy_manager' => array('modulePath' => (url($module_path) == $module_path) ? $module_path : (base_path() . $module_path))), 'type' => 'setting');
- drupal_set_title(t("Taxonomy Manager - %voc_name", array("%voc_name" => $voc->name)), PASS_THROUGH);
- $form['voc'] = array('#type' => 'value', "#value" => $voc);
- // Helper forms for loading the term data form.
- // When a term link in the tree view gets clicked, the term id is written into the
- // load-tid textfield and aftwards the load-tid-submit button gets clicked, which
- // triggers the ajax system.
- $form['load-tid'] = array(
- '#type' => 'textfield',
- '#prefix' => '<div class="taxonomy-manager-term-load-helper">',
- );
- $form['load-tid-refresh-tree'] = array(
- '#type' => 'checkbox',
- );
- $form['load-tid-submit'] = array(
- '#type' => 'submit',
- '#value' => 'load term',
- '#submit' => array('taxonomy_manager_load_tid_submit'),
- '#ajax' => array(
- 'callback' => 'taxonomy_manager_term_data_form_ajax_callback',
- 'method' => 'replaceWith',
- 'event' => 'click',
- 'wrapper' => 'taxonomy-term-data-replace',
- ),
- '#suffix' => '</div>',
- );
- taxonomy_manager_form_voc_jumper($form, $form_state);
- if (_taxonomy_manager_voc_is_empty($voc->vid)) {
- $text = t('No terms available');
- $form['text'] = array(
- '#markup' => $text,
- );
- taxonomy_manager_add_form($form, $voc, FALSE);
- return $form;
- }
- $form_state['cache'] = TRUE;
- $form['taxonomy']['#tree'] = TRUE;
- $form['taxonomy']['manager'] = array(
- '#type' => 'fieldset',
- '#title' => check_plain($voc->name) . _taxonomy_manager_select_all_helpers_markup(),
- '#weight' => 10,
- '#tree' => TRUE,
- );
- $form['taxonomy']['manager']['top'] = array(
- '#markup' => '',
- '#prefix' => '<div class="taxonomy-manager-tree-top">',
- '#suffix' => '</div>',
- );
- if (module_exists('i18n_taxonomy')) {
- if (i18n_taxonomy_vocabulary_mode($voc->vid, I18N_MODE_TRANSLATE)) {
- if ($tid) {
- $language = _taxonomy_manager_term_get_lang($tid);
- }
- else {
- $language = language_default()->language;
- }
- $form['taxonomy']['manager']['top']['language'] = array(
- '#type' => 'select',
- '#title' => t('Language'),
- '#default_value' => $language,
- '#options' => array('' => t('All'), 'no language' => t('no language')) + locale_language_list('name'),
- '#attributes' => array('class' => array('language-selector')),
- );
- }
- }
- $form['taxonomy']['manager']['top']['size'] = array('#markup' => '<div class="taxonomy-manager-tree-size">' . theme("image", array('path' => $module_path . "images/grippie.png", 'alt' => t("Resize tree"), 'title' => t("Resize tree"), 'attributes' => array('class' => "div-grippie"))) . '</div>');
- if (isset($form_state['values']['double_tree_values']['left_tree_expand_terms']) && count($form_state['values']['double_tree_values']['left_tree_expand_terms'])) {
- $tids_to_expand = $form_state['values']['double_tree_values']['left_tree_expand_terms'];
- }
- elseif (isset($form_state['values']['searched_terms']) && count($form_state['values']['searched_terms'])) {
- $tids_to_expand = $form_state['values']['searched_terms'];
- }
- else {
- $tids_to_expand = $tid;
- }
- $form['taxonomy']['manager']['tree'] = array(
- '#type' => 'taxonomy_manager_tree',
- '#vid' => $voc->vid,
- '#pager' => TRUE,
- '#search_string' => ($tid) ? NULL : $filter,
- '#language' => isset($language) ? $language : '',
- '#terms_to_expand' => $tids_to_expand,
- '#terms_to_highlight' => $tids_to_expand,
- );
- $form['toolbar'] = array(
- '#type' => 'fieldset',
- '#title' => t('Toolbar'),
- );
- $form['toolbar']['weight_up'] = array(
- //'#type' => 'button',
- '#attributes' => array('class' => array('taxonomy-manager-buttons')),
- '#value' => t('Up'),
- '#theme' => 'no_submit_button',
- '#prefix' => '<div id="taxonomy-manager-toolbar-buttons">',
- );
- $form['toolbar']['weight-down'] = array(
- //'#type' => 'button',
- '#attributes' => array('class' => array('taxonomy-manager-buttons')),
- '#value' => t('Down'),
- '#theme' => 'no_submit_button',
- );
- $form['toolbar']['wrapper'] = array(
- '#type' => 'markup',
- '#markup' => '<div id="taxonomy-manager-toolbar-throbber"></div><div class="clear"></div>',
- '#weight' => 20,
- '#prefix' => '</div>',
- );
- taxonomy_manager_add_form($form, $voc);
- taxonomy_manager_confirm_delete($form, $voc);
- taxonomy_manager_term_merge_form($form, $voc);
- taxonomy_manager_move_form($form, $voc);
- taxonomy_manager_export_form($form, $form_state, $voc);
- taxonomy_manager_double_tree_settings_form($form, $voc);
- taxonomy_manager_search_form($form, $voc);
- // A term clicked in tree-view and submitted through load-tid helper,
- // generate term data form.
- // Moved this code snippet to the bottom here to prevent needless
- // expanding of the tree for this tid.
- if (isset($form_state['values']['load-tid'])) {
- $tid = $form_state['values']['load-tid'];
- }
- // Something on the term data has been submitted, e.g. the 'add another item'
- // button
- elseif (isset($form_state['term']) && is_object($form_state['term'])) {
- $tid = $form_state['term']->tid;
- }
- taxonomy_manager_term_data_form($form, $form_state, $tid, $voc->vid);
- return $form;
- }
- function taxonomy_manager_double_tree_form($form, &$form_state, $voc1, $voc2, $tid = 0, $filter = NULL) {
- // Check for confirmation forms.
- if (isset($form_state['confirm_delete'])) {
- return taxonomy_manager_term_confirm_delete($form, $form_state, $voc1->vid, $voc2->vid);
- }
- $module_path = drupal_get_path('module', 'taxonomy_manager') . '/';
- $form = taxonomy_manager_form($form, $form_state, $voc1, $tid, $filter);
- $form['disable'] = array(
- '#markup' => l(t('Disable Double Tree'), 'admin/structure/taxonomy_manager/voc/ ' . $voc1->machine_name),
- '#weight' => -100,
- );
- $form['voc2'] = array('#type' => 'value', "#value" => $voc2);
- $form['taxonomy2'] = array(
- '#tree' => TRUE,
- );
- $form['taxonomy2']['manager'] = array(
- '#type' => 'fieldset',
- '#title' => check_plain($voc2->name) . _taxonomy_manager_select_all_helpers_markup(),
- '#weight' => 10,
- '#tree' => TRUE,
- );
- $form['taxonomy2']['manager']['top'] = array(
- '#value' => '',
- '#prefix' => '<div class="taxonomy-manager-tree-top">',
- '#suffix' => '</div>',
- );
- if (module_exists('i18n_taxonomy')) {
- if (i18n_taxonomy_vocabulary_mode($voc2->vid, I18N_MODE_TRANSLATE)) {
- if ($tid) {
- $language = _taxonomy_manager_term_get_lang($tid);
- }
- else {
- $language = language_default()->language;
- }
- $form['taxonomy2']['manager']['top']['language'] = array(
- '#type' => 'select',
- '#title' => t('Language'),
- '#default_value' => $language,
- '#options' => array('' => t('All'), 'no language' => t('no language')) + locale_language_list('name'),
- '#attributes' => array('class' => array('language-selector')),
- );
- }
- }
- $form['taxonomy2']['manager']['top']['size'] = array('#markup' => '<div class="taxonomy-manager-tree-size">' . theme("image", array('path' => $module_path . "images/grippie.png", 'alt' => t("Resize tree"), 'title' => t("Resize tree"), 'attributes' => array('class' => "div-grippie"))) . '</div>');
- if (isset($form_state['values']['double_tree_values']['right_tree_expand_terms']) && count($form_state['values']['double_tree_values']['right_tree_expand_terms'])) {
- $tids_to_expand = $form_state['values']['double_tree_values']['right_tree_expand_terms'];
- }
- else {
- $tids_to_expand = $tid;
- }
- $form['taxonomy2']['manager']['tree'] = array(
- '#type' => 'taxonomy_manager_tree',
- '#vid' => $voc2->vid,
- '#pager' => TRUE,
- '#search_string' => ($tid) ? NULL : $filter,
- '#language' => isset($language) ? $language : '',
- '#terms_to_expand' => $tids_to_expand, //@todo check if term coming through ajax
- '#terms_to_highlight' => $tids_to_expand,
- );
- $form['double-tree']['operations'] = array(
- '#tree' => TRUE,
- );
- $form['double-tree']['operations']['move_right'] = array(
- '#type' => 'image_button',
- '#attributes' => array('title' => t('Move right')),
- '#src' => $module_path . "images/go-next.png",
- '#submit' => array('taxonomy_manager_double_tree_move_submit'),
- '#validate' => array('taxonomy_manager_double_tree_move_validate'),
- '#ajax' => array(
- 'callback' => 'taxonomy_manager_double_tree_ajax_callback',
- 'method' => 'replaceWith',
- 'event' => 'click',
- 'wrapper' => 'taxonomy-manager',
- 'progress' => array('type' => ''),
- ),
- '#weight' => 20,
- '#prefix' => '<div class="taxonomy-manager-double-tree-operations-buttons">',
- '#suffix' => '</div>',
- );
- $form['double-tree']['operations']['move_left'] = array(
- '#type' => 'image_button',
- '#attributes' => array('title' => t('Move left')),
- '#src' => $module_path . "images/go-previous.png",
- '#submit' => array('taxonomy_manager_double_tree_move_submit'),
- '#validate' => array('taxonomy_manager_double_tree_move_validate'),
- '#ajax' => array(
- 'callback' => 'taxonomy_manager_double_tree_ajax_callback',
- 'method' => 'replaceWith',
- 'event' => 'click',
- 'wrapper' => 'taxonomy-manager',
- 'progress' => array('type' => ''),
- ),
- '#weight' => 20,
- '#prefix' => '<div class="taxonomy-manager-double-tree-operations-buttons">',
- '#suffix' => '</div>',
- );
- //switch operations
- if ($voc1->vid != $voc2->vid) {
- $form['double-tree']['operations']['move_right']['#attributes']['title'] = t('Switch selected terms and its children to the right voc');
- $form['double-tree']['operations']['move_right']['#submit'] = array('taxonomy_manager_double_tree_switch_submit');
- $form['double-tree']['operations']['move_right']['#validate'] = array('taxonomy_manager_double_tree_switch_validate');
- $form['double-tree']['operations']['move_left']['#attributes']['title'] = t('Switch selected terms and its children to the left voc');
- $form['double-tree']['operations']['move_left']['#submit'] = array('taxonomy_manager_double_tree_switch_submit');
- $form['double-tree']['operations']['move_left']['#validate'] = array('taxonomy_manager_double_tree_switch_validate');
- // Copy buttons
- $form['double-tree']['operations']['copy_right'] = $form['double-tree']['operations']['move_right'];
- $form['double-tree']['operations']['copy_left'] = $form['double-tree']['operations']['move_left'];
- $form['double-tree']['operations']['copy_right']['#attributes']['title'] = t('Copy selected term names to the right voc.');
- $form['double-tree']['operations']['copy_right']['#src'] = $module_path . "images/copy-right.png";
- $form['double-tree']['operations']['copy_right']['#submit'] = array('taxonomy_manager_double_tree_copy_submit');
- $form['double-tree']['operations']['copy_right']['#validate'] = array('taxonomy_manager_double_tree_copy_validate');
- $form['double-tree']['operations']['copy_right']['#weight'] = 22;
- $form['double-tree']['operations']['copy_left']['#attributes']['title'] = t('Copy selected term names to the left voc.');
- $form['double-tree']['operations']['copy_left']['#src'] = $module_path . "images/copy-left.png";
- $form['double-tree']['operations']['copy_left']['#submit'] = array('taxonomy_manager_double_tree_copy_submit');
- $form['double-tree']['operations']['copy_left']['#validate'] = array('taxonomy_manager_double_tree_copy_validate');
- $form['double-tree']['operations']['copy_left']['#weight'] = 23;
- }
- elseif (module_exists('i18n_taxonomy') && i18n_taxonomy_vocabulary_mode($voc2->vid, I18N_MODE_TRANSLATE)) {
- $form['double-tree']['operations']['add_translation'] = $form['double-tree']['operations']['move_right'];
- $form['double-tree']['operations']['add_translation']['#attributes']['title'] = t('Add Translation.');
- $form['double-tree']['operations']['add_translation']['#src'] = $module_path . "images/connect.png";
- $form['double-tree']['operations']['add_translation']['#submit'] = array('taxonomy_manager_double_tree_add_translation_submit');
- $form['double-tree']['operations']['add_translation']['#validate'] = array('taxonomy_manager_double_tree_add_translation_validate');
- }
- return $form;
- }
- /**
- * Adds a voc jumper menu, if ctools is enabled.
- */
- function taxonomy_manager_form_voc_jumper(&$form, $form_state) {
- if (module_exists('ctools')) {
- $options = array();
- foreach (taxonomy_vocabulary_get_names() as $voc) {
- $options[url('admin/structure/taxonomy_manager/voc/' . $voc->machine_name)] = $voc->name;
- }
- ctools_include('jump-menu');
- $settings = array(
- 'choose' => t('-- Switch vocabulary --'),
- );
- $form = ctools_jump_menu($form, $form_state, $options, $settings);
- // Attach the JS in case we rebuild the form.
- $form['#attached']['js'][] = drupal_get_path('module', 'ctools') . '/js/jump-menu.js';
- }
- }
- /**
- * form for searching terms
- */
- function taxonomy_manager_search_form(&$form, $voc) {
- $form['#attached']['js'][] = array(
- 'data' => array('hideForm' => array(array(
- 'show_button' => 'edit-search-show',
- 'hide_button' => 'edit-search-cancel',
- 'div' => 'edit-search'))),
- 'type' => 'setting');
- $form['toolbar']['search_show'] = array(
- //'#type' => 'button',
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'search')),
- '#value' => t('Search'),
- '#theme' => 'no_submit_button',
- );
- $search_description = t("You can search directly for exisiting terms.
- If your input doesn't match an existing term, it will be used for filtering root level terms (useful for non-hierarchical vocabularies).");
- $form['search'] = array(
- '#type' => 'fieldset',
- '#title' => t('Search'),
- '#attributes' => array('style' => 'display:none;', 'id' => 'edit-search'),
- '#description' => $search_description,
- '#collapsed' => TRUE,
- '#tree' => TRUE,
- );
- $form['search']['field'] = array(
- '#type' => 'textfield',
- '#title' => t('Search String'),
- '#autocomplete_path' => 'taxonomy_manager/autocomplete/' . $voc->vid,
- //'#prefix' => '<div id="edit-find-field">',
- //'#suffix' => '</div>',
- );
- $search_options = array(
- //'synonyms' => t('Include synonyms'), // @todo implement synonyms feature
- 'subtrees' => t('Search under selected terms'),
- );
- if (module_exists('i18n_taxonomy')) {
- if (i18n_taxonomy_vocabulary_mode($voc->vid, I18N_MODE_TRANSLATE)) {
- $search_options['language'] = t('Search within selected language');
- }
- }
- $form['search']['options'] = array(
- '#type' => 'checkboxes',
- '#title' => t('Search options'),
- '#options' => $search_options,
- );
- $form['search']['button'] = array(
- '#type' => 'submit',
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'search')),
- '#value' => t('Search'),
- //'#suffix' => '<div class="clear"></div>',
- );
- $form['search']['cancel'] = array(
- //'#type' => 'button',
- '#value' => t('Cancel'),
- '#theme' => 'no_submit_button',
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'cancel')),
- );
- }
- /**
- * confirmation form for deleting selected terms
- */
- function taxonomy_manager_confirm_delete(&$form, $voc) {
- $form['#attached']['js'][] = array(
- 'data' => array('hideForm' => array(array(
- 'show_button' => 'edit-delete-confirm',
- 'hide_button' => 'edit-delete-cancel',
- 'div' => 'edit-delete'))),
- 'type' => 'setting');
- $form['toolbar']['delete_confirm'] = array(
- //'#type' => 'button',
- '#attributes' => array('class' => array('taxonomy-manager-buttons delete')),
- '#value' => t('Delete'),
- '#theme' => 'no_submit_button',
- );
- $form['delete'] = array(
- '#type' => 'fieldset',
- '#attributes' => array('style' => 'display:none;', 'id' => 'edit-delete'),
- '#tree' => TRUE,
- '#title' => t('Confirmation'),
- );
- $question = t('Are you sure you want to delete all selected terms?');
- $info = t('Remember all term specific data will be lost. This action cannot be undone.');
- $form['delete']['text'] = array('#value' => "<b>" . $question . "</b><br/>" . $info);
- $options = array(
- 'delete_orphans' => t('Delete children of selected terms, if there are any'),
- );
- $form['delete']['options'] = array(
- '#type' => 'checkboxes',
- '#title' => t('Options'),
- '#options' => $options,
- );
- $form['delete']['delete'] = array(
- '#type' => 'submit',
- '#value' => t('Delete'),
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'delete')),
- '#submit' => array('taxonomy_manager_form_delete_submit'),
- '#validate' => array('taxonomy_manager_form_delete_validate'),
- );
- $form['delete']['cancel'] = array(
- //'#type' => 'button',
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'cancel')),
- '#value' => t('Cancel'),
- '#theme' => 'no_submit_button',
- );
- }
- /**
- * form for adding terms
- */
- function taxonomy_manager_add_form(&$form, $voc, $hide_form = TRUE) {
- $attributes = array();
- if ($hide_form) {
- $form['#attached']['js'][] = array(
- 'data' => array('hideForm' => array(array(
- 'show_button' => 'edit-add-show',
- 'hide_button' => 'edit-add-cancel',
- 'div' => 'edit-add'))),
- 'type' => 'setting');
- $attributes = array('style' => 'display:none;', 'id' => 'edit-add');
- $form['toolbar']['add_show'] = array(
- //'#type' => 'button',
- '#attributes' => array('class' => 'taxonomy-manager-buttons add'),
- '#value' => t('Add'),
- '#theme' => 'no_submit_button',
- );
- }
- $description = "";
- $description = t("If you have selected one or more terms in the tree view, the new terms are automatically children of those.");
- $form['add'] = array(
- '#type' => 'fieldset',
- '#tree' => TRUE,
- '#attributes' => $attributes,
- '#title' => t('Add new terms'),
- '#description' => $description,
- );
- $form['add']['mass_add'] = array(
- '#type' => 'textarea',
- '#title' => t('Terms'),
- '#description' => t("One term per line. Child terms can be prefixed with a
- dash '-' (one dash per hierarchy level). Terms that should not become
- child terms and start with a dash need to be wrapped in double quotes.
- <br />Example:<br />
- animals<br />
- -canine<br />
- --dog<br />
- --wolf<br />
- -feline<br />
- --cat"),
- '#rows' => 10,
- );
- $form['add']['add'] = array(
- '#type' => 'submit',
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'add')),
- '#value' => t('Add'),
- '#submit' => array('taxonomy_manager_form_add_submit'),
- );
- $form['add']['cancel'] = array(
- //'#type' => 'button',
- '#value' => t('Cancel'),
- '#theme' => 'no_submit_button',
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'cancel')),
- );
- }
- /**
- * Form for the Term merge module
- */
- function taxonomy_manager_term_merge_form(&$form, $voc) {
- if (!module_exists('term_merge') || !user_access('merge terms')) {
- return;
- }
- $form['#attached']['js'][] = array(
- 'data' => array('hideForm' => array(array(
- 'show_button' => 'edit-term-merge-show',
- 'hide_button' => 'edit-term-merge-cancel',
- 'div' => 'edit-term-merge'))),
- 'type' => 'setting');
- $description = t("This operation is based on the Term merge module. Selected terms get merged into the given one. Optionally the selected terms can be retained, otherwise they will be deleted.");
- $form['toolbar']['term_merge_show'] = array(
- //'#type' => 'button',
- '#attributes' => array('class' => array('taxonomy-manager-buttons merge')),
- '#value' => t('Term merge'),
- '#theme' => 'no_submit_button',
- );
- $form['term_merge'] = array(
- '#type' => 'fieldset',
- '#tree' => TRUE,
- '#attributes' => array('style' => 'display:none;', 'id' => 'edit-term-merge'),
- '#title' => t('Merging of terms'),
- '#description' => $description,
- );
- $form['term_merge']['dest_term'] = array(
- '#type' => 'textfield',
- '#title' => t('Destination term'),
- '#description' => t("Enter a unique term name or a term id with 'term-id:[tid]'"),
- '#required' => FALSE,
- '#autocomplete_path' => 'taxonomy_manager/autocomplete/' . $voc->vid,
- );
- $form['term_merge']['options'] = array(
- '#type' => 'checkboxes',
- '#title' => t('Options'),
- '#options' => array(
- 'keep_merged' => t('Keep merged terms'),
- ),
- );
- $form['term_merge']['submit'] = array(
- '#type' => 'submit',
- '#value' => t('Merge'),
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'merge')),
- '#validate' => array('taxonomy_manager_form_term_merge_validate'),
- '#submit' => array('taxonomy_manager_form_term_merge_submit'),
- );
- $form['term_merge']['cancel'] = array(
- //'#type' => 'button',
- '#value' => t('Cancel'),
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'cancel')),
- '#theme' => 'no_submit_button',
- );
- }
- /**
- * form for moving terms in hierarchies
- */
- function taxonomy_manager_move_form(&$form, $voc) {
- $form['#attached']['js'][] = array(
- 'data' => array('hideForm' => array(array(
- 'show_button' => 'edit-move-show',
- 'hide_button' => 'edit-move-cancel',
- 'div' => 'edit-move'))),
- 'type' => 'setting');
- $description = t("You can change the parent of one or more selected terms.
- If you leave the autocomplete field empty, the term will be a root term.");
- $form['toolbar']['move_show'] = array(
- //'#type' => 'button',
- '#value' => t('Move'),
- '#attributes' => array('class' => array('taxonomy-manager-buttons move')),
- '#theme' => 'no_submit_button',
- );
- $form['move'] = array(
- '#type' => 'fieldset',
- '#tree' => TRUE,
- '#attributes' => array('style' => 'display:none;', 'id' => 'edit-move'),
- '#title' => t('Moving of terms'),
- '#description' => $description,
- );
- $form['move']['parents'] = array(
- '#type' => 'textfield',
- '#title' => t('Parent term(s)'),
- '#description' => t("Enter a unique term name or a term id with 'term-id:[tid]'. Separate multiple parent terms with commas."),
- '#required' => FALSE,
- '#autocomplete_path' => 'taxonomy_manager/autocomplete/' . $voc->vid,
- );
- $options = array();
- $options['keep_old_parents'] = t('Keep old parents and add new ones (multi-parent). Otherwise old parents get replaced.');
- $form['move']['options'] = array(
- '#type' => 'checkboxes',
- '#title' => t('Options'),
- '#options' => $options,
- );
- $form['move']['submit'] = array(
- '#type' => 'submit',
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'move')),
- '#value' => t('Move'),
- '#validate' => array('taxonomy_manager_form_move_validate'),
- '#submit' => array('taxonomy_manager_form_move_submit'),
- );
- $form['move']['cancel'] = array(
- //'#type' => 'button',
- '#value' => t('Cancel'),
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'cancel')),
- '#theme' => 'no_submit_button',
- );
- }
- /**
- * form for exporting terms
- */
- function taxonomy_manager_export_form(&$form, &$form_state, $voc) {
- $form['#attached']['js'][] = array(
- 'data' => array('hideForm' => array(array(
- 'show_button' => 'edit-export-show',
- 'hide_button' => 'edit-export-cancel',
- 'div' => 'edit-export'))),
- 'type' => 'setting',
- );
- $form['toolbar']['export_show'] = array(
- //'#type' => 'button',
- '#attributes' => array('class' => array('taxonomy-manager-buttons export')),
- '#value' => t('Export'),
- '#theme' => 'no_submit_button',
- );
- $form['export'] = array(
- '#type' => 'fieldset',
- '#tree' => TRUE,
- '#attributes' => array('style' => 'display:none;', 'id' => 'edit-export'),
- '#title' => t('Export'),
- );
- $scope_options = array(
- 'whole_voc' => t('Whole Vocabulary'),
- 'children' => t('Child terms of a selected term'),
- 'root_terms' => t('Root level terms only'),
- );
- $form['export']['scope'] = array(
- '#type' => 'radios',
- '#title' => t('Terms to export'),
- '#options' => $scope_options,
- '#default_value' => 'whole_voc',
- '#prefix' => '<div id="taxonomy_manager_export_options">',
- '#suffix' => '</div>',
- );
- $form['export']['depth'] = array(
- '#type' => 'textfield',
- '#title' => t('Depth of tree'),
- '#description' => t('The number of levels of the tree to export. Leave empty to return all levels.'),
- '#size' => 10,
- );
- $format_options = array(
- 'term_tree' => t('Term names with hierarchy'),
- 'csv' => t('CSV'),
- );
- $help_items[] = t('Term names with hierarchy: Only term names are exported. Child terms are prefixed with dashes. Uses the same format as for mass-import (Add button).');
- $help_items[] = t('CSV: The comma-separated-values export has following columns: voc id | term id | term name | description | parent id 1 | ... | parent id n');
- $form['export']['format'] = array(
- '#type' => 'radios',
- '#title' => t('Format'),
- '#options' => $format_options,
- '#default_value' => 'term_tree',
- '#description' => theme('item_list', array('items' => $help_items, 'title' => t('Description of formats'))),
- );
- // CSV options
- $form['export']['csv']['delimiter'] = array(
- '#type' => 'textfield',
- '#title' => t('Delimiter for CSV'),
- '#required' => FALSE,
- '#default_value' => ";",
- '#size' => 10,
- '#states' => array(
- 'visible' => array(
- ':input[name="export[format]"]' => array('value' => 'csv'),
- ),
- ),
- );
- $wrapper_id = 'taxonomy-manager-export-textarea';
- if (isset($form_state['values']['export']['data'])) {
- $form['export']['data'] = array(
- '#type' => 'textarea',
- '#title' => t('Exported data'),
- '#value' => $form_state['values']['export']['data'],
- '#rows' => 8,
- '#prefix' => '<div id="' . $wrapper_id . '">',
- '#suffix' => '</div>',
- );
- }
- $form['export']['submit'] = array(
- '#prefix' => '<div id="' . $wrapper_id . '"></div>',
- '#type' => 'submit',
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'export')),
- '#value' => t('Export now'),
- '#submit' => array('taxonomy_manager_export_form_submit'),
- '#ajax' => array(
- 'callback' => 'taxonomy_manager_export_ajax_callback',
- 'method' => 'replaceWith',
- 'event' => 'click',
- 'wrapper' => $wrapper_id,
- 'progress' => array('type' => ''),
- ),
- );
- $form['export']['cancel'] = array(
- //'#type' => 'button',
- '#value' => t('Cancel'),
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'cancel')),
- '#theme' => 'no_submit_button',
- );
- }
- function taxonomy_manager_double_tree_settings_form(&$form, $voc) {
- $form['#attached']['js'][] = array(
- 'data' => array('hideForm' => array(array(
- 'show_button' => 'edit-double-tree-show',
- 'hide_button' => 'edit-double-tree-settings-cancel',
- 'div' => 'edit-double-tree-settings'))),
- 'type' => 'setting');
- $form['toolbar']['double_tree_show'] = array(
- //'#type' => 'button',
- '#attributes' => array('class' => array('taxonomy-manager-buttons double-tree')),
- '#value' => t('Double Tree'),
- '#theme' => 'no_submit_button',
- );
- $form['double-tree-settings'] = array(
- '#type' => 'fieldset',
- '#tree' => TRUE,
- '#attributes' => array('style' => 'display:none;', 'id' => 'edit-double-tree-settings'),
- '#title' => t('Double Tree Settings'),
- '#description' => t('Specify settings for second tree. Choose the same vocabulary if you want to move terms in the hierarchy or if you want to add new translations within a multilingual vocabulary. Choose a different vocabulary if you want to switch terms among these vocabularies.'),
- );
- $options = array();
- $vocs = taxonomy_get_vocabularies();
- foreach ($vocs as $v) {
- $options[$v->machine_name] = $v->name;
- }
- $form['double-tree-settings']['voc2_machine_name'] = array(
- '#type' => 'select',
- '#title' => t('Vocabulary for second tree'),
- '#options' => $options,
- '#default_value' => $voc->vid,
- );
- $form['double-tree-settings']['submit'] = array(
- '#type' => 'submit',
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'double-tree')),
- '#value' => t('Enable Double Tree'),
- '#submit' => array('taxonomy_manager_form_double_tree_submit'),
- );
- if (arg(3) == "double-tree") {
- $form['double-tree-settings']['disable'] = array(
- '#type' => 'submit',
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'double-tree-disable')),
- '#value' => t('Disable Double Tree'),
- '#submit' => array('taxonomy_manager_form_double_tree_disable_submit'),
- );
- }
- $form['double-tree-settings']['cancel'] = array(
- //'#type' => 'button',
- '#value' => t('Cancel'),
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'cancel')),
- '#theme' => 'no_submit_button',
- );
- }
- function taxonomy_manager_term_data_form(&$form, &$form_state, $tid = 0, $vid1, $vid2 = 0) {
- $module_path = drupal_get_path('module', 'taxonomy_manager') . '/';
- if ($tid) {
- $term = taxonomy_term_load($tid);
- //prevent that title of the fieldset is too long
- $title = check_plain($term->name);
- if (drupal_strlen($title) >= 33) {
- $title = drupal_substr($title, 0, 33) . "...";
- }
- $form['term_data'] = array(
- '#type' => 'fieldset',
- '#title' => $title . " (" . $term->tid . ")",
- );
- unset($form_state['term']);
- $form['term_data'] = taxonomy_form_term($form['term_data'], $form_state, $term);
- $form['term_data']['description']['#rows'] = 2;
- // Disable wysiwyg editor as long as #356480 (lazy-loading) is not resolved.
- $form['term_data']['description']['#wysiwyg'] = FALSE;
- $form['term_data']['weight'] = $form['term_data']['relations']['weight'];
- unset($form['term_data']['relations']);
- unset($form['term_data']['actions']);
- $form['term_data']['parents'] = _taxonomy_manager_form_term_data_parents($term);
- $form['term_data']['parents']['#weight'] = '52';
- $form['term_data']['close'] = array(
- '#markup' => '<div id="term-data-close"><span title="' . t('Close') . '"> </span></div>',
- '#weight' => -100,
- );
- $link_img = theme("image", array('path' => $module_path . "images/link-small.png", 'alt' => t("link to term page")));
- $form['term_data']['link'] = array(
- '#markup' => '<br />' . l($link_img . ' ' . t('Go to the term page'), 'taxonomy/term/' . $term->tid, array('attributes' => array('rel' => 'tag', 'title' => strip_tags($term->description), 'target' => '_blank'), 'html' => TRUE)),
- '#weight' => 56);
- $form['term_data']['vid'] = array('#type' => 'hidden', '#value' => $term->vid);
- $form['term_data']['tid'] = array('#type' => 'hidden', '#value' => $tid);
- $form['term_data']['save'] = array(
- '#type' => 'submit',
- '#value' => t('Save changes'),
- '#submit' => array('taxonomy_manager_term_data_form_submit'),
- '#validate' => array('taxonomy_form_term_validate'),
- '#attributes' => array('class' => array('taxonomy-manager-buttons', 'save')),
- '#ajax' => array(
- 'callback' => 'taxonomy_manager_term_data_form_ajax_callback',
- 'method' => 'replaceWith',
- 'event' => 'click',
- 'wrapper' => 'taxonomy-term-data-replace',
- 'progress' => array('type' => ''),
- ),
- '#weight' => 20,
- );
- // i18n integration
- if (module_exists('i18n_taxonomy')) {
- if (i18n_taxonomy_vocabulary_mode($term->vid, I18N_MODE_TRANSLATE)) {
- $form['term_data']['translations'] = _taxonomy_manager_form_term_data_translations($term);
- $form['term_data']['translations']['#weight'] = '50';
- $form['term_data']['language'] = array(
- '#type' => 'select',
- '#title' => t('Language'),
- '#description' => t('This term belongs to a multilingual vocabulary. You can set a language for it.'),
- '#default_value' => $term->language,
- '#options' => locale_language_list('name'),
- );
- }
- }
- // UUID integration.
- if (module_exists('uuid')) {
- $uuids = entity_get_uuid_by_id('taxonomy_term', array($tid));
- if (count($uuids)) {
- $form['term_data']['uuid'] = array(
- '#markup' => t('UUID: @uuid', array('@uuid' => reset($uuids))),
- '#weight' => -10,
- );
- }
- }
- _taxonomy_manager_term_data_form_filter_file_fields($form);
- }
- $form['term_data']['#prefix'] = '<div id="taxonomy-term-data-replace">';
- $form['term_data']['#suffix'] = '</div>';
- }
- /**
- * Removes file fields from the term data form, as they do not work on the
- * nested form structure and link to the original term edit form instead.
- *
- * See #1195940, hack necessary until #1329856/#1468686 get fixed.
- */
- function _taxonomy_manager_term_data_form_filter_file_fields(&$form) {
- foreach (element_children($form['term_data']) as $key) {
- $field = &$form['term_data'][$key];
- if (isset($field['#type']) && $field['#type'] == 'container' && isset($field['#language']) && isset($field[$field['#language']])) {
- foreach (element_children($field[$field['#language']]) as $delta) {
- $element = &$field[$field['#language']][$delta];
- if (isset($element['#type']) && $element['#type'] == "managed_file") {
- $form['term_data']['file_field_info'] = array(
- '#markup' => '<div class="term-data-form-file-field-info">' . t('Edit file fields <a href="!url" target="_blank">here</a>.', array('!url' => url('taxonomy/term/' . $form['term_data']['#term']['tid'] . '/edit'))) . '</div>',
- );
- unset($form['term_data'][$key]);
- break;
- }
- }
- }
- }
- }
- /**
- * helper function for generating tables with values and delete op and field for adding
- *
- * @param $term term object which is going to be displayed
- * @return an form array
- */
- function _taxonomy_manager_form_term_data_parents($term) {
- $module_path = drupal_get_path('module', 'taxonomy_manager') . '/';
- $form['#tree'] = TRUE;
- $form['#theme'] = 'taxonomy_manager_term_data_extra';
- $form['headers'][] = array('#markup' => t('Parents'));
- $form['headers'][] = array('#markup' => '');
- $form['data'] = array();
- foreach (taxonomy_get_parents($term->tid) as $tid => $parent) {
- $extra_info = taxonomy_manager_tree_term_extra_info($parent);
- $form['data'][$tid][] = array(
- '#markup' => l($parent->name, 'admin/structure/taxonomy_manager/termdata/' . $parent->tid, array('attributes' => array('title' => $extra_info, 'class' => 'taxonomy-term-data-name-link'))),
- '#row-class' => 'taxonomy-term-data-name',
- '#row-id' => 'term-' . $tid,
- '#tree' => TRUE,
- );
- $form['data'][$tid][0]['tid'] = array(
- '#type' => 'hidden',
- '#value' => $tid,
- );
- $form['data'][$tid]['remove'] = array(
- '#type' => 'image_button',
- '#attributes' => array('title' => t('Remove')),
- '#submit' => array('taxonomy_manager_term_data_form_submit_parents_remove'),
- '#validate' => array('taxonomy_manager_term_data_form_validate_parents_remove'),
- '#src' => $module_path . "images/list-remove.png",
- '#row-class' => 'taxonomy-term-data-operations',
- );
- $form['data'][$tid]['remove']['#ajax'] = array(
- 'callback' => 'taxonomy_manager_term_data_form_ajax_callback',
- 'progress' => array('type' => ''),
- 'method' => 'replaceWith',
- 'event' => 'click',
- 'wrapper' => 'taxonomy-term-data-replace',
- );
- }
- $form['op'] = array();
- $form['op']['add'] = array(
- '#type' => 'textfield',
- '#prefix' => '<div class="term-data-autocomplete">',
- '#autocomplete_path' => 'taxonomy_manager/autocomplete/' . $term->vid,
- '#suffix' => '</div>',
- '#size' => 35,
- );
- $form['op']['add_button'] = array(
- '#type' => 'image_button',
- '#attributes' => array('title' => t('Add')),
- '#submit' => array('taxonomy_manager_term_data_form_submit_parents_add'),
- '#validate' => array('taxonomy_manager_term_data_form_validate_parents_add'),
- '#src' => $module_path . "images/list-add.png",
- '#row-class' => 'term-data-autocomplete-add',
- '#ajax' => array(
- 'callback' => 'taxonomy_manager_term_data_form_ajax_callback',
- 'progress' => array('type' => ''),
- 'method' => 'replaceWith',
- 'event' => 'click',
- 'wrapper' => 'taxonomy-term-data-replace',
- ),
- );
- return $form;
- }
- /**
- * Helper function for generating a table listing the translations
- */
- function _taxonomy_manager_form_term_data_translations($term) {
- $module_path = drupal_get_path('module', 'taxonomy_manager') . '/';
- $languages = locale_language_list('name');
- $form['#tree'] = TRUE;
- $form['#theme'] = 'taxonomy_manager_term_data_extra';
- $form['headers'][] = array('#markup' => t('Translations'));
- $form['headers'][] = array('#markup' => t('Language'));
- $form['headers'][] = array('#markup' => '');
- if (!empty($term->i18n_tsid)) {
- $translation_set = i18n_taxonomy_translation_set_load($term->i18n_tsid);
- $translations = $translation_set->get_translations();
- // If the number of translations equals 1, there's only a source translation.
- if (count($translations) > 1) {
- foreach ($translations as $langcode => $translation) {
- if ($translation->tid !== $term->tid) {
- $form['data'][$translation->tid][] = array(
- '#markup' => l($translation->name, 'admin/structure/taxonomy_manager/termdata/' . $translation->tid, array('attributes' => array('class' => 'taxonomy-term-data-name-link'))),
- '#row-class' => 'taxonomy-term-data-name',
- '#row-id' => 'term-' . $translation->tid,
- '#tree' => TRUE,
- );
- $form['data'][$translation->tid][] = array(
- '#markup' => check_plain($languages[$translation->language]),
- '#row-class' => 'taxonomy-term-data-language',
- '#row-id' => 'term-' . $translation->language,
- '#tree' => TRUE,
- );
- $form['data'][$translation->tid][0]['tid'] = array(
- '#type' => 'hidden',
- '#value' => $translation->tid,
- );
- $form['data'][$translation->tid]['remove'] = array(
- '#type' => 'image_button',
- '#attributes' => array('title' => t('Remove')),
- '#submit' => array('taxonomy_manager_term_data_form_submit_translation_remove'),
- '#validate' => array('taxonomy_manager_term_data_form_validate_translation_remove'),
- '#src' => $module_path . "images/list-remove.png",
- '#row-class' => 'taxonomy-term-data-operations',
- );
- $form['data'][$translation->tid]['remove']['#ajax'] = array(
- 'callback' => 'taxonomy_manager_term_data_form_ajax_callback',
- 'progress' => array('type' => ''),
- 'method' => 'replaceWith',
- 'event' => 'click',
- 'wrapper' => 'taxonomy-term-data-replace',
- );
- }
- }
- }
- }
- $form['op'] = array();
- $form['op']['add'] = array(
- '#type' => 'textfield',
- '#prefix' => '<div class="term-data-autocomplete">',
- '#autocomplete_path' => 'taxonomy_manager/autocomplete/' . $term->vid,
- '#suffix' => '</div>',
- '#size' => 35,
- );
- // Translations have a different language than the original term.
- unset($languages[$term->language]);
- $form['op']['language'] = array(
- '#type' => 'select',
- '#options' => $languages,
- );
- $form['op']['add_button'] = array(
- '#type' => 'image_button',
- '#attributes' => array('title' => t('Add')),
- '#submit' => array('taxonomy_manager_term_data_form_submit_translation_add'),
- '#validate' => array('taxonomy_manager_term_data_form_validate_translation_add'),
- '#src' => $module_path . "images/list-add.png",
- '#row-class' => 'term-data-autocomplete-add',
- '#ajax' => array(
- 'callback' => 'taxonomy_manager_term_data_form_ajax_callback',
- 'progress' => array('type' => ''),
- 'method' => 'replaceWith',
- 'event' => 'click',
- 'wrapper' => 'taxonomy-term-data-replace',
- ),
- );
- return $form;
- }
- /**
- * Returns html markup for (un)select all checkboxes buttons.
- */
- function _taxonomy_manager_select_all_helpers_markup() {
- return '<span class="taxonomy-manager-select-helpers">' .
- '<span class="select-all-children" title="' . t("Select all") . '"> </span>' .
- '<span class="deselect-all-children" title="' . t("Remove selection") . '"> </span>' .
- '</span>';
- }
- /**
- * submit handler for loading term data form
- */
- function taxonomy_manager_load_tid_submit($form, &$form_state) {
- // Unset input, so that the term data form has fresh values.
- unset($form_state['input']);
- if ($form_state['values']['load-tid-refresh-tree']) {
- form_set_value(array('#parents' => array('tree-update')), array('update' => TRUE), $form_state);
- }
- $form_state['rebuild'] = TRUE;
- }
- /**
- * validates the form (only search button)
- **/
- function taxonomy_manager_form_validate($form, &$form_state) {
- if ($form_state['clicked_button']['#value'] == t('Search') && empty($form_state['values']['search']['field'])) {
- form_set_error('search', t('Search field is empty'));
- $form_state['rebuild'] = TRUE;
- }
- }
- /**
- * submits the taxonomy manager form (only search button)
- **/
- function taxonomy_manager_form_submit($form, &$form_state) {
- if ($form_state['values']['delete'] === TRUE) {
- return taxonomy_manager_term_confirm_delete_submit($form, $form_state);
- }
- $voc = $form_state['values']['voc'];
- if (isset($form_state['values']['voc2'])) {
- $voc2 = $form_state['values']['voc2'];
- $url_prefix = 'admin/structure/taxonomy_manager/double-tree/' . $voc->machine_name . '/' . $voc2->machine_name;
- }
- else {
- $url_prefix = 'admin/structure/taxonomy_manager/voc/' . $voc->machine_name;
- }
- $search_string = $form_state['values']['search']['field'];
- $terms = array();
- $include_synonyms = FALSE;
- $selected_tids = array();
- $language = "";
- // @todo
- /*if ($form_state['values']['search']['options']['synonyms']) {
- $include_synonyms = TRUE;
- }*/
- if ($form_state['values']['search']['options']['subtrees']) {
- $selected_tids = $form_state['values']['taxonomy']['manager']['tree']['selected_terms'];
- }
- if (isset($form_state['values']['search']['options']['language'])) {
- $language = $form_state['values']['taxonomy']['manager']['top']['language'];
- }
- $terms = taxonomy_manager_autocomplete_search_terms($search_string, $voc->vid, $include_synonyms, $selected_tids, $language);
- if (count($terms) == 1) {
- $tid = $terms[0];
- drupal_set_message(t("Your search string matches exactly one term"));
- drupal_goto($url_prefix . '/' . $tid);
- }
- elseif (count($terms) > 1) {
- $matched_text_list = array();
- foreach ($terms as $matched_tid) {
- $matched_term = taxonomy_term_load($matched_tid);
- $parents = array();
- foreach (taxonomy_get_parents($matched_tid) as $parent) {
- $parents[] = check_plain($parent->name);
- }
- $parent_text = count($parents) ? implode(' | ', $parents) . " › " : "";
- $matched_text_list[] = $parent_text . l($matched_term->name, $url_prefix . '/' . $matched_term->tid, array('attributes' => array('title' => taxonomy_manager_tree_term_extra_info($matched_term)))) . " (" . $matched_term->tid . (!empty($matched_term->language) ? '-' . check_plain($matched_term->language) : '') . ")";
- }
- form_set_value($form, array('searched_terms' => $terms), $form_state);
- drupal_set_message(t("Your search string matches !count terms:", array('!count' => count($terms))) . theme('item_list', array('items' => $matched_text_list)));
- $form_state['rebuild'] = TRUE;
- }
- else {
- drupal_set_message(t("No match found. Filtering root level terms starting with @search_string.", array('@search_string' => $search_string)));
- drupal_set_message(l(t("Show unfiltered tree"), $url_prefix));
- drupal_goto($url_prefix . '/0/' . $search_string);
- }
- }
- /**
- * validates taxonomy manager double tree
- **/
- function taxonomy_manager_double_tree_form_validate($form, &$form_state) {
- taxonomy_manager_form_validate($form, $form_state);
- }
- /**
- * submits the taxonomy manager double tree
- **/
- function taxonomy_manager_double_tree_form_submit($form, &$form_state) {
- taxonomy_manager_form_submit($form, $form_state);
- }
- /**
- * Submit handler for adding terms
- */
- function taxonomy_manager_form_add_submit($form, &$form_state) {
- $parents = isset($form_state['values']['taxonomy']['manager']['tree']['selected_terms']) ? $form_state['values']['taxonomy']['manager']['tree']['selected_terms'] : array();
- $lang = isset($form_state['values']['taxonomy']['manager']['top']['language']) ? $form_state['values']['taxonomy']['manager']['top']['language'] : "";
- $term_names_too_long = array();
- $new_terms = taxonomy_manager_mass_add_terms($form_state['values']['add']['mass_add'], $form_state['values']['voc']->vid, $parents, $lang, $term_names_too_long);
- $term_names = array();
- foreach ($new_terms as $term) {
- $term_names[] = $term->name;
- }
- if (module_exists('i18n_taxonomy') && !empty($lang) && i18n_taxonomy_vocabulary_mode($form_state['values']['voc']->vid, I18N_MODE_TRANSLATE)) {
- drupal_set_message(t("Saving terms to language @lang", array('@lang' => locale_language_name($form_state['values']['taxonomy']['manager']['top']['language']))));
- }
- if (count($term_names_too_long)) {
- drupal_set_message(t("Following term names were too long and truncated to 255 characters: %names.", array('%names' => implode(', ', $term_names_too_long))), 'warning');
- }
- drupal_set_message(t("Terms added: %terms", array('%terms' => implode(', ', $term_names))));
- }
- /**
- * Helper function for mass adding of terms.
- *
- * @param $input
- * The textual input with terms. Each line contains a single term. Child term
- * can be prefixed with a dash '-' (one dash for each level). Term names
- * starting with a dash and should not become a child term need to be wrapped
- * in quotes.
- * @param $vid
- * The vocabulary id.
- * @param int $parents
- * An array of parent term ids for the new inserted terms. Can be 0.
- * @param $lang
- * The i18n language, if i18n exists.
- * @param $term_names_too_long
- * Return value that is used to indicate that some term names were too long
- * and truncated to 255 characters.
- *
- * @return An array of the newly inserted term objects
- */
- function taxonomy_manager_mass_add_terms($input, $vid, $parents, $lang = "", &$term_names_too_long = array()) {
- $new_terms = array();
- $terms = explode("\n", str_replace("\r", '', $input));
- $parents = count($parents) ? $parents : 0;
- // Stores the current lineage of newly inserted terms.
- $last_parents = array();
- foreach ($terms as $name) {
- if (empty($name)) {
- continue;
- }
- $matches = array();
- // Child term prefixed with one or more dashes
- if (preg_match('/^(-){1,}/', $name, $matches)) {
- $depth = strlen($matches[0]);
- $name = substr($name, $depth);
- $current_parents = isset($last_parents[$depth-1]) ? $last_parents[$depth-1]->tid : 0;
- }
- // Parent term containing dashes at the beginning and is therefore wrapped
- // in double quotes
- elseif (preg_match('/^\"(-){1,}.*\"/', $name, $matches)) {
- $name = substr($name, 1, -1);
- $depth = 0;
- $current_parents = $parents;
- }
- else {
- $depth = 0;
- $current_parents = $parents;
- }
- // Truncate long string names that will cause database exceptions.
- if (strlen($name) > 255) {
- $term_names_too_long[] = $name;
- $name = substr($name, 0, 255);
- }
- $term = new stdClass;
- $term->name = $name;
- $term->vid = $vid;
- $term->parent = $current_parents;
- if (module_exists('i18n_taxonomy') && !empty($lang) && i18n_taxonomy_vocabulary_mode($vid, I18N_MODE_TRANSLATE)) {
- $term->language = $lang;
- }
- taxonomy_term_save($term);
- $new_terms[] = $term;
- $last_parents[$depth] = $term;
- }
- return $new_terms;
- }
- /**
- * Validation handler for deleting terms
- */
- function taxonomy_manager_form_delete_validate($form, &$form_state) {
- $selected_tids = array();
- $selected_tids = $form_state['values']['taxonomy']['manager']['tree']['selected_terms'];
- if (count($selected_tids) < 1) {
- form_set_error('delete', t("No terms for deleting selected"));
- $form_state['rebuild'] = TRUE;
- }
- }
- /**
- * Submit handler for deleting terms
- */
- function taxonomy_manager_form_delete_submit($form, &$form_state) {
- $selected_tids = array();
- $selected_tids = $form_state['values']['taxonomy']['manager']['tree']['selected_terms'];
- if ($form_state['values']['delete'] === TRUE) {
- return taxonomy_manager_term_confirm_delete_submit($form, $form_state);
- }
- // Rebuild the form to confirm term deletion.
- $form_state['rebuild'] = TRUE;
- $form_state['confirm_delete'] = TRUE;
- }
- /**
- * Form builder for the term delete form.
- *
- */
- function taxonomy_manager_term_confirm_delete($form, &$form_state, $vid, $vid2 = NULL) {
- $voc = taxonomy_vocabulary_load($vid);
- if (isset($vid2)) {
- $voc2 = taxonomy_vocabulary_load($vid2);
- $form['voc2'] = array('#type' => 'value', '#value' => $voc2);
- $url = 'admin/structure/taxonomy_manager/double-tree/' . $voc->machine_name . '/' . $voc2->machine_name;
- }
- else {
- $url = 'admin/structure/taxonomy_manager/voc/' . $voc->machine_name;
- }
- $selected = $form_state['values']['taxonomy']['manager']['tree']['selected_terms'];
- $form['selected_terms'] = array('#prefix' => '<ul>', '#suffix' => '</ul>', '#tree' => TRUE);
- foreach ($selected as $tid) {
- $term = taxonomy_term_load($tid);
- $form['selected_terms'][$tid] = array('#type' => 'hidden', '#value' => $tid, '#prefix' => '<li>', '#suffix' => check_plain($term->name) . "</li>\n");
- }
- $form['delete'] = array('#type' => 'value', '#value' => TRUE);
- $form['voc'] = array('#type' => 'value', '#value' => $voc);
- $form['options'] = array('#type' => 'value', '#value' => $form_state['values']['delete']['options']);
- $msg = !empty($form_state['values']['delete']['options']['delete_orphans']) ? t('Deleting a term will delete all its children if there are any.') : '';
- $msg .= t('This action cannot be undone.');
- return confirm_form($form,
- t('Are you sure you want to delete the following terms:'),
- $url,
- $msg,
- t('Delete'),
- t('Cancel'));
- }
- /**
- * Submit handler to delete a term after confirmation.
- *
- */
- function taxonomy_manager_term_confirm_delete_submit($form, &$form_state) {
- $info = taxonomy_manager_delete_terms($form_state['values']['selected_terms'], $form_state['values']['options']);
- $deleted_term_names = array();
- $remaining_child_term_names = array();
- foreach ($info['deleted_terms'] as $term) {
- $deleted_term_names[] = $term->name;
- }
- foreach ($info['remaining_child_terms'] as $term) {
- $remaining_child_term_names[] = $term->name;
- }
- if (isset($form_state['values']['voc2'])) {
- $form_state['redirect'] = 'admin/structure/taxonomy_manager/double-tree/' . $form_state['values']['voc']->machine_name . '/' . $form_state['values']['voc2']->machine_name;
- }
- else {
- $form_state['redirect'] = 'admin/structure/taxonomy_manager/voc/' . $form_state['values']['voc']->machine_name;
- }
- drupal_set_message(t("Deleted terms: %deleted_term_names", array('%deleted_term_names' => check_plain(implode(', ', $deleted_term_names)))));
- if (count($remaining_child_term_names)) {
- drupal_set_message(t("Remaining child terms with different parents: %remaining_child_term_names", array('%remaining_child_term_names' => check_plain(implode(', ', $remaining_child_term_names)))));
- }
- return;
- }
- /**
- * Validation handler for moving terms
- */
- function taxonomy_manager_form_move_validate($form, &$form_state) {
- $selected_tids = array();
- $selected_tids = $form_state['values']['taxonomy']['manager']['tree']['selected_terms'];
- $error_msg = "";
- if (count($selected_tids) < 1) {
- form_set_error('move', t("Please selected terms you want to move in the hierarchy"));
- $form_state['rebuild'] = TRUE;
- }
- elseif (_taxonomy_manager_check_duplicates($form_state['values']['voc']->vid, $form_state['values']['move']['parents'], $error_msg)) {
- form_set_error('move', t("Warning: Your input matches with multiple terms, because of duplicated term names. Please enter a unique term name or the term id with 'term-id:[tid]'") . " (" . $error_msg . ").");
- $form_state['rebuild'] = TRUE;
- }
- $typed_parents = taxonomy_manager_autocomplete_tags_get_tids($form_state['values']['move']['parents'], $form_state['values']['voc']->vid, FALSE);
- $parents = array();
- foreach ($typed_parents as $parent_info) {
- $parents[(int) $parent_info['tid']] = (int) $parent_info['tid'];
- }
- if (!taxonomy_manager_check_circular_hierarchy($selected_tids, $parents)) {
- form_set_error('move', t('Invalid selection. The resulting hierarchy would contain circles, which is not allowed. A term cannot be a parent of itself.'));
- $form_state['rebuild'] = TRUE;
- }
- elseif (!taxonomy_manager_check_language($form_state['values']['voc']->vid, $selected_tids, $typed_parents)) {
- form_set_error('move', t('Terms must be of the same language'));
- $form_state['rebuild'] = TRUE;
- }
- }
- /**
- * checks for circles in the hierarchy, e.g. 1 -> 2 -> 3 -> 1
- * a term can't contain itself as a parent
- *
- * returns TRUE if resulting hierarchy is valid, else FALSE
- */
- function taxonomy_manager_check_circular_hierarchy($tids, $new_parents_tids) {
- if (is_array($tids) && is_array($new_parents_tids)) {
- //directly same term
- foreach ($tids as $tid) {
- if (in_array($tid, $new_parents_tids)) {
- return FALSE;
- }
- }
- //same term over more hierarchy levels
- $all_parents = array();
- foreach ($new_parents_tids as $parent_tid) {
- $parents = taxonomy_get_parents_all($parent_tid);
- foreach ($parents as $parent) {
- $all_parents[$parent->tid] = $parent->tid;
- }
- }
- foreach ($tids as $tid) {
- if (in_array($tid, $all_parents)) {
- return FALSE;
- }
- }
- }
- return TRUE;
- }
- /**
- * checks if terms in move or merge operation are of the same language
- *
- * returns TRUE if operation allowed, else FALSE (different languages)
- */
- function taxonomy_manager_check_language($vid, $selected_tids, $parents) {
- if (module_exists('i18_ntaxonomy')) {
- if (count($parents) && count($selected_tids)) {
- $term = array_pop($parents);
- $lang = $term->language;
- if (i18n_taxonomy_vocabulary_mode($voc->vid, I18N_MODE_TRANSLATE)) {
- foreach ($parents as $parent) {
- if (_taxonomy_manager_term_get_lang($parent['tid']) != $lang) {
- return FALSE;
- }
- }
- foreach ($selected_tids as $tid) {
- if (_taxonomy_manager_term_get_lang($tid) != $lang) {
- return FALSE;
- }
- }
- }
- }
- }
- return TRUE;
- }
- /**
- * Submit handler for moving terms
- */
- function taxonomy_manager_form_move_submit($form, $form_state) {
- $selected_tids = array();
- $selected_tids = $form_state['values']['taxonomy']['manager']['tree']['selected_terms'];
- $lang = isset($form_state['values']['taxonomy']['manager']['top']['language']) ? $form_state['values']['taxonomy']['manager']['top']['language'] : NULL;
- $typed_parents = taxonomy_manager_autocomplete_tags_get_tids($form_state['values']['move']['parents'], $form_state['values']['voc']->vid, TRUE, $lang);
- $parents = array();
- foreach ($typed_parents as $parent_info) {
- $parents[] = $parent_info['tid'];
- }
- if (count($parents) == 0) $parents[0] = 0; //if empty, delete all parents
- taxonomy_manager_move($parents, $selected_tids, $form_state['values']['move']['options']);
- if ($form_state['values']['move']['options']['keep_old_parents']) {
- $parents[] = 1; //++ parent count for hierarchy update (-> multi hierarchy)
- }
- taxonomy_manager_update_voc($form_state['values']['voc']->vid, $parents);
- $term_names_array = array();
- foreach ($selected_tids as $selected_tid) {
- $term = taxonomy_term_load($selected_tid);
- $term_names_array[] = $term->name;
- }
- $term_names = implode(', ', $term_names_array);
- $parent_names = "";
- if (count($typed_parents) == 0) {
- $parent_names = t("root level");
- }
- else {
- $parent_names = $form_state['values']['move']['parents'];
- }
- drupal_set_message(t("Terms %term_names moved to %parent_names", array('%term_names' => $term_names, '%parent_names' => $parent_names)));
- }
- /**
- * Validation handler for validating terms
- */
- function taxonomy_manager_form_term_merge_validate($form, &$form_state) {
- $selected_tids = array();
- $selected_tids = $form_state['values']['taxonomy']['manager']['tree']['selected_terms'];
- $dest_terms = array();
- $regexp = '%(?:^|,\ *)("(?>[^"]*)(?>""[^"]* )*"|(?: [^",]*))%x';
- preg_match_all($regexp, $form_state['values']['term_merge']['dest_term'], $matches);
- $dest_terms = $matches[1];
- $error_msg = "";
- $typed_terms = taxonomy_manager_autocomplete_tags_get_tids($form_state['values']['term_merge']['dest_term'], $form_state['values']['voc']->vid, FALSE);
- if (!is_array($dest_terms) || count($dest_terms) == 0 || empty($dest_terms[0])) {
- form_set_error('term_merge][dest_term', t('Please enter a name into "Destination term"'));
- $form_state['rebuild'] = TRUE;
- }
- elseif (count($dest_terms) > 1) {
- form_set_error('term_merge][dest_term', t('Please only enter single names into "Destination term"'));
- $form_state['rebuild'] = TRUE;
- }
- if (count($selected_tids) < 1) {
- form_set_error('term_merge', t("Please selecte terms you want to merge"));
- $form_state['rebuild'] = TRUE;
- }
- elseif (_taxonomy_manager_check_duplicates($form_state['values']['voc']->vid, $form_state['values']['term_merge']['dest_term'], $error_msg)) {
- form_set_error('term_merge', t("Warning: Your input matches with multiple terms, because of duplicated term names. Please enter a unique term name or the term id with 'term-id:[tid]'") . " (" . $error_msg . ").");
- $form_state['rebuild'] = TRUE;
- }
- }
- /**
- * Submit handler for term merge
- */
- function taxonomy_manager_form_term_merge_submit($form, $form_state) {
- $selected_tids = array();
- $selected_tids = $form_state['values']['taxonomy']['manager']['tree']['selected_terms'];
- $dest_term_ids = taxonomy_manager_autocomplete_tags_get_tids($form_state['values']['term_merge']['dest_term'], $form_state['values']['voc']->vid, TRUE);
- $dest_term_id = array_shift($dest_term_ids);
- $dest_term = taxonomy_term_load($dest_term_id['tid']);
- $term_names_array = array();
- foreach ($selected_tids as $selected_tid) {
- $term = taxonomy_term_load($selected_tid);
- $term_names_array[] = $term->name;
- }
- $term_names = implode($term_names_array, ', ');
- if (module_exists('term_merge')) {
- term_merge($selected_tids, $dest_term->tid, $form_state['values']['term_merge']['options']['keep_merged']);
- drupal_set_message(t("Terms %term_names merged into %dest_term", array('%term_names' => $term_names, '%dest_term' => $dest_term->name)));
- }
- else {
- drupal_set_message(t('Term merge module not found'));
- }
- }
- /**
- * returns TRUE if term with same name exists more often
- */
- function _taxonomy_manager_check_duplicates($vid, $autocomplete_value, &$msg) {
- $regexp = '%(?:^|,\ *)("(?>[^"]*)(?>""[^"]* )*"|(?: [^",]*))%x';
- preg_match_all($regexp, $autocomplete_value, $matches);
- foreach ($matches[1] as $match) {
- $terms = array();
- $terms = taxonomy_manager_autocomplete_tags_get_tids($match, $vid, FALSE);
- if (count($terms) > 1) {
- $tids = array();
- foreach ($terms as $t) {
- $term = taxonomy_term_load($t['tid']);
- $tids[] = $term->tid . (!empty($term->language) ? '-' . check_plain($term->language) : '');
- }
- $msg .= check_plain($match) . ": " . implode(", ", $tids);
- return TRUE;
- }
- }
- return FALSE;
- }
- function taxonomy_manager_form_double_tree_submit($form, &$form_state) {
- drupal_goto('admin/structure/taxonomy_manager/double-tree/' . $form_state['values']['voc']->machine_name . '/' . $form_state['values']['double-tree-settings']['voc2_machine_name']);
- }
- function taxonomy_manager_form_double_tree_disable_submit($form, &$form_state) {
- drupal_goto('admin/structure/taxonomy_manager/voc/' . $form_state['values']['voc']->machine_name);
- }
- /**
- * Defines a settings form.
- */
- function taxonomy_manager_settings($form) {
- $form['taxonomy_manager_disable_mouseover'] = array(
- '#type' => 'checkbox',
- '#title' => t('Disable mouse-over effect for terms (weights and direct link)'),
- '#default_value' => variable_get('taxonomy_manager_disable_mouseover', 0),
- '#description' => t('Disabeling this feature speeds up the Taxonomy Manager'),
- );
- $form['taxonomy_manager_pager_tree_page_size'] = array(
- '#type' => 'select',
- '#title' => t('Pager count'),
- '#options' => array(25 => 25, 50 => 50, 75 => 75, 100 => 100, 150 => 150, 200 => 200, 250 => 250, 300 => 300, 400 => 400, 500 => 500, 1000 => 1000, 2500 => 2500, 5000 => 5000, 10000 => 10000),
- '#default_value' => variable_get('taxonomy_manager_pager_tree_page_size', TAXONOMY_MANAGER_PAGER_TREE_PAGE_SIZE_DEFAULT),
- '#description' => t('Select how many terms should be listed on one page. Huge page counts can slow down the Taxonomy Manager'),
- );
- return system_settings_form($form);
- }
- function taxonomy_manager_term_data_form_ajax_callback($form, $form_state) {
- $commands = array();
- $commands[] = ajax_command_insert(NULL, drupal_render($form['term_data']));
- $commands[] = ajax_command_after('#term-data-close', theme('status_messages'));
- // Update tree if necessary.
- if (isset($form_state['values']['tree-update'])) {
- if (isset($form_state['values']['tree-update']['update']) && $form_state['values']['tree-update']['update']) {
- $commands[] = ajax_command_insert('#taxonomy-manager .form-item-taxonomy-manager-tree', drupal_render($form['taxonomy']['manager']['tree']));
- if (isset($form['taxonomy2'])) {
- $commands[] = ajax_command_insert('#taxonomy-manager .form-item-taxonomy2-manager-tree', drupal_render($form['taxonomy2']['manager']['tree']));
- }
- }
- elseif (isset($form_state['values']['tree-update']['update-name'])) {
- $selector = 'a.term-data-link-id-' . $form_state['values']['tree-update']['update-name']['tid'];
- $commands[] = ajax_command_html($selector, '<span>' . check_plain($form_state['values']['tree-update']['update-name']['name']) . '</span>');
- }
- }
- return array('#type' => 'ajax', '#commands' => $commands);
- }
- function taxonomy_manager_term_data_form_submit($form, &$form_state) {
- $old_term = taxonomy_term_load($form_state['values']['tid']);
- $term = taxonomy_form_term_submit_build_taxonomy_term($form, $form_state);
- if ($term->weight != $old_term->weight) {
- form_set_value(array('#parents' => array('tree-update')), array('update' => TRUE), $form_state);
- }
- elseif ($term->name != $old_term->name) {
- form_set_value(array('#parents' => array('tree-update')), array('update-name' => array('name' => $term->name, 'tid' => $term->tid)), $form_state);
- }
- elseif (isset($term->language) && $term->language != $old_term->language) {
- form_set_value(array('#parents' => array('tree-update')), array('update' => TRUE), $form_state);
- }
- taxonomy_term_save($term);
- drupal_set_message(t('Updated term data'));
- $form_state['rebuild'] = TRUE;
- }
- function taxonomy_manager_term_data_form_validate_parents_add($form, &$form_state) {
- $term_data = $form_state['values'];
- $term = taxonomy_term_load($term_data['tid']);
- $parent_names = $term_data['parents']['op']['add'];
- $typed_terms = taxonomy_manager_autocomplete_tags_get_tids($parent_names, $term->vid, FALSE);
- $error_msg = "";
- if ($parent_names == "") {
- form_set_error('parents][op][add', t("Parent field is required."));
- }
- elseif (_taxonomy_manager_check_duplicates($term->vid, $parent_names, $error_msg)) {
- form_set_error('parents][op][add', t("Warning: Your input matches with multiple terms, because of duplicated term names. Please enter a unique term name or the term id with 'term-id:[tid]' (!error_msg)", array('!error_msg' => $error_msg)));
- }
- elseif (!taxonomy_manager_check_language($term->vid, array($term->tid), $typed_terms)) {
- form_set_error('parents][op][add', t("Terms must be of the same language."));
- }
- else {
- //validation for consistent hierarchy
- $parents = array();
- foreach ($typed_terms as $parent_info) {
- $parents[$parent_info['tid']] = $parent_info['tid'];
- }
- if (!taxonomy_manager_check_circular_hierarchy(array($term->tid => $term->tid), $parents)) {
- form_set_error('parents][op][add', t('Invalid parent. The resulting hierarchy would contain circles, which is not allowed. A term cannot be a parent of itself.'));
- }
- }
- }
- /**
- * Submit handler for adding parents for a term.
- */
- function taxonomy_manager_term_data_form_submit_parents_add($form, &$form_state) {
- $term_data = $form_state['values'];
- $term = taxonomy_term_load($term_data['tid']);
- $parent_names = $term_data['parents']['op']['add'];
- $typed_terms = taxonomy_manager_autocomplete_tags_get_tids($parent_names, $term->vid, TRUE); //insert terms
- if (!isset($term->parent)) {
- $term->parent = array();
- }
- foreach ($typed_terms as $parent_info) {
- $term->parent[] = $parent_info['tid'];
- }
- //remove root level entry
- db_delete('taxonomy_term_hierarchy')
- ->condition('tid', $term->tid)
- ->condition('parent', 0)
- ->execute();
- taxonomy_term_save($term); //executes hooks and clears caches
- taxonomy_manager_update_voc($term->vid, taxonomy_get_parents($term->tid)); // update hierarchy settings, if necessary
- drupal_set_message(t('Updated hierarchy'));
- $form_state['rebuild'] = TRUE;
- form_set_value(array('#parents' => array('tree-update')), array('update' => TRUE), $form_state);
- }
- function taxonomy_manager_term_data_form_validate_parents_remove($form, &$form_state) {
- $splits = explode('][', $form_state['triggering_element']['#name']);
- if (count($splits) == 3 && is_numeric($splits[1])) {
- form_set_value(array('#parents' => array('remove_parent_tid')), $splits[1], $form_state);
- }
- else {
- form_set_error('parents', t('Invalid term selection.'));
- }
- }
- /**
- * Submit handler for removing a parent of a term.
- */
- function taxonomy_manager_term_data_form_submit_parents_remove($form, &$form_state) {
- $term = taxonomy_term_load($form_state['values']['tid']);
- $parent = $form_state['values']['remove_parent_tid'];
- $parents = taxonomy_get_parents($term->tid);
- if (!isset($term->parent)) {
- $term->parent = array();
- }
- // Ensure that a term has a least parent 0.
- if (count($parents) == 1) {
- $term->parent[] = 0;
- }
- $term->parent = array_diff($term->parent, array($parent));
- taxonomy_term_save($term); //executes hooks and clears caches
- drupal_set_message(t("Removed parent"));
- $form_state['rebuild'] = TRUE;
- form_set_value(array('#parents' => array('tree-update')), array('update' => TRUE), $form_state);
- }
- /**
- * Validation handler for adding a single translation on the term data form.
- */
- function taxonomy_manager_term_data_form_validate_translation_add($form, &$form_state) {
- $term_data = $form_state['values'];
- $term1 = taxonomy_term_load($term_data['tid']);
- $input = $term_data['translations']['op']['add'];
- $language = $term_data['translations']['op']['language'];
- $typed_terms = taxonomy_manager_autocomplete_tags_get_tids($term_data['translations']['op']['add'], $term1->vid, FALSE, $language);
- if (empty($input) || count($typed_terms) > 1) {
- form_set_error('translations][op][add', t("Please input one term with an appropriate language."));
- }
- elseif ($term1->language == $language) {
- form_set_error('translations][op', t("Added term is of the same language."));
- return;
- }
- elseif (!is_null(i18n_taxonomy_term_get_translation($term1, $language))) {
- form_set_error('translations][op][language', t('A translation for this language already exists.'));
- return;
- }
- elseif (count($typed_terms) == 1) {
- $entry = array_shift($typed_terms);
- $term2 = taxonomy_term_load($entry['tid']);
- if (!is_null(i18n_taxonomy_term_get_translation($term2, $term1->language))) {
- form_set_error('translations][op][add', t('A translation for this term already exists.'));
- }
- }
- }
- /**
- * Submit handler for adding a single translation on the term data form.
- */
- function taxonomy_manager_term_data_form_submit_translation_add($form, &$form_state) {
- $term_data = $form_state['values'];
- $term1 = taxonomy_term_load($term_data['tid']);
- $voc = taxonomy_vocabulary_load($term1->vid);
- $typed_terms = taxonomy_manager_autocomplete_tags_get_tids($term_data['translations']['op']['add'], $term1->vid, TRUE, $term_data['translations']['op']['language']);
- $entry = array_shift($typed_terms);
- $term2 = taxonomy_term_load($entry['tid']);
- taxonomy_manager_add_translation($term1, $term2, $voc);
- drupal_set_message(t('The translation has been added'));
- $form_state['rebuild'] = TRUE;
- form_set_value(array('#parents' => array()), array('update' => TRUE), $form_state);
- }
- /**
- * Validation handler for removing a single translation on the term data form.
- */
- function taxonomy_manager_term_data_form_validate_translation_remove($form, &$form_state) {
- $splits = explode('][', $form_state['triggering_element']['#name']);
- if (count($splits) == 3 && is_numeric($splits[1])) {
- form_set_value(array('#parents' => array('remove_translation_tid')), $splits[1], $form_state);
- }
- else {
- form_set_error('translations', t('Invalid term selection.'));
- }
- }
- /**
- * Submit handler for removing a single translation on the term data form.
- */
- function taxonomy_manager_term_data_form_submit_translation_remove($form, &$form_state) {
- $term = taxonomy_term_load($form_state['values']['tid']);
- $term_to_remove = taxonomy_term_load($form_state['values']['remove_translation_tid']);
- $translation_set = i18n_translation_set_load($term->i18n_tsid);
- $translation_set->remove_language($term_to_remove->language)
- ->update_delete();
- drupal_set_message(t("Removed term from translation."));
- $form_state['rebuild'] = TRUE;
- form_set_value(array('#parents' => array()), array('update' => TRUE), $form_state);
- }
- function taxonomy_manager_double_tree_ajax_callback($form, $form_state) {
- $commands = array();
- $commands[] = ajax_command_prepend(NULL, theme('status_messages'));
- if ($form_state['values']['double_tree_values']['update_tree_left']) {
- $commands[] = ajax_command_insert('#taxonomy-manager .form-item-taxonomy-manager-tree', drupal_render($form['taxonomy']['manager']['tree']));
- }
- if ($form_state['values']['double_tree_values']['update_tree_right']) {
- $commands[] = ajax_command_insert('#taxonomy-manager .form-item-taxonomy2-manager-tree', drupal_render($form['taxonomy2']['manager']['tree']));
- }
- return array('#type' => 'ajax', '#commands' => $commands);
- }
- function taxonomy_manager_double_tree_move_validate($form, &$form_state) {
- $values = array();
- if (strpos($form_state['input']['_triggering_element_name'], 'right') !== FALSE) {
- //move right
- $values = array(
- 'selected_parents' => $form_state['values']['taxonomy2']['manager']['tree']['selected_terms'],
- 'selected_terms' => $form_state['values']['taxonomy']['manager']['tree']['selected_terms'],
- 'selected_terms_direct_parents' => $form_state['values']['taxonomy']['manager']['tree']['selected_terms_direct_parents'],
- 'left_tree_expand_terms' => $form_state['values']['taxonomy']['manager']['tree']['selected_terms_direct_parents'],
- 'right_tree_expand_terms' => $form_state['values']['taxonomy2']['manager']['tree']['selected_terms'],
- );
- }
- else {
- //move left
- $values = array(
- 'selected_parents' => $form_state['values']['taxonomy']['manager']['tree']['selected_terms'],
- 'selected_terms' => $form_state['values']['taxonomy2']['manager']['tree']['selected_terms'],
- 'selected_terms_direct_parents' => $form_state['values']['taxonomy2']['manager']['tree']['selected_terms_direct_parents'],
- 'left_tree_expand_terms' => $form_state['values']['taxonomy']['manager']['tree']['selected_terms'],
- 'right_tree_expand_terms' => $form_state['values']['taxonomy2']['manager']['tree']['selected_terms_direct_parents'],
- );
- }
- $values['update_tree_right'] = TRUE;
- $values['update_tree_left'] = TRUE;
- if (!count($values['selected_terms'])) {
- form_set_error('', t("No terms selected."));
- }
- elseif (is_array($values['selected_parents']) && count($values['selected_parents'])) {
- $p_array = array();
- foreach ($values['selected_parents'] as $parent) {
- $p_array[$parent]['tid'] = $parent;
- }
- if (!taxonomy_manager_check_language($form_state['values']['voc']->vid, $values['selected_terms'], $p_array)) {
- form_set_error('', t("Terms must be of the same language."));
- }
- elseif (!taxonomy_manager_check_circular_hierarchy($values['selected_terms'], $values['selected_parents'])) {
- form_set_error('', t('Invalid parent. The resulting hierarchy would contain circles, which is not allowed. A term cannot be a parent of itself.'));
- }
- }
- form_set_value(array('#parents' => array('double_tree_values')), $values, $form_state);
- }
- function taxonomy_manager_double_tree_move_submit($form, &$form_state) {
- $selected_terms = $form_state['values']['double_tree_values']['selected_terms'];
- $selected_parents = $form_state['values']['double_tree_values']['selected_parents'];
- $selected_terms_direct_parents = $form_state['values']['double_tree_values']['selected_terms_direct_parents'];
- $selected_terms_names = array();
- foreach ($selected_terms as $tid) {
- $selected_term = taxonomy_term_load($tid);
- $selected_terms_names[] = $selected_term->name;
- //reset all parents, except the direct parent in the tree
- $term_parents = taxonomy_get_parents($tid);
- $term_parents_array = array();
- $direct_parent = isset($selected_terms_direct_parents[$tid]) ? $selected_terms_direct_parents[$tid] : 0;
- foreach ($term_parents as $term_parent) {
- if ($direct_parent != $term_parent->tid) {
- $term_parents_array[$term_parent->tid] = $term_parent->tid;
- }
- }
- $selected_parent_names = array();
- if (count($selected_parents)) {
- foreach ($selected_parents as $parent) {
- $term = taxonomy_term_load($parent);
- $selected_parent_names[] = $term->name;
- $term_parents_array[$term->tid] = $term->tid;
- }
- }
- if (count($term_parents_array) == 0) {
- $term_parents_array[0] = 0;
- }
- taxonomy_manager_move($term_parents_array, array($tid), array('keep_old_parents' => FALSE));
- taxonomy_manager_update_voc($form_state['values']['voc']->vid, $term_parents_array);
- }
- $term_names = implode(', ', $selected_terms_names);
- if (count($selected_parents) == 0) {
- drupal_set_message(t("Removed current parent form terms %terms.", array('%terms' => $term_names)));
- }
- else {
- drupal_set_message(t("Terms %terms moved to parents %parents.", array('%terms' => $term_names, '%parents' => implode(', ', $selected_parent_names))));
- }
- $form_state['rebuild'] = TRUE;
- }
- function taxonomy_manager_double_tree_switch_validate($form, &$form_state) {
- $values = array();
- if (strpos($form_state['input']['_triggering_element_name'], 'right') !== FALSE) {
- //move right
- $values = array(
- 'selected_parents' => $form_state['values']['taxonomy2']['manager']['tree']['selected_terms'],
- 'selected_terms' => $form_state['values']['taxonomy']['manager']['tree']['selected_terms'],
- 'left_tree_expand_terms' => $form_state['values']['taxonomy']['manager']['tree']['selected_terms_direct_parents'],
- 'right_tree_expand_terms' => $form_state['values']['taxonomy']['manager']['tree']['selected_terms'],
- 'voc1' => $form_state['values']['voc']->vid,
- 'voc2' => $form_state['values']['voc2']->vid,
- );
- }
- else {
- //move left
- $values = array(
- 'selected_parents' => $form_state['values']['taxonomy']['manager']['tree']['selected_terms'],
- 'selected_terms' => $form_state['values']['taxonomy2']['manager']['tree']['selected_terms'],
- 'left_tree_expand_terms' => $form_state['values']['taxonomy2']['manager']['tree']['selected_terms'],
- 'right_tree_expand_terms' => $form_state['values']['taxonomy2']['manager']['tree']['selected_terms_direct_parents'],
- 'voc1' => $form_state['values']['voc2']->vid,
- 'voc2' => $form_state['values']['voc']->vid,
- );
- }
- $values['update_tree_right'] = TRUE;
- $values['update_tree_left'] = TRUE;
- if (!count($values['selected_terms'])) {
- form_set_error('', t("No terms selected."));
- }
- form_set_value(array('#parents' => array('double_tree_values')), $values, $form_state);
- }
- function taxonomy_manager_double_tree_copy_validate($form, &$form_state) {
- taxonomy_manager_double_tree_switch_validate($form, $form_state);
- $values = $form_state['values']['double_tree_values'];
- if (strpos($form_state['input']['_triggering_element_name'], 'right') !== FALSE) {
- $form_state['values']['double_tree_values']['update_tree_left'] = FALSE;
- }
- else {
- $form_state['values']['double_tree_values']['update_tree_right'] = FALSE;
- }
- }
- function taxonomy_manager_double_tree_copy_submit($form, &$form_state) {
- $selected_terms = $form_state['values']['double_tree_values']['selected_terms'];
- $selected_parents = $form_state['values']['double_tree_values']['selected_parents'];
- $voc1 = $form_state['values']['double_tree_values']['voc1'];
- $voc2 = $form_state['values']['double_tree_values']['voc2'];
- $voc1 = taxonomy_vocabulary_load($voc1);
- $voc2 = taxonomy_vocabulary_load($voc2);
- $new_tids = taxonomy_manager_copy($selected_terms, $voc1->vid, $voc2->vid, $selected_parents);
- if (count($new_tids)) {
- $new_tid = array_pop($new_tids);
- $form_state['values']['double_tree_values']['left_tree_expand_terms'] = array($new_tid);
- $form_state['values']['double_tree_values']['right_tree_expand_terms'] = array($new_tid);
- }
- $selected_terms_names = array();
- foreach ($selected_terms as $tid) {
- $term = taxonomy_term_load($tid);
- $selected_terms_names[] = $term->name;
- }
- $selected_parent_names = array();
- if (count($selected_parents)) {
- foreach ($selected_parents as $parent) {
- $term = taxonomy_term_load($parent);
- $selected_parent_names[] = $term->name;
- $term_parents_array[$term->tid] = $term->tid;
- }
- }
- $term_names = implode(', ', $selected_terms_names);
- if (count($selected_parents) == 0) {
- drupal_set_message(t("Copied %terms to vocabulary %voc.", array('%terms' => $term_names, '%voc' => $voc2->name)));
- }
- else {
- drupal_set_message(t("Copied %terms to vocabulary %voc under parents %parents.", array('%terms' => $term_names, '%voc' => $voc2->name, '%parents' => implode(', ', $selected_parent_names))));
- }
- $form_state['rebuild'] = TRUE;
- }
- function taxonomy_manager_double_tree_switch_submit($form, &$form_state) {
- $selected_terms = $form_state['values']['double_tree_values']['selected_terms'];
- $selected_parents = $form_state['values']['double_tree_values']['selected_parents'];
- $voc1 = $form_state['values']['double_tree_values']['voc1'];
- $voc2 = $form_state['values']['double_tree_values']['voc2'];
- $voc1 = taxonomy_vocabulary_load($voc1);
- $voc2 = taxonomy_vocabulary_load($voc2);
- taxonomy_manager_switch($selected_terms, $voc1->vid, $voc2->vid, $selected_parents);
- $selected_terms_names = array();
- foreach ($selected_terms as $tid) {
- $term = taxonomy_term_load($tid);
- $selected_terms_names[] = $term->name;
- }
- $selected_parent_names = array();
- if (count($selected_parents)) {
- foreach ($selected_parents as $parent) {
- $term = taxonomy_term_load($parent);
- $selected_parent_names[] = $term->name;
- $term_parents_array[$term->tid] = $term->tid;
- }
- }
- $term_names = implode(', ', $selected_terms_names);
- if (count($selected_parents) == 0) {
- drupal_set_message(t("Terms %terms moved to vocabulary %voc.", array('%terms' => $term_names, '%voc' => $voc2->name)));
- }
- else {
- drupal_set_message(t("Terms %terms moved to vocabulary %voc under parents %parents.", array('%terms' => $term_names, '%voc' => $voc2->name, '%parents' => implode(', ', $selected_parent_names))));
- }
- $form_state['rebuild'] = TRUE;
- }
- /**
- * Validation handler for adding a translation.
- */
- function taxonomy_manager_double_tree_add_translation_validate($form, &$form_state) {
- if (!module_exists('i18n_taxonomy')) {
- form_set_error('', t("i18n taxonomy module is not enabled."));
- return;
- }
- if (!count($form_state['values']['taxonomy']['manager']['tree']['selected_terms']) || !count($form_state['values']['taxonomy2']['manager']['tree']['selected_terms'])) {
- form_set_error('', t("No terms selected."));
- return;
- }
- $term1 = taxonomy_term_load(array_shift($form_state['values']['taxonomy']['manager']['tree']['selected_terms']));
- $term2 = taxonomy_term_load(array_shift($form_state['values']['taxonomy2']['manager']['tree']['selected_terms']));
- $voc = $form_state['values']['voc'];
- if (!i18n_taxonomy_vocabulary_mode($voc->vid, I18N_MODE_TRANSLATE)) {
- form_set_error('', t('This is not a multilingual vocabulary.'));
- return;
- }
- elseif ($term1->language == $term2->language) {
- form_set_error('', t("Selected terms are of the same language."));
- return;
- }
- elseif (!is_null(i18n_taxonomy_term_get_translation($term1, $term2->language)) ||
- !is_null(i18n_taxonomy_term_get_translation($term2, $term1->language))) {
- form_set_error('', t('A translation for this term or language already exists.'));
- return;
- }
- // Set the values for the submit handler.
- $values = array(
- 'term1' => $term1,
- 'term2' => $term2,
- 'voc' => $voc,
- );
- form_set_value(array('#parents' => array('double_tree_values')), $values, $form_state);
- }
- /**
- * Submit handler for adding a translation.
- */
- function taxonomy_manager_double_tree_add_translation_submit($form, &$form_state) {
- $term1 = $form_state['values']['double_tree_values']['term1'];
- $term2 = $form_state['values']['double_tree_values']['term2'];
- $voc = $form_state['values']['double_tree_values']['voc'];
- taxonomy_manager_add_translation($term1, $term2, $voc);
- drupal_set_message(t("Translation for %term2 - %term1 added.", array('%term2' => $term2->name, '%term1' => $term1->name)));
- }
- /**
- * Helper function for adding a translation between two terms.
- */
- function taxonomy_manager_add_translation($term1, $term2, $voc) {
- if (!module_exists('i18n_taxonomy')) {
- return;
- }
- if (!empty($term1->i18n_tsid)) {
- $translation_set = i18n_taxonomy_translation_set_load($term1->i18n_tsid);
- }
- else {
- // No translation set yet, build a new one with the source term.
- $translation_set = i18n_translation_set_create('taxonomy_term', $voc->machine_name)
- ->add_item($term1);
- }
- $translation_set->add_item($term2)->save();
- }
- /**
- * Duplicates a term to another voc
- */
- function taxonomy_manager_copy($tids, $from_voc, $to_voc, $selected_parents) {
- $new_tids = array();
- foreach ($tids as $tid) {
- $term = taxonomy_term_load($tid);
- $new_term = clone $term;
- unset($new_term->tid);
- $new_term->parent = count($selected_parents) ? $selected_parents : 0;
- $new_term->vid = $to_voc;
- // UUID integration: unset uuid on copy.
- if (isset($new_term->uuid)) {
- unset($new_term->uuid);
- }
- taxonomy_term_save($new_term);
- $new_tids[] = $new_term->tid;
- }
- taxonomy_manager_update_voc($to_voc, $selected_parents);
- taxonomy_terms_static_reset();
- return $new_tids;
- }
- /**
- * Changes vocabulary of given terms and its children
- * conflicts might be possible with multi-parent terms!
- */
- function taxonomy_manager_switch($tids, $from_voc, $to_voc, $parents = array()) {
- foreach ($tids as $tid) {
- //hook to inform modules about the changes
- module_invoke_all('taxonomy_manager_term', 'switch', $tid, $from_voc, $to_voc);
- $children = taxonomy_get_tree($from_voc, $tid);
- $terms_to_switch = array();
- foreach ($children as $child) {
- $terms_to_switch[] = $child->tid;
- }
- $terms_to_switch[] = $tid;
- db_update('taxonomy_term_data')
- ->fields(array('vid' => $to_voc))
- ->condition('tid', $terms_to_switch, 'IN')
- ->execute();
- taxonomy_terms_static_reset();
- //delete references to parents from the old voc
- foreach ($children as $child) {
- $term_parents = taxonomy_get_parents($child->tid);
- foreach ($term_parents as $term_parent) {
- if ($term_parent->vid != $to_voc) {
- db_delete('taxonomy_term_hierarchy')
- ->condition('tid', $child->tid)
- ->condition('parent', $term_parent->tid)
- ->execute();
- }
- }
- }
- //set parent of the selected term
- if (!count($parents)) {
- $parents[0] = 0;
- }
- taxonomy_manager_move($parents, array($tid));
- taxonomy_manager_update_voc($to_voc, $parents);
- }
- //TODO invoke update hook!!
- taxonomy_terms_static_reset();
- }
- /**
- * checks if voc has terms
- *
- * @param $vid voc id
- * @return true, if terms already exists, else false
- */
- function _taxonomy_manager_voc_is_empty($vid) {
- $has_rows = (bool) db_query_range("SELECT 1 FROM {taxonomy_term_data} t INNER JOIN {taxonomy_term_hierarchy} h ON t.tid = h.tid WHERE vid = :vid AND h.parent = 0", 0, 1, array(':vid' => $vid))->fetchField();
- return !$has_rows;
- }
- /**
- * deletes terms from the database
- * optional orphans (terms where parent get deleted) can be deleted as well
- *
- * (difference to taxonomy_term_delete: deletion of orphans optional)
- *
- * @param $tids array of term id to delete
- * @param $options associative array with options
- * if $options['delete_orphans'] is true, orphans get deleted
- */
- function taxonomy_manager_delete_terms($tids, $options = array()) {
- $deleted_term = array();
- $remaining_child_terms = array();
- if (!is_array($tids)) array($tids);
- while (count($tids) > 0) {
- $orphans = array();
- foreach ($tids as $tid) {
- if ($children = taxonomy_get_children($tid)) {
- foreach ($children as $child) {
- $parents = taxonomy_get_parents($child->tid);
- if ($options['delete_orphans']) {
- if (count($parents) == 1) {
- $orphans[$child->tid] = $child->tid;
- }
- else {
- $remaining_child_terms[$child->tid] = $child;
- }
- }
- else {
- $remaining_child_terms[$child->tid] = $child;
- db_delete('taxonomy_term_hierarchy')
- ->condition('tid', $child->tid)
- ->condition('parent', $tid)
- ->execute();
- if (count($parents) == 1) {
- $is_root = (bool) db_query_range("SELECT 1 FROM {taxonomy_term_hierarchy} h WHERE h.tid = :tid AND h.parent = 0", 0, 1, array(':tid' => $child->tid))->fetchField();
- if (!$is_root) {
- db_insert('taxonomy_term_hierarchy')
- ->fields(array('tid', 'parent'))
- ->values(array('tid' => $child->tid, 'parent' => 0))
- ->execute();
- }
- }
- }
- }
- }
- $term = taxonomy_term_load($tid);
- if ($term) {
- $deleted_terms[] = $term;
- db_delete('taxonomy_term_data')
- ->condition('tid', $tid)
- ->execute();
- db_delete('taxonomy_term_hierarchy')
- ->condition('tid', $tid)
- ->execute();
- field_attach_delete('taxonomy_term', $term);
- module_invoke_all('taxonomy_term_delete', $term);
- // Reset cache after each deletion as it might affect parents/children information that is used later on.
- taxonomy_terms_static_reset();
- }
- }
- $tids = $orphans;
- }
- return array('deleted_terms' => $deleted_terms, 'remaining_child_terms' => $remaining_child_terms);
- }
- /**
- * Moves terms in hierarchies to other parents
- *
- * @param $parents
- * Array of parent term ids to where children can be moved.
- * Array should only contain more parents if multi hierarchy is enabled.
- * If array contains 0, terms get moved to root level
- * @param $children
- * Array of term ids to move
- * @param $options
- * Array of additional options for moving
- * 'keep_old_parents': if true, existing parents does not get deleted (only
- * possible with multi hierarchies).
- */
- function taxonomy_manager_move($parents, $children, $options = array()) {
- if (!is_array($parents)) {
- $parents = array($parents);
- }
- // Key parent terms array by tid, so that it is always unique.
- $keyed_array = array();
- foreach ($parents as $parent) {
- $keyed_array[$parent] = $parent;
- }
- $parents = $keyed_array;
- foreach ($children as $child) {
- $term = taxonomy_term_load($child);
- $term_parents = $parents;
- if (isset($options['keep_old_parents']) && $options['keep_old_parents']) {
- // Add existing parents to $term_parents array
- $results = db_select('taxonomy_term_hierarchy', 'h')
- ->condition('tid', $child)
- ->fields('h')
- ->execute();
- foreach ($results as $p) {
- $term_parents[$p->parent] = $p->parent;
- }
- }
- $term->parent = $term_parents;
- taxonomy_term_save($term);
- }
- taxonomy_terms_static_reset();
- }
- /**
- * helper function for getting out of term ids from autocomplete fields
- * non-exsiting terms get inserted autmatically
- * the input gets parsed for term names, optional a term id can be directly passed with prefixing the input with 'term-id:'
- *
- * @param $typed_input input string of form field
- * @param $vid vocabulary id
- * @param $insert_new TRUE if non-existing terms should be inserted
- * @param $lang define the language (optional)
- * @return array of term ids
- */
- function taxonomy_manager_autocomplete_tags_get_tids($typed_input, $vid, $insert_new = TRUE, $lang = NULL) {
- $tids = array();
- $regexp = '%(?:^|,\ *)("(?>[^"]*)(?>""[^"]* )*"|(?: [^",]*))%x';
- preg_match_all($regexp, $typed_input, $matches);
- $typed_terms = array_unique($matches[1]);
- foreach ($typed_terms as $typed_term) {
- $typed_term = str_replace('""', '"', preg_replace('/^"(.*)"$/', '\1', $typed_term));
- $typed_term = trim($typed_term);
- if ($typed_term != "") {
- if (substr($typed_term, 0, 8) == "term-id:") {
- $id = substr($typed_term, 8);
- $term = taxonomy_term_load($id);
- if ($term->vid == $vid) {
- $tids[$term->tid]['tid'] = $term->tid;
- }
- }
- else {
- $possibilities = taxonomy_get_term_by_name($typed_term);
- $typed_term_tid = NULL; // tid match if any.
- foreach ($possibilities as $possibility) {
- if ($possibility->vid == $vid && !($lang && $lang != $possibility->language)) {
- $typed_term_tid = $possibility->tid;
- $tids[$typed_term_tid]['tid'] = $typed_term_tid;
- }
- }
- if (!$typed_term_tid && $insert_new) {
- // Truncate long string names that will cause database exceptions.
- if (strlen($typed_term) > 255) {
- $typed_term = substr($typed_term, 0, 255);
- }
- $edit = new stdClass;
- $edit->name = $typed_term;
- $edit->vid = $vid;
- if (module_exists('i18n_taxonomy') && $lang != "" && i18n_taxonomy_vocabulary_mode($vid, I18N_MODE_TRANSLATE)) {
- $edit->language = $lang;
- }
- $status = taxonomy_term_save($edit);
- $typed_term_tid = $edit->tid;
- $tids[$typed_term_tid]['tid'] = $typed_term_tid;
- $tids[$typed_term_tid]['new'] = TRUE;
- }
- }
- }
- }
- return $tids;
- }
- /**
- * similar to taxonomy_manager_autocomplete_tags_get_tids, but used for searching terms
- * takes synonyms and selected subtrees into account
- *
- * @param $typed_input input string of form field
- * @param $vid vocabulary id
- * @param $include_synonyms TRUE if search should include synonyms
- * @param $parents array of parents
- * @return array of term ids
- */
- function taxonomy_manager_autocomplete_search_terms($typed_input, $vid, $include_synonyms = FALSE, $parents = array(), $language = NULL) {
- $tids = array();
- if ($language != NULL && $language == "no language") {
- $language = "";
- }
- $regexp = '%(?:^|,\ *)("(?>[^"]*)(?>""[^"]* )*"|(?: [^",]*))%x';
- preg_match_all($regexp, $typed_input, $matches);
- $typed_terms = array_unique($matches[1]);
- foreach ($typed_terms as $typed_term) {
- $typed_term = str_replace('""', '"', preg_replace('/^"(.*)"$/', '\1', $typed_term));
- $typed_term = trim($typed_term);
- if ($typed_term == "") {
- continue;
- }
- //TODO
- /*if ($include_synonyms) {
- if ($language != NULL) {
- $search_sql = db_query("SELECT td.tid FROM {term_data} td LEFT JOIN {term_synonym} ts ON td.tid = ts.tid WHERE td.vid = %d AND (td.name = '%s' OR ts.name = '%s') AND td.language = '%s'", $vid, $typed_term, $typed_term, $language);
- }
- else {
- $search_sql = db_query("SELECT td.tid FROM {term_data} td LEFT JOIN {term_synonym} ts ON td.tid = ts.tid WHERE td.vid = %d AND (td.name = '%s' OR ts.name = '%s')", $vid, $typed_term, $typed_term);
- }
- }
- else {
- if ($language != NULL) {
- $search_sql = db_query("SELECT td.tid FROM {term_data} td WHERE td.vid = %d AND td.name = '%s' AND td.language = '%s'", $vid, $typed_term, $language);
- }
- else {
- $search_sql = db_query("SELECT td.tid FROM {term_data} td WHERE td.vid = %d AND td.name = '%s'", $vid, $typed_term);
- }
- }*/
- $terms = taxonomy_get_term_by_name($typed_term);
- foreach ($terms as $term) {
- if ($term->vid == $vid) {
- $tids[] = $term->tid;
- }
- }
- if (count($parents)) {
- $filtered_tids = array();
- foreach ($tids as $tid) {
- $parents_all = taxonomy_get_parents_all($tid);
- foreach ($parents_all as $key => $parent) {
- if (in_array($parent->tid, $parents)) {
- $filtered_tids[] = $tid;
- break;
- }
- }
- }
- $tids = $filtered_tids;
- }
- }
- return $tids;
- }
- /**
- * callback for updating weights
- * data send through AJAX, $_POST
- * $_POST[$tid] => $weight
- *
- */
- function taxonomy_manager_update_weights() {
- $submitted_data = $_POST;
- if (isset($submitted_data['form_token']) && isset($submitted_data['form_id']) && !empty($submitted_data['weights']) && is_array($submitted_data['weights'])) {
- if (drupal_valid_token($submitted_data['form_token'], $submitted_data['form_id'])) {
- foreach ($submitted_data['weights'] as $tid => $weight) {
- if (is_numeric($tid) && is_numeric($weight)) {
- $term = taxonomy_term_load($tid);
- $term->weight = $weight;
- taxonomy_term_save($term);
- }
- }
- }
- }
- exit();
- }
- /**
- * Submit handler for the export form.
- */
- function taxonomy_manager_export_form_submit($form, &$form_state) {
- $voc = $form_state['values']['voc'];
- $selected_tids = $selected_tids = $form_state['values']['taxonomy']['manager']['tree']['selected_terms'];
- $selected_tid = count($selected_tids) ? array_pop($selected_tids) : 0;
- $options = $form_state['values']['export'];
- $options['depth'] = !empty($options['depth']) ? $options['depth'] : NULL;
- $tree = taxonomy_manager_export_get_tree($voc->vid, $selected_tid, $options['depth'], $options['scope']);
- $data = '';
- if ($options['format'] == 'csv') {
- $data = taxonomy_manager_export_csv($tree, $options['csv']['delimiter']);
- }
- elseif ($options['format'] == 'term_tree') {
- $data = taxonomy_manager_export_term_tree($tree);
- }
- $form_state['values']['export']['data'] = $data;
- $form_state['rebuild'] = TRUE;
- }
- /**
- * Ajax handler for the export form.
- */
- function taxonomy_manager_export_ajax_callback($form, $form_state) {
- return $form['export']['data'];
- }
- /**
- * Generates the CVS Ouput
- */
- function taxonomy_manager_export_csv($tree, $delimiter = ";") {
- $output = "";
- foreach ($tree as $term) {
- $array = array();
- $array[] = '"' . $term->vid . '"';
- $array[] = '"' . $term->tid . '"';
- $array[] = '"' . $term->name . '"';
- $array[] = '"' . $term->description . '"';
- foreach ($term->parents as $parent) {
- $array[] = '"' . $parent . '"';
- }
- $output .= implode($delimiter, $array) . "\n";
- }
- return $output;
- }
- /**
- * Generates term tree export that prefixes child term with dashes.
- *
- * The same format can be used for importing terms (see Add button).
- */
- function taxonomy_manager_export_term_tree($tree) {
- $output = "";
- foreach ($tree as $term) {
- // If a term already starts with dashes, we have to escape the name.
- if (substr($term->name, 0, 1) == '-') {
- $name = '"' . $term->name . '"';
- }
- else {
- $name = $term->name;
- }
- $output .= str_repeat('-', $term->depth) . $name . "\n";
- }
- return $output;
- }
- /**
- * Helper for loading the tree to export.
- */
- function taxonomy_manager_export_get_tree($vid, $selected_tid, $depth, $scope) {
- $tree = array();
- if ($scope == 'whole_voc') {
- $tree = taxonomy_get_tree($vid, 0, $depth);
- }
- elseif ($scope == 'children' && $selected_tid) {
- $tree = taxonomy_get_tree($vid, $selected_tid, $depth);
- }
- elseif ($scope == 'root_terms') {
- $tree = taxonomy_get_tree($vid, 0, 1);
- }
- return $tree;
- }
- /**
- * Helper function that updates the hierarchy settings of a voc
- */
- function taxonomy_manager_update_voc($vid, $parents = array()) {
- $voc = taxonomy_vocabulary_load($vid);
- if ($voc->vid == $vid) {
- $current_hierarchy = count($parents);
- if ($current_hierarchy > 2) {
- $current_hierarchy = 2;
- }
- if ($current_hierarchy > $voc->hierarchy) {
- $voc->hierarchy = $current_hierarchy;
- taxonomy_vocabulary_save($voc);
- }
- }
- }
- /**
- * Retrieve a pipe delimited string of autocomplete suggestions (+synonyms)
- */
- function taxonomy_manager_autocomplete_load($vid, $tags_typed = '') {
- // If the request has a '/' in the search text, then the menu system will have
- // split it into multiple arguments, recover the intended $tags_typed.
- $args = func_get_args();
- // Shift off the $field_name argument.
- array_shift($args);
- $tags_typed = implode('/', $args);
- // The user enters a comma-separated list of tags. We only autocomplete the last tag.
- $tags_typed = drupal_explode_tags($tags_typed);
- $last_string = drupal_strtolower(array_pop($tags_typed));
- $matches = array();
- if ($last_string != '') {
- $query = db_select('taxonomy_term_data', 't');
- $query->addTag('translatable');
- $query->addTag('term_access');
- // Do not select already entered terms.
- if (!empty($tags_typed)) {
- $query->condition('t.name', $tags_typed, 'NOT IN');
- }
- // Select rows that match by term name.
- $tags_return = $query
- ->fields('t', array('tid', 'name'))
- ->condition('t.vid', $vid)
- ->condition('t.name', '%' . db_like($last_string) . '%', 'LIKE')
- ->range(0, 30)
- ->execute()
- ->fetchAllKeyed();
- $prefix = count($tags_typed) ? drupal_implode_tags($tags_typed) . ', ' : '';
- $matches = array();
- foreach ($tags_return as $tid => $name) {
- $n = $name;
- // Term names containing commas or quotes must be wrapped in quotes.
- if (strpos($name, ',') !== FALSE || strpos($name, '"') !== FALSE) {
- $n = '"' . str_replace('"', '""', $name) . '"';
- }
- // Add term name to list of matches.
- $matches[$prefix . $n] = check_plain($name);
- }
- }
- drupal_json_output($matches);
- }
- /**
- * theme function for taxonomy manager form
- */
- function theme_taxonomy_manager_form($variables) {
- $form = $variables['form'];
- $pager = theme('pager');
- $tree = drupal_render($form['taxonomy']);
- $term_data = drupal_render($form['term_data']);
- $top = drupal_render_children($form);
- $output = $top . $pager;
- $output .= '<div id="taxonomy-manager" class="admin clear-block">';
- $output .= '<div id="taxonomy-manager-tree-outer-div" class="left clear-block">';
- $output .= $tree;
- $output .= '</div>';
- $output .= '<div id="taxonomy-term-data" class="right clear-block">';
- $output .= $term_data;
- $output .= '</div>';
- $output .= '</div>';
- return $output;
- }
- /**
- * theme function for taxonomy manager form
- */
- function theme_taxonomy_manager_double_tree_form($variables) {
- $form = $variables['form'];
- $pager = theme('pager');
- $tree1 = drupal_render($form['taxonomy']);
- $tree2 = drupal_render($form['taxonomy2']);
- $operations = drupal_render($form['double-tree']);
- $term_data = drupal_render($form['term_data']);
- $top = drupal_render_children($form);
- $output = $top . $pager;
- $output .= '<div id="taxonomy-manager" class="admin clear-block">';
- $output .= '<div id="taxonomy-manager-tree-outer-div" class="left clear-block">';
- $output .= $tree1;
- $output .= '</div>';
- $output .= '<div id="taxonomy-manager-double-tree-operations">';
- $output .= $operations;
- $output .= '</div>';
- $output .= '<div id="taxonomy2-manager-tree-outer-div" class="left clear-block">';
- $output .= $tree2;
- $output .= '</div>';
- $output .= '<div id="taxonomy-term-data" class="term-data-overlay">';
- $output .= $term_data;
- $output .= '</div>';
- $output .= '</div>';
- return $output;
- }
- /**
- * themes a real button form type (no form submit)
- */
- function theme_no_submit_button($variables) {
- $element = $variables['element'];
- /* Make sure not to overwrite classes.
- if (isset($element['#attributes']['class'])) {
- $element['#attributes']['class'][] = 'form-'. $element['#button_type'] .' '. $element['#attributes']['class'];
- }
- else {
- $element['#attributes']['class'][] = 'form-'. $element['#button_type'];
- }*/
- return '<input type="button" ' . (empty($element['#name']) ? '' : 'name="' . $element['#name'] . '" ') . 'id="' . $element['#id'] . '" value="' . check_plain($element['#value']) . '" ' . drupal_attributes($element['#attributes']) . " />\n";
- }
- /**
- * themes a image type button
- */
- function theme_taxonomy_manager_image_button($element) {
- //TODO still used?
- //Make sure not to overwrite classes
- if (isset($element['#attributes']['class'])) {
- $element['#attributes']['class'] = 'form-' . $element['#button_type'] . ' ' . $element['#attributes']['class'];
- }
- else {
- $element['#attributes']['class'] = 'form-' . $element['#button_type'];
- }
- // here the novelty begins: check if #button_type is normal submit button or image button
- $return_string = '<input ';
- if ($element['#button_type'] == 'image') {
- $return_string .= 'type="image" ';
- }
- else {
- $return_string .= 'type="submit" ';
- }
- $return_string .= (empty($element['#id']) ? '' : 'id="' . $element['#id'] . '" ');
- $return_string .= (empty($element['#name']) ? '' : 'name="' . $element['#name'] . '" ');
- $return_string .= 'value="' . check_plain($element['#value']) . '" ';
- $return_string .= drupal_attributes($element['#attributes']) . " />\n";
- return $return_string;
- }
- function theme_taxonomy_manager_term_data_extra($variables) {
- $element = $variables['element'];
- $rows = array();
- $headers = array();
- foreach (element_children($element['headers']) as $key) {
- if (is_array($element['headers'][$key])) {
- $headers[] = drupal_render($element['headers'][$key]);
- }
- }
- foreach (element_children($element['data']) as $tid) {
- $row = array();
- foreach (element_children($element['data'][$tid]) as $key) {
- if (is_array($element['data'][$tid][$key])) {
- $row[] = array(
- 'data' => drupal_render($element['data'][$tid][$key]) . drupal_render($element['data'][$tid][$key]['tid']),
- 'class' => isset($element['data'][$tid][$key]['#row-class']) ? $element['data'][$tid][$key]['#row-class'] : '',
- );
- }
- }
- $rows[] = $row;
- }
- $row = array();
- foreach (element_children($element['op']) as $key) {
- if (is_array($element['op'][$key])) {
- //$row[] = drupal_render($element['op'][$key]);
- $row[] = array(
- 'data' => drupal_render($element['op'][$key]),
- 'class' => isset($element['op'][$key]['#row-class']) ? $element['op'][$key]['#row-class'] : '',
- );
- }
- }
- $rows[] = $row;
- return theme('table', array('header' => $headers, 'rows' => $rows));
- }
|