19337a630SNickeau<?php 29337a630SNickeau 39337a630SNickeauuse ComboStrap\Bootstrap; 49337a630SNickeauuse ComboStrap\Identity; 5*04fd306cSNickeauuse ComboStrap\IdentityFormsHelper; 69337a630SNickeauuse ComboStrap\LogUtility; 79337a630SNickeauuse ComboStrap\PluginUtility; 8*04fd306cSNickeauuse ComboStrap\Site; 9*04fd306cSNickeauuse ComboStrap\SiteConfig; 10*04fd306cSNickeauuse dokuwiki\Form\Form; 11*04fd306cSNickeauuse dokuwiki\Form\InputElement; 129337a630SNickeau 139337a630SNickeauif (!defined('DOKU_INC')) die(); 1437748cd8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 159337a630SNickeau 169337a630SNickeau/** 179337a630SNickeau * 189337a630SNickeau */ 199337a630SNickeauclass action_plugin_combo_profile extends DokuWiki_Action_Plugin 209337a630SNickeau{ 219337a630SNickeau 229337a630SNickeau const CANONICAL = Identity::CANONICAL; 234cadd4f8SNickeau const TAG_UPDATE = "profile-update"; // form 1 244cadd4f8SNickeau const TAG_DELETE = "profile-delete"; // form 2 259337a630SNickeau const FORM_PROFILE_UPDATE_CLASS = "form-" . self::TAG_UPDATE; 269337a630SNickeau const FORM_PROFILE_DELETE_CLASS = "form-" . self::TAG_DELETE; 279337a630SNickeau const CONF_ENABLE_PROFILE_UPDATE_FORM = "enableProfileUpdateForm"; 289337a630SNickeau const CONF_ENABLE_PROFILE_DELETE_FORM = "enableProfileDeleteForm"; 299337a630SNickeau 309337a630SNickeau 319337a630SNickeau function register(Doku_Event_Handler $controller) 329337a630SNickeau { 339337a630SNickeau /** 349337a630SNickeau * To modify the profile update form and add class 359337a630SNickeau * 369337a630SNickeau * Deprecated object passed by the event but still in use 379337a630SNickeau * https://www.dokuwiki.org/devel:event:html_updateprofileform_output 389337a630SNickeau * 399337a630SNickeau * Event using the new object but not found anywhere 409337a630SNickeau * https://www.dokuwiki.org/devel:event:form_updateprofile_output 419337a630SNickeau */ 42*04fd306cSNickeau if (SiteConfig::getConfValue(self::CONF_ENABLE_PROFILE_UPDATE_FORM, 1)) { 439337a630SNickeau $controller->register_hook('HTML_UPDATEPROFILEFORM_OUTPUT', 'BEFORE', $this, 'handle_profile_update', array()); 44*04fd306cSNickeau $controller->register_hook('FORM_UPDATEPROFILE_OUTPUT', 'BEFORE', $this, 'handle_profile_update', array()); 459337a630SNickeau } 469337a630SNickeau 479337a630SNickeau /** 489337a630SNickeau * To modify the register form and add class 499337a630SNickeau * 509337a630SNickeau * Deprecated object passed by the event but still in use 519337a630SNickeau * https://www.dokuwiki.org/devel:event:html_profiledeleteform_output 529337a630SNickeau * 539337a630SNickeau * Event using the new object but not found anywhere 549337a630SNickeau * https://www.dokuwiki.org/devel:event:form_profiledelete_output 559337a630SNickeau */ 56*04fd306cSNickeau if (SiteConfig::getConfValue(self::CONF_ENABLE_PROFILE_DELETE_FORM, 1)) { 579337a630SNickeau $controller->register_hook('HTML_PROFILEDELETEFORM_OUTPUT', 'BEFORE', $this, 'handle_profile_delete', array()); 58*04fd306cSNickeau $controller->register_hook('FORM_PROFILEDELETE_OUTPUT', 'BEFORE', $this, 'handle_profile_delete', array()); 599337a630SNickeau } 609337a630SNickeau 619337a630SNickeau 629337a630SNickeau } 639337a630SNickeau 649337a630SNickeau function handle_profile_update(&$event, $param) 659337a630SNickeau { 669337a630SNickeau 67*04fd306cSNickeau $form = &$event->data; 68*04fd306cSNickeau $class = get_class($form); 69*04fd306cSNickeau switch ($class) { 70*04fd306cSNickeau case "Doku_Form": 71*04fd306cSNickeau /** 72*04fd306cSNickeau * Old one 73*04fd306cSNickeau * @var Doku_Form $form 74*04fd306cSNickeau */ 75*04fd306cSNickeau self::updateDokuFormProfileUpdate($form); 76*04fd306cSNickeau return; 77*04fd306cSNickeau case "dokuwiki\Form\Form"; 78*04fd306cSNickeau /** 79*04fd306cSNickeau * New One 80*04fd306cSNickeau * @var Form $form 81*04fd306cSNickeau */ 82*04fd306cSNickeau self::updateNewFormProfileUpdate($form); 83*04fd306cSNickeau return; 84*04fd306cSNickeau } 85*04fd306cSNickeau 86*04fd306cSNickeau 87*04fd306cSNickeau } 88*04fd306cSNickeau 89*04fd306cSNickeau public function handle_profile_delete($event, $param) 90*04fd306cSNickeau { 91*04fd306cSNickeau 92*04fd306cSNickeau $form = &$event->data; 93*04fd306cSNickeau $class = get_class($form); 94*04fd306cSNickeau switch ($class) { 95*04fd306cSNickeau case Doku_Form::class: 96*04fd306cSNickeau /** 97*04fd306cSNickeau * Old one 98*04fd306cSNickeau * @var Doku_Form $form 99*04fd306cSNickeau */ 100*04fd306cSNickeau self::updateDokuFormProfileDelete($form); 101*04fd306cSNickeau return; 102*04fd306cSNickeau case dokuwiki\Form\Form::class; 103*04fd306cSNickeau /** 104*04fd306cSNickeau * New One 105*04fd306cSNickeau * @var Form $form 106*04fd306cSNickeau */ 107*04fd306cSNickeau self::updateNewFormProfileDelete($form); 108*04fd306cSNickeau return; 109*04fd306cSNickeau } 110*04fd306cSNickeau 111*04fd306cSNickeau 112*04fd306cSNickeau } 113*04fd306cSNickeau 114*04fd306cSNickeau private static function updateNewFormProfileDelete(Form &$form) 115*04fd306cSNickeau { 116*04fd306cSNickeau /** 117*04fd306cSNickeau * The Login page is an admin page created via buffer 118*04fd306cSNickeau * We print before the forms 119*04fd306cSNickeau * to avoid a FOUC 120*04fd306cSNickeau */ 121*04fd306cSNickeau print IdentityFormsHelper::getHtmlStyleTag(self::TAG_DELETE); 122*04fd306cSNickeau 123*04fd306cSNickeau 124*04fd306cSNickeau $deleteFormClassSuffix = self::FORM_PROFILE_DELETE_CLASS; 125*04fd306cSNickeau $form->addClass(Identity::FORM_IDENTITY_CLASS . " " . $deleteFormClassSuffix); 126*04fd306cSNickeau 127*04fd306cSNickeau /** 128*04fd306cSNickeau * Heading 129*04fd306cSNickeau */ 130*04fd306cSNickeau $headerHTML = IdentityFormsHelper::getHeaderHTML($form, $deleteFormClassSuffix, false); 131*04fd306cSNickeau if ($headerHTML != "") { 132*04fd306cSNickeau $form->addHTML($headerHTML, 1); 133*04fd306cSNickeau } 134*04fd306cSNickeau 135*04fd306cSNickeau IdentityFormsHelper::deleteFieldSetAndBrFromForm($form); 136*04fd306cSNickeau 137*04fd306cSNickeau 138*04fd306cSNickeau /** 139*04fd306cSNickeau * Submit button 140*04fd306cSNickeau */ 141*04fd306cSNickeau $submitButtonPosition = $form->findPositionByAttribute("type", "submit"); 142*04fd306cSNickeau if ($submitButtonPosition === false) { 143*04fd306cSNickeau LogUtility::msg("Internal error: No submit button found"); 144*04fd306cSNickeau return; 145*04fd306cSNickeau } 146*04fd306cSNickeau $form->getElementAt($submitButtonPosition) 147*04fd306cSNickeau ->addClass("btn") 148*04fd306cSNickeau ->addClass("btn-primary"); 149*04fd306cSNickeau 150*04fd306cSNickeau /** 151*04fd306cSNickeau * Password Input 152*04fd306cSNickeau */ 153*04fd306cSNickeau 154*04fd306cSNickeau $passwordElementPosition = $form->findPositionByAttribute("type", "password"); 155*04fd306cSNickeau if ($passwordElementPosition === false) { 156*04fd306cSNickeau LogUtility::msg("Internal error: No password found"); 157*04fd306cSNickeau return; 158*04fd306cSNickeau } 159*04fd306cSNickeau 160*04fd306cSNickeau IdentityFormsHelper::toBootStrapInputElementAndGetNewLoopingPosition($form, $passwordElementPosition, $deleteFormClassSuffix); 161*04fd306cSNickeau 162*04fd306cSNickeau 163*04fd306cSNickeau } 164*04fd306cSNickeau 165*04fd306cSNickeau private static function updateDokuFormProfileDelete(Doku_Form &$form) 166*04fd306cSNickeau { 167*04fd306cSNickeau 1689337a630SNickeau /** 1699337a630SNickeau * The profile page is created via buffer 1709337a630SNickeau * We print before the forms to avoid a FOUC 1719337a630SNickeau */ 172*04fd306cSNickeau print IdentityFormsHelper::getHtmlStyleTag(self::TAG_DELETE); 1739337a630SNickeau 174*04fd306cSNickeau 1759337a630SNickeau $class = &$form->params["class"]; 176*04fd306cSNickeau IdentityFormsHelper::addIdentityClass($class, self::FORM_PROFILE_DELETE_CLASS); 1779337a630SNickeau $newFormContent = []; 1789337a630SNickeau 1799337a630SNickeau /** 1809337a630SNickeau * Header (Logo / Title) 1819337a630SNickeau */ 182*04fd306cSNickeau $newFormContent[] = IdentityFormsHelper::getHeaderHTML($form, self::FORM_PROFILE_DELETE_CLASS, false); 183*04fd306cSNickeau 184*04fd306cSNickeau /** 185*04fd306cSNickeau * Field 186*04fd306cSNickeau */ 187*04fd306cSNickeau foreach ($form->_content as $field) { 188*04fd306cSNickeau if (!is_array($field)) { 189*04fd306cSNickeau continue; 190*04fd306cSNickeau } 191*04fd306cSNickeau $fieldName = $field["name"]; 192*04fd306cSNickeau if ($fieldName == null) { 193*04fd306cSNickeau // this is not an input field 194*04fd306cSNickeau if ($field["type"] == "submit") { 195*04fd306cSNickeau /** 196*04fd306cSNickeau * This is important to keep the submit element intact 197*04fd306cSNickeau * for forms integration such as captcha 198*04fd306cSNickeau * They search the submit button to insert before it 199*04fd306cSNickeau */ 200*04fd306cSNickeau $classes = "btn btn-primary btn-block"; 201*04fd306cSNickeau if (isset($field["class"])) { 202*04fd306cSNickeau $field["class"] = $field["class"] . " " . $classes; 203*04fd306cSNickeau } else { 204*04fd306cSNickeau $field["class"] = $classes; 205*04fd306cSNickeau } 206*04fd306cSNickeau $newFormContent[] = $field; 207*04fd306cSNickeau } 208*04fd306cSNickeau continue; 209*04fd306cSNickeau } 210*04fd306cSNickeau switch ($fieldName) { 211*04fd306cSNickeau case "oldpass": 212*04fd306cSNickeau $passwordText = $field["_text"]; 213*04fd306cSNickeau $passwordFieldHTML = <<<EOF 214*04fd306cSNickeau<div> 215*04fd306cSNickeau <input type="password" class="form-control" placeholder="$passwordText" required="required" name="$fieldName"> 216*04fd306cSNickeau</div> 217*04fd306cSNickeauEOF; 218*04fd306cSNickeau $newFormContent[] = $passwordFieldHTML; 219*04fd306cSNickeau break; 220*04fd306cSNickeau case "confirm_delete": 221*04fd306cSNickeau $confirmText = $field["_text"]; 222*04fd306cSNickeau $ConfirmValue = $field["value"]; 223*04fd306cSNickeau $rememberMeHtml = <<<EOF 224*04fd306cSNickeau<div class="checkbox rememberMe"> 225*04fd306cSNickeau <label><input type="checkbox" name="$fieldName" value="$ConfirmValue" required="required"> $confirmText</label> 226*04fd306cSNickeau</div> 227*04fd306cSNickeauEOF; 228*04fd306cSNickeau $newFormContent[] = $rememberMeHtml; 229*04fd306cSNickeau break; 230*04fd306cSNickeau default: 231*04fd306cSNickeau $tag = self::TAG_DELETE; 232*04fd306cSNickeau LogUtility::msg("The $tag field name ($fieldName) is unknown", LogUtility::LVL_MSG_ERROR, self::CANONICAL); 233*04fd306cSNickeau 234*04fd306cSNickeau 235*04fd306cSNickeau } 236*04fd306cSNickeau } 237*04fd306cSNickeau $form->_content = $newFormContent; 238*04fd306cSNickeau 239*04fd306cSNickeau } 240*04fd306cSNickeau 241*04fd306cSNickeau private static function updateNewFormProfileUpdate(Form &$form) 242*04fd306cSNickeau { 243*04fd306cSNickeau /** 244*04fd306cSNickeau * The Login page is an admin page created via buffer 245*04fd306cSNickeau * We print before the forms 246*04fd306cSNickeau * to avoid a FOUC 247*04fd306cSNickeau */ 248*04fd306cSNickeau print IdentityFormsHelper::getHtmlStyleTag(self::TAG_UPDATE); 249*04fd306cSNickeau 250*04fd306cSNickeau 251*04fd306cSNickeau $form->addClass(Identity::FORM_IDENTITY_CLASS . " " . self::FORM_PROFILE_UPDATE_CLASS); 252*04fd306cSNickeau 253*04fd306cSNickeau 254*04fd306cSNickeau /** 255*04fd306cSNickeau * Heading 256*04fd306cSNickeau */ 257*04fd306cSNickeau $headerHTML = IdentityFormsHelper::getHeaderHTML($form, self::FORM_PROFILE_UPDATE_CLASS); 258*04fd306cSNickeau if ($headerHTML != "") { 259*04fd306cSNickeau $form->addHTML($headerHTML, 1); 260*04fd306cSNickeau } 261*04fd306cSNickeau 262*04fd306cSNickeau IdentityFormsHelper::deleteFieldSetAndBrFromForm($form); 263*04fd306cSNickeau 264*04fd306cSNickeau /** 265*04fd306cSNickeau * Submit and reset button 266*04fd306cSNickeau */ 267*04fd306cSNickeau IdentityFormsHelper::toBootStrapSubmitButton($form); 268*04fd306cSNickeau IdentityFormsHelper::toBootstrapResetButton($form); 269*04fd306cSNickeau 270*04fd306cSNickeau /** 271*04fd306cSNickeau * Input elements 272*04fd306cSNickeau */ 273*04fd306cSNickeau IdentityFormsHelper::toBoostrapInputElements($form, self::FORM_PROFILE_UPDATE_CLASS); 274*04fd306cSNickeau 275*04fd306cSNickeau } 276*04fd306cSNickeau 277*04fd306cSNickeau 278*04fd306cSNickeau private static function updateDokuFormProfileUpdate(Doku_Form &$form) 279*04fd306cSNickeau { 280*04fd306cSNickeau 281*04fd306cSNickeau /** 282*04fd306cSNickeau * The profile page is created via buffer 283*04fd306cSNickeau * We print before the forms to avoid a FOUC 284*04fd306cSNickeau */ 285*04fd306cSNickeau print IdentityFormsHelper::getHtmlStyleTag(self::TAG_UPDATE); 286*04fd306cSNickeau 287*04fd306cSNickeau 288*04fd306cSNickeau $class = &$form->params["class"]; 289*04fd306cSNickeau IdentityFormsHelper::addIdentityClass($class, self::FORM_PROFILE_UPDATE_CLASS); 290*04fd306cSNickeau $newFormContent = []; 291*04fd306cSNickeau 292*04fd306cSNickeau /** 293*04fd306cSNickeau * Header (Logo / Title) 294*04fd306cSNickeau */ 295*04fd306cSNickeau $newFormContent[] = IdentityFormsHelper::getHeaderHTML($form, self::FORM_PROFILE_UPDATE_CLASS); 2969337a630SNickeau 2979337a630SNickeau 2989337a630SNickeau /** 2999337a630SNickeau * Form Attributes 3009337a630SNickeau * https://getbootstrap.com/docs/5.0/forms/layout/#horizontal-form 3019337a630SNickeau */ 3029337a630SNickeau $rowClass = "row"; 3039337a630SNickeau if (Bootstrap::getBootStrapMajorVersion() == Bootstrap::BootStrapFourMajorVersion) { 3049337a630SNickeau $rowClass .= " form-group"; 3059337a630SNickeau } 3069337a630SNickeau $firstColWeight = 5; 3079337a630SNickeau $secondColWeight = 12 - $firstColWeight; 3089337a630SNickeau 3099337a630SNickeau 3109337a630SNickeau /** 3119337a630SNickeau * Replace the field 3129337a630SNickeau * 3139337a630SNickeau * The password text localized by lang is shared 3149337a630SNickeau * between the password and the password check field 3159337a630SNickeau */ 3169337a630SNickeau $passwordText = "Password"; 3179337a630SNickeau foreach ($form->_content as $field) { 3189337a630SNickeau if (!is_array($field)) { 3199337a630SNickeau continue; 3209337a630SNickeau } 3219337a630SNickeau $fieldName = $field["name"]; 3229337a630SNickeau if ($fieldName == null) { 3239337a630SNickeau // this is not an input field 3249337a630SNickeau switch ($field["type"]) { 3259337a630SNickeau case "submit": 3269337a630SNickeau /** 3279337a630SNickeau * This is important to keep the submit element intact 3289337a630SNickeau * for forms integration such as captcha 3299337a630SNickeau * The search the submit button to insert before it 3309337a630SNickeau */ 3319337a630SNickeau $classes = "btn btn-primary"; 3329337a630SNickeau if (isset($field["class"])) { 3339337a630SNickeau $field["class"] = $field["class"] . " " . $classes; 3349337a630SNickeau } else { 3359337a630SNickeau $field["class"] = $classes; 3369337a630SNickeau } 3379337a630SNickeau $field["tabindex"] = "6"; 3389337a630SNickeau $newFormContent[] = $field; 3399337a630SNickeau break; 3409337a630SNickeau case "reset": 3419337a630SNickeau $classes = "btn btn-secondary"; 3429337a630SNickeau if (isset($field["class"])) { 3439337a630SNickeau $field["class"] = $field["class"] . " " . $classes; 3449337a630SNickeau } else { 3459337a630SNickeau $field["class"] = $classes; 3469337a630SNickeau } 3479337a630SNickeau $field["tabindex"] = "7"; 3489337a630SNickeau $newFormContent[] = $field; 3499337a630SNickeau break; 3509337a630SNickeau } 3519337a630SNickeau continue; 3529337a630SNickeau } 3539337a630SNickeau switch ($fieldName) { 3549337a630SNickeau case "login": 3559337a630SNickeau $loginText = $field["_text"]; 3569337a630SNickeau $loginValue = $field["value"]; 3579337a630SNickeau $loginHTML = <<<EOF 3589337a630SNickeau<div class="$rowClass"> 3599337a630SNickeau <label for="inputUserName" class="col-sm-$firstColWeight col-form-label">$loginText</label> 3609337a630SNickeau <div class="col-sm-$secondColWeight"> 3619337a630SNickeau <input type="text" class="form-control" id="inputUserName" placeholder="Username" name="$fieldName" value="$loginValue" disabled> 3629337a630SNickeau </div> 3639337a630SNickeau</div> 3649337a630SNickeauEOF; 3659337a630SNickeau $newFormContent[] = $loginHTML; 3669337a630SNickeau break; 3679337a630SNickeau case "fullname": 3689337a630SNickeau $fullNameText = $field["_text"]; 3699337a630SNickeau $fullNameValue = $field["value"]; 3709337a630SNickeau $fullNameHtml = <<<EOF 3719337a630SNickeau<div class="$rowClass"> 3729337a630SNickeau <label for="inputRealName" class="col-sm-$firstColWeight col-form-label">$fullNameText</label> 3739337a630SNickeau <div class="col-sm-$secondColWeight"> 3749337a630SNickeau <input type="text" class="form-control" id="inputRealName" placeholder="$fullNameText" tabindex="1" name="$fieldName" value="$fullNameValue" required="required"> 3759337a630SNickeau </div> 3769337a630SNickeau</div> 3779337a630SNickeauEOF; 3789337a630SNickeau $newFormContent[] = $fullNameHtml; 3799337a630SNickeau break; 3809337a630SNickeau case "email": 3819337a630SNickeau $emailText = $field["_text"]; 3829337a630SNickeau $emailValue = $field["value"]; 3839337a630SNickeau $emailHTML = <<<EOF 3849337a630SNickeau<div class="$rowClass"> 3859337a630SNickeau <label for="inputEmail" class="col-sm-$firstColWeight col-form-label">$emailText</label> 3869337a630SNickeau <div class="col-sm-$secondColWeight"> 3879337a630SNickeau <input type="email" class="form-control" id="inputEmail" placeholder="name@example.com" tabindex="2" name="$fieldName" value="$emailValue" required="required"> 3889337a630SNickeau </div> 3899337a630SNickeau</div> 3909337a630SNickeauEOF; 3919337a630SNickeau $newFormContent[] = $emailHTML; 3929337a630SNickeau break; 3939337a630SNickeau case "newpass": 3949337a630SNickeau $passwordText = $field["_text"]; 3959337a630SNickeau $passwordHtml = <<<EOF 3969337a630SNickeau<div class="$rowClass"> 3979337a630SNickeau <label for="inputPassword" class="col-sm-$firstColWeight col-form-label">$passwordText</label> 3989337a630SNickeau <div class="col-sm-$secondColWeight"> 3999337a630SNickeau <input type="password" class="form-control" id="inputPassword" placeholder="$passwordText" tabindex="3" name="$fieldName"> 4009337a630SNickeau </div> 4019337a630SNickeau</div> 4029337a630SNickeauEOF; 4039337a630SNickeau $newFormContent[] = $passwordHtml; 4049337a630SNickeau break; 4059337a630SNickeau case "passchk": 4069337a630SNickeau $passwordCheckText = $field["_text"]; 4079337a630SNickeau $passwordCheckHtml = <<<EOF 4089337a630SNickeau<div class="$rowClass"> 4099337a630SNickeau <label for="inputPasswordCheck" class="col-sm-$firstColWeight col-form-label">$passwordCheckText</label> 4109337a630SNickeau <div class="col-sm-$secondColWeight"> 4119337a630SNickeau <input type="password" class="form-control" id="inputPasswordCheck" placeholder="$passwordText" tabindex="4" name="$fieldName"> 4129337a630SNickeau </div> 4139337a630SNickeau</div> 4149337a630SNickeauEOF; 4159337a630SNickeau $newFormContent[] = $passwordCheckHtml; 4169337a630SNickeau break; 4179337a630SNickeau case "oldpass": 4189337a630SNickeau $passwordCheckText = $field["_text"]; 4199337a630SNickeau $passwordCheckHtml = <<<EOF 4209337a630SNickeau<div class="$rowClass"> 4219337a630SNickeau <label for="inputPasswordCheck" class="col-sm-$firstColWeight col-form-label">$passwordCheckText</label> 4229337a630SNickeau <div class="col-sm-$secondColWeight"> 4239337a630SNickeau <input type="password" class="form-control" id="inputPasswordCheck" placeholder="$passwordCheckText" tabindex="5" name="$fieldName" required="required"> 4249337a630SNickeau </div> 4259337a630SNickeau</div> 4269337a630SNickeauEOF; 4279337a630SNickeau $newFormContent[] = $passwordCheckHtml; 4289337a630SNickeau break; 4299337a630SNickeau 4309337a630SNickeau 4319337a630SNickeau default: 4329337a630SNickeau $tag = self::TAG_UPDATE; 4339337a630SNickeau LogUtility::msg("The $tag field name ($fieldName) is unknown", LogUtility::LVL_MSG_ERROR, self::CANONICAL); 4349337a630SNickeau 4359337a630SNickeau } 4369337a630SNickeau } 4379337a630SNickeau 4389337a630SNickeau 4399337a630SNickeau /** 4409337a630SNickeau * Update 4419337a630SNickeau */ 4429337a630SNickeau $form->_content = $newFormContent; 4439337a630SNickeau 4449337a630SNickeau } 4459337a630SNickeau 4469337a630SNickeau} 4479337a630SNickeau 448