forked from bcit-ci/CodeIgniter
-
Notifications
You must be signed in to change notification settings - Fork 4
Hot Scaffolding
Derek Jones edited this page Jul 5, 2012
·
4 revisions
Develop a simple scaffolding for CRUD operations on tables. It works this way: Suppose you want to edit a master table:
/*
-----
users
----
id
category_id
name
---
*/
and want that your crud appears related to:
/*
----
category
----
id
name
*/
then this library is sufficient that you create a controller and configured as you want to see your crud.
could be:
Example class users
/system/controllers/users.php
<?php
class users extends Controller {
public function __construct()
{
parent::Controller();
$param = array('baseclass' =>__CLASS__,
'table' =>'users',
'slaves'=>array(
array('table'=>
array(
'name' =>'category',
'caption' =>'name' ,
'id' =>'id' ,
'join' =>'category_id'
)
)
),
'hidden'=>array('id'),
'rename'=>array(
'User Category'=>'category_id',
'User Name' =>'name'
)
);
$this->load->library('libscaffolding',$param);
}
function index()
{
echo "<p>".$this->libscaffolding->newlink()."</p>";
echo "<p>".$this->libscaffolding->all()."</p>";
}
public function edit($id)
{
echo "<p>".$this->libscaffolding->edit($id)."</p>";
}
public function view($id)
{
echo "<p>".$this->libscaffolding->view($id)."</p>";
}
public function delete($id)
{
$this->libscaffolding->_delete($id);
}
public function update($id)
{
$this->libscaffolding->_update($id,$_POST);//do better
}
public function add()
{
echo "<p>".$this->libscaffolding->add()."</p>";
}
public function insert()
{
$this->libscaffolding->_insert($_POST);//do better
}
}
?>
clever! crud you already have a warm relationship with which you can customize to your liking.
to install this feature you must: install the following file:
/system/libraries/libscaffolding.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Scaffolding library for Code Igniter applications
* Author: Daniel Romero, Jaguarcode Consulting, www.jaguarcode.com.ar, February 2009
*/
class libscaffolding {
private $base;
private $table;
private $slaves;
private $hidden = array(); //columns to hidden ->egg optional
private $redir = 'yes'; //redir to main view ->egg optional
private $rename = array(); //rename main columns ->egg optional
private $sql = false; //change a table by a complex sql statement ->egg optional
private $showpanel = true; //show control panel for all method ->egg optional
private $styletable = false; //show style for control panel ->egg optional
private $table_select;
private $slave_select;
/**
* ::construct(array)
*
* array::struct
* |
* |-> table :: master table for crud
* |-> baseclass :: class trigger
* |-> slaves :: array with joined tables
* |
* |->name :: join table name
* |->caption :: field for reemplaze
* |->id :: field id
* |->join :: field for equalizer
*
*/
public function __construct($config)
{
if (!isset($this->CI)) $this->CI =& get_instance();
$this->CI->load->model ('advanced','',TRUE);
$this->CI->load->library('table');
$this->table = $config["table"];
$this->slaves = $config["slaves"];
$this->base = base_url().$config["baseclass"];
if(is_array ($config["hidden" ] )) $this->hidden = $config["hidden" ];
if(isset ($config["redirect" ] )) $this->redir = $config["redirect" ];
if(isset ($config["rename" ] )) $this->rename = $config["rename" ];
if(isset ($config["statement"] )) $this->sql = $config["statement" ];
if(isset ($config["showpanel"] )) $this->showpanel = $config["showpanel" ];
if(isset ($config["styletable"] )) $this->styletable = $config["styletable" ];
$this->setstyle();
}
private function setstyle()
{
if($this->styletable!=false)
{
$this->CI->table->set_template($this->styletable);
}
}
/**
* ::select
*
* |->select all for all tables
*
*/
private function select()
{
$this->table_select = $this->mainget();//$this->CI->advanced->get($this->table);
$this->slave_select = array();
foreach($this->slaves as $rows)
{
$this->slave_select[$rows['table']['name']] = $this->CI->advanced->get($rows['table']['name']);
}
}
private function mainget()
{
$rs = "";
if($this->sql==false)
$rs = $this->CI->advanced->get($this->table);
else
$rs = $this->CI->advanced->query($this->sql);
return $rs;
}
/**
* ::all
*
* |->Generate master view
* |->Return html
*
*/
public function all()
{
$this->select();
if ($this->table_select->num_rows() == 0)
{
die('<p>The table appears to have no data.</p>');
}
else
{
$this->CI->table->set_heading($this->getfield());
foreach ($this->table_select->result() as $row)
{
$tmp_row=array();
foreach($row as $key=>$value)
{
foreach($this->slaves as $slave)
{
$slave_table = $slave['table']['name' ]; //empresas
$slave_caption = $slave['table']['caption' ]; //nombre
$slave_id = $slave['table']['id' ]; //codigo
$slave_join = $slave['table']['join' ]; //id_empresa
$rw = $this->slave_select[$slave_table];
$value = $this->getvalue(array(
'slave_join' =>$slave_join ,
'slave_caption' =>$slave_caption,
'slave_id' =>$slave_id ,
'key' =>$key ,
'rw' =>$rw ,
'value' =>$value
));
}
if(in_array($key,$this->hidden))
{}
else
$tmp_row[]= $value;
}
if($this->showpanel)
$tmp_row[]= "
<a >base}/view/{$row->id}' class='view'>View</a>
<a >base}/edit/{$row->id}' class='edit'>Edit</a>
<a >base}/delete/{$row->id}' class='delete'>delete</a>
";
$this->CI->table->add_row($tmp_row);
}
}
return $this->CI->table->generate();
}
private function getfield()
{
$fields = $this->table_select->field_data();
$headers = array();
foreach ($fields as $field)
{
if(in_array($field->name,$this->hidden))
{}
else
{
$key_found = array_search($field->name,$this->rename);
if($key_found)
$headers []= "<strong>$key_found</strong>";
else
$headers []= "<strong>$field->name</strong>";
}
}
$headers []=" ";
return $headers;
}
private function getvalue($array)
{
if( $array['slave_join'] == $array['key'] )
foreach ($array['rw']->result() as $rs)
{
$keyfound = false;
foreach( $rs as $k=>$v )
{
if( $array['slave_id'] == $k )
if( $array['value'] == $v )
$keyfound = true;
if( $array['slave_caption'] == $k )
if( $keyfound == true)
$array['value'] = $v;
}
}
return $array['value'];
}
/**
* ::view
*
* |->Generate master view table
* |->Return html
*
*/
public function view($id)
{
$this->select();
if ($this->table_select->num_rows() == 0)
{
echo '<p>The table appears to have no data.</p>';
}
else
{
foreach ($this->table_select->result() as $row)
{
if((int)$row->id == (int)$id)
{
foreach($row as $key=>$value)
{
foreach($this->slaves as $slave)
{
$slave_table = $slave['table']['name' ]; //empresas
$slave_caption = $slave['table']['caption' ]; //nombre
$slave_id = $slave['table']['id' ]; //codigo
$slave_join = $slave['table']['join' ]; //id_empresa
$rw = $this->slave_select[$slave_table];
$value = $this->getvalue(array(
'slave_join' =>$slave_join ,
'slave_caption' =>$slave_caption,
'slave_id' =>$slave_id ,
'key' =>$key ,
'rw' =>$rw ,
'value' =>$value
));
}
if(in_array($key,$this->hidden))
{}//
else
{
$key_found = array_search($key,$this->rename);
if($key_found)
$key = $key_found;
$this->CI->table->add_row(array("<strong>$key</strong>",$value));
}
}
}
}
}
return $this->CI->table->generate();
}
/**
* ::edit
*
* |->Generate master form
* |->Return html
*
*/
public function edit($id)
{
$this->select();
if ($this->table_select->num_rows() == 0)
{
echo '<p>The table appears to have no data.</p>';
}
else
{
foreach ($this->table_select->result() as $row)
{
if((int)$row->id == (int)$id)
{
foreach($row as $key=>$value)
{
$input = "<input type='text' name='$key' value='$value' />";
foreach($this->slaves as $slave)
{
$slave_table = $slave['table']['name' ]; //empresas
$slave_caption = $slave['table']['caption' ]; //nombre
$slave_id = $slave['table']['id' ]; //codigo
$slave_join = $slave['table']['join' ]; //id_empresa
$rw = $this->slave_select[$slave_table];
if( $slave_join == $key )
$input = $this->dropdown(array(
'slave_join' =>$slave_join ,
'slave_caption' =>$slave_caption,
'slave_id' =>$slave_id ,
'key' =>$key ,
'rw' =>$rw ,
'value' =>$value
));
}
if(in_array($key,$this->hidden))
{}//
else
{
$key_found = array_search($key,$this->rename);
if($key_found)
$key = $key_found;
$this->CI->table->add_row(array("<strong>$key</strong>",$input));
}
}
$this->CI->table->add_row(array(" ","<input type='submit' name='btn' value='Update'>"));
}
}
}
return "<form action='{$this->base}/update/{$id}' method='post'>".$this->CI->table->generate()."</form>";
}
private function dropdown($array)
{
$input ="<select name='".$array['key']."'>";
foreach ($array['rw']->result_array() as $rs)
{
$keyfound = false;
$selected = "";
if($rs[$array['slave_id']]==$array['value']) $selected="selected='selected'";
$input.="<option value='".$rs[$array['slave_id']]."' $selected>".$rs[$array['slave_caption']]."</option>";
}
$input.="</select>";
return $input;
}
/**
* ::_delete
*
* |->Delete selected element
* |->Redirect
*
*/
public function _delete($id)
{
$this->CI->advanced->delete(array('table'=>$this->table,'field'=>'id','value'=>$id));
$this->transfer();
}
/**
* ::_update
*
* |->Update selected element
* |->Redirect
*
*/
public function _update($id,$array)
{
unset($array['id']);
unset($array['btn']);
$array['id'] = $id;
$this->CI->advanced->update(array(
'table' =>$this->table,
'field' =>'id',
'id' =>$array['id'],
'data' =>$array
));
$this->transfer();
}
/**
* ::_insert
*
* |->Insert selected element
* |->Redirect
*
*/
public function _insert($array)
{
unset($array['id']);
unset($array['btn']);
$array['id'] = $this->CI->advanced->max($this->table,'id')+1;
$this->CI->advanced->insert(array(
'table' =>$this->table,
'data' =>$array
));
$this->transfer();
}
/**
* ::newlink
*
* |->Get link for insert
* |->return html
*
*/
public function newlink()
{
return "<a >base}/add/'>new</a>";
}
private function transfer()
{
if($this->redir =='yes')
redirect($this->base);
}
/**
* ::add
*
* |->Generate insert form
* |->return html
*
*/
public function add()
{
$id=1;$b=false;
$this->select();
if ($this->table_select->num_rows() == 0)
{
echo '<p>The table appears to have no data.</p>';
}
else
{
foreach ($this->table_select->result() as $row)
{
if($b==false)
{
foreach($row as $key=>$value)
{
$input = "<input type='text' name='$key' value='' />";
foreach($this->slaves as $slave)
{
$slave_table = $slave['table']['name' ]; //empresas
$slave_caption = $slave['table']['caption' ]; //nombre
$slave_id = $slave['table']['id' ]; //codigo
$slave_join = $slave['table']['join' ]; //id_empresa
$rw = $this->slave_select[$slave_table];
if( $slave_join == $key )
$input = $this->dropdown(array(
'slave_join' =>$slave_join ,
'slave_caption' =>$slave_caption,
'slave_id' =>$slave_id ,
'key' =>$key ,
'rw' =>$rw ,
'value' =>0
));
}//endforeach
if(in_array($key,$this->hidden))
{}//
else
{
$key_found = array_search($key,$this->rename);
if($key_found)
$key = $key_found;
$this->CI->table->add_row(array("<strong>$key</strong>",$input));
}
}//endforeach
$this->CI->table->add_row(array(" ","<input type='submit' name='btn' value='Insert'>"));
}//endif
$b=true;
}
}
return "<form action='{$this->base}/insert/' method='post'>".$this->CI->table->generate()."</form>";
}
}
?>
You must install this model /system/models/advanced.php
<?php
class advanced extends Model
{
public function __construct()
{
parent::Model();
}
public function get($tabla)
{
return $this->db->get($tabla);
}
public function query($string)
{
return $this->db->query($string);
}
public function delete($array)
{
$this->db->delete($array['table'], array($array['field'] => $array['value']));
}
public function update($array)
{
$this->db->where($array['field'], $array['id']);
$this->db->update($array['table'], $array['data']);
}
public function insert($array){
$this->db->insert($array['table'], $array['data']);
}
public function max($table,$field)
{
$max ="";
$this->db->select_max($field);
$rs =$this->db->get($table);
foreach($rs->result_array() as $row)
{
$max = $row[$field];
}
return $max;
}
}
?>
presto, the library has more functions to better use, you can fit your needs bye!