materio_showroom.module 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. <?php
  2. // TODO: alter entity translation field permission with field_permission
  3. // __ __ _ _______ __ __
  4. // / / ____ _________ _/ /_(_)___ ____ / ____(_)__ / /___/ /
  5. // / / / __ \/ ___/ __ `/ __/ / __ \/ __ \ / /_ / / _ \/ / __ /
  6. // / /___/ /_/ / /__/ /_/ / /_/ / /_/ / / / / / __/ / / __/ / /_/ /
  7. // /_____/\____/\___/\__,_/\__/_/\____/_/ /_/ /_/ /_/\___/_/\__,_/
  8. /**
  9. * Implements hook_field_info().
  10. *
  11. * Provides the description of the field.
  12. */
  13. function materio_showroom_field_info() {
  14. return array(
  15. // We name our field as the associative name of the array.
  16. 'field_materio_showroom_location' => array(
  17. 'label' => t('Showroom Location'),
  18. 'description' => t('Define material location by showroom'),
  19. 'default_widget' => 'materio_showroom_location_text',
  20. 'default_formatter' => 'materio_showroom_location_simple_text',
  21. ),
  22. );
  23. // TODO: define in settings wich vocabulary is for showrooms
  24. }
  25. /**
  26. * Implements hook_field_validate().
  27. *
  28. * This hook gives us a chance to validate content that's in our
  29. * field. We're really only interested in the $items parameter, since
  30. * it holds arrays representing content in the field we've defined.
  31. * We want to verify that the items only contain RGB hex values like
  32. * this: #RRGGBB. If the item validates, we do nothing. If it doesn't
  33. * validate, we add our own error notification to the $errors parameter.
  34. *
  35. * @see field_example_field_widget_error()
  36. */
  37. // function materio_showroom_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
  38. // foreach ($items as $delta => $item) {
  39. // // if (!empty($item['rgb'])) {
  40. // // if (!preg_match('@^#[0-9a-f]{6}$@', $item['rgb'])) {
  41. // // $errors[$field['field_name']][$langcode][$delta][] = array(
  42. // // 'error' => 'field_example_invalid',
  43. // // 'message' => t('Color must be in the HTML format #abcdef.'),
  44. // // );
  45. // // }
  46. // // }
  47. // }
  48. // }
  49. /**
  50. * Implements hook_field_is_empty().
  51. *
  52. * hook_field_is_empty() is where Drupal asks us if this field is empty.
  53. * Return TRUE if it does not contain data, FALSE if it does. This lets
  54. * the form API flag an error when required fields are empty.
  55. */
  56. function materio_showroom_field_is_empty($item, $field) {
  57. // dsm($item,'item');
  58. // dsm($field,'field');
  59. return empty($item['location']); // && empty($item['showroom_tid'])
  60. }
  61. // ______ __
  62. // / ____/___ _________ ___ ____ _/ /____ __________
  63. // / /_ / __ \/ ___/ __ `__ \/ __ `/ __/ _ \/ ___/ ___/
  64. // / __/ / /_/ / / / / / / / / /_/ / /_/ __/ / (__ )
  65. // /_/ \____/_/ /_/ /_/ /_/\__,_/\__/\___/_/ /____/
  66. /**
  67. * Implements hook_field_formatter_info().
  68. *
  69. * We need to tell Drupal that we have two different types of formatters
  70. * for this field. One will change the text color, and the other will
  71. * change the background color.
  72. *
  73. * @see field_example_field_formatter_view()
  74. */
  75. function materio_showroom_field_formatter_info() {
  76. return array(
  77. // This formatter just displays the hex value in the color indicated.
  78. 'materio_showroom_location_simple_text' => array(
  79. 'label' => t('Simple text-based formatter'),
  80. 'field types' => array('field_materio_showroom_location'),
  81. ),
  82. // This formatter changes the background color of the content region.
  83. // 'field_example_color_background' => array(
  84. // 'label' => t('Change the background of the output text'),
  85. // 'field types' => array('field_example_rgb'),
  86. // ),
  87. );
  88. }
  89. /**
  90. * Implements hook_field_formatter_view().
  91. *
  92. * Two formatters are implemented.
  93. * - field_example_simple_text just outputs markup indicating the color that
  94. * was entered and uses an inline style to set the text color to that value.
  95. * - field_example_color_background does the same but also changes the
  96. * background color of div.region-content.
  97. *
  98. * @see field_example_field_formatter_info()
  99. */
  100. function materio_showroom_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  101. $element = array();
  102. switch ($display['type']) {
  103. // This formatter simply outputs the field as text.
  104. case 'materio_showroom_location_simple_text':
  105. foreach ($items as $delta => $item) {
  106. if(!empty($item['location'])){
  107. $term = taxonomy_term_load($item['showroom_tid']);
  108. $element[$delta] = array(
  109. '#type' => 'html_tag',
  110. '#tag' => 'p',
  111. '#value' => t('%showroom : @loc', array('%showroom' => $term->name, '@loc' => $item['location'])),
  112. );
  113. }
  114. }
  115. break;
  116. }
  117. return $element;
  118. }
  119. // _ ___ __ __
  120. // | | / (_)___/ /___ ____ / /______
  121. // | | /| / / / __ / __ `/ _ \/ __/ ___/
  122. // | |/ |/ / / /_/ / /_/ / __/ /_(__ )
  123. // |__/|__/_/\__,_/\__, /\___/\__/____/
  124. // /____/
  125. /**
  126. * Implements hook_field_widget_info().
  127. *
  128. * Three widgets are provided.
  129. * - A simple text-only widget where the user enters the '#ffffff'.
  130. * - A 3-textfield widget that gathers the red, green, and blue values
  131. * separately.
  132. * - A farbtastic colorpicker widget that chooses the value graphically.
  133. *
  134. * These widget types will eventually show up in hook_field_widget_form,
  135. * where we will have to flesh them out.
  136. *
  137. * @see field_example_field_widget_form()
  138. */
  139. function materio_showroom_field_widget_info() {
  140. return array(
  141. 'materio_showroom_location_text' => array(
  142. 'label' => t('Location as text'),
  143. 'field types' => array('field_materio_showroom_location'),
  144. ),
  145. );
  146. }
  147. /**
  148. * Implements hook_field_widget_form().
  149. *
  150. * hook_widget_form() is where Drupal tells us to create form elements for
  151. * our field's widget.
  152. *
  153. * We provide one of three different forms, depending on the widget type of
  154. * the Form API item provided.
  155. *
  156. * The 'field_example_colorpicker' and 'field_example_text' are essentially
  157. * the same, but field_example_colorpicker adds a javascript colorpicker
  158. * helper.
  159. *
  160. * field_example_3text displays three text fields, one each for red, green,
  161. * and blue. However, the field type defines a single text column,
  162. * rgb, which needs an HTML color spec. Define an element validate
  163. * handler that converts our r, g, and b fields into a simulated single
  164. * 'rgb' form element.
  165. */
  166. function materio_showroom_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
  167. $widget = $element;
  168. $widget['#delta'] = $delta;
  169. switch ($instance['widget']['type']) {
  170. case 'materio_showroom_location_text':
  171. $locval = isset($items[$delta]['location']) ? $items[$delta]['location'] : '';
  172. $showroom_tid = isset($items[$delta]['showroom_tid']) ? $items[$delta]['showroom_tid'] : 0;
  173. $widget['showroom_tid'] = array(
  174. '#type' => 'hidden',
  175. '#default_value' => $showroom_tid,
  176. // Allow a slightly larger size that the field length to allow for some
  177. // configurations where all characters won't fit in input field.
  178. '#maxlength' => 255,
  179. );
  180. $widget['location'] = array(
  181. '#type' => 'textfield',
  182. '#title' => "Showroom", //$showroom_term->name,
  183. '#default_value' => $locval,
  184. // Allow a slightly larger size that the field length to allow for some
  185. // configurations where all characters won't fit in input field.
  186. '#size' => 20,
  187. '#maxlength' => 255,
  188. );
  189. $widget['#attached'] = array(
  190. // Add javascript to remove the draggable behaviour.
  191. 'js' => array(drupal_get_path('module', 'materio_showroom') . '/js/materio_showroom.js'),
  192. );
  193. break;
  194. }
  195. return $widget;
  196. }
  197. /**
  198. * Implements hook_field_widget_settings_form().
  199. */
  200. function materio_showroom_field_widget_settings_form($field, $instance) {
  201. $widget = $instance['widget'];
  202. $settings = $widget['settings'];
  203. $vocs = taxonomy_get_vocabularies();
  204. $options = array();
  205. foreach ($vocs as $vid => $voc) {
  206. $options[$vid] = $voc->name;
  207. }
  208. $form['vocabulary'] = array(
  209. '#type' => 'select',
  210. '#title' => t('Vocabulary'),
  211. '#default_value' => $settings['vocabulary'],
  212. // '#element_validate' => array('_tode_widget_settings_maxlength_validate'),
  213. '#required' => TRUE,
  214. '#description' => t('Choose which vocabulary will be associated as showroom.'),
  215. '#options' => $options,
  216. );
  217. return $form;
  218. }
  219. /**
  220. * Implements hook_form_alter().
  221. */
  222. function materio_showroom_form_field_ui_field_edit_form_alter(&$form, &$form_state, $form_id) {
  223. if($form['#field']['type'] == "field_materio_showroom_location"){
  224. // dsm($form, 'form');
  225. $form['field']['cardinality']['#disabled'] = 'true';
  226. $form['field']['cardinality']['#default_value'] = -1;
  227. }
  228. //
  229. }
  230. /**
  231. * Implements hook_form_alter().
  232. */
  233. function materio_showroom_form_alter(&$form, &$form_state, $form_id) {
  234. // dsm($form_id);
  235. // act only on node edit form
  236. if(isset($form['#node_edit_form'])){
  237. // dsm($form_id, 'form_id');
  238. // dsm($form, 'form');
  239. // dsm($form_state, 'form_state');
  240. _materio_showroom_alter_location_field_form($form, $form_state, $form_id);
  241. }
  242. }
  243. function _materio_showroom_alter_location_field_form(&$form, &$form_state, $form_id){
  244. // define some constants
  245. $field_type = 'field_materio_showroom_location';
  246. $node = $form['#node'];
  247. $nodetype = $form['type']['#value'];
  248. // dsm($form_state, 'form_state');
  249. global $user;
  250. $user = user_load($user->uid); // Make sure the user object is fully loaded
  251. // dsm($user, 'user');
  252. $fieldsmap = field_info_field_map();
  253. $showroomfieldinstances = array();
  254. $user_termref_field_instances = array();
  255. foreach ($fieldsmap as $field_name => $field) {
  256. // dsm($field,$field_name);
  257. // get all (probably one :p) showroom field instances from the current node
  258. if ($field['type'] == $field_type
  259. && isset($field['bundles']['node'])
  260. && in_array($nodetype, $field['bundles']['node'])) {
  261. $showroomfieldinstances[] = $field_name;
  262. }
  263. // get all term reference fields instance from users
  264. if (isset($field['bundles']['user'])
  265. && $field['type'] == 'taxonomy_term_reference') {
  266. $field_info = field_info_field($field_name);
  267. // dsm($field_info, "field_info");
  268. $user_termref_field_instances[$field_info['settings']['allowed_values'][0]['vocabulary']] = $field_name;
  269. }
  270. }
  271. // dsm($showroomfieldinstances, 'showroomfieldinstances');
  272. // dsm($user_termref_field_instances, 'user_termref_field_instances');
  273. // if there is no showroom field instances do nothing
  274. if(!empty($showroomfieldinstances)){
  275. // act on each field instance
  276. foreach ($showroomfieldinstances as $field_name) {
  277. // retrive various field infos
  278. $field_info = field_info_field($field_name);
  279. // dsm($field_info, 'field_info');
  280. $field_instance = field_info_instance('node', $field_name, $nodetype);
  281. // get all terms from chosen vocabulary in field instance widget settings
  282. $vid = $field_instance['widget']['settings']['vocabulary'];
  283. $voc = taxonomy_vocabulary_load($vid);
  284. $tree = taxonomy_get_tree($vid);
  285. // dsm($tree, 'tree');
  286. foreach ($tree as $key => $term) {
  287. $terms[$term->tid] = $term->name;
  288. }
  289. // dsm($terms, 'terms');
  290. // get user own term for current vocabulary (if any)
  291. if(isset($user_termref_field_instances[$voc->machine_name])){
  292. $user_field_name = $user_termref_field_instances[$voc->machine_name];
  293. $field_items = field_get_items('user', $user, $user_field_name);
  294. if (is_array($field_items) || $field_items instanceof Traversable){
  295. foreach ($field_items as $key => $value) {
  296. $user_showrooms[] = $value['tid'];
  297. }
  298. // dsm($user_showrooms, "user_showrooms");
  299. }
  300. }
  301. // get already recorded values
  302. $old_items = field_get_items('node', $node, $field_name);
  303. // dsm($old_items, 'old_items');
  304. foreach ($old_items as $i => $value) {
  305. $values[$value['showroom_tid']] = $value['location'];
  306. }
  307. // dsm($values, 'values');
  308. // build new item list
  309. // for ($k=0; $k < 3; $k++) {
  310. foreach ($terms as $tid => $name) {
  311. $items[] = array(
  312. 'showroom_tid' => "$tid",
  313. 'location' => isset($values[$tid]) ? $values[$tid] : ''
  314. );
  315. }
  316. // }
  317. // dsm($items, 'items');
  318. // change form_state items count
  319. // without this, form wont populated with all wanted items
  320. $form_state['field'][$field_name][LANGUAGE_NONE]['items_count'] = count($items);
  321. // retrieve new field form with our custom items
  322. $new_field_form = field_default_form('node', null, $field_info, $field_instance, LANGUAGE_NONE, $items, $form, $form_state)[$field_name];
  323. // dsm($new_field_form, 'new_field_form');
  324. // $elements = field_multiple_value_form($field_info, $field_instance, LANGUAGE_NONE, $items, $form, $form_state);
  325. // dsm($elements, 'elements');
  326. // change items location field title
  327. // and check access comparing term id with user taged with
  328. $i = 0;
  329. foreach ($terms as $tid => $name) {
  330. $item = $new_field_form[LANGUAGE_NONE][$i];
  331. $new_field_form[LANGUAGE_NONE][$i]['location']['#title'] = $terms[$item['showroom_tid']['#default_value']];
  332. $disabled = !user_access('materio showroom edit all samples fields', $user) && !in_array($tid, $user_showrooms);
  333. $new_field_form[LANGUAGE_NONE][$i]['location']['#disabled'] = $disabled;
  334. $i++;
  335. }
  336. // remove the last one more item added by default
  337. unset($new_field_form[LANGUAGE_NONE][$i]);
  338. // remove "add more" button
  339. unset($new_field_form[LANGUAGE_NONE]['add_more']);
  340. // dsm($new_field_form, 'new_field_form');
  341. // delete normal field form and replace it with our new custom field form
  342. unset($form[$field_name]);
  343. $form[$field_name] = $new_field_form;
  344. }
  345. }
  346. }
  347. /**
  348. * Implements hook_permission().
  349. */
  350. function materio_showroom_permission() {
  351. return array(
  352. 'materio showroom edit all samples fields' => array(
  353. 'title' => t('Edit all materiO showroom samples fields'),
  354. 'description' => t('Edit all materiO showroom samples fields'),
  355. ),
  356. 'materio showroom migrate fields' => array(
  357. 'title' => t('Migrate materio showroom location fields'),
  358. 'description' => t('Migrate materio showroom location fields'),
  359. ),
  360. );
  361. }
  362. /**
  363. * Implements hook_menu_local_tasks_alter().
  364. */
  365. function materio_showroom_menu_local_tasks_alter(&$data, $router_item, $root_path) {
  366. switch($root_path){
  367. case 'admin/content/showrooms' :
  368. $item = menu_get_item('node/add/showroom');
  369. if ($item['access']) {
  370. $data['actions']['output'][] = array(
  371. '#theme' => 'menu_local_action',
  372. '#link' => $item,
  373. );
  374. }
  375. // TODO: prepopulate user role and showroom taxo (https://www.drupal.org/project/prepopulate)
  376. // $item = menu_get_item('admin/people/create');
  377. // if ($item['access']) {
  378. // $data['actions']['output'][] = array(
  379. // '#theme' => 'menu_local_action',
  380. // '#link' => $item,
  381. // );
  382. // }
  383. break;
  384. }
  385. }
  386. // __ ____ __ _
  387. // / |/ (_)___ __________ _/ /_(_)___ ____
  388. // / /|_/ / / __ `/ ___/ __ `/ __/ / __ \/ __ \
  389. // / / / / / /_/ / / / /_/ / /_/ / /_/ / / / /
  390. // /_/ /_/_/\__, /_/ \__,_/\__/_/\____/_/ /_/
  391. // /____/
  392. /**
  393. * Implements hook_menu().
  394. */
  395. function materio_showroom_menu() {
  396. $items['admin/config/content/materio/migrate_showroom'] = array(
  397. 'title' => 'Showrooms location fields migration settings',
  398. 'page callback' => 'drupal_get_form',
  399. 'page arguments' => array('materio_showroom_migrate_location_fields_settings_form'),
  400. 'access arguments' => array('materio showroom migrate fields'),
  401. 'type' => MENU_LOCAL_TASK,
  402. // 'file' => ,
  403. );
  404. return $items;
  405. }
  406. function materio_showroom_migrate_location_fields_settings_form(){
  407. drupal_set_title('Showroom Migration settings', PASS_THROUGH);
  408. $field_type = 'field_materio_showroom_location';
  409. $types = node_type_get_types();
  410. // dsm($types, 'types');
  411. $nt_options = array();
  412. foreach ($types as $mn => $type) {
  413. $nt_options[$mn] = $type->name;
  414. }
  415. $node_type = variable_get('materio_showroom_migrate_node_type', null);
  416. // source field (must be a text field)
  417. $form['node_type'] = array(
  418. '#type'=>'select',
  419. '#options'=>$nt_options,
  420. '#default_value' => $node_type,
  421. '#title' => t('Content type'),
  422. '#multiple' => false,
  423. );
  424. if($node_type){
  425. $fieldsmap = field_info_field_map();
  426. $src_options = array();
  427. $target_options = array();
  428. foreach ($fieldsmap as $field_name => $field) {
  429. // dsm($field, $field_name);
  430. if ($field['type'] == 'text'
  431. && isset($field['bundles']['node'])
  432. && in_array($node_type, $field['bundles']['node'])) {
  433. $src_options[$field_name] = $field_name;
  434. }
  435. if ($field['type'] == $field_type
  436. && isset($field['bundles']['node'])
  437. && in_array($node_type, $field['bundles']['node'])) {
  438. $target_options[$field_name] = $field_name;
  439. }
  440. }
  441. // source field (must be a text field)
  442. $form['source_field'] = array(
  443. '#type'=>'select',
  444. '#options'=>$src_options,
  445. '#default_value' => variable_get('materio_showroom_migrate_source_field', null),
  446. '#title' => t('source field (must be a text field)'),
  447. '#multiple' => false,
  448. );
  449. // target field (must be a showroom location field)
  450. $form['target_field'] = array(
  451. '#type'=>'select',
  452. '#options'=>$target_options,
  453. '#default_value' => variable_get('materio_showroom_migrate_target_field', null),
  454. '#title' => t('target field (must be a showroom location field)'),
  455. '#multiple' => false,
  456. );
  457. $vocs = taxonomy_get_vocabularies();
  458. $voc_options = array();
  459. foreach ($vocs as $vid => $voc) {
  460. $voc_options[$vid] = $voc->name;
  461. }
  462. // vocabulary for showrooms
  463. $vid = variable_get('materio_showroom_migrate_vocabulary', null);
  464. $form['vocabulary'] = array(
  465. '#type'=>'select',
  466. '#options'=>$voc_options,
  467. '#default_value' => $vid,
  468. '#title' => t('vocabulary for showrooms'),
  469. '#multiple' => false,
  470. );
  471. // default taxonomy term
  472. if($vid){
  473. $tree = taxonomy_get_tree($vid);
  474. foreach ($tree as $key => $term) {
  475. $terms_options[$term->tid] = $term->name;
  476. }
  477. $term = variable_get('materio_showroom_migrate_default_term', null);
  478. $form['default_term'] = array(
  479. '#type'=>'select',
  480. '#options'=>$terms_options,
  481. '#default_value' => $term,
  482. '#title' => t('default taxonomy term'),
  483. '#multiple' => false,
  484. );
  485. if($term){
  486. $form['migrate'] = array(
  487. '#type' => 'submit',
  488. '#value' => 'Migrate',
  489. // '#submit' => array('materio_showroom_migrate_location_fields_migrate'),
  490. );
  491. }
  492. }
  493. }
  494. $form['submit'] = array(
  495. '#type' => 'submit',
  496. '#value' => 'Save',
  497. // '#submit' => array('materio_showroom_migrate_location_fields_migrate'),
  498. );
  499. return $form;
  500. }
  501. function materio_showroom_migrate_location_fields_settings_form_submit($form, &$form_state){
  502. // dsm($form_state, 'form_state');
  503. $node_type = $form_state['values']['node_type'];
  504. $src_field = $form_state['values']['source_field'];
  505. $target_field = $form_state['values']['target_field'];
  506. $vid = $form_state['values']['vocabulary'];
  507. $default_term = $form_state['values']['default_term'];
  508. variable_set('materio_showroom_migrate_node_type', $node_type);
  509. variable_set('materio_showroom_migrate_source_field', $src_field);
  510. variable_set('materio_showroom_migrate_target_field', $target_field);
  511. variable_set('materio_showroom_migrate_vocabulary', $vid);
  512. variable_set('materio_showroom_migrate_default_term', $default_term);
  513. // dsm($node_type, 'node_type');
  514. // dsm($src_field,"src_field");
  515. // dsm($target_field,"target_field");
  516. // dsm($vid,"vid");
  517. // dsm($default_term,"default_term");
  518. if ($form_state['values']['op'] == 'Migrate'){
  519. _materio_showroom_batch_migration($node_type, $src_field, $target_field, $vid, $default_term);
  520. }
  521. // $query = "INSERT INTO field_data_field_screenshot SELECT a.* FROM field_data_field_image a LEFT JOIN field_data_field_screenshot b ON a.entity_id = b.entity_id AND a.entity_type = b.entity_type WHERE b.entity_id IS NULL";
  522. //
  523. // $query2 = "INSERT INTO field_revision_field_screenshot SELECT a.* FROM field_revision_field_image a LEFT JOIN field_revision_field_screenshot b ON a.entity_id = b.entity_id AND a.entity_type = b.entity_type WHERE b.entity_id IS NULL";
  524. }
  525. function _materio_showroom_batch_migration($node_type, $src_field, $target_field, $vid, $tid){
  526. // Reset counter for debug information.
  527. $_SESSION['http_request_count'] = 0;
  528. $batch = array(
  529. 'title' => t('Migrating Showroom fields ...'),
  530. 'operations' => array(),
  531. 'init_message' => t('Commencing'),
  532. 'progress_message' => t('Processed @current out of @total.'),
  533. 'error_message' => t('An error occurred during processing'),
  534. 'finished' => '_materio_showroom_batch_migration_finished',
  535. );
  536. $query = new EntityFieldQuery();
  537. $query->entityCondition('entity_type', 'node')
  538. ->entityCondition('bundle', $node_type)
  539. ->fieldCondition($src_field, 'value', '', '!=');
  540. $result = $query->execute();
  541. // dsm($result, 'result');
  542. if (isset($result['node'])) {
  543. $voc = taxonomy_vocabulary_load($vid);
  544. $tree = taxonomy_get_tree($vid);
  545. foreach ($tree as $key => $term) {
  546. $terms[$term->tid] = $term->name;
  547. }
  548. if(!empty($terms)){
  549. foreach ($result['node'] as $nid => $value) {
  550. $batch['operations'][] = array(
  551. '_materio_showroom_batch_migration_op',
  552. array(
  553. $nid,
  554. $src_field, $target_field,
  555. $terms, $tid,
  556. )
  557. );
  558. }
  559. }
  560. }
  561. batch_set($batch);
  562. }
  563. function _materio_showroom_batch_migration_op($nid, $src_field, $target_field, $terms, $default_tid, &$context){
  564. $context['results']['field_migrated']++;
  565. $node = node_load($nid);
  566. $src_items = field_get_items('node', $node, $src_field);
  567. $src_value = $src_items ? $src_items[0]['value'] : '';
  568. // $src_value = str_replace('/', '-', $src_value);
  569. //
  570. // build new item list
  571. $items = array(LANGUAGE_NONE => array());
  572. foreach ($terms as $tid => $name) {
  573. $items[LANGUAGE_NONE][] = array(
  574. 'showroom_tid' => $tid,
  575. 'location' => $default_tid == $tid ? $src_value : '',
  576. );
  577. }
  578. $node->$target_field = $items;
  579. node_save($node);
  580. //Simply show the import row count.
  581. $context['message'] = t('Migrating node !c : %title (%nid)', array(
  582. '!c' => $context['results']['field_migrated'],
  583. '%title'=>$node->title,
  584. '%nid'=>$nid ));
  585. // In order to slow importing and debug better,
  586. // we can uncomment this line to make each import slightly slower.
  587. // usleep(2500);
  588. if ( false ) {
  589. $context['results']['failed_nodes'][] = $nid ;
  590. }
  591. _materio_showroom_update_http_requests();
  592. }
  593. function _materio_showroom_batch_migration_finished($success, $results, $operations){
  594. // dsm($success, 'success');
  595. // dsm($results, 'results');
  596. // dsm($operations, 'operations');
  597. if ($success) {
  598. // Here we could do something meaningful with the results.
  599. // We just display the number of nodes we processed...
  600. drupal_set_message(t('@count results processed in @requests HTTP requests.', array('@count' => count($results), '@requests' => _materio_showroom_get_http_requests())));
  601. drupal_set_message(t('The final result was "%final"', array('%final' => end($results))));
  602. }
  603. else {
  604. // An error occurred.
  605. // $operations contains the operations that remained unprocessed.
  606. drupal_set_message(
  607. t('operations : @args',
  608. array(
  609. '@args' => print_r(current($operations), TRUE),
  610. )
  611. ),
  612. 'error'
  613. );
  614. $error_operation = reset($operations);
  615. drupal_set_message(
  616. t('An error occurred while processing @operation with arguments : @args',
  617. array(
  618. '@operation' => $error_operation[0],
  619. '@args' => print_r($error_operation[0], TRUE),
  620. )
  621. ),
  622. 'error'
  623. );
  624. }
  625. }
  626. /**
  627. * Utility function to increment HTTP requests in a session variable.
  628. */
  629. function _materio_showroom_update_http_requests() {
  630. $_SESSION['http_request_count']++;
  631. }
  632. /**
  633. * Utility function to count the HTTP requests in a session variable.
  634. *
  635. * @return int
  636. * Number of requests.
  637. */
  638. function _materio_showroom_get_http_requests() {
  639. return !empty($_SESSION['http_request_count']) ? $_SESSION['http_request_count'] : 0;
  640. }