Index: boxes.admin.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/boxes/boxes.admin.inc,v retrieving revision 1.5.2.1 diff -u -p -r1.5.2.1 boxes.admin.inc --- boxes.admin.inc 25 Apr 2010 18:41:54 -0000 1.5.2.1 +++ boxes.admin.inc 18 May 2010 22:30:03 -0000 @@ -68,6 +68,29 @@ function boxes_delete_form_submit($form, $form_state['redirect'] = 'admin/build/block'; } + +function boxes_convert_form($form_state, $module, $delta) { + $form['module'] = array('#type' => 'hidden', '#value' => $module); + $form['delta'] = array('#type' => 'hidden', '#value' => $delta); + switch ($module) { + case 'block': + return confirm_form($form, t('Are you sure you want to convert this block to a box?'), 'admin/build/block', '', t('Convert'), t('Cancel')); + break; + case 'boxes': + return confirm_form($form, t('Are you sure you want to convert this box to a block?'), 'admin/build/block', '', t('Convert'), t('Cancel')); + break; + case 'default': + drupal_not_found(); + die(); + } +} + + +function boxes_convert_form_submit($form, &$form_state) { + boxes_convert($form_state['values']['module'], $form_state['values']['delta']); + $form_state['redirect'] = 'admin/build/block'; +} + /** * Form for in page editing. */ Index: boxes.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/boxes/boxes.module,v retrieving revision 1.10.2.3 diff -u -p -r1.10.2.3 boxes.module --- boxes.module 26 Apr 2010 17:51:24 -0000 1.10.2.3 +++ boxes.module 18 May 2010 22:30:03 -0000 @@ -40,6 +40,13 @@ function boxes_menu() { 'type' => MENU_CALLBACK, 'file' => 'boxes.admin.inc', ); + $items['boxes/convert/%/%'] = array( + 'page callback' => 'drupal_get_form', + 'page arguments' => array('boxes_convert_form', 2, 3), + 'access callback' => 'boxes_access_admin', + 'type' => MENU_CALLBACK, + 'file' => 'boxes.admin.inc', + ); return $items; } @@ -227,6 +234,71 @@ function boxes_load_reset() { boxes_box::reset(); } +function boxes_load_block($delta = NULL) { + $where = ''; + if (isset($delta)) { + $where = " AND blocks.delta = '%s'"; + } + $sql = "SELECT boxes.body, boxes.info AS description, boxes.format, blocks.delta, blocks.title, blocks.bid + FROM {blocks} + INNER JOIN {boxes} ON boxes.bid = blocks.delta + WHERE blocks.module = 'block'". $where; + $query = db_query($sql, $delta); + while ($block = db_fetch_object($query)) { + $blocks[$block->delta] = $block; + } + if (isset($delta)) { + return $blocks[$delta]; + } + return $blocks; +} + +function boxes_convert($module, $delta) { + // depending on what the module is we convert to the other + switch ($module) { + case 'block': + // load the block information + $block = boxes_load_block($delta); + + // remove {boxes} entry + // silly block system, the bid is the delta + db_query("DELETE FROM {boxes} WHERE bid = %d", $delta); + + // update the {blocks} entry + $block->module = 'boxes'; + // We also have to update the delta because when a new block is created + // we will run into duplicate keys. + ctools_include('cleanstring'); + $block->delta = ctools_cleanstring($block->description .'_'. $delta); + drupal_write_record('blocks', $block, 'bid'); + + // update the {blocks_roles} entry (if any) + $query = db_query("SELECT rid FROM {blocks_roles} WHERE module = '%s' AND delta = '%s'", $module, $delta); + while ($result = db_fetch_object($query)) { + db_query("DELETE FROM {blocks_roles} WHERE module = '%s' AND delta = '%s'", $module, $delta); + $record = array( + 'module' => 'boxes', + 'delta' => $block->delta, + 'rid' => $result->rid, + ); + drupal_write_record('blocks_roles', $record); + } + + // create the {box} record + $block->plugin_key = 'simple'; + $block->options = array('body' => $block->body, 'format' => $block->format); + unset($block->body); + unset($block->format); + unset($block->bid); + drupal_write_record('box', $block); + break; + case 'boxes': + $box = boxes_load($delta); + //@TODO + break; + } +} + /** * Common element of the box fom */ @@ -296,8 +368,9 @@ function boxes_block_delete_submit($form */ function boxes_form_block_admin_display_form_alter(&$form, $form_state) { foreach (element_children($form) as $i) { - if ($form[$i]['module']['#value'] == 'boxes') { - $delta = $form[$i]['delta']['#value']; + $module = $form[$i]['module']['#value']; + $delta = $form[$i]['delta']['#value']; + if ($module == 'boxes') { if (strpos($delta, 'add__') !== 0) { $box = boxes_load($delta); if (($box->export_type & EXPORT_IN_DATABASE) && ($box->export_type & EXPORT_IN_CODE)) { @@ -312,6 +385,11 @@ function boxes_form_block_admin_display_ } } } + // add convert link + if (($module == 'block' || $module == 'boxes') && strpos($delta, 'add__') !== 0) { + $module_opp = $module == 'block' ? 'box' : 'block'; + $form[$i]['configure']['#value'] .= '|'. l(t('convert to @type', array('@type' => $module_opp)), 'boxes/convert/'. $module .'/'. $delta); + } } }