2016-08-30 1 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

는 URL PARAMS에서 레코드 ID를 사용 :

여기에 업로드 양식 기능의 작업 코드입니다. 사용자는 URL의 ID를 변경하여 다른 회원 레코드를 변경합니다. 'Member :: currentUser' 또는 멤버 ID가있는'HiddenField'를 왜 사용하지 않을까요? –

+0

@FatalError "Moderator"그룹 만 다른 사용자의 세부 정보를 변경할 수있는 기능을 설정했습니다. 그래서 그게 문제가 아니에요. 내가 만드는 것에 대해서는 분명히 분명히해야했습니다. "운영자"는 다른 사용자의 파일을 업로드합니다. 따라서 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가 너무 일반적이고 컨트롤러 보안과 충돌 할 가능성이있는 ID 아래에 ID를 저장한다는 이슈를 궁금해한다. 다른 필드 이름을 통해 전달하려고 했습니까? – thezenmonkey