Using Ion Auth as a separate module in the HMVC structure
Asked Answered
K

6

6

I am interested in using ion auth for a project of mine which is running on the HMVC pattern. The application is written in Codeigniter.

The problem I face is once the ion auth is placed in the /app/modules/auth folder, when I try to access the module I get the below error:

HTTP Error 500 (Internal Server Error):
An unexpected condition was encountered while the server was attempting to fulfill the request.

Please help me out here, I am sure that I am having some sort of a configuration/path problem but just can't figure out where.

I have simply downloaded the ion_auth files from github and placed the extracted files as it is in the module folder I removed all the lines where it loads the libraries such as database, session since I have used the config to auto load them. But I left the loading of the ion_auth library.

In the module folder modules/auth I have a similar application structure with the module specific config, libraries, etc folders.

Let me know where I must have done wrong, I will continue to search and fix this problem and post if I have any luck.

Kriss answered 15/6, 2011 at 4:23 Comment(0)
I
10

Try this:

  1. Get: codeigniter.zip (CI2.0)
  2. Extract, make sure it is running, set config/config.php
  3. Get Modular Extension : HMVC
  4. Install - Copy MY_Loader & MY_Router to /core, MX to third party folder Do not copy MY_Controller - this is for Modular Separation and not Extensions
  5. Get Ion_auth
  6. Install the SQL for the Ion_auth
  7. Put Ion_auth into a modules folder /application/modules/users
  8. Add route in config/routes.php : $route['auth/(.*)'] = 'users/auth/$1';

  9. Autoload ion_auth - $autoload['libraries'] = array('database','session','users/ion_auth');

  10. Edit following paths in modules/users/library/ion_auth.php :

    $this->ci->load->config('users/ion_auth', TRUE);
    $this->ci->load->library('email');
    $this->ci->load->library('session');
    $this->ci->lang->load('users/ion_auth');
    $this->ci->load->model('users/ion_auth_model');
    
Invalid answered 9/8, 2011 at 21:22 Comment(0)
P
9

I got CI 2.1 + Modular Extensions 5.4 + Ion Auth 2 all working.

Since, I didn't really see any exact info on this and the stuff I did see, had a bunch of things like routing and stuff that I couldn't get working the way they were done, I decided to share the what I did to accomplish this.

At first I was struggling with it, but then I had to sit back and think about what was going on.

After that, it was actually pretty straight forward, only a couple of gotchas…

