array( 'title' => t('Administer block classes'), 'description' => t('Set CSS classes for blocks.'), ), ); } /* * Extend block's classes with any user defined classes. */ function block_class_preprocess_block(&$vars) { $block = $vars['block']; /* The original code: */ //$classes = block_class($block); //$vars['classes_array'] = array_merge($vars['classes_array'], explode(' ', $classes)); /* Replaced with the following so it doesn't fire that many queries if you have a lot of blocks */ static $_block_class_blocks_classes; if (! isset ($_block_class_blocks_classes)) { $_block_class_blocks_classes = array(); $result = db_query('SELECT css_class, module, delta FROM {block_class}'); while ($record = $result->fetchObject()) { $_block_class_blocks_classes[$record->module][$record->delta] = $record->css_class; } } if (isset($_block_class_blocks_classes[$block->module][$block->delta])) { $classes = $_block_class_blocks_classes[$block->module][$block->delta]; $vars['classes_array'] = array_merge($vars['classes_array'], explode(' ', $classes)); } } /* * Extend panel block's classes with any user defined classes. * Implements hook_preprocess_hook() */ function block_class_preprocess_panels_pane(&$vars) { if ($vars['pane']->type != 'block') { return; } // Infer the block's $module and $delta from the pane subtype. $block_parts = explode('-', $vars['pane']->subtype); // Load the block based on the block parts. $block = block_load($block_parts[0], $block_parts[1]); // Return block_class classes as string. $css_class = block_class($block); // Add a generic 'module type' pane class. $vars['classes_array'][] = drupal_html_class('pane-' . $block->module); // Add $css_class to the $classes_array. $vars['classes_array'][] = $css_class; } /** * Return classes as string */ function block_class($block) { $ret = db_query('SELECT css_class FROM {block_class} WHERE module = :module AND delta = :delta', array(':module' => $block->module, ':delta' => $block->delta))->fetchField(); return $ret ? check_plain ($ret) : ''; } /** * Alter block edit form */ function block_class_form_alter(&$form, &$form_state, $form_id) { if (user_access('administer block classes') && $form_id == 'block_admin_configure' || $form_id == 'block_add_block_form') { $block = new stdClass; $block->module = $form['module']['#value']; $block->delta = $form['delta']['#value']; $css_class = block_class($block); // Create a more technical description for users with administer blocks permission. $description = t('Customize the styling of this block by adding CSS classes. Separate multiple classes by spaces.'); $form['settings']['css_class'] = array( '#type' => 'textfield', '#title' => t('CSS class(es)'), '#default_value' => $css_class, '#description' => t('Separate classes with a space.'), '#maxlength' => 255, ); $form['#submit'][] = 'block_class_form_submit'; } } /** * Save supplied class. */ function block_class_form_submit($form, &$form_state) { if ($form_state['values']['form_id'] == 'block_admin_configure' || $form_state['values']['form_id'] == 'block_add_block_form') { if (isset($form_state['values']['css_class']) && user_access('administer blocks')) { $module = $form_state['values']['module']; $delta = $form_state['values']['delta']; $class = $form_state['values']['css_class']; db_delete('block_class')->condition('module', $module)->condition('delta', $delta)->execute(); if (!empty($class)) { $id = db_insert('block_class')->fields(array('module' => $module, 'delta' => $delta, 'css_class' => $class))->execute(); } } } } /** * Implements hook_features_api(). */ function block_class_features_api() { return array( 'block_class' => array( 'name' => t('Block class'), 'feature_source' => TRUE, 'default_hook' => 'block_class_features_default_class', 'file' => drupal_get_path('module', 'block_class') . '/block_class.features.inc', ), ); }