2015-02-05 76 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'));