t('Image'),
'weight' => 10,
// Only provides a single content type.
'single' => TRUE,
'content_types' => 'panels_image_content_types',
'render callback' => 'panels_image_render',
'add callback' => 'panels_image_add',
'edit callback' => 'panels_image_edit',
'add validate callback' => 'panels_image_edit_validate',
'edit validate callback' => 'panels_image_edit_validate',
'title callback' => 'panels_image_title',
);
return $items;
}
/**
* Return all content types available.
*/
function panels_image_content_types() {
return array(
'image' => array(
'title' => t('Image'),
'weight' => 5,
'icon' => 'icon_node.png',
'path' => panels_get_path('content_types/node'),
'description' => t('Add a image as content.'),
'category' => array(t('Images'), 5),
),
);
}
/**
* Output function for the 'image' content type. Outputs an image node
* based on the module and delta supplied in the configuration.
*/
function panels_image_render($conf, $panel_args) {
$nid = $conf['nid'];
if (!is_numeric($nid)) {
return;
}
$node = node_load($nid);
if (!node_access('view', $node)) {
return;
}
$block->module = 'node';
$block->delta = $node->nid;
if (!empty($conf['image_size'])) {
$node->panel_image_size = $conf['image_size'];
}
if (!empty($conf['caption_type'])) {
if ($conf['caption_type'] == 'custom' && !empty($conf['caption_text'])) {
$node->panel_image_caption = check_plain($conf['caption_text']);
}
elseif ($conf['caption_type'] == 'body') {
$node->panel_image_caption = check_markup($node->body, $node->format, FALSE);
}
}
$block->content = node_view($node, FALSE, FALSE, FALSE);
return $block;
}
/**
* Returns the form for a new image.
*/
function panels_image_add($id, $parents, $conf = array()) {
$form = panels_image_edit($id, $parents, $conf);
$form['nid'] = array(
'#prefix' => '
',
'#suffix' => '
',
'#title' => t('Enter the title or NID of an image'),
'#type' => 'textfield',
'#maxlength' => 512,
'#autocomplete_path' => 'panels/node/autocomplete',
'#weight' => -10,
);
$form['validate_me'] = array('#type' => 'value', '#value' => TRUE);
return $form;
}
/**
* Returns an edit form for the custom type.
*/
function panels_image_edit($id, $parents, $conf) {
$form['nid'] = array(
'#type' => 'value',
'#default_value' => $conf['nid'],
);
if (function_exists('image_get_sizes')) {
foreach (image_get_sizes() as $key => $size) {
$dimensions = $size['width'] .'x'. $size['height'];
$label = $size['label'];
if ($dimensions != 'x') {
$label .= ' '. $dimensions;
}
$image_sizes[$key] = $label;
}
$form['image_size'] = array(
'#type' => 'select',
'#title' => t('Image size'),
'#options' => $image_sizes,
'#description' => t('What size of the image should be inserted?'),
);
if (isset($conf['image_size'])) {
$form['image_size']['#default_value'] = $conf['image_size'];
}
}
$form['caption_type'] = array(
'#type' => 'select',
'#title' => t('Image caption'),
'#options' => array(
'none' => t('None'),
'body' => t('Existing caption'),
'custom' => t('Custom caption'),
),
'#default_value' => isset($conf['caption_type']) ? $conf['caption_type'] : 'none',
'#description' => t('Which caption (if any) should be displayed?'),
);
$form['caption_text'] = array(
'#type' => 'textfield',
'#title' => t('Custom caption'),
'#default_value' => isset($conf['caption_text']) ? $conf['caption_text'] : '',
);
return $form;
}
/**
* Validate a image.
*/
function panels_image_edit_validate($form, $form_values) {
if (!$form_values['validate_me']) {
return;
}
$nid = $form_values['nid'];
$preg_matches = array();
$match = preg_match('/\[nid: (\d+)\]/', $nid, $preg_matches);
if (!$match) {
$match = preg_match('/^nid: (\d+)/', $nid, $preg_matches);
}
if ($match) {
$nid = $preg_matches[1];
}
if (is_numeric($nid)) {
$node = db_fetch_object(db_query(db_rewrite_sql("SELECT n.nid FROM {node} n WHERE n.nid = %d AND n.type = 'image'"), $nid));
}
else {
$node = db_fetch_object(db_query(db_rewrite_sql("SELECT n.nid FROM {node} n WHERE LOWER(n.title) = LOWER('%s') AND n.type = 'image'"), $nid));
}
if ($node) {
form_set_value($form['nid'], $node->nid);
}
if (!($node || preg_match('/^[@%]\d+$/', $nid))) {
form_error($form['nid'], t('Invalid image'));
}
}
/**
* Returns the administrative title for a image.
*/
function panels_image_title($conf) {
$node = node_load($conf['nid']);
if ($node) {
$title = ''. t('Image:') .' '. check_plain($node->title);
$title .= ' ['. $conf['image_size'] .']';
return $title;
}
else {
return t('Deleted/missing node @nid', array('@nid' => $conf['nid']));
}
}