The Steps I took to get ION AUTH working with CodeIgniter + MX HMVC

  1. Install CodeIgnter (I actually used an existing project I was working on, so it wasn't a fresh clean install. I removed "index.php" and I had HMVC already installed the recommended way. This is about Ion Auth anyway.)

  2. Get the latest version of Ion Auth.

  3. Instead of installing Ion Auth in application/third_party, Unzip it, and rename the resulting directory to auth. Put it in application/modules which results in application/modules/auth.

  4. Run Ion Auth's sql to set up the tables.

  5. In application/config/autoload.php update the line to:

    $autoload['libraries'] = array('database','session');
    
  6. In modules/auth/libraries/Ion_auth.php update the lines in __construct to:

    $this->ci->load->config('auth/ion_auth', TRUE);
    $this->ci->load->library('email');
    $this->ci->load->library('session');
    $this->ci->lang->load('auth/ion_auth');
    $this->ci->load->model('auth/ion_auth_model')
    
  7. In modules/auth/models/ion_auth_model.php update the lines in __construct to:

    $this->load->config('auth/ion_auth', TRUE);
    $this->load->helper('cookie');
    $this->load->helper('date');
    $this->load->library('session');
    $this->lang->load('auth/ion_auth');
    
  8. Change the auth controller (modules/auth/controllers/auth.php) to extend MX_Controller instead of the default CI_Controller.

  9. Now, in auth.php, make sure you change all $this->data to $data - (Make sure to read about this below!!).

  10. Move the files and directories in modules/auth/views/auth to modules/auth/views resulting in modules/auth/views with no lower level auth dir - (Make sure to read about this below!!).

  11. Add a routes.php file into modules/auth/config and add the following line:

    $route['auth/(:any)'] = "auth/$1";
    
  12. Now, go to http://yoursite/auth and everything should be good to go!

Gotchas

First off.. DO NOT AUTOLOAD THE LIBRARIES OR MODELS in the application/config/autoload.php file. Do them in the modules explicitly with $this->load->library("whatever"), etc…

That one stumped me for quite a while.

I forgot to mention that in my current install, I have already removed index.php from the URL and I have a .htaccess file in the the base of my installation. If things don't work, it's probably something with the RewriteBase here. This is the .htaccess I use:

## Set up mod_rewrite
<IfModule mod_rewrite.c>
Options +MultiViews +FollowSymLinks
DirectoryIndex index.php index.html

# Enable Rewrite Engine
# ------------------------------
RewriteEngine On

# UPDATE THIS TO POINT TO where you installed this FROM YOUR DOC ROOT.
# If this is in the DOC ROOT, leave it as it is
#---------------------
RewriteBase /

# In case your hosting service doesn't add or remove 'www.' for you, you can
# do it here by uncommenting and updating the 'Rewrite*'s below.
#
# Add or remove 'www.'  Whichever you prefer.  
# This one removes the 'www.' which seems to be the favorable choice these days. 
# ------------------------------
#RewriteCond %{HTTP_HOST} ^www.<sitename>.com
#RewriteRule (.*) http://<sitename>.com/$1 [R=301,L]

# Redirect index.php Requests
# ------------------------------
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteCond %{THE_REQUEST} !/system/.*
RewriteRule (.*?)index\.php/*(.*) $1$2 [R=301,L]

# Standard ExpressionEngine Rewrite
# ------------------------------
RewriteRule modules/(.+)/controllers/(.+)\.php$ /index.php?/$1/$2 [L,R=301]
RewriteRule controllers/(.+)\.php$ /index.php?/$1 [L,R=301]

RewriteCond $1 !\.(css|js|gif|jpe?g|png) [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

=================================

When I updated the modules/auth/controllers/auth.php to extend MX_Controller instead of CI_Controller, I was getting a series of errors after. The first of these errors was:

    A PHP Error was encountered

    Severity: Notice

    Message: Undefined property: CI::$data

    Filename: MX/Controller.php

To resolve this error, I changed all $this->data to $data in the auth.php controller`.

After fixing this problem, when I would go to auth, I would get an error like this:

Unable to load the requested file: auth/login.php

Apparently, it can't find the view files in it's own views dir. Ahh. Not exactly true though after thinking about it. The reason is because it's trying to find module/file_to_view and the file_to_view should be in views! Not in auth/views/auth!! So, we need to move everyting up from the auth dir into the views dir!

After that, everything works fine! I can cross load models, libraries and controllers in other modules and I can do Modules::run() in views and everything else!

I hope this helps someone else. Good Luck!

Phenology answered 24/12, 2011 at 21:1 Comment(2)
I wrote a bash script to make this all even easier, I tried to paste it in here, but I guess it's too large. I'll see if it can be posted in it's own post, if not, if anyone is interested, let me know and I'll figure out somewhere to put it.Phenology
Step 10 is redundant, somehow... There is no need for adding ->ci-> member variable, i.e. leave $this->load->config('users/ion_auth', TRUE); as isTubercular
Z
1

I don't see any reason for it to not work . check out pyrocms

They are using ionauth with hmvc.

if you don't get it working, just upload the files in normal ci directories and check if it works without any problems.

Zoogloea answered 15/6, 2011 at 5:52 Comment(1)
Thanks Krish , I will check with pyrocms and keep you posted.Kriss
R
1

This is what I did following ciuser's guideline but with some changes:

  1. Do a clean install of Codeigniter. Set up config.php, database.php etc.
  2. Install Modular Extension:
    Move third_party/MX to CI/application/third_party.
    Move core/MY_Loader.php and core/MY_Router.php to CI/application/core.
  3. Install Ion Auth:
    Move the following Ion Auth folders to CI/application/modules/auth folder: config, controllers, language, libraries, models.
    Move the files under Ion Auth/views folder to CI/application/modules/auth/views. (Without one extra layer of auth as in Ion Auth.)
    Run Ion Auth sql in database.
  4. Check it at yourbaseurl/index.php/auth.
Rempe answered 29/10, 2011 at 17:15 Comment(0)
P
1

I wrote a bash script to Get and Install CodeIgniter 2 + Modular Extensions 5.4 + Ion Auth 2.

Here it is. Good luck and let me know if there are any problems with it.

#! /bin/bash

echo "

This will install Codeigniter 2, Modular Extensions 5.4 and Ion Auth 2!

This script will TRY to download the packages for you.
-----------------------------------------------------
The resulting CodeIgniter install is already configured to remove the index.php
from the URL and should ALMOST be ready to run!  Make sure to read the
steps at the end of this.


Good luck..


Hit a key to continue or Ctrl-c to cancel now."


read

## Download the files
echo "Get CodeIgniter"
wget -O CodeIgniter.zip http://codeigniter.com/download.php

echo "Get Ion Auth"
wget --no-check-certificate -O benedmunds-ion-auth.zip https://github.com/benedmunds/CodeIgniter-Ion-Auth/zipball/2

echo "Get Modular Extensions"
wget --no-check-certificate -O wiredesignz.zip https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/get/tip.zip

## Unpack all the files
echo "Unpack Files"
unzip CodeIgniter.zip
rm CodeIgniter.zip
unzip benedmunds-ion-auth.zip
rm benedmunds-ion-auth.zip
unzip wiredesignz.zip
rm wiredesignz.zip

## Get the Dirs
echo "Find Dirs"
CI_DIR=`ls -c1 | grep ^CodeIgniter_`
ME_DIR=`ls -c1 | grep ^wired`
IA_DIR=`ls -c1 | grep ^ben`

## Make Modules Dir
echo "Make Modules Dir"
mkdir $CI_DIR/application/modules

## Move the Modular Extensions Files Into Place
echo "Move Modular Extensions files"
mv $ME_DIR/third_party/MX $CI_DIR/application/third_party
mv $ME_DIR/core/* $CI_DIR/application/core/

## Remove the Modular Extension Dir
echo "Remove ME Install Dir"
rm -rf $ME_DIR

## Make Welcome Module Dir
echo "Make Modular Welcome Dir"
mkdir -p $CI_DIR/application/modules/welcome/controllers

## Move default welcome controller to the modules dir
echo "Move Welcome Controller into Modules"
mv $CI_DIR/application/controllers/welcome.php $CI_DIR/application/modules/welcome/controllers/


## Make Welcome Views Dir
echo "Make Welcome Views Dir"
mkdir -p $CI_DIR/application/modules/welcome/views

## Move Welcome View into modular dir
echo "Move Welcome views into modular Welcome Dir"
mv $CI_DIR/application/views/welcome_message.php $CI_DIR/application/modules/welcome/views/

## Rename Ion Auths Dir to Auth
echo "Rename Ion Auth Dir to Auth"
mv $IA_DIR $CI_DIR/application/modules/auth

## Update the Welcome Controller to extend MX_Controller instead of CI_Controller
echo "Update Welcome Controller to extend MX_Controller"
sed -i -e "s/CI_Controller/MX_Controller/" $CI_DIR/application/modules/welcome/controllers/welcome.php

## Update the default autoload file to include database and session libraries
echo "Update autoload file to include the database and session libraries"
sed -i -e "s/\$autoload\['libraries'] = array()/\$autoload['libraries'] = array('database','session')/" $CI_DIR/application/config/autoload.php

## Update the config file to remove index.php
echo "Update config file to remove index.php"
sed -i -e "s/\$config\['index_page'] = 'index.php';/\$config['index_page'] = '';/" $CI_DIR/application/config/config.php

## Update the Ion Auth libraries to use the auth resource
echo "Update Ion Auth Lib to use the Auth Resources"
sed -i -e "s/\$this->ci->load->config('ion_auth', TRUE);/\$this->ci->load->config('auth\/ion_auth', TRUE);/" $CI_DIR/application/modules/auth/libraries/Ion_auth.php
sed -i -e "s/\$this->ci->lang->load('ion_auth');/\$this->ci->lang->load('auth\/ion_auth');/" $CI_DIR/application/modules/auth/libraries/Ion_auth.php
sed -i -e "s/\$this->ci->load->model('ion_auth_model');/\$this->ci->load->model('auth\/ion_auth_model');/" $CI_DIR/application/modules/auth/libraries/Ion_auth.php

## Update the Ion Auth model to use the auth resource
echo "Update the Ion Auth Model to use the Auth Resources"
sed -i -e "s/\$this->load->config('ion_auth', TRUE);/\$this->load->config('auth\/ion_auth', TRUE);/" $CI_DIR/application/modules/auth/models/ion_auth_model.php
sed -i -e "s/\$this->lang->load('ion_auth')/\$this->lang->load('auth\/ion_auth')/" $CI_DIR/application/modules/auth/models/ion_auth_model.php

## Update the Auth Controller to extend MX_Controller instead of CI_Controller
echo "Update Auth Controller to extend MX_Controller"
sed -i -e "s/CI_Controller/MX_Controller/" $CI_DIR/application/modules/auth/controllers/auth.php

## Update the Auth Controller so "$this->data" will be "$data"
echo "Update the Auth Controller to change \$this->data to \$data"
sed -i -e "s/\$this->data/\$data/" $CI_DIR/application/modules/auth/controllers/auth.php

## Move auth/views files up 1 level
echo "Move auth/views files up 1 level"
mv $CI_DIR/application/modules/auth/views/auth/* $CI_DIR/application/modules/auth/views/

## Remove the auth/views/auth dir
echo "Remove the auth/views/auth dir"
rmdir $CI_DIR/application/modules/auth/views/auth

## Make the routes.php file
echo "Write the modules/auth/config/routes.php file"
echo "<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| URI ROUTING
| -------------------------------------------------------------------------
*/

\$route['auth/(:any)'] = \"auth/\$1\";

/* End of file routes.php */
/* Location: ./application/config/routes.php */


" > $CI_DIR/application/modules/auth/config/routes.php

echo "Creating the $CI_DIR/.htaccess file"
echo "## Set up mod_rewrite

<IfModule mod_rewrite.c>
Options +MultiViews +FollowSymLinks
DirectoryIndex index.php index.html

# Enable Rewrite Engine
# ------------------------------
RewriteEngine On

# UPDATE THIS TO POINT TO where you installed this FROM YOUR DOC ROOT.
# If this is in the DOC ROOT, leave it as it is
#---------------------
RewriteBase /

# In case your hosting service doesn't add or remove 'www.' for you, you can
# do it here by uncommenting and updating the 'Rewrite*'s below.
#
# Add or remove 'www.'  Whichever you prefer.  
# This one removes the 'www.' which seems to be the favorable choice these days. 
# ------------------------------
#RewriteCond %{HTTP_HOST} ^www.<sitename>.com
#RewriteRule (.*) http://<sitename>.com/\$1 [R=301,L]

# Redirect index.php Requests
# ------------------------------
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteCond %{THE_REQUEST} !/system/.*
RewriteRule (.*?)index\.php/*(.*) \$1\$2 [R=301,L]


# Standard ExpressionEngine Rewrite
# ------------------------------
RewriteRule modules/(.+)/controllers/(.+)\.php\$ /index.php?/\$1/\$2 [L,R=301]
RewriteRule controllers/(.+)\.php\$ /index.php?/\$1 [L,R=301]

RewriteCond \$1 !\.(css|js|gif|jpe?g|png) [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\$ index.php/\$1 [L]

</IfModule>" > $CI_DIR/.htaccess

echo "

*********** DON'T FORGET THESE STEPS ***********
====================================================================

6 more steps:
==================
1) Update the \$config['base_url'] var in application/config/config.php
2) Update the \$config['encryption_key'] var in application/config/config.php
3) Update your application/config/database.php file to work with your database,
4) Run the Ion Auth SQL file located in application/modules/auth/sql.
5) Now rename or move everything from $CI_DIR into where you set \$config['base_url']

If you put your CodeIgniter files anywhere other than DOC ROOT you need to do step 6:
6)Update the 'RewriteBase' in the .htaccess file in your CodeIgniter Directory to where your CodeIgniter files are.

If your CodeIgniter files ARE IN the DOC ROOT of your webserver, you should be able to run from there like this:
---------------
yourdomain.com
yourdomain.com/auth


If your CodeIgniter files AREN'T IN the DOC ROOT:
Remember to update the RewriteBase to point to "your_ci_dir" (see below) in the .htaccess file and you should be able to run like this:
--------------------------
yourdomain.com/your_ci_dir
yourdomain.com/your_ci_dir/auth

====================================================================
    YOU SHOULD BE DONE AFTER FOLLOWING THOSE STEPS!

I think you should be up and running!


Hope this all works!


Please let me know if this worked for you or not!
Edmund - edmundchaniii AT gmail.com

C'ya!

"
Phenology answered 5/1, 2012 at 1:9 Comment(1)
If anyone reading this is interested, I'm developing a way to do this using a composer package that uses repositories and install scripts. Check out the github profile with the same name and look for a project called Matches. Hope to release in less than a month from now =]Giotto
E
0

The solutions given by @ciuser and @Dash worked for me but auto loading the ion_auth does not because to the language files. So I kept the language folder content in the application/language folder and rest as a module which works like a charm.

Excursus answered 14/7, 2013 at 12:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.