2015-02-05 81 views
0

對於cakephp來說相對較新,我試圖使用saveall()並根據用戶爲寄存器選擇的角色保存各個模型。CakePHP使用saveAll並指定僅限於哪些模型

這是我的觀點:

<?php echo $this->Form->create('User', array('type' => 'file')); ?> 
    <fieldset> 
     <legend><?php echo __('Add User'); ?></legend> 
     <?php 
      echo $this->Form->file('User.user_image'); 
      echo $this->Form->input('User.name', array('label' => 'Nombre')); 
      echo $this->Form->input('User.last_name', array('label' => 'Apellidos')); 
      echo $this->Form->input('User.email', array('label' => 'E-Mail')); 
      echo $this->Form->input('User.password', array('label' => 'Contraseña')); 
      echo $this->Form->input('User.phone', array('label' => 'Telefono')); 
      //echo $this->Form->input('created_ip_connection'); 
      //echo $this->Form->input('last_ip_connection'); 
      echo $this->Form->input('User.group_id', array('empty' => 'Elige un rol', 'label' => 'Rol de Usuario')); 
     ?> 
     <div style="display: none;" id="companyAdd"> 
      <legend><?php echo __('Datos de Compañia'); ?></legend> 
      <?php 
       echo $this->Form->input('Address.exterior_number', array('label' => 'Numero Exterior', 'required' => false)); 
       echo $this->Form->input('Address.internal_number', array('label' => 'Numero Interior', 'required' => false)); 
       echo $this->Form->input('Address.street', array('label' => 'Calle', 'required' => false)); 
       echo $this->Form->input('Address.suburby', array('label' => 'Colonia', 'required' => false)); 
       echo $this->Form->input('Address.country_id', array('empty' => 'Selecciona País', 'label' => 'Pais', 'required' => false)); 
       echo $this->Form->input('Address.state_id', array('empty' => 'Selecciona País', 'label' => 'Estado', 'required' => false)); 
       echo $this->Form->input('Address.city_id', array('empty' => 'Selecciona Estado', 'label' => 'Municipio', 'required' => false)); 
       echo $this->Form->input('Company.name', array('label' => 'Nombre de Compañia', 'required' => false)); 
       echo $this->Form->input('Company.description', array('label' => 'Descripción de Compañia', 'required' => false)); 
       echo $this->Form->input('Company.bank_acc', array('label' => 'Cuenta de Banco', 'required' => false)); 
       echo $this->Form->input('Company.rfc', array('label' => 'RFC', 'required' => false)); 
      ?> 
     </div> 
     <div style="display: none;" id="userAdd"> 
      <legend><?php echo __('Datos de Comprador/Proveedor'); ?></legend> 
      <?php 
       echo $this->Form->input('Buyer.company_id', array('empty' => 'Elige Comapñia', 'label' => 'Compañia', 'required' => false)); 
      ?> 
     </div> 
    </fieldset> 

<?php echo $this->Form->end(__('Registrar')); ?> 

這裏是我的控制器:

