diff --git modules/block/block.admin.inc modules/block/block.admin.inc index cb249c3..34caa89 100644 --- modules/block/block.admin.inc +++ modules/block/block.admin.inc @@ -198,6 +198,7 @@ function block_admin_configure(&$form_state, $module = NULL, $delta = 0) { '#type' => 'fieldset', '#title' => t('Block specific settings'), '#collapsible' => TRUE, + '#weight' => -10, ); $form['block_settings']['title'] = array( '#type' => 'textfield', @@ -332,6 +333,9 @@ function block_admin_configure_validate($form, &$form_state) { form_set_error('info', t('Please ensure that each block description is unique.')); } } + $edit = (object) $form_state['values']; + $edit->block_machine_name = $edit->module . '_' . $edit->delta; + field_attach_form_validate('block', $edit, $form, $form_state); } function block_admin_configure_submit($form, &$form_state) { @@ -375,6 +379,11 @@ function block_admin_configure_submit($form, &$form_state) { } $query->execute(); + $edit = (object) $form_state['values']; + $edit->block_machine_name = 'block_' . $edit->delta; + field_attach_submit('block', $edit, $form, $form_state); + $edit = (array) $edit; + module_invoke($form_state['values']['module'], 'block_save', $form_state['values']['delta'], $form_state['values']); drupal_set_message(t('The block configuration has been saved.')); cache_clear_all(); @@ -448,6 +457,33 @@ function block_add_block_form_submit($form, &$form_state) { } $query->execute(); + field_attach_create_bundle('block_' . $delta); + + // Create the 'block_body' field if it doesn't already exist. + $field = field_info_field('block_body'); + if (empty($field)) { + $field = array( + 'field_name' => 'block_body', + 'type' => 'text_long', + ); + field_create_field($field); + } + + // Attach an instance of the 'block_body' field to the new block bundle. + $instance = array( + 'field_name' => 'block_body', + 'bundle' => 'block_' . $delta, + 'label' => t('Block body'), + 'description' => t('The content of the block as shown to the user.'), + 'required' => TRUE, + 'settings' => array('text_processing' => 1), + 'widget' => array( + 'type' => 'text_textarea', + 'label' => t('Block body'), + ), + ); + field_create_instance($instance); + drupal_set_message(t('The block has been created.')); cache_clear_all(); $form_state['redirect'] = 'admin/structure/block'; @@ -468,6 +504,8 @@ function block_box_delete(&$form_state, $bid = 0) { * Deletion of custom blocks. */ function block_box_delete_submit($form, &$form_state) { + field_attach_delete_bundle('block_' . $form_state['values']['bid']); + db_delete('box') ->condition('bid', $form_state['values']['bid']) ->execute(); diff --git modules/block/block.module modules/block/block.module index 031071a..0f95c59 100644 --- modules/block/block.module +++ modules/block/block.module @@ -105,6 +105,48 @@ function block_theme() { } /** + * Implement hook_fieldable_info(). + */ +function block_fieldable_info() { + $return = array( + 'block' => array( + 'label' => t('Block'), + 'object keys' => array( + 'id' => 'bid', + 'bundle' => 'block_machine_name', + ), + 'bundles' => array(), + ), + ); + foreach (_block_rehash() as $block) { + // Only custom blocks are fieldable. + if ($block['module'] == 'block') { + $return['block']['bundles']['block_' . $block['delta']] = array( + 'label' => $block['info'], + 'admin' => array( + 'path' => 'admin/structure/block/configure/block/' . $block['delta'], + 'access arguments' => array('administer blocks'), + ), + ); + } + } + return $return; +} + +/** + * Implement hook_field_build_modes(). + */ +function block_field_build_modes($obj_type) { + $modes = array(); + if ($obj_type == 'block') { + $modes = array( + 'full' => t('User account'), + ); + } + return $modes; +} + +/** * Implement hook_permission(). */ function block_permission() { @@ -211,6 +253,11 @@ function block_block_configure($delta = 0, $edit = array()) { */ function block_block_save($delta = 0, $edit = array()) { block_box_save($edit, $delta); + $edit = (object) $edit; + $edit->bid = $delta; + $edit->block_machine_name = $edit->module . '_' . $edit->delta; + field_attach_presave('block', $edit); + field_attach_update('block', $edit); } /** @@ -225,6 +272,27 @@ function block_block_view($delta = 0, $edit = array()) { } /** + * Implement hook_form_FORM_ID_alter(). + */ +function block_form_block_admin_configure_alter(&$form, &$form_state) { + $block = block_box_get($form['delta']['#value']); + $field_form = array(); + $field_form_state = array(); + field_attach_form('block', (object) $block, $field_form, $field_form_state); + if (isset($field_form['#fields'])) { + $form['#fields'] = $field_form['#fields']; + unset($field_form['#fields']); + $form['block_fields'] = array( + '#type' => 'fieldset', + '#title' => t('Block content'), + '#collapsible' => TRUE, + '#weight' => -5, + ); + $form['block_fields'] += $field_form; + } +} + +/** * Implement hook_page_alter(). * * Render blocks into their regions. @@ -328,6 +396,8 @@ function _block_rehash() { drupal_write_record('block', $block); // Set region to none if not enabled. $block['region'] = $block['status'] ? $block['region'] : BLOCK_REGION_NONE; + // Create a unique machine-readable name for the block. + $block['block_machine_name'] = $module . '_' . $delta; // Add to the list of blocks we return. $blocks[] = $block; } @@ -348,6 +418,8 @@ function _block_rehash() { $old_blocks[$module][$delta]['region'] = $old_blocks[$module][$delta]['status'] ? $old_blocks[$module][$delta]['region'] : BLOCK_REGION_NONE; } // Add this block to the list of blocks we return. + // Create a unique machine-readable name for the block. + $old_blocks[$module][$delta]['block_machine_name'] = $module . '_' . $delta; $blocks[] = $old_blocks[$module][$delta]; // Remove this block from the list of blocks to be deleted. unset($old_blocks[$module][$delta]); @@ -370,7 +442,10 @@ function _block_rehash() { } function block_box_get($bid) { - return db_query("SELECT * FROM {box} WHERE bid = :bid", array(':bid' => $bid))->fetchAssoc(); + $box = db_query("SELECT * FROM {box} WHERE bid = :bid", array(':bid' => $bid))->fetchAssoc(); + $box->block_machine_name = 'block_' . $box->bid; + field_attach_load('block', array($box->bid => $box)); + return (array) $box; } /**