gpt4 book ai didi

php - Codeigniter - 提交后验证失败时重新填充表单

转载 作者:可可西里 更新时间:2023-11-01 12:56:19 32 4
gpt4 key购买 nike

我有一个表单,要求用户输入一些信息。如果他们未能完成必填字段,他们将重新获得表格;页面顶部通知他们需要哪些字段,并且我启用了粘性表单 (set_value()),因此他们的输入不会丢失。

我正在使用 flashdata 向用户显示消息(即,如果他们输入的内容已经存在于数据库中)。

我的表单在我的 Controller 的索引方法中。当从我的 View 中单击提交时,它会调用我的 Controller 中的 add() 方法。add() 方法执行验证并根据结果提交到数据库或踢回给用户以获取更多数据。

我在执行此操作时遇到了几个问题。1. 如果验证失败,我使用 $this->index() 返回我的表单并显示验证错误。如果我尝试使用重定向,我会丢失我的验证错误和我的 $_POST[] 数据,所以我的粘性表单最终会变成空白。2. 使用 $this->index() 将 'add' 附加到我的 url 的末尾3. 使用 $this->index() 会导致闪存数据出现问题。随机结果。

有什么想法吗?

<?php
class Restaurant extends Controller {

function Restaurant() {
parent::Controller();
}

function index() {

// Load libraries and models
$this->load->model('/restaurant/mRestaurantTypes');
$this->load->model('/restaurant/mRestaurant');
$this->load->model('/utilities/mUtilities');

// Get states
$stateSelect = array();
$getStates = $this->mUtilities->getStates();

if($getStates->num_rows() > 0) {
foreach($getStates->result() as $row) {
$stateSelect[$row->abbr] = $row->name;
}
}


// Get restaurant types
$restaurantTypes = array();
$getRestaurantTypes = $this->mRestaurantTypes->getRestaurantTypes();

if($getRestaurantTypes->num_rows() > 0) {
foreach($getRestaurantTypes->result() as $row) {
$restaurantTypes[$row->restaurant_types_id] = $row->type;
}
}

// Create form elements
$data['name'] = array(
'name' => 'name',
'id' => 'name',
'value' => set_value('name'),
'maxlength' => '200',
'size' => '50'
);

$data['address'] = array(
'name' => 'address',
'id' => 'address',
'value' => set_value('address'),
'maxlength' => '200',
'size' => '50'
);

$data['city'] = array(
'name' => 'city',
'id' => 'city',
'value' => set_value('city'),
'maxlength' => '50',
'size' => '25'
);

$data['state'] = $stateSelect;

$data['zip'] = array(
'name' => 'zip',
'id' => 'zip',
'value' => set_value('zip'),
'maxlength' => '10',
'size' => '10'
);

$data['phone'] = array(
'name' => 'phone',
'id' => 'phone',
'value' => set_value('phone'),
'maxlength' => '15',
'size' => '15'
);

$data['url'] = array(
'name' => 'url',
'id' => 'url',
'value' => set_value('url'),
'maxlength' => '255',
'size' => '50'
);

$data['type'] = $restaurantTypes;

$data['tags'] = array(
'name' => 'tags',
'id' => 'tags',
'value' => set_value('tags'),
'maxlength' => '255',
'size' => '50'
);

$data['active'] = array(
'name' => 'active',
'id' => 'active',
'value' => 'Y',
'maxlength' => '1',
'size' => '2'
);

// Set page variables
$data_h['title'] = "Add new restaurant";

// Load views
$this->load->view('/template/header', $data_h);
$this->load->view('/restaurant/index', $data);
$this->load->view('/template/footer');

}


/**
* Add the the new restaurant to the database.
*/
function add() {

// Load libraries and models
$this->load->library('form_validation');
$this->load->model('/restaurant/mRestaurant');

// Define validation rules
$this->form_validation->set_rules('name', 'Name', 'trim|required|max_length[255]|xss_clean');
$this->form_validation->set_rules('address', 'Address', 'trim|required|max_length[100]|xss_clean');
$this->form_validation->set_rules('city', 'City', 'trim|required|max_length[128]|xss_clean');
//$this->form_validation->set_rules('state', 'State', 'trim|required');
$this->form_validation->set_rules('zip', 'Zip', 'trim|required|max_length[128]|xss_clean');
$this->form_validation->set_rules('phone', 'Phone', 'trim|required|max_length[10]|xss_clean');
$this->form_validation->set_rules('url', 'URL', 'trim|required|max_length[255]|xss_clean');
$this->form_validation->set_rules('tags', 'Tags', 'trim|xss_clean');


// Form validation
if ($this->form_validation->run() == FALSE) {

// On failure
$this->index();

} else {

// On success, prepare the data
$data = array(
'name' => $_POST['name'],
'address' => $_POST['address'],
'city' => $_POST['city'],
'state' => $_POST['state'],
'zip' => $_POST['zip'],
'phone' => $_POST['phone'],
'url' => $_POST['url'],
'type' => $_POST['type'],
'tags' => $_POST['tags'],
'active' => $_POST['active'],
);

// Check if the restaurant already exists
$check = $this->mRestaurant->getRestaurant($data['name'], $data['zip']);

// If no records were returned add the new restaurant
if($check->num_rows() == 0) {
$query = $this->mRestaurant->addRestaurant($data);

if ($query) {
// On success
$this->session->set_flashdata('status', '<div class="success">Added New Restaurant!</div>');
} else {
// On failure
$this->session->set_flashdata('status', '<div class="error">Could not add a new restaurant.</div>');
}

redirect('restaurant/confirm', 'refresh');
} else {
// Notify the user that the restaurant already exists in the database
$this->session->set_flashdata('status', '<div class="notice">This restaurant already exists in the database.</div>');
redirect('restaurant/index');
}

}

}


function confirm() {

$data['title'] = "Confirm";

$this->load->view('/template/header');
$this->load->view('/restaurant/confirm', $data);
$this->load->view('/template/footer');
}
}
?>

