did;
if (!$did) {
$display->did = $did = 'new';
}
// Load the display being edited from cache, if possible.
if (!empty($_POST) && is_object($cache = panels_edit_cache_get($did))) {
$display = $cache->display;
}
else {
$cache = panels_edit_cache_get_default($display, $content_types, $title);
}
// Get a renderer.
$renderer = panels_get_renderer_handler('editor', $display);
$renderer->cache = $cache;
$output = $renderer->edit();
if (is_object($output) && $destination) {
return panels_goto($destination);
}
return $output;
}
/**
* Form definition for the panels display editor
*
* No validation function is necessary, as all 'validation' is handled
* either in the lead-up to form rendering (through the selection of
* specified content types) or by the validation functions specific to
* the ajax modals & content types.
*
* @ingroup forms
* @see panels_edit_display_submit()
*/
function panels_edit_display_form($form, &$form_state) {
$display = &$form_state['display'];
$renderer = &$form_state['renderer'];
// Make sure there is a valid cache key.
$cache_key = isset($display->cache_key) ? $display->cache_key : $display->did;
$display->cache_key = $cache_key;
// Annoyingly, theme doesn't have access to form_state so we have to do this.
$form['#display'] = $display;
// The flexible layout maker wants to be able to edit a display without
// actually editing a display, so we provide this 'setting' to allow
// that to go away.
if (empty($form_state['no display settings'])) {
$links = $renderer->get_display_links();
}
else {
$links = '';
}
$form['hide']['display-settings'] = array(
'#value' => $links,
);
$form += panels_edit_display_settings_form($form, $form_state);
$form['panel'] = array('#tree' => TRUE);
$form['panel']['pane'] = array('#tree' => TRUE);
$form['display'] = array(
'#markup' => $renderer->render(),
);
foreach ($renderer->plugins['layout']['regions'] as $region_id => $title) {
// Make sure we at least have an empty array for all possible locations.
if (!isset($display->panels[$region_id])) {
$display->panels[$region_id] = array();
}
$form['panel']['pane'][$region_id] = array(
// Use 'hidden' instead of 'value' so the js can access it.
'#type' => 'hidden',
'#default_value' => implode(',', (array) $display->panels[$region_id]),
);
}
if (empty($form_state['no buttons'])) {
$form['buttons']['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
'#id' => 'panels-dnd-save',
'#submit' => array('panels_edit_display_form_submit'),
'#save-display' => TRUE,
);
$form['buttons']['cancel'] = array(
'#type' => 'submit',
'#value' => t('Cancel'),
);
}
// Build up the preview portion of the form, if necessary.
if (empty($form_state['no preview'])) {
$form['preview'] = array(
'#tree' => TRUE,
'#prefix' => '
' . t('Live preview') . '
' . '
',
'#suffix' => '
',
);
ctools_context_replace_form($form['preview'], $display->context);
$form['preview']['button'] = array(
'#type' => 'submit',
'#value' => t('Preview'),
'#attributes' => array('class' => array('use-ajax-submit')),
'#id' => 'panels-live-preview-button',
'#submit' => array('panels_edit_display_form_submit', 'panels_edit_display_form_preview'),
);
}
return $form;
}
/**
* Handle form submission of the display content editor.
*
* This reads the location of the various panes from the form, which will
* have been modified from the ajax, rearranges them and then saves
* the display.
*/
function panels_edit_display_form_submit($form, &$form_state) {
$display = &$form_state['display'];
$old_content = $display->content;
$display->content = array();
if (!empty($form_state['values']['panel']['pane'])) {
foreach ($form_state['values']['panel']['pane'] as $panel_id => $panes) {
$display->panels[$panel_id] = array();
if ($panes) {
$pids = explode(',', $panes);
// need to filter the array, b/c passing it in a hidden field can generate trash
foreach (array_filter($pids) as $pid) {
if ($old_content[$pid]) {
$display->panels[$panel_id][] = $pid;
$old_content[$pid]->panel = $panel_id;
$display->content[$pid] = $old_content[$pid];
}
}
}
}
}
panels_edit_display_settings_form_submit($form, $form_state);
}
/**
* Submission of the preview button. Render the preview and put it into
* the preview widget area.
*/
function panels_edit_display_form_preview(&$form, &$form_state) {
$display = &$form_state['display'];
ctools_include('ajax');
$display->context = ctools_context_replace_placeholders($display->context, $form_state['values']['preview']);
$display->skip_cache = TRUE;
$output = panels_render_display($display);
// Add any extra CSS that some layouts may have added specifically for this.
if (!empty($display->add_css)) {
$output = "\n" . $output;
}
$commands = array();
$commands[] = array(
'command' => 'panel_preview',
'output' => $output,
);
print ajax_render($commands);
ajax_footer();
exit;
}
/**
* Form for display settings.
*/
function panels_edit_display_settings_form($form, &$form_state) {
$display = &$form_state['display'];
$layout = panels_get_layout($display->layout);
$form_state['layout'] = $layout;
ctools_include('dependent');
if ($form_state['display_title']) {
$form['display_title'] = array (
'#tree' => TRUE,
);
$form['display_title']['hide_title'] = array(
'#type' => 'select',
'#title' => t('Title type'),
'#default_value' => (int) $display->hide_title,
'#options' => array(
PANELS_TITLE_NONE => t('No title'),
PANELS_TITLE_FIXED => t('Manually set'),
PANELS_TITLE_PANE => t('From pane'),
),
);
$form['display_title']['title'] = array(
'#type' => 'textfield',
'#default_value' => $display->title,
'#title' => t('Title'),
'#description' => t('The title of this panel. If left blank, a default title may be used. Set to No Title if you want the title to actually be blank.'),
'#process' => array('ctools_dependent_process'),
'#dependency' => array('edit-display-title-hide-title' => array(PANELS_TITLE_FIXED)),
);
if (!empty($display->context)) {
$form['display_title']['title']['#description'] .= ' ' . t('You may use substitutions in this title.');
// We have to create a manual fieldset because fieldsets do not support IDs.
// Use 'hidden' instead of 'markup' so that the process will run.
// Add js for collapsible fieldsets manually
// drupal_add_js('misc/form.js');
// drupal_add_js('misc/collapse.js');
// $form['display_title']['contexts_prefix'] = array(
// '#type' => 'hidden',
// '#id' => 'edit-display-substitutions',
// '#prefix' => '',
// );
}
}
// TODO doc the ability to do this as part of the API
if (!empty($layout['settings form']) && function_exists($layout['settings form'])) {
$form['layout_settings'] = $layout['settings form']($display, $layout, $display->layout_settings);
}
$form['layout_settings']['#tree'] = TRUE;
return $form;
}
/**
* Validate the layout settings form.
*/
function panels_edit_display_settings_form_validate($form, &$form_state) {
if ($function = panels_plugin_get_function('layout', $form_state['layout'], 'settings validate')) {
$function($form_state['values']['layout_settings'], $form['layout_settings'], $form_state['display'], $form_state['layout'], $form_state['display']->layout_settings);
}
}
/**
* Store changes from the layout settings form.
*/
function panels_edit_display_settings_form_submit($form, &$form_state) {
$display = &$form_state['display'];
if ($function = panels_plugin_get_function('layout', $form_state['layout'], 'settings submit')) {
$function($form_state['values']['layout_settings'], $display, $form_state['layout'], $display->layout_settings);
}
// Since not all layouts have layout settings, check here in case of notices.
if (isset($form_state['values']['layout_settings'])) {
$display->layout_settings = $form_state['values']['layout_settings'];
}
if (isset($form_state['values']['display_title']['title'])) {
$display->title = $form_state['values']['display_title']['title'];
$display->hide_title = $form_state['values']['display_title']['hide_title'];
}
}