public function register(){ 
    $this->layout = 'generalLayout'; 
    if ($this->request->is('post')) { 
     if($this->request->data['User']['group_id'] == 1){ 
      $this->User->create(); 
      if(!empty($this->data)) 
      { 
       //Check if image has been uploaded 
       if(!empty($this->data['User']['user_image']['name'])) 
       { 
        $file = $this->data['User']['user_image']; //put the data into a var for easy use 

        $ext = substr(strtolower(strrchr($file['name'], '.')), 1); //get the extension 
        $arr_ext = array('jpg', 'jpeg', 'gif'); //set allowed extensions 

        //only process if the extension is valid 
        if(in_array($ext, $arr_ext)) 
        { 
         //do the actual uploading of the file. First arg is the tmp name, second arg is 
         //where we are putting it 
         $destinationPath = 'images\users\\'; 
         $randomCode = substr(md5(uniqid(rand(), true)), 5, 5); 
         $filename = $this->data['User']['name'].'_'.$randomCode."_".$file['name']; 
         move_uploaded_file($file['tmp_name'], WWW_ROOT . $destinationPath . $filename); 

         //prepare the filename for database entry 
         $this->request->data['User']['user_image'] = $filename; 
        } 
       } 
       $this->request->data['User']['created_ip_connection'] = $this->request->clientIp(); 
       $this->request->data['User']['last_ip_connection'] = $this->request->clientIp(); 
       if ($this->User->saveAll($this->request->data['User'])) { 
        $this->Session->setFlash(__('The user has been saved.')); 
        return $this->redirect(array('action' => 'register')); 
       } else { 
        $this->Session->setFlash(__('The user could not be saved. Please, try again.')); 
       } 
       //now do the save 
       //$this->products->save($this->data) ; 
      } 
     } 
     if($this->request->data['User']['group_id'] == 2){ 
      $this->User->create(); 
      if(!empty($this->data)) 
      { 
       //Check if image has been uploaded 
       if(!empty($this->data['User']['user_image']['name'])) 
       { 
        $file = $this->data['User']['user_image']; //put the data into a var for easy use 

        $ext = substr(strtolower(strrchr($file['name'], '.')), 1); //get the extension 
        $arr_ext = array('jpg', 'jpeg', 'gif'); //set allowed extensions 

        //only process if the extension is valid 
        if(in_array($ext, $arr_ext)) 
        { 
         //do the actual uploading of the file. First arg is the tmp name, second arg is 
         //where we are putting it 
         $destinationPath = 'images\users\\'; 
         $randomCode = substr(md5(uniqid(rand(), true)), 5, 5); 
         $filename = $this->data['User']['name'].'_'.$randomCode."_".$file['name']; 
         move_uploaded_file($file['tmp_name'], WWW_ROOT . $destinationPath . $filename); 

         //prepare the filename for database entry 
         $this->request->data['User']['user_image'] = $filename; 
        } 
       } 
       $this->request->data['User']['created_ip_connection'] = $this->request->clientIp(); 
       $this->request->data['User']['last_ip_connection'] = $this->request->clientIp(); 
       if ($this->User->saveAll($this->request->data)) { 
        $this->Session->setFlash(__('The user has been saved.')); 
        return $this->redirect(array('action' => 'register')); 
       } else { 
        $this->Session->setFlash(__('The user could not be saved. Please, try again.')); 
       } 
       //now do the save 
       //$this->products->save($this->data) ; 
      } 
     } 
     if($this->request->data['User']['group_id'] == 3){ 
      $this->Session->setFlash(__('Group 3 Happened')); 
      return $this->redirect(array('action' => 'register')); 
     } 
     /*$this->Session->setFlash(__('Nothing Happened')); 
     return $this->redirect(array('action' => 'register'));*/ 

    } 
    $groups = $this->User->Group->find('list'); 
    $this->set(compact('groups')); 
    $companies = $this->User->Company->find('list'); 
    $this->set(compact('companies')); 
} 

而且我的模型關係

