Codeigniter HMVC и ion_auth с ajaxForm

Я разрабатываю сайт с Codeigniter 2.1.3

Я использую HMVC для создания модулей ion_auth.

Я пытаюсь разделить мою систему входа в систему и серверную часть.

Я создал два модуля для ion_auth: application/modules/auth — для фронтенда application/modules/admin — для бэкенда

Оба имеют одинаковые файлы, за исключением того, что контроллер авторизации администратора вызывает другое представление входа в систему.

Представление моей домашней страницы вызывает представление входа в систему следующим образом:

echo Module::run('auth/login');

Оба контроллера аутентификации расширяют Frontend_controller, который расширяет MY_Controller. MY_Controller находится в приложении/ядре и расширяет MX_Controller.

Представление входа в систему для внешнего интерфейса использует ajaxForm для отправки формы:

<div id="login_form">
<?php
 $attr = array('class'=>'form-inline', 'id'=>'loginForm');
 $send = array('class'=>'btn btn-inverse', 'name'=>'signin', 'value'=>'Sign In');
 echo form_open(site_url('auth/login', $attr));
?>
<div >
 <img src="<?php echo site_url('assets/img/login.gif'); ?>" alt="Login" />
</div>
<div  left; font-size:11px; font-weight:bold;padding-top:25px;margin-right:45px">LOGIN</div>

<div left">
 <?php echo form_label('Cellphone', 'cellphone', array('class'=>'login-label')); ?>
</div>
<div class="span2"  padding-top:10px"><?php echo form_input('identity', set_value('identity', ''), 'placeholder="cellphone no" class="span2 phone" id="cellphone"'); ?></div>

<div left; margin-left:10px"><?php echo form_label('Password', 'password', array('class'=>'login-label')); ?></div>
<div class="span2"  padding-top:10px"><?php echo form_password('password', '', 'placeholder="password" class="span2" id="password"'); ?></div>
<div class="span1" ><?php echo form_submit($send); ?></div>
<input type="hidden" name="submitLogin" value="1" />
<?php echo form_close(); ?>
<div class="clearfix"></div>
</div>
<script>
$(function()
{
 var options = { 
 target: '#login_form',
 success:       showResponse  // post-submit callback 
 };

 $('#loginForm').ajaxForm(options);

// post-submit callback 
function showResponse(responseText, statusText, xhr, $form)  { 
   alert('status: ' + statusText + '\n\nresponseText: \n' + responseText + 
        '\n\nThe output div should have already been updated with the responseText.'); 
} 
});
</script>

У меня несколько проблем:

Проблема первая: я прочитал документацию HMVC и добавил эти строки в файл MY_Controller:

$this->load->library('form_validation');
$this->form_validation->CI =& $this;

Я создал файл MY_Form_validation в: application/libraries:

class My_Form_validation extends CI_Form_validation()
{
 public $CI;
} 

После этого, когда я перехожу на свою домашнюю страницу, я получаю эту ошибку: Не удается получить доступ к защищенному свойству CI_Form_validation::$CI в C:\sites\tl\application\core\MY_Controller.php в строке 12.

Проблема вторая: если я не внесу эти изменения проверки формы и попытаюсь отправить форму входа на главную страницу, она снова откроет представление входа на новой странице без ошибок. Похоже, он не использует jquery для отправки формы

Пожалуйста, может кто-нибудь помочь с этим?

Я уже несколько дней борюсь за то, чтобы эта система входа работала.


person Sigal Zahavi    schedule 12.06.2013    source источник
comment
Похоже, проблема в том, что форма входа не отправляется через вызов jQuery ajaxForm, но я не знаю, почему.   -  person Sigal Zahavi    schedule 12.06.2013


Ответы (1)


Когда я впервые обнаружил расширение HMVC, я начал с использования Modules::run(), а затем столкнулся с проблемами, похожими на ваши, поэтому мне пришлось найти альтернативный способ делать что-то, используя как собственные функции CI, так и HMVC. Мой вывод состоял в том, чтобы создать Frontend_Controller и Backend_controller, которые оба наследуются от Base_controller. Последний имеет слой рендеринга шаблонов и другие общие функции.

Я организовал свои модули, играя с файлами маршрутов.

Вы можете добавить проверку авторизации (сессию) на Base_controller, которая будет перенаправлять на модуль аутентификации, и там вы создадите систему аутентификации на основе сеанса, перенаправление на основной модуль.

Идея состоит в том, что каждый модуль будет действовать индивидуально, но при этом интегрироваться в систему по наследству.

Редактировать :

Я проверил ваши проблемы и прочитал код, который вы предоставили, и заметил 2 проблемы.

1- если вы просмотрите исходный код класса Form_Validation в /system/libraries/Form_Validation.php, вы заметите, что поле $CI защищено и, следовательно, не может быть установлено таким образом, вместо этого вы можете сделать это:

class My_Form_validation extends CI_Form_validation()
{
     function __construct()
     {
          parent::__construct(); // in the parent constructor : $this->CI =& get_instance(); 
     }
} 

2- вы вызываете ajaxFrom() по идентификатору формы, я думаю, что вы должны переопределить нормальное поведение отправки, которое обычно отправляет стандартный HTTP-запрос с помощью вызова ajax, отправляя данные формы и получая ответ.

person AchrafSoltani    schedule 12.06.2013
comment
Спасибо, AchrafSoltani, но я не понимаю, как использовать ваш способ и как он решает мою проблему. У меня есть 2 контроллера Frontend и Admin. У меня также есть базовый контроллер: MY_Controller. Я не понимаю, как это решает проблему, заключающуюся в том, что представление входа в систему не использует jQuery ajaxForm для отправки формы? - person Sigal Zahavi; 12.06.2013
comment
Я нашел это !!! Ошибка в объявлении формы: echo form_open(site_url('auth/login', $attr); Должно быть: echo form_open(site_url('auth/login'), $attr); - person Sigal Zahavi; 12.06.2013