array( 'theme' => $admin_theme, 'theme_token' => drupal_get_token($admin_theme), ), ); drupal_add_js($settings, 'setting'); } // Don't rely on global $theme_key // Use one in form state instead $theme_key = $form_state['build_info']['args'][0]; $theme_path = $form_state['build_info']['theme']['theme_path']; $base_theme_path = $form_state['build_info']['theme']['base_theme_path']; // Load all includes file and record it in $form_state['build_info'] // So Drupal will reload them during ajax process or form rebuild $files = array( $base_theme_path . '/vtcore/plugins/regionarea/regionarea.admin', $base_theme_path . '/vtcore/plugins/regionarea/inc/helper_function.inc.php', $base_theme_path . '/vtcore/plugins/regionarea/inc/subform.inc.php', ); foreach ($files as $file) { vtcore_form_load_includes($file, $form, $form_state); } // User area specific settings $form['region'] = array( '#type' => 'fieldset', '#title' => t('Region Manager'), '#collapsible' => FALSE, '#collapsed' => FALSE, '#weight' => -19, '#group' => 'theme_core', '#attached' => array( 'library' => array( array('system', 'ui.sortable'), array('system', 'ui.core')), 'js' => array( $base_theme_path . '/vtcore/plugins/regionarea/js/regionarea.js', $base_theme_path . '/vtcore/plugins/regionarea/js/regionareaPlugin.js', ), 'css' => array($base_theme_path . '/vtcore/plugins/regionarea/css/regionarea.css'), ), '#tree' => FALSE, ); // Build container for configurator $form['region']['configurator'] = array( '#type' => 'container', '#attributes' => array( 'id' => 'regionarea-configurator', ), ); // Give user select box if not on create new template mode $options = array( '' => '-- ' . t('Select') . ' --', 'create_new' => t('Create New Layout'), ); $options += _regionarea_get_all_layout_files($theme_key); $options += _regionarea_get_all_layout_database($theme_key); // @easter_egg // You can set default layout when loading here // $build_mode = 'create_new'; $build_mode = ''; if (isset($form_state['values'])) { $build_mode = vtcore_get_default_value('layout_select', $form_state['values'], ''); } $form['region']['configurator']['layout_select'] = array( '#type' => 'select', '#title' => t('Select layout file to process'), '#options' => $options, '#default_value' => $build_mode, ); $form['region']['configurator']['layout_delete'] = array( '#type' => 'submit', '#name' => 'delete', '#value' => t('Delete'), '#submit' => array('regionarea_layout_delete_submit'), '#weight' => 19, ); $form['region']['configurator']['layout_process'] = array( '#type' => 'submit', '#name' => 'process', '#value' => t('Process'), '#submit' => array('regionarea_layout_process_submit'), '#weight' => 19, '#ajax' => array( 'callback' => 'regionarea_workarea_ajax_refresh', 'wrapper' => 'regionarea-workarea', 'method' => 'replace', 'effect' => 'slide', 'path' => 'system/ajax/theme-' . $theme_key, 'ajax_page_state' => BASE_THEME, ), ); // Build container for workspace $form['region']['workarea'] = array( '#type' => 'container', '#attributes' => array( 'id' => 'regionarea-workarea', ), ); // Don't process any further if user hasn't select the correct configuration if (empty($build_mode)) { return $form; } // Container for settings $form['region']['workarea']['settings'] = array( '#type' => 'container', '#attributes' => array( 'id' => 'workarea-settings', ), ); // Configuration for this layout if ($build_mode == 'create_new') { $form['region']['workarea']['settings']['layout_new'] = array( '#type' => 'textfield', '#title' => t('New layout filename'), '#default_value' => '', '#field_suffix' => '.layout', '#description' => t('Enter valid default layout filename, such as page--node--1 for url node/1'), ); } $form['region']['workarea']['settings']['layout_storing'] = array( '#type' => 'select', '#title' => t('Layout file store mode'), '#options' => array( 'database' => t('Store in database, variable table'), 'theme' => t('Store as layout file in !theme layout theme dynamic directory', array('!theme' => $theme_key)), 'plugin' => t('Store as layout file in region area plugin layouts directory'), ), ); // Build layout_data and layout_data $layout_data = _regionarea_build_layouts_array($build_mode, $theme_key); // Quit on empty $layout_data if (empty($layout_data)) { $form['region']['workarea']['empty'] = array( '#markup' => '
' . t('Failed to retrieve valid layout structure.') . '
', ); return $form; } // Build place holder for drag and drop // Enabled Areas Container $form['region']['workarea']['enabled_area'] = array( '#type' => 'container', '#attributes' => array( 'id' => 'target--enabled--area', 'class' => array( 'drag-area-target', 'enabled-area', 'layout-parent', ), ), ); $form['region']['workarea']['enabled_area']['element_title'] = array( '#type' => 'markup', '#markup' => '

