2016-08-30 12 views
7

có cách nào để chuyển biến URL sang hành động biểu mẫu không? Tôi đã có nó làm việc trên một hình thức chi tiết người dùng, nhưng khi tôi đang cố gắng để làm điều đó với một tập tin người dùng tải lên nó sẽ không hoạt động.Đường sọc: Chuyển biến số URL sang biểu mẫu hành động

Như bạn sẽ thấy bên dưới, tôi có biểu mẫu và hành động lưu để lưu chi tiết người dùng. Điều đó hoạt động tốt.

Khi tôi cố gắng chuyển biến URL tới biểu mẫu Tải lên tệp người dùng, nó không hoạt động. Nó nói rằng tôi đang cố gắng để có được một giá trị của một đối tượng không.

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

Sử dụng ID kỷ lục trong params URL nói chung là một ý tưởng tồi. Người dùng có thể thay đổi Bản ghi thành viên khác thay vì bản thân họ bằng cách thay đổi ID trong URL. Tại sao không sử dụng 'Member :: currentUser' hoặc' HiddenField' với ID thành viên trong đó? –

+0

@ FatalError Tôi có các chức năng được thiết lập chỉ cho phép nhóm "Moderator" thay đổi chi tiết của những người dùng khác. Vì vậy, đó không phải là một vấn đề. Tôi có lẽ phải rõ ràng hơn về những gì tôi đang xây dựng. Tệp tải lên "người kiểm duyệt" cho người dùng khác. Vì vậy, Member :: currentUser không được áp dụng ở đây. Tôi không muốn đính kèm ID của người dùng hiện tại vào một tệp. Tôi muốn thay đổi OwnerID thành ID trong URL. Khi tôi cố gắng sử dụng một trường ẩn, nó nói "không phản đối" sau khi biểu mẫu được gửi. Tôi đã chuyển ID URL cho trường bằng hàm getUser(). – Dallby

+0

Nếu bạn vượt qua User ID trong một trường ẩn, bạn cần phải trả lại bản ghi đó trong hàm gửi '$ ownerMember = Member :: get() -> byID ($ data ['OwnerID']); ' – thezenmonkey

Trả lời

1

OK, tôi quản lý để tìm một này ra ...

tôi phải thiết lập một hình thức hành động để chỉ đạo các chức năng tải lên đến URL chính xác. Có vẻ như ID đã bị xóa khỏi URL khi tôi nhấp vào gửi, do đó, chức năng "getUser" không thể thấy giá trị.

Dưới đây là đoạn code làm việc cho các chức năng Tải lên Mẫu:

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

Bạn shoulf có thể vượt qua các id tiết kiệm nó một lĩnh vực ẩn. Tôi tự hỏi id vấn đề là bạn đang lưu nó dưới ID, đó là quá chung chung và có khả năng xung đột với bảo mật điều khiển. Bạn đã thử truyền nó qua một tên trường khác chưa? – thezenmonkey

Các vấn đề liên quan