'submit', '#value' => t('Edit rule'), '#name' => 'edit' . $rule['crid'], '#submit' => array('css_injector_admin_edit_button'), '#attributes' => array('class' => array('css-inject-edit')), '#crid' => $rule['crid'], ); $form['rules'][$rule['crid']]['delete'] = array( '#type' => 'submit', '#value' => t('Delete rule'), '#name' => 'delete' . $rule['crid'], '#submit' => array('css_injector_admin_delete_button'), '#attributes' => array('class' => array('css-inject-delete')), '#crid' => $rule['crid'], ); } return $form; } /** * Edit button callback for the CSS rule listing form. */ function css_injector_admin_edit_button($form, &$form_state) { $button = $form_state['triggering_element']; $crid = $button['#crid']; $form_state['redirect'] = 'admin/config/development/css-injector/edit/' . $crid; } /** * Delete button callback for the CSS rule listing form. * Redirects the user to the confirmation form. */ function css_injector_admin_delete_button($form, &$form_state) { $button = $form_state['triggering_element']; $crid = $button['#crid']; $form_state['redirect'] = 'admin/config/development/css-injector/delete/' . $crid; } /** * Theme function for the CSS Injector admin overview form. */ function theme_css_injector_admin_form($variables) { $form = $variables['form']; $headers = array(t('Title'), t('Location'), t('Actions')); $rows = array(); if (!empty($form['rules'])) { foreach (element_children($form['rules']) as $crid) { $row = array(); $rule = $form['rules'][$crid]['#rule']; $row[] = check_plain($rule['title']); $row[] = _css_injector_rule_uri($rule['crid']); $row[] = drupal_render($form['rules'][$crid]); $rows[] = $row; } } $link = l(t('Create a new rule'), 'admin/config/development/css-injector/add'); $row = array(); if (empty($rows)) { $row[] = array( 'data' => t('No CSS injection rules have been set up yet. !url.', array('!url' => $link)), 'colspan' => 3, ); } else { $row[] = array( 'data' => t('!url.', array('!url' => $link)), 'colspan' => 3, ); } $rows[] = $row; $output = theme('table', array('header' => $headers, 'rows' => $rows)); $output .= drupal_render_children($form); return $output; } /** * Form builder function for the CSS rule edit form. */ function css_injector_edit($form, $form_state, $crid = NULL) { if (isset($crid)) { $rule = _css_injector_load_rule($crid, TRUE); $path = _css_injector_rule_uri($rule['crid']); if (file_exists($path)) { $rule['css_text'] = file_get_contents($path); } else { $rule['css_text'] = ''; } } else { $rule = array( 'title' => '', 'rule_type' => CSS_INJECTOR_PAGES_NOTLISTED, 'rule_themes' => '', 'rule_conditions' => '', 'media' => 'all', 'preprocess' => 1, 'css_text' => '', 'enabled' => 1, ); } // Adding css stylesheet for icons. $form['#attached']['js'] = array( drupal_get_path('module', 'css_injector') . '/ace/ace.js', drupal_get_path('module', 'css_injector') . '/syntax_highlighter.js', ); $form['#attached']['css'] = array( drupal_get_path('module', 'css_injector') . '/syntax_highlighter.css', ); if (isset($crid)) { $form['crid'] = array( '#type' => 'value', '#value' => $crid, ); } $form['title'] = array( '#type' => 'textfield', '#title' => t('Title'), '#default_value' => $rule['title'], '#required' => TRUE, ); $form['css_text'] = array( '#type' => 'textarea', '#title' => t('CSS code'), '#rows' => 10, '#default_value' => $rule['css_text'], '#required' => TRUE, ); $form['css_text_ace'] = array( '#prefix' => 'Disable syntax highlighter', '#markup' => '
' . $rule['css_text'] . '
', ); // Get info of site themes. $themes = array(); $theme_list = list_themes(); $default_theme = variable_get('theme_default'); foreach ($theme_list as $single_theme) { $themes[$single_theme->name] = $single_theme->info['name']; } $rule['rule_themes'] = unserialize($rule['rule_themes']); $form['conditional']['rule_themes'] = array( '#type' => 'select', '#title' => 'Themes to show on', '#default_value' => isset($rule['rule_themes']) ? $rule['rule_themes'] : $default_theme, '#options' => $themes, '#description' => t('Select themes css will be applied to. @theme theme is selected by default.', array('@theme' => $themes[$default_theme])), '#multiple' => TRUE, ); // Shamelessly ripped from block.module. Who doesn't use this snippet // of code, really? $php_access = (user_access('use PHP for settings') && module_exists('php')); $options = array( CSS_INJECTOR_PAGES_NOTLISTED => t('Add on every page except the listed pages.'), CSS_INJECTOR_PAGES_LISTED => t('add on only the listed pages.') ); $description = t("Enter one page per line as Drupal paths. The '*' character is a wildcard. Example paths are %blog for the blog page and %blog-wildcard for every personal blog. %front is the front page.", array('%blog' => 'blog', '%blog-wildcard' => 'blog/*', '%front' => '')); if ($php_access) { $options[CSS_INJECTOR_PHP] = t('Add if the following PHP code outputs a nonzero value (PHP-mode, experts only).'); $description .= ' ' . t('If the PHP-mode is chosen, enter PHP code between %php. Note that executing incorrect PHP-code can break your Drupal site.', array('%php' => '')); } $form['conditional']['rule_type'] = array( '#type' => 'radios', '#title' => t('Add the CSS on specific pages'), '#options' => $options, '#default_value' => $rule['rule_type'], ); $form['conditional']['rule_conditions'] = array( '#type' => 'textarea', '#title' => t('Pages'), '#default_value' => $rule['rule_conditions'], '#description' => $description, ); $form['media'] = array( '#type' => 'select', '#title' => t('Media'), '#options' => array( 'all' => t('All'), 'screen' => t('Screen'), 'print' => t('Print'), 'IE 7' => t('IE7'), 'IE 8' => t('IE8'), 'IE 9' => t('IE9'), ), '#default_value' => $rule['media'], ); $form['preprocess'] = array( '#type' => 'checkbox', '#title' => t('Preprocess CSS'), '#default_value' => $rule['preprocess'], ); $form['enabled'] = array( '#type' => 'checkbox', '#title' => t('Enable rule'), '#default_value' => isset($rule['enabled']) ? $rule['enabled'] : 1, ); $form['buttons']['save'] = array( '#type' => 'submit', '#value' => t('Save'), '#submit' => array('css_injector_edit_save'), ); $form['buttons']['save_and_continue'] = array( '#type' => 'submit', '#value' => t('Save and Continue Editing'), '#submit' => array('css_injector_edit_save_and_continue'), ); if (!empty($rule['crid'])) { $form['buttons']['delete'] = array( '#type' => 'submit', '#value' => t('Delete'), '#crid' => $rule['crid'], '#submit' => array('css_injector_admin_delete_button'), ); } return $form; } /** * Validation callback for the CSS rule edit form. */ function css_injector_edit_validate($form, &$form_state) { $directory = drupal_realpath('public://css_injector'); if (!file_prepare_directory($directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS)) { form_error($form, t('The directory %directory is not writable', array('%directory' => $directory))); } } /** * Submit button callback for the CSS rule edit form. */ function css_injector_edit_save($form, &$form_state) { //$themes = implode('//', $form_state['values']['themes']); $rule = $form_state['values']; $crid = !empty($form_state['values']['crid']) ? $form_state['values']['crid'] : NULL; // Serialize themes list before inserting to databse. $rule['rule_themes'] = serialize($rule['rule_themes']); drupal_write_record('css_injector_rule', $rule, empty($crid) ? array() : 'crid'); // Unserialize themes list for form state. $rule['rule_themes'] = unserialize($rule['rule_themes']); $form_state['values']['rule'] = $rule; file_unmanaged_save_data($rule['css_text'], _css_injector_rule_uri($rule['crid']), FILE_EXISTS_REPLACE); _css_injector_load_rule(NULL, TRUE); drupal_set_message(t('Your CSS injection rule %title was saved.', array('%title' => $rule['title']))); $form_state['redirect'] = 'admin/config/development/css-injector'; } /** * Save and continue callback for the CSS rule edit form. */ function css_injector_edit_save_and_continue($form, &$form_state) { css_injector_edit_save($form, $form_state); $form_state['redirect'] = 'admin/config/development/css-injector/edit/' . $form_state['values']['rule']['crid']; } /** * Menu callback -- ask for confirmation of rule deletion. */ function css_injector_delete_confirm($form, &$form_state, $crid) { $form['crid'] = array( '#type' => 'value', '#value' => $crid, ); $rule = _css_injector_load_rule($crid); return confirm_form($form, t('Are you sure you want to delete %title?', array('%title' => $rule['title'])), isset($_GET['destination']) ? $_GET['destination'] : 'admin/config/development/css-injector', t('This action cannot be undone.'), t('Delete'), t('Cancel') ); } /** * Execute node deletion. */ function css_injector_delete_confirm_submit($form, &$form_state) { if ($form_state['values']['confirm']) { _css_injector_delete_rule($form_state['values']['crid']); } $form_state['redirect'] = 'admin/config/development/css-injector'; return; }