' . t('Workspace') . '

', ); $form['region']['workarea']['enabled_area']['empty'] = array( '#type' => 'markup', '#markup' => '

' . t('There is no enabled areas available') . '

', ); // Disabled Areas Container $form['region']['workarea']['disabled_area'] = array( '#type' => 'container', '#attributes' => array( 'id' => 'target--disabled--area', 'class' => array( 'drag-area-target', 'disabled-area', 'layout-parent', ), ), ); $form['region']['workarea']['disabled_area']['element_title'] = array( '#type' => 'markup', '#markup' => '

' . t('Disabled Areas') . '

', ); $form['region']['workarea']['disabled_area']['empty'] = array( '#type' => 'markup', '#markup' => '

' . t('There is no disabled areas available') . '

', ); // Disabled Region Container $form['region']['workarea']['disabled_region'] = array( '#type' => 'container', '#attributes' => array( 'id' => 'target--disabled--region', 'class' => array( 'drag-region-target', 'disabled-region', 'layout-parent', ), ), ); $form['region']['workarea']['disabled_region']['element_title'] = array( '#type' => 'markup', '#markup' => '

' . t('Disabled Regions') . '

', ); $form['region']['workarea']['disabled_region']['empty'] = array( '#type' => 'markup', '#markup' => '

' . t('There is no disabled regions available') . '

', ); // Disabled Block Container $form['region']['workarea']['disabled_block'] = array( '#type' => 'container', '#attributes' => array( 'id' => 'target--disabled--block', 'class' => array( 'drag-block-target', 'disabled-block', 'layout-parent', ), ), ); $form['region']['workarea']['disabled_block']['element_title'] = array( '#type' => 'markup', '#markup' => '

' . t('Disabled Blocks') . '

', ); $form['region']['workarea']['disabled_block']['empty'] = array( '#type' => 'markup', '#markup' => '

' . t('There is no disabled blocks available') . '

