t('Custom PHP'),
'weight' => -10,
'single' => TRUE,
'content_types' => 'panels_admin_content_types_custom_php',
'render callback' => 'panels_content_custom_php',
'editor render callback' => 'panels_admin_content_custom_php',
'add callback' => 'panels_admin_edit_custom_php',
'edit callback' => 'panels_admin_edit_custom_php',
'title callback' => 'panels_admin_title_custom_php',
'no override title' => TRUE,
);
return $items;
}
/**
* Output function for the 'custom_php' content type. Allows sufficiently
* privileged users to enter custom php code that is evaluated while
* $context is in scope. Use with caution!
*/
function panels_content_custom_php($conf, $panel_args, $context) {
static $delta = 0;
$block = new stdClass();
// eval() the php that has been entered by the user.
eval($conf['body']);
$block->delta = ++$delta;
// Put our default member values into a separate array.
$members = array(
'module' => 'custom',
'subject' => filter_xss_admin($conf['title']),
'content' => '',
);
// Iterate through the array of defaults and assign put in
// any values that haven't already been set by the custom
// php code.
foreach ($members as $member => $value) {
if (empty($block->$member)) {
$block->$member = $value;
}
}
return $block;
}
/**
* Render callback for when the custom content is in the editor so that people
* can have a preview on the spot.
*
* @param panels_display $display
* @param stdClass $pane
* @return stdClass $block
*/
function panels_admin_content_custom_php($display, $pane) {
$block = new stdClass();
$block->title = filter_xss_admin($pane->configuration['title']);
// We don't want to render php output on preview here, because if something is
// wrong the whole display will be borked.
$block->content = check_markup($pane->configuration['body'], 1);
return $block;
}
/**
* Return all content types available.
*/
function panels_admin_content_types_custom_php() {
if (filter_access(2)) {
return array(
'custom_php' => array(
'title' => t('Custom PHP content'),
'icon' => 'icon_block_custom.png',
'path' => panels_get_path('content_types/custom'),
'description' => t('Custom PHP block with access to Panels context data. Use sparingly, and with caution!'),
'category' => array(t('Custom'), -10),
'optional context' => new panels_optional_context(t('Context'), 'any'),
),
);
}
}
/**
* Returns an edit form for the custom_php type.
*/
function panels_admin_edit_custom_php($id, $parents, $conf = NULL) {
if (!is_array($conf)) {
$conf = array('title' => '', 'body' => '');
}
$form['title'] = array(
'#type' => 'textfield',
'#default_value' => $conf['title'],
'#title' => t('Title'),
);
$body = t('Any content you want to have passed along to theme function for displaying MUST be stored in $block->content.') . "\n\n";
$body .= t('MAKE SURE YOU ERASE ALL OF THIS HELP TEXT. Only error-free php code should be saved in this field.') . "\n\n";
$body .= t('Do NOT use php tags.');
$form['body'] = array(
'#title' => t('Body'),
'#type' => 'textarea',
'#default_value' => isset($conf['body']) ? $conf['body'] : $body,
'#rows' => 10,
'#description' => t('The PHP code you enter here will be evaluated at render-time. Any context data present in the display will be available to this code in the $context variable. DO NOT include @php tags.', array('@php' => '')),
);
return $form;
}
/**
* Returns the administrative title for a type.
*/
function panels_admin_title_custom_php($conf) {
$output = t('Custom PHP with context');
if ($conf['title']) {
$output .= " (" . filter_xss_admin($conf['title']) . ")";
}
return $output;
}