Skip to main content
1 of 2
xanabobana
  • 87
  • 3
  • 19

CI4: Passing variable to custom validation rule comes through as string not int

I'm trying to rewrite a page from CI3 to CI4.  In CI3, the validation rule took a parameter from the controller. But now that I've rewritten the code, that parameter (projectid) is coming through as the text 'projectid'.  How do I pass a variable from the controller to a custom validation rule in CI4?

in app\Config\Validation.php:

    public array $manageProjectInfo = array (         'fldPublish' => array (             'label' => 'Make project public',             'rules' => 'trim|check_publish_datasets[projectid]'         )     ); 

The following is writing pid: projectid into the logs:

   // check that there are no unpublished datasets if unpublishing project     public function check_publish_datasets($fldPublish, $pid) {          $valid = TRUE;         $project_model = model('Project_model');         if (!$fldPublish) {             log_message('debug','pid: '.$pid);             $nDatasets = $project_model->get_projectdataavail($pid,$published=TRUE);             if (count($nDatasets) > 0) {                 $valid = FALSE;                 $error = "This project cannot be unpublished because it contains published datasets.";             }         }            return $valid;     } 

in app\Controllers\Manage\Project.php

    public function info($projectid = -1) {             $basics['pagetitle'] = "Manage Project Information";             if ($this->request->getPost()) {                 $project['fldPublish'] = $this->request->getPost('fldPublish');             }             //Define form attributes             $data['formattribs'] = array(                 'class' => 'basicForm',                 'id' => 'manage-project-info-form'             );             //Create array of input options, setting default values to either what they were in the database or what was entered in post data for form repopulation on error             $data['fldPublish_publish'] = array(                 'name' => 'fldPublish',                 'id' => 'fldPublish',                 'type' => 'radio',                 'value' => '1',                 'checked' => ($project['fldPublish'] == "1" ? TRUE : FALSE)             );             $data['fldPublish_notpublish'] = array(                 'name' => 'fldPublish',                 'id' => 'fldPublish',                 'type' => 'radio',                 'value' => '0',                 'checked' => ($project['fldPublish'] == "0" ? TRUE : FALSE)             );             //Check if form validation has already been run and passed                //Form validation rules set in form_validation config file             if (!$this->request->is('post') || !$this->validateData($this->request->getPost(), 'manageProjectInfo')) {                 $this->common->render_page($basics, 'manage/project/info', $data);             }             //If successful form validation...             else {                 //Collect post data for insert                 $project = array(                     'fldPublish' => $this->request->getPost('fldPublish')                 );                 $validData = $this->validator->getValidated();                 foreach ($validData as $key=>$valid) {                     $project[$key] = $valid;                 }                 //Check flag-type columns to see if they're set to one, if they aren't set values to zero.                 if ($project['fldPublish'] != 1)                     $project['fldPublish'] = 0;                 //Convert null dates                 $builder = $this->db->table('tblProject');                 $builder->where('pkProjectID', $projectid);                 $updateattempt = $builder->update($info_changes);                 if ($updateattempt) {                     //update the projectUpdated date and log a tblProjectChanges record                     $this->project_model->logProjectUpdated($projectid, "project", "info");                     $this->session->setFlashdata('successmessage', "Your changes were successfully submitted");                     return redirect()->to('manage/project/' . $projectid . '/info');                 } else {                     $data['errormessage'] = "There was a problem writing your changes to the database. Please try again";                     //Load the views with render_pages, passing either name of main view to load or array of main pages to load                     $this->common->render_page($basics, 'manage/project/info', $data);                 }             }         }     } 

In the CI4 documentation, there is an example sending one of the other form inputs as a parameter (https://codeigniter.com/user_guide/libraries/validation.html#setting-multiple-rules). So I tried making a hidden input and passing that, but it also just printed the text name of the variable into the logs.

xanabobana
  • 87
  • 3
  • 19