Codeigniter HMVC และ ion_auth พร้อม ajaxForm

ฉันกำลังพัฒนาเว็บไซต์ด้วย Codeigniter 2.1.3

ฉันใช้ HMVC เพื่อสร้างโมดูล ion_auth

ฉันกำลังพยายามแยกระบบเข้าสู่ระบบส่วนหน้าและส่วนหลังออกจากกัน

ฉันสร้างสองโมดูลสำหรับ ion_auth: application/modules/auth - สำหรับแอปพลิเคชันส่วนหน้า/โมดูล/ผู้ดูแลระบบ - สำหรับแบ็กเอนด์

ทั้งสองมีไฟล์เดียวกัน ยกเว้นตัวควบคุมการตรวจสอบสิทธิ์ของผู้ดูแลระบบกำลังเรียกมุมมองการเข้าสู่ระบบที่แตกต่างกัน

มุมมองหน้าแรกของฉันเรียกมุมมองการเข้าสู่ระบบดังนี้:

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

ตัวควบคุมการรับรองความถูกต้องทั้งสองขยาย Frontend_controller ซึ่งขยาย MY_Controller MY_Controller อยู่ใน application/core และขยาย 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;
} 

หลังจากทำเช่นนี้เมื่อฉันไปที่หน้าแรกของฉัน ฉันได้รับข้อผิดพลาด: Cannot access protected property CI_Form_validation::$CI in C:\sites\tl\application\core\MY_Controller.php on line 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() ด้วย id ของแบบฟอร์ม ฉันคิดว่าคุณควรแทนที่พฤติกรรมการส่งปกติซึ่งโดยปกติจะส่งคำขอ http มาตรฐานโดยการเรียก ajax โดยส่งข้อมูลแบบฟอร์มและดึงการตอบสนอง

person AchrafSoltani    schedule 12.06.2013
comment
ขอบคุณ AchrafSoltani แต่ฉันไม่เข้าใจวิธีการใช้วิธีของคุณและมันจะแก้ปัญหาของฉันได้อย่างไร ฉันมีตัวควบคุม 2 ตัวคือส่วนหน้าและผู้ดูแลระบบ ฉันยังมีตัวควบคุมฐาน: 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