View source
<?php
define('CCK_BLOCKS_FIELD_BLOCK_DISABLED', 1);
define('CCK_BLOCKS_FIELD_BLOCK_ENABLED', 2);
function cck_blocks_content_build_modes() {
return array(
'cck_blocks' => array(
'title' => t('CCK Blocks'),
'build modes' => array(
'cck_blocks' => array(
'title' => t('CCK Blocks'),
'views style' => FALSE,
),
),
),
);
}
function cck_blocks_block($op = 'list', $delta = 0, $edit = array()) {
static $built_nodes = NULL;
$fields = module_invoke('content', 'fields');
switch ($op) {
case 'list':
$blocks = array();
if (count($fields)) {
foreach ($fields as $field_name => $field_info) {
if (variable_get('cck_blocks_' . $field_info['field_name'] . '_block_availability', CCK_BLOCKS_FIELD_BLOCK_DISABLED) == CCK_BLOCKS_FIELD_BLOCK_ENABLED) {
$blocks[$field_name] = array(
'info' => t('CCK: @field', array(
'@field' => t($field_info['widget']['label']),
)),
'cache' => BLOCK_NO_CACHE,
);
}
}
}
return $blocks;
case 'configure':
if (module_exists('token')) {
$form = array();
$form['view']['token_help'] = array(
'#title' => t('Replacement patterns'),
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('Prefer raw-text replacements for text to avoid problems with HTML entities!'),
);
$form['view']['token_help']['help'] = array(
'#value' => theme('token_help', 'node'),
);
return $form;
}
case 'view':
$block = array();
$node = menu_get_object();
$display_nodecontent = !arg(2) || arg(2) == 'revisions' && is_numeric(arg(3));
if (isset($node->nid) && $display_nodecontent && $fields[$delta]) {
$nid = $node->nid;
if (!isset($built_nodes[$nid])) {
$node->build_mode = 'cck_blocks';
$built_nodes[$nid] = node_build_content($node, FALSE, TRUE);
}
$cck_field_data = false;
if (isset($built_nodes[$nid]->content[$delta])) {
$cck_field_data = $built_nodes[$nid]->content[$delta];
}
else {
$cck_field_data = _cck_blocks_find_data_in_group($built_nodes[$nid]->content, $delta);
}
if ($cck_field_data) {
$block_content = drupal_render($cck_field_data);
if (trim($block_content) != '') {
if (module_exists('token')) {
$title = db_result(db_query("SELECT title FROM {blocks} WHERE delta = '%s'", $delta));
if ($title) {
$block['title'] = token_replace($title, 'node', $built_nodes[$nid]);
}
}
$block['subject'] = t($fields[$delta]['widget']['label']);
$block['content'] = $block_content;
}
}
}
}
return $block;
}
function _cck_blocks_find_data_in_group(&$group, $delta) {
$result = NULL;
foreach ($group as $key => $data) {
if (is_array($data) && strpos($key, 'group_') == 0) {
if (isset($data['group'][$delta])) {
$result = $data['group'][$delta];
break;
}
else {
if (isset($data['group']) && is_array($data['group'])) {
if ($result = _cck_blocks_find_data_in_group($data['group'], $delta)) {
break;
}
}
}
}
}
return $result;
}
function cck_blocks_form_alter(&$form, $form_state, $form_id) {
switch ($form_id) {
case 'content_field_edit_form':
if (isset($form_state['change_basic'])) {
break;
}
$field_name = $form['#field']['field_name'];
$form['field']['global_cck_blocks_settings'] = array(
'#type' => 'radios',
'#title' => t('Provide block for this field'),
'#default_value' => variable_get('cck_blocks_' . $field_name . '_block_availability', CCK_BLOCKS_FIELD_BLOCK_DISABLED),
'#description' => t('When enabled, this field becomes available as a block in the block admin page.'),
'#options' => array(
CCK_BLOCKS_FIELD_BLOCK_DISABLED => t('Disabled'),
CCK_BLOCKS_FIELD_BLOCK_ENABLED => t('Enabled'),
),
);
$form['#submit'][] = 'cck_blocks_field_settings_submit';
break;
}
}
function cck_blocks_field_settings_submit($form, $form_state) {
$field_name = $form['#field']['field_name'];
$global_value = $form_state['values']['global_cck_blocks_settings'];
variable_set('cck_blocks_' . $field_name . '_block_availability', $global_value);
}