Codeigniter-HMVC 表单验证复选框数组回调验证不起作用
Codeigniter-HMVC form validation checkbox array callback validation not work
Codeigniter 表单验证复选框验证不起作用。我一直在做一个项目,我可以在我的视图中 select 不同的复选框。当我提交我的表单时 如果所有的框都是空的那么应该抛出回调消息 .
但由于某些原因不适用于
<input type="checkbox" name="tables[]" value="<?php echo $table;?>" />
我环顾了 stack overflow 网站 和其他网站,尝试了很多但没有成功。
问题让我的回调函数正常工作的最佳解决方案是什么,如果所有复选框都为空,那么将抛出我的表单验证消息?
致任何想要 var dump 结果的人
array(3) {
[0]=> string(4) "user"
[1]=> string(10) "user_group"
[2]=> string(16) "user_join_status"
}
控制器
<?php
class Backup extends MX_Controller {
public function __construct() {
parent::__construct();
$this->load->library('admin/users');
$this->load->model('admin/tool/model_tool_backup');
}
public function index() {
$data['tables'] = $this->model_tool_backup->get_tables();
$this->load->library('form_validation');
$this->form_validation->set_rules('tables[]', 'Table', 'callback_check');
// $this from library MY_Form_Validation for HMVC
if ($this->form_validation->run($this) == FALSE) {
$data['sidebar'] = Modules::run('admin/common/sidebar/index');
$data['navbar'] = Modules::run('admin/common/navbar/index');
$data['header'] = Modules::run('admin/common/header/index');
$data['footer'] = Modules::run('admin/common/footer/index');
$this->load->view('tool/backup_view', $data);
} else {
var_dump($this->input->post('tables[]'));
//$this->output->set_header('Pragma: public');
//$this->output->set_header('Expires: 0');
//$this->output->set_header('Content-Description: File Transfer');
//$this->output->set_header('Content-Type: application/octet-stream');
//$this->output->set_header('Content-Disposition: attachment; filename=' . $this->db->database . '_' . date('Y-m-d_H-i-s', time()) . '_backup.sql');
//$this->output->set_header('Content-Transfer-Encoding: binary');
//$this->output->append_output($this->backup_codeigniter($this->input->post('backup[]')));
}
}
public function check($post_tables) {
$post_tables = $this->input->post('tables[]');
if (!isset($post_tables)) {
$this->form_validation->set_message('check', 'You Must Select At Least One Table To Do Back Up!');
return FALSE;
} else {
return TRUE;
}
}
public function backup_codeigniter($tables) {
$this->load->dbutil();
$prefs = array(
'tables' => $tables,
'ignore' => array(),
'format' => 'txt',
'filename' => $this->db->database . '_' . date('Y-m-d_H-i-s', time()) . '_backup.sql',
'add_drop' => TRUE,
'add_insert' => TRUE,
'newline' => "\n"
);
return $this->dbutil->backup($prefs);
}
}
查看
<?php echo form_open_multipart('admin/tool/backup', array('class' => 'form-horizontal')); ?>
<?php echo validation_errors('<div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> <button type="button" class="close" data-dismiss="alert">×</button>', '</div>'); ?>
<div class="form-group">
<label class="col-sm-2 control-label">Backup</label>
<div class="col-sm-10">
<div class="well well-sm" style="height: 150px; overflow: auto;">
<?php foreach ($tables as $table) { ?>
<div class="checkbox">
<label>
<input type="checkbox" name="tables[]" value="<?php echo $table; ?>"/>
<?php echo $table; ?></label>
</div>
<?php } ?>
</div>
<a onclick="$(this).parent().find(':checkbox').prop('checked', true);">Select All</a> /
<a onclick="$(this).parent().find(':checkbox').prop('checked', false);">Unselect All</a>
</div>
</div>
<div class="button-group">
<div class="form-group text-right">
<button type="submit" class="btn btn-lg btn-inverse">Click to Backup Database</button>
</div>
</div>
<?php echo form_close(); ?>
MY_Form_Validation HMVC 库 那为什么在 $this->form_validation->run($this)
中需要 $this 用于回调
<?php
class MY_Form_validation extends CI_Form_validation {
function run($module = '', $group = '') {
(is_object($module)) AND $this->CI = &$module;
return parent::run($group);
}
}
更改这些行(相应地):
$this->form_validation->set_rules('tables[]', 'Table', 'callback_check');
...
if ($this->form_validation->run($this) == FALSE) {
对此:
$this->form_validation->set_rules('tables', 'Table', 'callback_check');
...
if ($this->form_validation->run() == FALSE) {
现在你的回调函数应该接收这样发送的参数:
public function check($post_tables) {
if (!isset($post_tables)) {
$this->form_validation->set_message('check', 'You Must Select At Least One Table To Do Back Up!');
return FALSE;
} else {
return TRUE;
}
}
更新:
由于此问题与 Codeigniter 的非标准 HMVC 设置有关,阅读此博客后,我发现了这一行:
$this->form_validation->CI =& $this; // Hack to make it work properly with HMVC
您可能会找到您要找的东西:https://github.com/ci-bonfire/Bonfire/issues/295
问题已解决 似乎是 codeigniter hmvc 表单验证不适用于验证复选框数组的问题。所有其他回调工作正常,但只是选中的框未验证正确。
我的修复工作
所以我不得不使用服务器 REQUEST_METHOD 自己的自定义验证,如下例所示。
<?php
class Backup extends MX_Controller {
private $error = array();
public function __construct() {
parent::__construct();
$this->load->library('admin/users');
$this->load->model('admin/tool/model_tool_backup');
$this->load->library('form_validation');
}
public function index() {
$tables = $this->input->post('tables');
$data['tables'] = $this->model_tool_backup->get_tables();
if (($this->input->server('REQUEST_METHOD') == 'POST') && $this->validate()) {
}
if (isset($this->error['warning'])) {
$data['error_warning'] = $this->error['warning'];
} else {
$data['error_warning'] = '';
}
if (isset($this->error['tables'])) {
$data['error_tables'] = $this->error['tables'];
} else {
$data['error_tables'] = '';
}
$data['sidebar'] = Modules::run('admin/common/sidebar/index');
$data['navbar'] = Modules::run('admin/common/navbar/index');
$data['header'] = Modules::run('admin/common/header/index');
$data['footer'] = Modules::run('admin/common/footer/index');
$this->load->view('tool/backup_view', $data);
}
public function validate() {
if (!isset($_POST['tables'])) {
$this->error['tables'] = 'You must select at least one item';
}
return !$this->error;
}
public function backup_codeigniter($tables) {
$this->load->dbutil();
$prefs = array(
'tables' => $tables,
'ignore' => array(),
'format' => 'txt',
'filename' => $this->db->database . '_' . date('Y-m-d_H-i-s', time()) . '_backup.sql',
'add_drop' => TRUE,
'add_insert' => TRUE,
'newline' => "\n"
);
return $this->dbutil->backup($prefs);
}
}
Codeigniter 表单验证复选框验证不起作用。我一直在做一个项目,我可以在我的视图中 select 不同的复选框。当我提交我的表单时 如果所有的框都是空的那么应该抛出回调消息 .
但由于某些原因不适用于
<input type="checkbox" name="tables[]" value="<?php echo $table;?>" />
我环顾了 stack overflow 网站 和其他网站,尝试了很多但没有成功。
问题让我的回调函数正常工作的最佳解决方案是什么,如果所有复选框都为空,那么将抛出我的表单验证消息?
致任何想要 var dump 结果的人
array(3) {
[0]=> string(4) "user"
[1]=> string(10) "user_group"
[2]=> string(16) "user_join_status"
}
控制器
<?php
class Backup extends MX_Controller {
public function __construct() {
parent::__construct();
$this->load->library('admin/users');
$this->load->model('admin/tool/model_tool_backup');
}
public function index() {
$data['tables'] = $this->model_tool_backup->get_tables();
$this->load->library('form_validation');
$this->form_validation->set_rules('tables[]', 'Table', 'callback_check');
// $this from library MY_Form_Validation for HMVC
if ($this->form_validation->run($this) == FALSE) {
$data['sidebar'] = Modules::run('admin/common/sidebar/index');
$data['navbar'] = Modules::run('admin/common/navbar/index');
$data['header'] = Modules::run('admin/common/header/index');
$data['footer'] = Modules::run('admin/common/footer/index');
$this->load->view('tool/backup_view', $data);
} else {
var_dump($this->input->post('tables[]'));
//$this->output->set_header('Pragma: public');
//$this->output->set_header('Expires: 0');
//$this->output->set_header('Content-Description: File Transfer');
//$this->output->set_header('Content-Type: application/octet-stream');
//$this->output->set_header('Content-Disposition: attachment; filename=' . $this->db->database . '_' . date('Y-m-d_H-i-s', time()) . '_backup.sql');
//$this->output->set_header('Content-Transfer-Encoding: binary');
//$this->output->append_output($this->backup_codeigniter($this->input->post('backup[]')));
}
}
public function check($post_tables) {
$post_tables = $this->input->post('tables[]');
if (!isset($post_tables)) {
$this->form_validation->set_message('check', 'You Must Select At Least One Table To Do Back Up!');
return FALSE;
} else {
return TRUE;
}
}
public function backup_codeigniter($tables) {
$this->load->dbutil();
$prefs = array(
'tables' => $tables,
'ignore' => array(),
'format' => 'txt',
'filename' => $this->db->database . '_' . date('Y-m-d_H-i-s', time()) . '_backup.sql',
'add_drop' => TRUE,
'add_insert' => TRUE,
'newline' => "\n"
);
return $this->dbutil->backup($prefs);
}
}
查看
<?php echo form_open_multipart('admin/tool/backup', array('class' => 'form-horizontal')); ?>
<?php echo validation_errors('<div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> <button type="button" class="close" data-dismiss="alert">×</button>', '</div>'); ?>
<div class="form-group">
<label class="col-sm-2 control-label">Backup</label>
<div class="col-sm-10">
<div class="well well-sm" style="height: 150px; overflow: auto;">
<?php foreach ($tables as $table) { ?>
<div class="checkbox">
<label>
<input type="checkbox" name="tables[]" value="<?php echo $table; ?>"/>
<?php echo $table; ?></label>
</div>
<?php } ?>
</div>
<a onclick="$(this).parent().find(':checkbox').prop('checked', true);">Select All</a> /
<a onclick="$(this).parent().find(':checkbox').prop('checked', false);">Unselect All</a>
</div>
</div>
<div class="button-group">
<div class="form-group text-right">
<button type="submit" class="btn btn-lg btn-inverse">Click to Backup Database</button>
</div>
</div>
<?php echo form_close(); ?>
MY_Form_Validation HMVC 库 那为什么在 $this->form_validation->run($this)
中需要 $this 用于回调
<?php
class MY_Form_validation extends CI_Form_validation {
function run($module = '', $group = '') {
(is_object($module)) AND $this->CI = &$module;
return parent::run($group);
}
}
更改这些行(相应地):
$this->form_validation->set_rules('tables[]', 'Table', 'callback_check');
...
if ($this->form_validation->run($this) == FALSE) {
对此:
$this->form_validation->set_rules('tables', 'Table', 'callback_check');
...
if ($this->form_validation->run() == FALSE) {
现在你的回调函数应该接收这样发送的参数:
public function check($post_tables) {
if (!isset($post_tables)) {
$this->form_validation->set_message('check', 'You Must Select At Least One Table To Do Back Up!');
return FALSE;
} else {
return TRUE;
}
}
更新:
由于此问题与 Codeigniter 的非标准 HMVC 设置有关,阅读此博客后,我发现了这一行:
$this->form_validation->CI =& $this; // Hack to make it work properly with HMVC
您可能会找到您要找的东西:https://github.com/ci-bonfire/Bonfire/issues/295
问题已解决 似乎是 codeigniter hmvc 表单验证不适用于验证复选框数组的问题。所有其他回调工作正常,但只是选中的框未验证正确。
我的修复工作
所以我不得不使用服务器 REQUEST_METHOD 自己的自定义验证,如下例所示。
<?php
class Backup extends MX_Controller {
private $error = array();
public function __construct() {
parent::__construct();
$this->load->library('admin/users');
$this->load->model('admin/tool/model_tool_backup');
$this->load->library('form_validation');
}
public function index() {
$tables = $this->input->post('tables');
$data['tables'] = $this->model_tool_backup->get_tables();
if (($this->input->server('REQUEST_METHOD') == 'POST') && $this->validate()) {
}
if (isset($this->error['warning'])) {
$data['error_warning'] = $this->error['warning'];
} else {
$data['error_warning'] = '';
}
if (isset($this->error['tables'])) {
$data['error_tables'] = $this->error['tables'];
} else {
$data['error_tables'] = '';
}
$data['sidebar'] = Modules::run('admin/common/sidebar/index');
$data['navbar'] = Modules::run('admin/common/navbar/index');
$data['header'] = Modules::run('admin/common/header/index');
$data['footer'] = Modules::run('admin/common/footer/index');
$this->load->view('tool/backup_view', $data);
}
public function validate() {
if (!isset($_POST['tables'])) {
$this->error['tables'] = 'You must select at least one item';
}
return !$this->error;
}
public function backup_codeigniter($tables) {
$this->load->dbutil();
$prefs = array(
'tables' => $tables,
'ignore' => array(),
'format' => 'txt',
'filename' => $this->db->database . '_' . date('Y-m-d_H-i-s', time()) . '_backup.sql',
'add_drop' => TRUE,
'add_insert' => TRUE,
'newline' => "\n"
);
return $this->dbutil->backup($prefs);
}
}