', ); // Build all available tags $available_tags = array('div' => 'div'); vtcore_alter_process('regionarea_available_tags', $available_tags); // Build the areas from the layout_data first. foreach ($layout_data['area'] as $area => $area_data) { // Skip if no #enabled key, most likely we got // broken .layout entry if (!isset($area_data['#enabled'])) { continue; } if ($area_data['#enabled'] == 1) { $form['region']['workarea']['enabled_area'][$area] = _regionarea_build_area_forms($area, $area_data, $available_tags); } else { $form['region']['workarea']['disabled_area'][$area] = _regionarea_build_area_forms($area, $area_data, $available_tags); } } // Build the regions from the layout_data $all_area = array( 'disabled' => t('Disabled'), ); $all_area += _regionarea_build_parent_select_options($layout_data['area']); foreach ($layout_data['region'] as $region => $region_data) { if (isset($layout_data['area'][$region_data['#parent']]) && $layout_data['area'][$region_data['#parent']]['#enabled'] == 1 && $region_data['#parent'] != 'disabled') { $form['region']['workarea']['enabled_area'][$region_data['#parent']][$region] = _regionarea_build_region_forms($region, $region_data, $all_area, $available_tags); } else { $form['region']['workarea']['disabled_region'][$region] = _regionarea_build_region_forms($region, $region_data, $all_area, $available_tags); } } // Build the blocks from the layout_data $all_region = array( 'disabled' => t('Disabled'), ); $all_region += _regionarea_build_parent_select_options($layout_data['region']); foreach ($layout_data['block'] as $block => $block_data) { $area_parent = ''; if ($block_data['#parent'] != 'disabled' && isset($layout_data['region'][$block_data['#parent']])) { $area_parent = $layout_data['region'][$block_data['#parent']]['#parent']; } if (isset($layout_data['area'][$area_parent]) && isset($layout_data['region'][$block_data['#parent']]) && $layout_data['area'][$area_parent]['#enabled'] == 1 && $block_data['#parent'] != 'disabled') { $form['region']['workarea']['enabled_area'][$area_parent][$block_data['#parent']][$block] = _regionarea_build_block_forms($block, $block_data, $all_region, $block_data['#block_type']); } else { $form['region']['workarea']['disabled_block'][$block] = _regionarea_build_block_forms($block, $block_data, $all_region, $block_data['#block_type']); } } // Add custom submit function if (!in_array('regionarea_submit', $form['#submit'])) { $form['#validate'][] = 'regionarea_validation'; $form['#submit'][] = 'regionarea_submit'; } } /** * Submit callback function to delete the layout */ function regionarea_layout_delete_submit(&$form, &$form_state) { $theme_key = $form_state['build_info']['args'][0]; $file = $form_state['values']['layout_select']; $paths = pathinfo($file); // Layout stored in database, clean out the database if (empty($paths['extension']) && $paths['dirname'] == '.' && isset($form_state['storage']['old_value']['layouts'][$paths['filename']])) { $stored = variable_get('theme_' . $theme_key . '_settings'); unset($stored['layouts'][$paths['filename']]); variable_set('theme_' . $theme_key . '_settings', $stored); drupal_set_message(t('@file deleted from database.', array('@file' => $file))); } else { // Don't allow to delete default files and plugin specified files $banned = array('theme_default', 'layout', 'adminpage'); $path = explode('/', $paths['dirname']); $remove = TRUE; foreach ($banned as $ban) { if (in_array($ban, $path)) { $remove = FALSE; } } if ($remove) { $delete = file_unmanaged_delete($file); if ($delete != FALSE) { drupal_set_message(t('@file deleted.', array('@file' => $file))); } } else { drupal_set_message(t('@file cannot be deleted.', array('@file' => $file))); } } // Unset these so form will destroy workarea unset($form_state['values']['layout_select']); unset($form_state['values']['layout_delete']); unset($form_state['values']['layout_process']); $form_state['submitted'] = TRUE; $form_state['rebuild'] = TRUE; } /** * Submit callback function to build the form * based on selected layout */ function regionarea_layout_process_submit(&$form, &$form_state) { $form_state['storage']['old_value']['layout_select'] = $form_state['values']['layout_select']; $form_state['submitted'] = FALSE; $form_state['rebuild'] = TRUE; } /** * Validation function for regionarea submit */ function regionarea_validation(&$form, &$form_state) { // Give error on empty filename when in create // new layout mode if ($form_state['values']['layout_select'] == 'create_new' && empty($form_state['values']['layout_new']) && isset($form['region']['workarea']['settings']['layout_new'])) { form_set_error('layout_new', t('Filename required')); } // Give error on no layout at all $area_enabled = FALSE; foreach ($form_state['values']['area'] as $area => $areadata) { if ($areadata['enabled'] == 1) { $area_enabled = TRUE; break; } } if ($area_enabled == FALSE) { form_set_error('workarea', t('At least 1 enabled area required for a valid layout files.')); } } /** * Main submit function to actually save the * layout arrays either as database or as * file */ function regionarea_submit(&$form, &$form_state) { global $vtcore; $theme_key = $form_state['build_info']['args'][0]; $theme_path = $form_state['build_info']['theme']['theme_path']; $base_theme_path = $form_state['build_info']['theme']['base_theme_path']; $data = array(); // Move data out from $form_state; _regionarea_build_data_for_saving('area', $data, $form_state); _regionarea_build_data_for_saving('region', $data, $form_state); _regionarea_build_data_for_saving('block', $data, $form_state); // Let other plugin connect with this form vtcore_alter_process('regionarea_vtcore_build_data_for_saving', $data, $form_state); $storing = $form_state['values']['layout_storing']; $file = $form_state['values']['layout_select']; if (!empty($form_state['values']['layout_new'])) { $file = $form_state['values']['layout_new']; } if ($storing == 'database') { // Remove file path from $file $file = basename($file); $file = str_replace('.layout', '', $file); $form_state['values']['layouts'][$file] = $data; // Bug fix http://drupal.org/node/1883460 $form_state['storage']['old_value']['layouts'][$file] = $data; drupal_set_message(t('@file saved to database.', array('@file' => $file))); } if ($storing == 'theme') { $file = basename($file); $file = str_replace('.layout', '', $file); $filepath = $theme_path . '/layouts/theme_dynamic'; file_prepare_directory($filepath, $options = FILE_CREATE_DIRECTORY); _regionarea_save_layout_file($filepath, $file, $data); } if ($storing == 'plugin') { $file = basename($file); $file = str_replace('.layout', '', $file); $filepath = $base_theme_path . '/vtcore/plugins/regionarea/layouts'; file_prepare_directory($filepath, $options = FILE_CREATE_DIRECTORY); _regionarea_save_layout_file($filepath, $file, $data); } // Do Clean up for sane form rebuilding unset($form_state['values']['area']); unset($form_state['values']['region']); unset($form_state['values']['block']); unset($form_state['values']['layout_new']); unset($form_state['values']['layout_storing']); unset($form_state['values']['layout_delete']); unset($form_state['values']['layout_process']); unset($form_state['values']['layout_select']); unset($form_state['storage']['old_value']['area']); unset($form_state['storage']['old_value']['region']); unset($form_state['storage']['old_value']['block']); unset($form_state['storage']['old_value']['layout_new']); unset($form_state['storage']['old_value']['layout_storing']); unset($form_state['storage']['old_value']['layout_delete']); unset($form_state['storage']['old_value']['layout_process']); unset($form_state['storage']['old_value']['layout_select']); // Clear stored cache if ($vtcore->cache) { cache_clear_all($theme_key . '--', 'cache', TRUE); } } /** * Ajax callback function */ function regionarea_configurator_ajax_refresh($form, &$form_state) { return $form['region']['configurator']; } /** * Ajax callback function */ function regionarea_workarea_ajax_refresh($form, &$form_state) { return $form['region']['workarea']; } /** * Implements hook_regionarea_vtcore_block_settings_alter_process(). * * We implement this hook to serve the layout plugin default vtcore-block blocks */ function regionarea_regionarea_vtcore_block_settings_alter_process(&$form, $block, $block_data, $all_regions = FALSE) { // Skip if not vtcore block if ($block_data['#block_type'] != 'vtcore-block') { return; } switch ($block) { // Additional form setting for logo case 'logo' : $form['block'][$block]['site_title_enable'] = array( '#type' => 'checkbox', '#title' => t('Custom Site Title'), '#default_value' => vtcore_get_default_value('#site_title_enable', $block_data, 1), ); $form['block'][$block]['site_title'] = array( '#type' => 'textfield', '#default_value' => vtcore_get_default_value('#site_title', $block_data, ''), '#description' => t('Enabling the custom site title by checking the checkbox above will override Drupal standard site name settings as found in admin/config/system/site-information'), ); $form['block'][$block]['site_slogan_enable'] = array( '#type' => 'checkbox', '#title' => t('Custom site slogan'), '#default_value' => vtcore_get_default_value('#site_slogan_enable', $block_data, 1), ); $form['block'][$block]['site_slogan'] = array( '#type' => 'textarea', '#default_value' => vtcore_get_default_value('#site_slogan', $block_data, ''), '#description' => t('Enabling the custom site slogan by checking the checkbox above will override Drupal standard site slogan settings as found in admin/config/system/site-information'), ); break; // Additional form setting for breadcrumb case 'breadcrumb' : $form['block'][$block]['breadcrumb_separator'] = array( '#type' => 'textfield', '#title' => t('Breadcrumb separator'), '#default_value' => vtcore_get_default_value('#breadcrumb_separator', $block_data, ' | '), ); break; // Additional form setting for tabs case 'tabs' : $form['block'][$block]['tabs_js'] = array( '#type' => 'checkbox', '#title' => t('Enable js'), '#default_value' => vtcore_get_default_value('#tab_js', $block_data, 1), ); $form['block'][$block]['tabs_js_user'] = array( '#type' => 'checkbox', '#title' => t('Enable js on user page'), '#default_value' => vtcore_get_default_value('#tab_js_user', $block_data, 0), ); $form['block'][$block]['tabs_js_overlay'] = array( '#type' => 'checkbox', '#title' => t('Enable js on overlay'), '#default_value' => vtcore_get_default_value('#tab_js_overlay', $block_data, 0), ); break; } }