/** * This tool generates a panel with a <form> tag inside it * @param array $params * An associative array of parameters, containing: * "uri" => the uri or url the form should post to * "title" => the title of the panel * "complete" => boolean, indicating whether the data on the server is in a complete state * "editing" => boolean, indicating whether to show the form in the "editing" state * "form" => string containing the contents of the form portion of the panel * which is normally generated by a "pie/form" tool * "static" => string containing the contents of the "static" portion * "collapsed" => defaults to false. Whether the panel is shown as collapsed into just the header * "toggle" => defaults to false. The events that cause toggling of collapsed state. * If the string is 'click' then toggles the panel on clicks. * If the string is 'move' then toggles the panel on mouseenter/mouseleave. * "edit_button" => optional, to override the edit button * "save_button" => optional, to override the save button * "cancel_button" => optional, to override the cancel button * "panel_classes" => optional, additional classes for the panel * "snf" => optional. The name of the nonce field in the session * "on_success" => optional. The URI to redirect to on success * "on_errors" => optional. The URI to display if errors occur * "inProcess" => optional. Causes the panel to appear as if it's a step in a process. */ function pie_panel_tool($params) { foreach (array('title', 'complete', 'editing', 'static', 'form') as $f) { if (!array_key_exists($f, $params)) { throw new Pie_Exception_RequiredField(array('field' => '$' . $f)); } } $defaults = array('edit_button' => "<button type='submit' class='basic16 basic16_edit pie_panel_tool_edit'>edit</button>", 'save_button' => "<button type='submit' class='basic16 basic16_check pie_panel_tool_save'>save</button>", 'cancel_button' => "<button type='reset' class='basic16 basic16_cancel pie_panel_tool_cancel'>cancel</button>", 'panel_classes' => '', 'uri' => null, 'collapsed' => false, 'toggle' => false, 'inProcess' => false, 'on_success' => null, 'on_errors' => null, 'snf' => null); extract(array_merge($defaults, $params)); $more_class = $params['complete'] ? 'pie_panel_tool_complete' : 'pie_panel_tool_incomplete'; $panel_classes = "{$more_class} {$panel_classes}"; $title_div = "<div class='pie_panel_tool_title'>{$title}</div>"; if ($uri) { $header = "<div class='pie_panel_tool_buttons'>{$save_button}{$cancel_button}{$edit_button}</div>{$title_div}"; } else { $header = $title_div; } // Whether to display the panel one way or the other if ($inProcess) { $header = $title_div; if (is_array($form)) { $form['fields']['_pie_buttons'] = array('type' => 'buttons', 'label' => '', 'options' => array('continue' => 'Continue'), 'attributes' => array('class' => 'basic32 basic32_right', 'type' => 'submit')); } else { $form .= "<div class='pie_panel_tool_formbuttons'><button type='submit' class='pie_panel_tool_continue basic32 basic32_right' value='continue'>Continue</button></div>"; } } // Turn the static into a string, if it's an array // This currently doesn't work well, because it causes // a bug where the outer form is submitted twice. if (is_array($static)) { foreach ($static['fields'] as $k => $f) { if (Pie::ifset($static['fields'][$k]['type'])) { switch ($static['fields'][$k]['type']) { case 'textarea': $static['fields'][$k]['value'] = str_replace("\n", "<br>", $static['fields'][$k]['value']); break; case 'date': if (!isset($static['fields'][$k]['options']['date'])) { $static['fields'][$k]['options']['date'] = "M j, Y"; } break; case 'buttons': unset($static['fields'][$k]); } } $static['fields'][$k]['type'] = 'static'; } $static = Pie::tool('pie/form', $static, array('id' => 'static')); } // Turn the form into a form if (is_array($form)) { $form = Pie::tool('pie/form', $form); } // Build the panel $panel = "<div class='pie_panel_tool_header'>{$header}</div>" . "<div class='pie_panel_tool_form'>{$form}</div>"; if (isset($snf) or isset($on_success) or isset($on_errors)) { $panel .= "<div>" . Pie_Html::formInfo($on_success, $on_errors, $snf) . "</div>"; } if ($uri) { $panel = Pie_Html::form($uri, 'post', array('class' => "pie_panel_tool_panel"), $panel); } $panel .= "<div class='pie_panel_tool_static'>{$static}</div>"; if ($editing) { $panel_classes .= ' pie_editing'; } if ($complete) { $panel_classes .= ' pie_complete'; } if ($collapsed) { $panel_classes .= ' pie_collapsed'; } if ($toggle === 'click') { $panel_classes .= ' pie_panel_tool_toggle_onclick'; } if ($toggle === 'move') { $panel_classes .= ' pie_panel_tool_toggle_move'; } Pie_Response::addScript('plugins/pie/js/PieTools.js'); Pie_Response::addStylesheet('plugins/pie/css/Ui.css'); if (isset($_form_static)) { Pie_Response::setSlot('form', $form); Pie_Response::setSlot('static', $static); } return "<div class='pie_panel_tool_container {$panel_classes}'>{$panel}</div>"; }