Проверка обратного вызова массива флажка проверки кода Codeigniter-HMVC не работает
Проверка правильности формы проверки кода не работает. Я работал над проектом, в котором я могу установить различные флажки в моем представлении. И когда я отправляю свою форму, если все поля пусты, тогда следует выдать сообщение обратного вызова.
Но почему-то не будет работать с
<input type="checkbox" name="tables[]" value="<?php echo $table;?>" />
Я посмотрел вокруг сайта переполнения стека и другие и попробовал много, но не некоторые, чтобы работать.
Вопрос: Каково было бы лучшее решение, чтобы заставить мою функцию обратного вызова работать так, чтобы, если все флажки были пустыми, тогда бросало бы мое сообщение проверки формы?
Для тех, кто хочет получить результаты 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 в $this->form_validation->run($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);
}
}
2 ответа
Решеннаяпроблема Кажется, что проблема с проверкой формы codeigniter hmvc не работает с проверкой массивов флажков. Все остальные обратные вызовы работают нормально, хотя только отмеченные флажки не подтверждают правильность.
My Fix Working
Поэтому мне пришлось использовать собственную пользовательскую проверку с использованием сервера 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);
}
}
Измените эти строки (соответственно):
$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;
}
}
ОБНОВИТЬ:
Так как эта проблема связана с нестандартной настройкой HMVC для Codeigniter, прочитав этот блог, я нашел следующую строку:
$this->form_validation->CI =& $this; // Hack to make it work properly with HMVC
Вы можете найти то, что ищете: https://github.com/ci-bonfire/Bonfire/issues/295