Silverstripe: Pass variable url for form action

Is there a way to pass a URL variable into a form action? I have work on a user data form, but when I try to do this with a user file upload, this will not work.

As you will see below, I have a save form and action to save user information. It works great.

When I try to pass the URL variable to the user file upload form, it does not work. It says that I'm trying to get the value of a non-object.

// Get Client ID from URL Parameters public function getUser() { if( isset($this->urlParams['ID']) && is_numeric($this->urlParams['ID']) ) { return $user = Member::get()->byID($this->urlParams['ID']); } else { return $user = $this->request->postVars(); } } // Edit/Save a User details public function EditUserDetails() { //Include JS for updating details Requirements::javascript('module-memberprofiles/javascript/MemberProfileUpdate.js'); Requirements::set_force_js_to_bottom(true); $fields = new FieldList( $leftCol = CompositeField::create( TextField::create('FirstName', 'First Name') ->setFieldHolderTemplate('UserDetails_FieldHolder'), TextField::create('Surname', 'Surname') ->setFieldHolderTemplate('UserDetails_FieldHolder'), CompositeField::create( TextField::create('Address', ''), TextField::create('Suburb', ''), CompositeField::create( DropdownField::create('State', '', singleton('Member')->dbObject('State')->enumValues())->setFieldHolderTemplate('UserDetails_StatePostCode'), TextField::create('PostCode', '')->setFieldHolderTemplate('UserDetails_StatePostCode') )->addExtraClass('row') ) ->addExtraClass('userdetails-address wrap') ->setFieldHolderTemplate('UserDetails_AddressHolder'), TextField::create('Phone', 'Phone') ->setFieldHolderTemplate('UserDetails_FieldHolder'), TextField::create('Email', 'Email') ->setFieldHolderTemplate('UserDetails_FieldHolder') )->setFieldHolderTemplate('UserDetails_CompositeField') ); $actions = new FieldList(new FormAction('SaveUserDetails', 'Save Profile')); $validation = new RequiredFields(array('FirstName','Surname','Email')); $form = new Form ( $this, 'EditUserDetails', $fields, $actions, $validation); $form->loadDataFrom($this->getUser()); $form->setTemplate('MemberProfilePage_UserDetailsForm'); return $form; } public function SaveUserDetails($data, $form) { $table = Member::get()->byID($this->getUser()); $members = Member::get(); $emailExists = $members->filter(array( 'Email' => $data['Email'], 'ID:not' => $table->ID )); if( $emailExists->count() > 0 ) { $form->sessionMessage('Sorry, that email address already exists. Please try again','bad'); return $this->redirectBack(); } else { $form->sessionMessage('You have successfully updated this user\ details.','good'); } $form->saveInto($table); $table->write(); $this->redirectBack(); return $this; } //User file upload function public function UploadUserFile() { $fields = FieldList::create( FileField::create('UserFiles', 'Upload files') ); $actions = FieldList::create(FormAction::create('SaveUserFile', 'Upload files')); $form = Form::create($this, __FUNCTION__, $fields, $actions, null); $form->loadDataFrom($this->getUser()); return $form; } //Refresh files function public function SaveUserFile($data, $form) { $up = new Upload(); $file = Object::create('File'); $file->setFileName('newname'); $up->loadIntoFile($data['UserFiles'], $file, 'User-Files'); if($up->isError()) { //handle error here //var_dump($up->getErrors()); }else { //file uploaded //$file->OwnerID = 3; //$file->write(); //$this->redirectBack(); return $this; } } 
+7
php forms file-upload silverstripe
source share
1 answer

OK, I managed to figure it out ...

I needed to set the form action to redirect the upload function to the correct URL. It seems that the identifier was removed from the URL when the submit button was clicked, so the getUser function could not see the value.

Here is the working code for the function "Download Form":

 public function UploadUserFile() { $fields = FieldList::create( FileField::create('UserFiles', 'Upload files'), HiddenField::create('ID','',$this->getUser()->ID) ); $actions = FieldList::create( FormAction::create('SaveUserFile', 'Upload files') ->addExtraClass('button rounded solid') ); $form = Form::create($this, 'UploadUserFile', $fields, $actions); $form->setFormAction($this->Link().'UploadUserFile/'.$this->getUser()->ID); return $form; } 
+1
source share

All Articles