2016-08-30 18 views
7

Czy istnieje sposób przekazania zmiennej adresu URL do działania formularza? Mam to działa na formularzu danych użytkownika, ale gdy próbuję to zrobić z przesłaniem pliku użytkownika, nie będzie działać.Silverstripe: Przepuścić adres URL Zmienna do formularza Działanie

Jak widać poniżej, mam formularz i akcję zapisu, aby zapisać dane użytkownika. To działa dobrze.

Kiedy próbuję przekazać zmienną adresu URL do formularza przesyłania plików użytkownika, nie działa. Mówi, że próbuję uzyskać wartość nieobiektową.

// 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

Korzystanie identyfikator rekordu w params URL jest ogólnie zły pomysł. Użytkownicy mogą zmieniać inne zapisy członków niż własne, zmieniając identyfikator w adresie URL. Dlaczego nie używać 'Member :: currentUser' lub' HiddenField' z identyfikatorem członka? –

+0

@FatalError Mam skonfigurowane funkcje, które umożliwiają grupie "Moderator" zmianę danych innych użytkowników. To nie jest problem. Prawdopodobnie powinienem był jaśniej zrozumieć, co buduję. "Moderatorzy" przesyłają pliki innym użytkownikom. Więc Member :: currentUser nie ma tutaj zastosowania. Nie chcę dołączać bieżącego identyfikatora użytkownika do pliku. Chcę zmienić OwnerID na identyfikator znajdujący się w adresie URL. Kiedy próbowałem użyć ukrytego pola, po wysłaniu formularza jest napisane "nie-obiekt". Przekazałem identyfikator URL do pola za pomocą funkcji getUser(). – Dallby

+0

Jeśli identyfikator użytkownika zostanie przekazany w ukrytym polu, musisz go odzyskać w funkcji przesyłania '$ ownerMember = Member :: get() -> byID ($ data ['OwnerID']);' – thezenmonkey

Odpowiedz

1

OK, udało mi się zrozumieć ten jeden ...

musiałem ustawić działanie formularz skierować funkcji przesyłania do właściwego adresu URL. Wygląda na to, że identyfikator został usunięty z adresu URL po kliknięciu przycisku "Wyślij", więc funkcja "getUser" nie mogła zobaczyć wartości.

Oto kod działa dla funkcji Prześlij Kształt:

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

Możesz przekazać identyfikator, zapisując go w ukrytym polu. Zastanawiam się, że problem polega na tym, że zapisujesz go pod ID, który jest zbyt ogólny i prawdopodobnie koliduje z bezpieczeństwem kontrolera. Czy próbowałeś przekazać go przez inną nazwę pola? – thezenmonkey