public $hasOne = array(
    'Buyer' => array(
     'className' => 'Buyer', 
     'foreignKey' => 'user_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    ), 
    'Company' => array(
     'className' => 'Company', 
     'foreignKey' => 'user_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    ), 
    'Provider' => array(
     'className' => 'Provider', 
     'foreignKey' => 'user_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    ) 
); 

我想要麼只發送所需的信息(意思模型取決於所選擇的組)。通過窗體到控制器。或者在控制器中只使用發送的模型來保存我想要的模型。我怎麼能做這個工作。 saveAll不起作用,因爲我也通過表單發送沒有信息的其他模型。我怎麼能做這個工作?

另外如何獲取我剛剛保存的用戶的ID?

+0

你有沒有嘗試刪除你不'saveAll'-例如,'未設置($這個 - >請求 - >數據之前想要的信息['供應商'])'如果你不想提供者字段? – AgRizzo 2015-02-05 20:12:27

+0

您還可以在調用saveAll之前解除模型綁定 – 2015-02-05 21:12:17

回答

0

好吧,我發現如何做到這一點。我使用了Saving Related Model Data方法。我只是根據正在創建的用戶的類型,使用表單發送的數據所需的信息。我沒有改變視圖和模型。我只更改了group_id爲2(普通用戶)和3(半管理員用戶)時的部分控制器。使用模型關係和發送的信息,我可以根據我給出的信息,對每個模型使用save()方法。下面是代碼,我希望它可以幫助別人:

$this->layout = 'generalLayout'; 
    if ($this->request->is('post')) { 
     if($this->request->data['User']['group_id'] == 1){ 
      $this->User->create(); 
      if(!empty($this->data)) 
      { 
       //Check if image has been uploaded 
       if(!empty($this->data['User']['user_image']['name'])) 
       { 
        $file = $this->data['User']['user_image']; //put the data into a var for easy use 

        $ext = substr(strtolower(strrchr($file['name'], '.')), 1); //get the extension 
        $arr_ext = array('jpg', 'jpeg', 'gif'); //set allowed extensions 

        //only process if the extension is valid 
        if(in_array($ext, $arr_ext)) 
        { 
         //do the actual uploading of the file. First arg is the tmp name, second arg is 
         //where we are putting it 
         $destinationPath = 'images\users\\'; 
         $randomCode = substr(md5(uniqid(rand(), true)), 5, 5); 
         $filename = $this->data['User']['name'].'_'.$randomCode."_".$file['name']; 
         move_uploaded_file($file['tmp_name'], WWW_ROOT . $destinationPath . $filename); 

         //prepare the filename for database entry 
         $this->request->data['User']['user_image'] = $filename; 
        } 
       } 
       $this->request->data['User']['created_ip_connection'] = $this->request->clientIp(); 
       $this->request->data['User']['last_ip_connection'] = $this->request->clientIp(); 
       if ($this->User->saveAll($this->request->data['User'])) { 
        $this->Session->setFlash(__('The user has been saved.')); 
        return $this->redirect(array('action' => 'register')); 
       } else { 
        $this->Session->setFlash(__('The user could not be saved. Please, try again.')); 
       } 
       //now do the save 
       //$this->products->save($this->data) ; 
      } 
     } 
     if($this->request->data['User']['group_id'] == 2){ 
      $this->User->create(); 
      if(!empty($this->data)) 
      { 
       //Check if image has been uploaded 
       if(!empty($this->data['User']['user_image']['name'])) 
       { 
        $file = $this->data['User']['user_image']; //put the data into a var for easy use 

        $ext = substr(strtolower(strrchr($file['name'], '.')), 1); //get the extension 
        $arr_ext = array('jpg', 'jpeg', 'gif'); //set allowed extensions 

        //only process if the extension is valid 
        if(in_array($ext, $arr_ext)) 
        { 
         //do the actual uploading of the file. First arg is the tmp name, second arg is 
         //where we are putting it 
         $destinationPath = 'images\users\\'; 
         $randomCode = substr(md5(uniqid(rand(), true)), 5, 5); 
         $filename = $this->data['User']['name'].'_'.$randomCode."_".$file['name']; 
         move_uploaded_file($file['tmp_name'], WWW_ROOT . $destinationPath . $filename); 

         //prepare the filename for database entry 
         $this->request->data['User']['user_image'] = $filename; 
        } 
       } 
       $this->request->data['User']['created_ip_connection'] = $this->request->clientIp(); 
       $this->request->data['User']['last_ip_connection'] = $this->request->clientIp(); 
       if ($this->User->save($this->request->data['User'])) { 
        //Obtener el Id de user guardado 
        $userId = $this->User->id; 
        $this->request->data['Buyer']['user_id'] = $userId; 
        $this->request->data['Provider'] = $this->request->data['Buyer']; 
        if ($this->User->Buyer->save($this->request->data['Buyer']) && $this->User->Provider->save($this->request->data['Provider'])){ 
         $this->Session->setFlash(__('The user has been saved.')); 
         return $this->redirect(array('action' => 'register')); 
        } else { 
         $this->Session->setFlash(__('The Buyer or Provider could not be saved. Please, try again.')); 
        } 

       } else { 
        $this->Session->setFlash(__('The user could not be saved. Please, try again.')); 
       } 
       //now do the save 
       //$this->products->save($this->data) ; 
      } 
     } 
     if($this->request->data['User']['group_id'] == 3){ 
      /*echo print_r($this->request->data); 
      return false;*/ 
      $this->User->create(); 
      if(!empty($this->data)) 
      { 
       //Check if image has been uploaded 
       if(!empty($this->data['User']['user_image']['name'])) 
       { 
        $file = $this->data['User']['user_image']; //put the data into a var for easy use 

        $ext = substr(strtolower(strrchr($file['name'], '.')), 1); //get the extension 
        $arr_ext = array('jpg', 'jpeg', 'gif'); //set allowed extensions 

        //only process if the extension is valid 
        if(in_array($ext, $arr_ext)) 
        { 
         //do the actual uploading of the file. First arg is the tmp name, second arg is 
         //where we are putting it 
         $destinationPath = 'images\users\\'; 
         $randomCode = substr(md5(uniqid(rand(), true)), 5, 5); 
         $filename = $this->data['User']['name'].'_'.$randomCode."_".$file['name']; 
         move_uploaded_file($file['tmp_name'], WWW_ROOT . $destinationPath . $filename); 

         //prepare the filename for database entry 
         $this->request->data['User']['user_image'] = $filename; 
        } 
       } 
       //Save the user 
       $this->request->data['User']['created_ip_connection'] = $this->request->clientIp(); 
       $this->request->data['User']['last_ip_connection'] = $this->request->clientIp(); 
       if ($this->User->save($this->request->data['User'])) { 
        //Get the id of the user I just saved 
        $userId = $this->User->id; 
        if ($this->User->Company->Address->save($this->request->data["Address"])) { 
         $addressId = $this->User->Company->Address->id; 
         $this->request->data['Company']['user_id'] = $userId; 
         $this->request->data['Company']['address_id'] = $addressId; 
         $this->request->data['Company']['permision'] = true; 
         if ($this->User->Company->save($this->request->data["Company"])) { 
          $companyId = $this->User->Company->id; 
          $this->request->data['Buyer']['user_id'] = $userId; 
          $this->request->data['Buyer']['company_id'] = $companyId; 
          $this->request->data['Provider'] = $this->request->data['Buyer']; 
          if ($this->User->Buyer->save($this->request->data['Buyer']) && $this->User->Provider->save($this->request->data['Provider'])){ 
           $this->Session->setFlash(__('The user has been saved.')); 
           return $this->redirect(array('action' => 'register')); 
          } else { 
           $this->Session->setFlash(__('The Buyer or Provider could not be saved. Please, try again.')); 
          } 
         } else { 
          $this->Session->setFlash(__('The company could not be saved. Please, try again.')); 
         } 
        } else { 
         $this->Session->setFlash(__('The Address could not be saved. Please, try again.')); 
        } 
       } else { 
        $this->Session->setFlash(__('The user could not be saved. Please, try again.')); 
       } 



       //now do the save 
       //$this->products->save($this->data) ; 
      } 
     } 
     /*$this->Session->setFlash(__('Nothing Happened')); 
     return $this->redirect(array('action' => 'register'));*/ 

    } 
    $groups = $this->User->Group->find('list'); 
    $this->set(compact('groups')); 
    $companies = $this->User->Company->find('list'); 
    $this->set(compact('companies'));