View source
<?php
function arrange_fields_menu() {
$items = array();
$items["arrange-fields/%"] = array(
"title" => "Arrange fields - Form",
"page callback" => "arrange_fields_display_form",
"page arguments" => array(
1,
),
"access arguments" => array(
"administer arrange fields",
),
"type" => MENU_CALLBACK,
);
$items["arrange-fields/webform/%"] = array(
"title" => "Arrange fields - Webform",
"page callback" => "arrange_fields_display_webform",
"page arguments" => array(
2,
),
"access arguments" => array(
"administer arrange fields",
),
"type" => MENU_CALLBACK,
);
$items["arrange-fields/other/%"] = array(
"title" => "Arrange fields - Other Forms",
"page callback" => "arrange_fields_display_otherform",
"page arguments" => array(
2,
),
"access arguments" => array(
"administer arrange fields",
),
"type" => MENU_CALLBACK,
);
$items["admin/structure/types/arrange-fields"] = array(
"title" => "Arrange form fields",
"page callback" => "arrange_fields_display_main",
"access arguments" => array(
"administer arrange fields",
),
"type" => MENU_LOCAL_TASK,
"weight" => 5,
);
$items["admin/config/arrange-fields"] = array(
"title" => "Arrange fields",
"description" => "Arrange fields and components on your forms.",
"page callback" => "arrange_fields_display_main",
"access arguments" => array(
"administer arrange fields",
),
"type" => MENU_NORMAL_ITEM,
);
$items["admin/config/arrange-fields/forms"] = array(
"title" => "Forms",
"type" => MENU_DEFAULT_LOCAL_TASK,
"weight" => 1,
);
$items["admin/config/arrange-fields/settings"] = array(
"title" => "Settings",
"page callback" => "drupal_get_form",
"page arguments" => array(
"arrange_fields_settings_form",
),
"access arguments" => array(
"administer arrange fields",
),
"type" => MENU_LOCAL_TASK,
"weight" => 2,
);
$items["admin/config/arrange-fields/export"] = array(
"title" => "Export",
"page callback" => "drupal_get_form",
"page arguments" => array(
"arrange_fields_export_form",
),
"access arguments" => array(
"administer arrange fields",
),
"type" => MENU_LOCAL_TASK,
"weight" => 3,
);
$items["admin/config/arrange-fields/import"] = array(
"title" => "Import",
"page callback" => "drupal_get_form",
"page arguments" => array(
"arrange_fields_import_form",
),
"access arguments" => array(
"administer arrange fields",
),
"type" => MENU_LOCAL_TASK,
"weight" => 4,
);
$items["admin/structure/types/manage/%node_type/arrange-fields"] = array(
"title" => "Arrange fields",
"page callback" => "arrange_fields_display_form",
"page arguments" => array(
4,
),
"access arguments" => array(
"administer arrange fields",
),
"type" => MENU_LOCAL_TASK,
"weight" => 3,
);
$items["node/%webform_menu/webform/arrange-fields"] = array(
"title" => "Arrange fields",
"page callback" => "arrange_fields_display_webform",
"page arguments" => array(
1,
),
"access arguments" => array(
"administer arrange fields",
),
"type" => MENU_LOCAL_TASK,
"weight" => 3,
);
$items["arrange-fields/popup-edit-field"] = array(
"title" => "Arrange fields - Form",
"page callback" => "arrange_fields_popup_edit_field",
"access arguments" => array(
"administer arrange fields",
),
"type" => MENU_CALLBACK,
);
$items["arrange-fields/popup-close-window"] = array(
"title" => "Arrange fields - Form",
"page callback" => "arrange_fields_popup_close_window",
"access arguments" => array(
"administer arrange fields",
),
"type" => MENU_CALLBACK,
);
return $items;
}
function arrange_fields_permission() {
$arr = array(
"administer arrange fields" => array(
"title" => t("Administer Arrange Fields settings"),
"description" => t("Use and configure Arrange Fields module, as well as export & import settings."),
),
);
return $arr;
}
function arrange_fields_settings_form() {
$form = array();
$form["arrange_fields_grid_width"] = array(
"#type" => "select",
"#title" => t("Grid width"),
"#options" => array(
1 => "1px",
5 => "5px",
10 => "10px (default)",
15 => "15px",
20 => "20px",
),
"#default_value" => variable_get("arrange_fields_grid_width", 10),
"#description" => t("This setting determines the spacing between elements on the grid (when arranging fields).\n For more free-form movement, set to 1px. More rigid, boxy movement, set to 20px.\n If you are unsure what to set, leave this at 10px."),
);
$form["arrange_fields_snap_resize"] = array(
"#type" => "checkbox",
"#title" => t("Experimental - Snap to grid when resizing text boxes and markup?"),
"#default_value" => variable_get("arrange_fields_snap_resize", 0),
"#description" => t("When resizing textfields, textareas, or markup, should\n we automatically snap to the nearest grid width? This may help\n elements line up more cleanly."),
);
$form["arrange_fields_other_form_ids"] = array(
"#type" => "textarea",
"#title" => t("Additional form_id's"),
"#default_value" => variable_get("arrange_fields_other_form_ids", ""),
"#description" => t("Enter any additional form_id's you would like to be\n able to arrange, <strong>one per line</strong>. \n Be aware that\n this module (Arrange Fields) may not be able to\n arrange forms with complex structures. Also, form_ids that\n are longer than 100 characters are allowed, but may not work \n correctly if the first 100 characters are identical between two\n or more ids.\n <br>\n After you enter complete form_id's here and hit Save,\n you will be able to arrange them by clicking on them\n at the bottom of the ") . l(t("Arrange Fields admin settings page"), "admin/settings/arrange-fields") . ".\n <br>\n " . t("Example") . ": <br> \n <strong>my_custom_form_id_1</strong>\n <br>\n " . t("(Advanced) Include File: ") . "<br>" . t("\n You may also specify one required include file after the form_id\n in the format <em>form_id:module,include.file.inc</em>") . "<br>\n " . t("Example:") . "<br>\n <strong>contact_site_form:contact, contact.pages.inc</strong>\n ",
);
$form["arrange_fields_enable_form_id_discovery"] = array(
"#type" => "checkbox",
"#title" => t("Enable form_id and include file discovery mode"),
"#default_value" => variable_get("arrange_fields_enable_form_id_discovery", 0),
"#description" => t("If enabled, users with the 'Administer Arrange Fields settings' permission\n will see the ID of any form on the page printed out, as well as\n any possible include files which might be required. This can\n be very helpful in dicovering form_id's, for use with the \n Additional form_id's box above."),
);
return system_settings_form($form);
}
function arrange_fields_export_form() {
$form = array();
$res = db_query("SELECT * FROM {variable}\n WHERE name LIKE 'arrange_fields_position_data_%%' \n ORDER BY name ");
foreach ($res as $cur) {
$db_name = $cur->name;
if (!($db_value = unserialize($cur->value))) {
continue;
}
if (trim($db_value) == "") {
continue;
}
$form_id = str_replace("arrange_fields_position_data_", "", $db_name);
if (strstr($form_id, "webform_client_form")) {
$nid = str_replace("webform_client_form_", "", $form_id);
if (!($node = node_load($nid))) {
continue;
}
$form_id .= " (Webform: {$node->title})";
}
$value = $db_name . "~~!af-name-sep!~~" . $db_value . "~~!af-val-sep!~~";
$form[$db_name] = array(
"#title" => $form_id,
"#type" => "textarea",
"#default_value" => $value,
);
}
return $form;
}
function arrange_fields_import_form() {
$form = array();
$form["import"] = array(
"#title" => "Import",
"#type" => "textarea",
"#rows" => 15,
"#description" => t("Use this box to import definitions from an Arrange Fields export.\n You may paste in more than one definition at a time."),
);
$form["submit"] = array(
"#type" => "submit",
"#value" => "Import",
);
return $form;
}
function arrange_fields_import_form_submit($form, $form_state) {
$import = trim($form_state["values"]["import"]);
$definitions = explode("~~!af-val-sep!~~", $import);
foreach ($definitions as $definition) {
$temp = explode("~~!af-name-sep!~~", $definition);
$db_name = trim($temp[0]);
$db_value = trim($temp[1]);
if ($db_name == "") {
continue;
}
variable_set($db_name, $db_value);
drupal_set_message($db_name . " " . t("definition was imported successfully."));
}
}
function arrange_fields_popup_edit_field() {
$type_name = $_REQUEST["type_name"];
$field_name = $_REQUEST["field"];
$GLOBALS["arrange_fields_in_popup"] = TRUE;
if ($type_name != "webform") {
module_load_include('inc', 'field_ui', 'field_ui.admin');
if (!is_array($field_name)) {
$field_name = str_replace("-", "_", $field_name);
$_SESSION["arrange_field_popup_edit_field_name"] = $field_name;
}
else {
$field_name = $_SESSION["arrange_field_popup_edit_field_name"];
$_SESSION["arrange_field_popup_edit_field_name"] = "";
}
$instance = field_info_instance("node", $field_name, $type_name);
$GLOBALS["arrange_fields_editing_field"] = TRUE;
$rtn = drupal_render(drupal_get_form('field_ui_field_edit_form', $instance));
}
else {
$temp = explode("_", $field_name);
$nid = $temp[0];
$cid = $temp[1];
$component = webform_menu_component_load($cid, $nid, "");
$node = node_load($nid);
$GLOBALS["arrange_fields_editing_field"] = TRUE;
$rtn = drupal_render(drupal_get_form('webform_component_edit_form', $node, $component, FALSE));
}
return $rtn;
}
function arrange_fields_popup_close_window() {
arrange_fields_add_arrange_css_js();
$GLOBALS["arrange_fields_in_popup"] = TRUE;
$rtn = "";
$rtn .= "<div style='text-align: center;'>\n In order for your changes to become visible, you must save and reload\n the main window:<br><br>\n <input type='button' value='" . t("Close and Save/Reload Main Window") . "'\n onClick='arrangeFieldsClosePopup()'>\n </div>";
return $rtn;
}
function arrange_fields_display_main() {
$rtn = "";
drupal_add_css(drupal_get_path("module", "arrange_fields") . "/css/arrange_fields.css");
$rtn .= t("Select a content type to arrange fields") . "...\n <ul>";
$types = _node_types_build()->types;
foreach ($types as $type) {
if ($GLOBALS["arrange_fields_webform_installed"] && $type->type == "webform") {
continue;
}
$rtn .= "<li>" . l($type->name, "arrange-fields/{$type->type}") . "</li>";
}
$rtn .= "</ul>";
if ($GLOBALS["arrange_fields_webform_installed"]) {
$rtn .= t("Select a webform to arrange fields") . "...\n <ul>";
$is_empty = TRUE;
$result = db_query("SELECT * FROM {node} WHERE type = 'webform'");
$nodes = array();
foreach ($result as $record) {
$nodes[] = $record;
$is_empty = FALSE;
}
if ($is_empty) {
$rtn .= "<li>" . t("No webforms have been created yet.") . "</li>";
}
else {
foreach ($nodes as $node_res) {
$rtn .= "<li>" . l($node_res->title, "arrange-fields/webform/{$node_res->nid}") . "</li>";
}
}
$rtn .= "</ul>";
}
$other_form_ids = trim(variable_get("arrange_fields_other_form_ids", ""));
if ($other_form_ids != "") {
$temp = explode("\n", $other_form_ids);
$rtn .= t("Additional form_id's you specified on the Settings tab...");
$rtn .= "<ul>";
foreach ($temp as $form_id) {
$rtn .= "<li>" . l(trim($form_id), "arrange-fields/other/" . trim($form_id)) . "</li>";
}
$rtn .= "</ul>";
$rtn .= "<div class='arrange-fields-other-form-caveat'>";
$rtn .= t("Some caveats: Arrange Fields may not work correctly on forms\n with complex structures. Also, remember that some forms may\n appear differently depending on if you are admin, an authorized user,\n or an anonymous user (like user_register).\n If you need to arrange a form which only appears for anonymous users,\n temporarily grant anonymous users the \"administer\n arrange fields\" permission so you can arrange the form how it\n needs to look. Just be sure to take this away when you are done as\n it introduces a major security risk.");
$rtn .= "</div>";
}
return $rtn;
}
function arrange_fields_init() {
if (!isset($GLOBALS["arrange_fields_editing_type"])) {
$GLOBALS["arrange_fields_editing_type"] = " ";
}
if (!isset($GLOBALS["arrange_fields_editing"])) {
$GLOBALS["arrange_fields_editing"] = " ";
}
if (!isset($GLOBALS["arrange_fields_editing_field"])) {
$GLOBALS["arrange_fields_editing_field"] = FALSE;
}
if (function_exists("webform_menu")) {
$GLOBALS["arrange_fields_webform_installed"] = TRUE;
}
else {
$GLOBALS["arrange_fields_webform_installed"] = FALSE;
}
}
function arrange_fields_add_arrange_css_js() {
module_load_include('inc', 'node', 'node.pages');
drupal_add_library('system', 'ui.draggable');
drupal_add_library('system', 'ui.dialog');
drupal_add_library('system', 'ui.resizable');
drupal_add_js(drupal_get_path("module", "arrange_fields") . "/js/arrange_fields_node_edit.js");
drupal_add_js(drupal_get_path("module", "arrange_fields") . "/js/arrange_fields.js");
drupal_add_js(drupal_get_path("module", "arrange_fields") . "/js/arrange_fields_dialog.js");
drupal_add_css(drupal_get_path("module", "arrange_fields") . "/css/arrange_fields.css");
}
function arrange_fields_display_form($form_type) {
if (is_object($form_type)) {
$form_type_name = $form_type->name;
$form_type = $form_type->type;
}
else {
$form_type_name = $form_type;
}
$rtn = "";
$form_id = $form_type . "_node_form";
$position_data = variable_get("arrange_fields_position_data_{$form_id}", FALSE);
if ($position_data) {
drupal_add_js(array(
"arrangeFieldsNotNewForm" => TRUE,
), "setting");
}
arrange_fields_add_arrange_css_js();
$temp_form = drupal_get_form("arrange_fields_position_form", $form_id, $form_type);
$rtn .= drupal_render($temp_form);
$rtn .= "<div>" . t("Use this form to drag-and-drop fields into the order which\n you want them to appear on the node/edit page.") . "</div>\n <div>" . t("You may resize text fields by dragging the right side\n of the field.") . "</div>";
$rtn .= "<input type='button' value='add markup' onClick='arrangeFieldsDialogEditMarkup(\"new\");'>";
$GLOBALS["arrange_fields_editing"] = $form_id;
$GLOBALS["arrange_fields_editing_type"] = $form_type;
$node_form = new stdClass();
$node_form->language = "";
$node_form->type = $form_type;
$temp_form = drupal_get_form($form_id, $node_form);
$rtn .= drupal_render($temp_form);
$rtn .= "<div>" . t("If you need more room, move a field close to the bottom. The\n container will resize, adding more room.") . "</div>";
$rtn .= arrange_fields_render_dialogs();
return $rtn;
}
function arrange_fields_display_webform($nid) {
if (is_object($nid)) {
$webform_node = $nid;
$nid = $webform_node->nid;
}
else {
$webform_node = node_load($nid);
}
$form_id = "webform_client_form_{$nid}";
$form_type = "webform";
$rtn = "";
$position_data = variable_get("arrange_fields_position_data_{$form_id}", FALSE);
if ($position_data) {
drupal_add_js(array(
"arrangeFieldsNotNewForm" => TRUE,
), "setting");
}
arrange_fields_add_arrange_css_js();
$temp_form = drupal_get_form("arrange_fields_position_form", $form_id, $form_type);
$rtn .= drupal_render($temp_form);
$rtn .= "<div>" . t("Use this form to drag-and-drop fields into the order which\n you want them to appear on the webform entry page.") . "</div>\n <div>" . t("You may resize text fields by dragging the right side\n of the field.") . "</div>";
$rtn .= "<input type='button' value='add markup' onClick='arrangeFieldsDialogEditMarkup(\"new\");'>";
$GLOBALS["arrange_fields_editing"] = $form_id;
$GLOBALS["arrange_fields_editing_type"] = $form_type;
$temp_form = drupal_get_form($form_id, $webform_node, NULL, TRUE);
$rtn .= drupal_render($temp_form);
$rtn .= "<div>" . t("If you need more room, move a field close to the bottom, then save positions. The\n container will resize, adding more room.") . "</div>";
$rtn .= arrange_fields_render_dialogs();
return $rtn;
}
function arrange_fields_display_otherform($form_id) {
$form_type = "otherform";
if (strstr($form_id, ":")) {
$temp = explode(":", $form_id);
$form_id = trim($temp[0]);
$include_data = explode(",", $temp[1]);
$include_module = trim($include_data[0]);
$include_file = trim($include_data[1]);
$temp = explode(".", $include_file);
$include_ext = trim($temp[count($temp) - 1]);
$include_file = trim(str_replace(".{$include_ext}", "", $include_file));
module_load_include($include_ext, $include_module, $include_file);
}
drupal_set_title("Arrange fields - Other Forms - {$form_id}");
$rtn = "";
$position_data = variable_get("arrange_fields_position_data_{$form_id}", FALSE);
if ($position_data) {
drupal_add_js(array(
"arrangeFieldsNotNewForm" => TRUE,
), "setting");
}
arrange_fields_add_arrange_css_js();
$temp_form = drupal_get_form("arrange_fields_position_form", $form_id, $form_type);
$rtn .= drupal_render($temp_form);
$rtn .= "<div>" . t("Use this form to drag-and-drop fields into the order which\n you want them to appear on the form entry page.") . "</div>\n <div>" . t("You may resize text fields by dragging the right side\n of the field.") . "</div>";
$rtn .= "<input type='button' value='add markup' onClick='arrangeFieldsDialogEditMarkup(\"new\");'>";
$GLOBALS["arrange_fields_editing"] = $form_id;
$GLOBALS["arrange_fields_editing_type"] = $form_type;
$temp_form = drupal_get_form($form_id);
$rtn .= drupal_render($temp_form);
$rtn .= "<div>" . t("If you need more room, move a field close to the bottom, then save positions. The\n container will resize, adding more room.") . "</div>";
$rtn .= arrange_fields_render_dialogs();
return $rtn;
}
function arrange_fields_render_dialogs() {
$rtn = "";
$rtn .= "<div id='arrange-fields-config-dialog' title='Configure'> \n <table>\n <tr>\n <td width='45%'>Wrapper width:</td><td><input type='input' name='af-dialog-width' size='6'></td>\n </tr>\n <tr> \n <td>Wrapper height:</td><td><input type='input' name='af-dialog-height' size='6'></td>\n </tr>\n </table>\n <div style='font-size: 0.8em; line-height: 1.0em;'>(remember to specify px, %, etc. Leave blank for default.)</div>\n \n <div id='arrange-fields-config-dialog-labels'>\n Label: \n <label><input type='radio' name='af-dialog-label-display' value='' checked> default (block)</label>\n <label><input type='radio' name='af-dialog-label-display' value='inline-block' > inline</label>\n </div>\n </div>";
$rtn .= "<div id='arrange-fields-markup-dialog' title='Markup'>\n <div><b>Body:</b></div>\n <textarea name='af-markup-body' class='af-markup-body'></textarea>\n <div style='font-size: 0.8em; line-height: 1.0em;'>\n You may enter any valid HTML here.</div>\n \n <div style='padding-top: 10px;'><b>Wrapper style</b>='\n <input name='af-wrapper-style' class='af-wrapper-style'>\n '\n <div style='font-size: 0.8em; line-height: 1.0em;'>\n Enter style definitions. Ex: background-color: black;\n </div>\n </div>\n \n <div style='padding-top: 10px;'><b>Z-index</b>:\n <label><input type='radio' name='af-markup-z-index' value='201' checked> foreground (default)</label>\n <label><input type='radio' name='af-markup-z-index' value='75' > background</label>\n \n </div>\n\n \n <div class='af-delete-button'>\n <button type='button' onClick='arrangeFieldsDialogMarkupDelete();'>Delete</button>\n </div>\n </div>";
return $rtn;
}
function arrange_fields_add_draggable_wrappers(&$form, $form_type, $disable_buttons = FALSE) {
if ($form_type == "webform") {
$fields = array();
$fields[] = array(
"name" => "submit",
"element" => &$form["submit"],
);
$fields[] = array(
"name" => "next",
"element" => &$form["next"],
);
$fields[] = array(
"name" => "previous",
"element" => &$form["previous"],
);
if (!isset($form["submitted"])) {
$form["submitted"] = array();
}
foreach ($form["submitted"] as $name => &$element) {
if (is_array($element)) {
$fields[] = array(
"name" => $name,
"element" => &$element,
);
}
}
if (isset($form["actions"]) && is_array($form["actions"])) {
foreach ($form["actions"] as $name => &$element) {
if (is_array($element)) {
$fields[] = array(
"name" => $name,
"element" => &$element,
);
}
}
}
if (isset($form["details"]["nid"]["#value"])) {
$webform_nid = $form["details"]["nid"]["#value"];
$webform_node = node_load($webform_nid);
}
if (isset($form["captcha"]) && is_array($form["captcha"])) {
$fields[] = array(
"name" => "captcha",
"element" => &$form["captcha"],
);
}
if (isset($form["mollom"]) && is_array($form["mollom"])) {
$fields[] = array(
"name" => "mollom",
"element" => &$form["mollom"],
);
}
}
else {
$fields = arrange_fields_get_form_fields($form);
}
foreach ($fields as $field_arr) {
$field_name = $field_arr["name"];
$element =& $field_arr["element"];
$element_type = af_get($element["#type"]);
if (isset($element["#theme"]) && $element["#theme"] == "webform_render_multifile") {
$element_type = "multifile";
}
if (isset($form["#node"]) && $form_type != "webform") {
$field_name = preg_replace("/[^a-zA-Z0-9]/", "-", $field_name);
}
else {
if ($form_type == "webform") {
$field_name = preg_replace("/[^a-zA-Z0-9\\_]/", "-", $field_name);
}
}
if (af_get($element["#arrange_fields_added_wrappers"]) == TRUE) {
continue;
}
if (!$element_type || $element_type == "" || $element_type == "hidden" || $element_type == "token" || $element_type == "value") {
continue;
}
$edit_link = "";
$edit_link = "<div class='arrange-fields-control-handle'>";
if ($GLOBALS["arrange_fields_editing_type"] == $form_type && $form_type != "" && substr($field_name, 0, 6) == "field-") {
$edit_link .= "<a href='javascript: arrangeFieldsPopupEditField(\"{$form_type}\", \"{$field_name}\");'>conf</a>";
}
if ($form_type == "webform" && is_array($webform_node->webform["components"])) {
$cid = FALSE;
foreach ($webform_node->webform["components"] as $tcid => $c_arr) {
if ($c_arr["form_key"] == $field_name) {
$cid = $tcid;
break;
}
}
if ($cid) {
$webform_field_id = $webform_nid . "_" . $cid;
$edit_link .= "<a href='javascript: arrangeFieldsPopupEditField(\"{$form_type}\", \"{$webform_field_id}\");'>wf</a>";
}
}
if ($element_type == "vertical_tabs") {
$field_name .= "-vertical-tabs";
}
$edit_link .= "<span class='arrange-fields-handle-region'> </span>\n <a href='javascript: arrangeFieldsDialogConfigureField(\"{$field_name}\",\"{$element_type}\");' class='arrange-fields-config-link' \n title='Configure this field'> </a>";
$edit_link .= "</div>";
$css_class = "draggable-form-item";
$css_id = "edit-{$field_name}-draggable-wrapper";
if ($element_type == "fieldset" && $field_name != "captcha") {
$css_class .= " draggable-form-item-fieldset";
$css_id = "edit-{$field_name}-fieldset-draggable-wrapper";
}
if ($element_type == "vertical_tabs") {
$css_class .= " arrange-fields-vertical-tabs-wrapper ";
}
$css_class .= " arrange-fields-element-type-{$element_type} ";
if (!isset($element["#af_prefix"])) {
$element["#af_prefix"] = "";
}
if (!isset($element["#af_suffix"])) {
$element["#af_suffix"] = "";
}
$element["#af_prefix"] .= "<div id='{$css_id}' class='{$css_class}'>{$edit_link}";
$element["#af_suffix"] .= "</div>";
if (!isset($element["#pre_render"])) {
$element["#pre_render"] = array();
}
$element["#pre_render"][] = "arrange_fields_pre_render";
if ($element_type == "submit" || $element_type == "button") {
if ($disable_buttons) {
$element["#disabled"] = TRUE;
}
}
if ($field_name == "actions" && $element["#type"] == "actions" && $disable_buttons) {
foreach ($element as &$e) {
if (is_array($e)) {
$e["#disabled"] = TRUE;
}
}
}
if ($form_type == "webform" && $element_type == "markup") {
$element["#af_prefix"] .= $element["#value"];
}
$element["#arrange_fields_added_wrappers"] = TRUE;
}
$GLOBALS["arrange_fields_added_wrappers_" . $form["form_id"]["#value"]] = TRUE;
}
function arrange_fields_pre_render($element) {
if (!isset($element["#prefix"])) {
$element["#prefix"] = "";
}
if (!isset($element["#suffix"])) {
$element["#suffix"] = "";
}
if (af_get($element["#type"]) == "managed_file") {
if (isset($element["upload_button"])) {
$element["upload_button"]["#executes_submit_callback"] = FALSE;
}
}
if (isset($element["#af_prefix"])) {
$element["#prefix"] .= $element["#af_prefix"];
$element["#suffix"] .= $element["#af_suffix"];
}
return $element;
}
function arrange_fields_get_form_fields(&$arr, $previous_key = "") {
$rtn = array();
foreach ($arr as $name => &$element) {
if (is_array($element)) {
if (isset($element["#group"]) && $element["#group"] != "") {
continue;
}
if ($name == "buttons" && !isset($element["#type"]) && isset($element["submit"]) && $element["submit"]["#type"] == "submit") {
$rtn[] = array(
"name" => $name,
"element" => &$element,
);
}
elseif (isset($element["#type"]) && $element["#type"] != "hidden" && $element["#type"] != "token" && $element["#type"] != "value") {
if (is_numeric($name) && $previous_key != "") {
$rtn[] = array(
"name" => $previous_key,
"element" => &$arr,
);
}
else {
$rtn[] = array(
"name" => $name,
"element" => &$element,
);
}
}
else {
$temp = arrange_fields_get_form_fields($element, $name);
$rtn = array_merge($rtn, $temp);
}
}
}
return $rtn;
}
function arrange_fields_get_included_module_files() {
$rtn = "";
$arr = get_included_files();
foreach ($arr as $file) {
if (!strstr($file, "modules/")) {
continue;
}
if (strstr($file, ".module")) {
continue;
}
if (strstr($file, "devel/")) {
continue;
}
if (strstr($file, "/entity/")) {
continue;
}
if (strstr($file, "/field/")) {
continue;
}
if (strstr($file, ".field.inc")) {
continue;
}
$temp = explode("modules/", $file);
$file = $temp[1];
if (!strstr($file, ".")) {
continue;
}
$rtn .= " <em>{$file}</em> <br>";
}
return $rtn;
}
function arrange_fields_form_alter(&$form, &$form_state, $form_id) {
if (variable_get("arrange_fields_enable_form_id_discovery", 0) && user_access("administer arrange fields")) {
drupal_set_message(t("Arrange Fields module: Form ID <strong>") . $form_id . t("</strong> detected.\n <br>To turn off this message, visit ") . l("admin/config/arrange-fields/settings", "admin/config/arrange-fields/settings") . t(" and uncheck\n the Enable form_id discovery mode checkbox."));
$tmf = arrange_fields_get_included_module_files();
if ($tmf) {
drupal_set_message(t("These are possible include files which <b>may or may not</b> need\n to be specified along with the form_id:") . "<br>{$tmf}" . t("\n If you are unsure what these are used for, please ignore them, and just\n use the form_id stated above."));
}
}
$form_type = af_get($GLOBALS["arrange_fields_editing_type"]);
if (af_get($GLOBALS["arrange_fields_editing"]) == $form_id) {
unset($form["#submit"]);
$form["#attributes"]["class"] = "arrange-fields-container";
if (!af_get($GLOBALS["arrange_fields_added_wrappers_" . $form["form_id"]["#value"]])) {
arrange_fields_add_draggable_wrappers($form, $form_type, TRUE);
}
}
if ($position_data = variable_get("arrange_fields_position_data_{$form_id}", FALSE)) {
if (strpos($form_id, "webform_client_form") === 0) {
$form_type = "webform";
}
if ($form_type == "webform" && isset($form["submission_info"]) && is_array($form["submission_info"]) && $form["submission_info"]["#type"] == "fieldset") {
return;
}
drupal_add_css(drupal_get_path("module", "arrange_fields") . "/css/arrange_fields.css");
drupal_add_js(drupal_get_path("module", "arrange_fields") . "/js/arrange_fields_node_edit.js");
$fid = $form["#id"];
if (!isset($form["#attributes"])) {
$form["#attributes"] = array();
$form["#attributes"]["class"] = "";
}
if (is_array($form["#attributes"]["class"])) {
$form["#attributes"]["class"][0] .= " arrange-fields-container arrange-fields-container-{$fid} ";
}
else {
$form["#attributes"]["class"] .= " arrange-fields-container arrange-fields-container-{$fid} ";
}
if (!af_get($GLOBALS["arrange_fields_added_wrappers_" . $form["form_id"]["#value"]])) {
arrange_fields_add_draggable_wrappers($form, $form_type);
}
$jsConfigArray = array();
$jsMarkupArray = array();
$css_markup = $markup_elements = "";
$lines = explode(";", $position_data);
foreach ($lines as $line) {
if (trim($line) == "") {
continue;
}
$temp = explode(",", $line);
$wrapper_id = trim(af_get($temp[0]));
$pos_top = trim(af_get($temp[1]));
$pos_left = trim(af_get($temp[2]));
$element_type = trim(af_get($temp[3]));
$element_id = trim(af_get($temp[4]));
$width = trim(af_get($temp[5]));
$height = trim(af_get($temp[6]));
$wrapper_width = trim(af_get($temp[7]));
$wrapper_height = trim(af_get($temp[8]));
$label_display = trim(af_get($temp[9]));
$label_vertical_align = trim(af_get($temp[10]));
$text_label_display = $label_display;
if ($label_display == "inline-block") {
$text_label_display = "inline";
}
if ($wrapper_id == "~~maxBottom~~") {
$css_markup .= " .arrange-fields-container-{$fid} {\n height: {$pos_top};\n }";
continue;
}
if ($temp[7] == "~~markup_element~~") {
$markup_width = af_get($temp[8]);
$markup_height = af_get($temp[9]);
$safe_markup_body = trim(af_get($temp[10]));
$markup_body = arrange_fields_unconvert_unsafe_chars(trim(af_get($temp[10])));
$safe_wrapper_style = trim(af_get($temp[11]));
$wrapper_style = arrange_fields_unconvert_unsafe_chars(trim(af_get($temp[11])));
$z_index = trim(af_get($temp[12]));
$markup_elements .= "\n <div class='draggable-form-item arrange-fields-draggable-markup' \n id='{$wrapper_id}'>\n <div class='arrange-fields-control-handle arrange-fields-control-handle-markup'><span class='arrange-fields-handle-region'> </span>\n <a href='javascript: arrangeFieldsDialogEditMarkup(\"{$wrapper_id}\");' class='arrange-fields-config-markup-link' title='Configure this markup'> </a>\n </div>\n <div class='arrange-fields-markup-body form-item' \n id='{$wrapper_id}_body'>{$markup_body}</div>\n </div>";
$css_markup .= "\n #{$fid} #{$wrapper_id} {\n top: {$pos_top};\n left: {$pos_left};\n width: {$markup_width};\n height: {$markup_height};\n z-index: {$z_index};\n {$wrapper_style}\n }\n ";
$jsMarkupArray[$wrapper_id]["markupBody"] = $safe_markup_body;
$jsMarkupArray[$wrapper_id]["wrapperStyle"] = $safe_wrapper_style;
$jsMarkupArray[$wrapper_id]["zIndex"] = $z_index;
continue;
}
$jsConfigArray[$wrapper_id]["wrapperWidth"] = $wrapper_width;
$jsConfigArray[$wrapper_id]["wrapperHeight"] = $wrapper_height;
$jsConfigArray[$wrapper_id]["labelDisplay"] = $label_display;
$jsConfigArray[$wrapper_id]["labelVerticalAlign"] = $label_vertical_align;
$css_markup .= " \n #{$fid} #{$wrapper_id}{ \n top: {$pos_top};\n left: {$pos_left}; \n }\n ";
if ($width != "0px" && $element_type != "" && $element_id == "" && !strstr($wrapper_id, "-vertical-tabs-")) {
$css_markup .= " \n #{$fid} #{$wrapper_id} {$element_type}.form-text, \n #{$fid} #{$wrapper_id} {$element_type}.form-textarea {\n width: {$width};\n height: {$height};\n }\n ";
}
else {
if ($width != "0px" && $element_type != "" && $element_id != "" && !strstr($wrapper_id, "-vertical-tabs-")) {
$css_markup .= "\n #{$fid} #{$wrapper_id} {$element_type}#{$element_id} {\n width: {$width};\n ";
if ($element_type != "input") {
$css_markup .= "\n height: {$height}; \n ";
}
$css_markup .= " } ";
}
}
if ($wrapper_width != "") {
$css_markup .= " #{$fid} #{$wrapper_id} { width: {$wrapper_width}; } ";
}
if ($wrapper_height != "") {
$css_markup .= "\n #{$fid} #{$wrapper_id} { height: {$wrapper_height}; } \n #{$fid} #{$wrapper_id} fieldset { height: 100%; } \n ";
}
if ($label_display != "") {
$css_markup .= "\n #{$fid} #{$wrapper_id} .form-item label { \n vertical-align: {$label_vertical_align}; \n }\n #{$fid} #{$wrapper_id} .form-item > input, \n #{$fid} #{$wrapper_id} .form-item > label,\n #{$fid} #{$wrapper_id} .form-item > div,\n #{$fid} #{$wrapper_id} .form-item > div.form-radios > div,\n #{$fid} #{$wrapper_id} .form-item > div.form-checkboxes > div\n {\n display: {$label_display};\n }";
if ($element_type == "input") {
$css_markup .= "\n #{$fid} #{$wrapper_id} .form-item > label\n {\n display: {$text_label_display};\n }\n ";
}
$css_markup .= " \n #{$fid} #{$wrapper_id} .form-item div.ui-resizable-handle,\n #{$fid} #{$wrapper_id} .form-item div.description\n {\n display: block;\n } \n ";
}
}
drupal_add_js(array(
"arrangeFieldsDialogConfigObj" => $jsConfigArray,
), "setting");
drupal_add_js(array(
"arrangeFieldsDialogMarkupObj" => $jsMarkupArray,
), "setting");
drupal_add_js(array(
"arrangeFieldsGridWidth" => variable_get("arrange_fields_grid_width", 10),
), "setting");
drupal_add_js(array(
"arrangeFieldsSnapResize" => variable_get("arrange_fields_snap_resize", 0),
), "setting");
if ($GLOBALS["arrange_fields_editing"] != $form_id) {
$css_markup .= "\n \n #{$fid} {\n border: 0;\n background: none;\n }\n \n #{$fid} .draggable-form-item {\n border: 0;\n background-color: transparent;\n }\n \n ";
}
$form["arrange_fields_css_markup_and_elements"] = array(
"#markup" => "<style>{$css_markup}</style>{$markup_elements}",
"#after_build" => array(
"arrange_fields_add_form_css_js",
),
);
form_set_cache($form["#build_id"], $form, $form_state);
}
if (($form_id == "field_ui_field_edit_form" || $form_id == "webform_component_edit_form") && $GLOBALS["arrange_fields_editing_field"] == TRUE) {
if (is_array($form["#submit"])) {
$form["#submit"][] = "arrange_fields_editing_field_submit";
}
else {
$form["#submit"] = array(
"arrange_fields_editing_field_submit",
);
}
}
}
function arrange_fields_editing_field_submit($form, &$form_state) {
$form_state["redirect"] = "arrange-fields/popup-close-window";
}
function arrange_fields_add_form_css_js($element) {
drupal_add_css(drupal_get_path("module", "arrange_fields") . "/css/arrange_fields.css");
drupal_add_js(drupal_get_path("module", "arrange_fields") . "/js/arrange_fields_node_edit.js");
return $element;
}
function arrange_fields_unconvert_unsafe_chars($str) {
$str = str_replace("_~!co%~_", ",", $str);
$str = str_replace("_~!sc%~_", ";", $str);
$str = str_replace("_~!sq%~_", "'", $str);
$str = str_replace("_~!dq%~_", '"', $str);
$str = str_replace("_~!nl%~_", "\n", $str);
return $str;
}
function arrange_fields_position_form($form_state1, $form_state2, $form_id, $form_type) {
$form = array();
$form["arrange_fields_form_id"] = array(
"#type" => "hidden",
"#value" => $form_id,
);
$form["arrange_fields_form_type"] = array(
"#type" => "hidden",
"#value" => $form_type,
);
$form["arrange_fields_position_data"] = array(
"#type" => "textfield",
"#maxlength" => 99999999999,
);
$html = "\n <div id='paypal-please-donate' style='float:right; max-width:320px; border: 1px solid #ccc; padding: 3px; margin-left: 20px; margin-bottom: 5px; font-size: 0.8em; line-height: 1.5em;'>\n If you find this module useful, please consider donating to the project maintainer (Richard Peacock).\n Any amount is greatly appreciated!\n <div style='text-align: center;'>\n <a href='https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=8VVAK7KZVTHGE' \n target='_blank'><img src='" . $GLOBALS["base_url"] . "/" . drupal_get_path("module", "arrange_fields") . "/paypal-donate-button.png'></a>\n </div>\n </div> \n ";
$form["markup_paypal_beg"] = array(
"#markup" => $html,
);
$form["save"] = array(
"#type" => "submit",
"#value" => t("Save position data *"),
"#attributes" => array(
"onClick" => "return arrangeFieldsSavePositions()",
),
);
$form["reset"] = array(
"#type" => "button",
"#value" => t("Reset position data"),
"#attributes" => array(
"onClick" => "return arrangeFieldsConfirmReset()",
),
);
$form["extra_markup_help"] = array(
"#markup" => "<div style='font-size: 0.9em;'>" . t("* To ensure the correct hight of the form is saved, you may need\n to save position data twice, once you have finished arranging fields.") . "</div>",
);
return $form;
}
function arrange_fields_position_form_validate($form, &$form_state) {
$form_id = $form_state["values"]["arrange_fields_form_id"];
if (stristr($form_state["values"]["op"], "reset")) {
variable_set("arrange_fields_position_data_{$form_id}", "");
drupal_set_message(t("Position data for this form has been reset. It will \n be displayed to the user without any modifications,\n in its original state."));
$path = isset($_GET['q']) ? $_GET['q'] : '<front>';
$link = url($path, array(
'absolute' => TRUE,
));
drupal_goto($link);
}
$form_state["submitted"] = TRUE;
}
function arrange_fields_position_form_submit($form, $form_state) {
$form_id = $form_state["values"]["arrange_fields_form_id"];
$form_type = $form_state["values"]["arrange_fields_form_type"];
$position_data = $form_state["values"]["arrange_fields_position_data"];
variable_set("arrange_fields_position_data_{$form_id}", $position_data);
$demo_link = l(t("See demo of most recent save (loads in new window)"), "node/add/" . str_replace("_", "-", $form_type), array(
"attributes" => array(
"target" => "_blank",
),
));
if ($form_type == "webform") {
$nid = str_replace("webform_client_form_", "", $form_id);
$demo_link = l(t("See demo of most recent save (loads in new window)"), "node/{$nid}", array(
"attributes" => array(
"target" => "_blank",
),
));
}
if ($form_type == "otherform") {
$demo_link = "";
}
drupal_set_message(t("Position data saved.") . " " . $demo_link);
}
function arrange_fields_page_alter(&$page) {
if (af_get($GLOBALS["arrange_fields_in_popup"])) {
foreach ($page as $key => $val) {
if (!strstr($key, "#") && $key != "content") {
unset($page[$key]);
}
}
}
}
function af_get(&$val) {
if (isset($val)) {
return $val;
}
else {
return "";
}
}