2016-08-30 35 views
7

有沒有辦法將URL變量傳遞給表單操作?我已經在用戶的詳細信息表單上工作了,但是當我嘗試使用用戶文件上傳時,它不起作用。Silverstripe:將URL變量傳遞給表單操作

正如你將在下面看到的,我有一個表單和一個保存用戶詳細信息的操作。這工作正常。

當我嘗試將URL變量傳遞給用戶文件上載表單時,它不起作用。它說我試圖獲得一個非對象的值。

// 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's 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\'s 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; 
     } 
    } 
+0

在網址參數使用記錄ID通常是一個壞主意。通過更改URL中的ID,用戶可以更改其他成員記錄而不是自己的記錄。爲什麼不使用'Member :: currentUser'或者一個'HiddenField'和它的成員ID呢? –

+0

@FatalError我設置的功能只允許「版主」組更改其他用戶的詳細信息。所以這不是問題。 我應該更清楚我正在建造什麼。 「版主」爲其他用戶上傳文件。所以Member :: currentUser在這裏不適用。我不想將當前用戶的ID附加到文件中。我想將OwnerID更改爲URL中的ID。 當我嘗試使用隱藏字段時,它表示提交表單後顯示「非對象」。我使用getUser()函數將URL ID傳遞給了字段。 – Dallby

+0

如果你傳遞一個隱藏字段的用戶ID,你需要在提交函數'$ ownerMember = Member :: get() - > byID($ data ['OwnerID']);' – thezenmonkey

回答

1

OK,我設法弄清楚這一個...

我不得不設置窗體行動直接上傳功能,以正確的URL。當我點擊提交時,似乎ID已從URL中刪除,所以「getUser」函​​數看不到該值。

下面是上載表單功能的工作代碼:

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; 
    } 
+0

你應該能夠通過id將它保存爲隱藏字段。我想知道問題是你將它保存在ID下,這太普通,可能與控制器安全性相沖突。你有沒有嘗試通過另一個字段名稱傳遞它? – thezenmonkey