最佳答案

我将尝试帮助处理我经常使用的 Controller 中的逻辑:

function index()
{
//set some default variables
$data['error_message'] = '';
//if this is to edit existing value, load it here
// from database and assign to $data
//...
//set form validation rules
$validation = array();
$validation['field_name'] = array(
'field' => 'field_name',
'label' => 'Field label',
'rules' => 'trim|required'
);
//more rules here
//...
$this->load->library('form_validation');
$this->form_validation->set_rules($validation);
//run validation
if ($this->form_validation->run() == FALSE)
{
$data['error_message'] .= validation_errors();
}
else
{
//do insert/update
//
//it's better to do redirection after receiving post request
//you can use flashdata for success message
if ( $success )
{
$this->session_set_flashdata('success_message', MESSAGE_HERE);
}
redirect(RESULT_PAGE);
}
//reaching this block can have 2 meaning, direct page access, or not have valid form validation
//assign required variables, such as form dropdown option, etc
//...
//load view
$this->load->view(VIEW_FILE, $data);
}

查看文件:

...
<?php if ( $error_message ): ?>
<?php echo $error_message; ?>
<?php endif; ?>
<?php echo form_open(current_url, array('id' => 'some_form_id')); ?>
<!-- form field here -->
<label for="field_name">Field label</label>
<input name="field_name" value="<?php echo set_value('field_name', $DEFAULT_FIELD_NAME_IF_NEEDED); ?>" />
<!-- more form field here -->
<?php echo form_close(); ?>
...

希望对您有所帮助。

对于 View 文件中的 $DEFAULT_FIELD_NAME_IF_NEEDED,如果此表单页面要编辑数据库中的现有数据,我将使用它来传递默认值。您可以在 Controller 中加载数据,然后将其传递给 View 文件并在表单字段中显示。

关于php - Codeigniter - 提交后验证失败时重新填充表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1973802/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com