Fixes for ORM
This commit is contained in:
parent
83fcf55501
commit
0ee23bf06e
@ -183,7 +183,7 @@ abstract class Kohana_Database_LDAP extends Kohana_LDAP {
|
||||
|
||||
foreach ($u as $dn => $leaf)
|
||||
if ($this->_bind($dn,$pass))
|
||||
return $this;
|
||||
return ORM::factory('LDAP',$dn);
|
||||
|
||||
// We didnt find an AUTH DN to bind with
|
||||
return FALSE;
|
||||
|
@ -212,6 +212,8 @@ abstract class Kohana_Database_LDAP_Search {
|
||||
$this->_filter = $this->_build();
|
||||
|
||||
// Validation that we are connected, no point contining if we are not.
|
||||
$this->_db->connect();
|
||||
|
||||
if (! $this->_db->connection())
|
||||
throw HTTP_Exception::factory(501,'Cant run a search without a connection (:type,:filter)',array(':type'=>$this->_db,':filter'=>$this->_filter));
|
||||
|
||||
@ -247,8 +249,8 @@ abstract class Kohana_Database_LDAP_Search {
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
throw HTTP_Exception::factory(501,'Error running a query (SCOPE::scope,TYPE::type,FILTER::filter,ATTRS::attrs) [:error]',
|
||||
array(':scope'=>$this->_scope,':type'=>$this->_db,':filter'=>$this->_filter,':attrs'=>join('|',$this->_attrs),':error'=>$e->getMessage()));
|
||||
throw HTTP_Exception::factory(501,'Error running a query (SCOPE::scope,BASE::base,TYPE::type,FILTER::filter,ATTRS::attrs) [:error]',
|
||||
array(':base'=>$base,':scope'=>$this->_scope,':type'=>$this->_db,':filter'=>$this->_filter,':attrs'=>join('|',$this->_attrs),':error'=>$e->getMessage()));
|
||||
}
|
||||
|
||||
$result[$base] = new Database_LDAP_Result(array('l'=>$this->_db->connection(),'r'=>$search),array('b'=>$base,'s'=>$this->_scope,'f'=>$this->_filter),$as_object,$object_params);
|
||||
|
@ -13,6 +13,7 @@ abstract class Kohana_ORM_LDAP extends ORM {
|
||||
protected $_disable_wild_select = TRUE;
|
||||
protected $_disable_join_table_name = TRUE;
|
||||
protected $_primary_key = 'dn';
|
||||
protected $_sub_items = array();
|
||||
|
||||
public function __construct($id = NULL) {
|
||||
// We'll process our $id
|
||||
@ -89,5 +90,133 @@ abstract class Kohana_ORM_LDAP extends ORM {
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles getting of column
|
||||
* We override Kohana's get() to allow for LDAP symantics.
|
||||
*
|
||||
* @param string $column Column name
|
||||
* @throws Kohana_Exception
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($column)
|
||||
{
|
||||
if (array_key_exists($column, $this->_object))
|
||||
{
|
||||
return (in_array($column, $this->_serialize_columns))
|
||||
? $this->_unserialize_value($this->_object[$column])
|
||||
: $this->_object[$column];
|
||||
}
|
||||
elseif (isset($this->_related[$column]))
|
||||
{
|
||||
// Return related model that has already been fetched
|
||||
return $this->_related[$column];
|
||||
}
|
||||
elseif (isset($this->_belongs_to[$column]))
|
||||
{
|
||||
$model = $this->_related($column);
|
||||
|
||||
// Use this model's column and foreign model's primary key
|
||||
$col = ($this->_disable_join_table_name ? '' : $model->_object_name.'.').$model->_primary_key;
|
||||
$val = $this->_object[$this->_belongs_to[$column]['foreign_key']];
|
||||
|
||||
// Make sure we don't run WHERE "AUTO_INCREMENT column" = NULL queries. This would
|
||||
// return the last inserted record instead of an empty result.
|
||||
// See: http://mysql.localhost.net.ar/doc/refman/5.1/en/server-session-variables.html#sysvar_sql_auto_is_null
|
||||
if ($val !== NULL)
|
||||
{
|
||||
$model->where($col, '=', $val)->find();
|
||||
}
|
||||
|
||||
return $this->_related[$column] = $model;
|
||||
}
|
||||
elseif (isset($this->_has_one[$column]))
|
||||
{
|
||||
$model = $this->_related($column);
|
||||
|
||||
if (! is_array($this->_has_one[$column]['foreign_key']))
|
||||
{
|
||||
// Use this model's primary key value and foreign model's column
|
||||
$col = ($this->_disable_join_table_name ? '' : $model->_object_name.'.').$this->_has_one[$column]['foreign_key'];
|
||||
$val = $this->_object[$this->_has_one[$column]['far_key']];
|
||||
$val = array_pop($val);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach ($this->_has_one[$column]['foreign_key'] as $fk)
|
||||
{
|
||||
// Simple has_many relationship, search where target model's foreign key is this model's primary key
|
||||
$col = ($this->_disable_join_table_name ? '' : $model->_object_name.'.').$fk;
|
||||
$val = $this->_object[$fk];
|
||||
|
||||
$model = $model->where($col, '=', $val);
|
||||
}
|
||||
}
|
||||
|
||||
if ($col = 'dn' AND $val)
|
||||
$model->base($val)->find();
|
||||
else
|
||||
$model->where($col, '=', $val)->find();
|
||||
|
||||
return $this->_related[$column] = $model;
|
||||
}
|
||||
elseif (isset($this->_has_many[$column]))
|
||||
{
|
||||
$model = ORM::factory($this->_has_many[$column]['model']);
|
||||
|
||||
if (! is_array($this->_has_many[$column]['foreign_key']))
|
||||
{
|
||||
if (isset($this->_has_many[$column]['through']))
|
||||
{
|
||||
// Grab has_many "through" relationship table
|
||||
$through = $this->_has_many[$column]['through'];
|
||||
|
||||
// Join on through model's target foreign key (far_key) and target model's primary key
|
||||
$join_col1 = ($this->_disable_join_table_name ? '' : $through.'.').$this->_has_many[$column]['far_key'];
|
||||
$join_col2 = ($this->_disable_join_table_name ? '' : $model->_object_name.'.').$model->_primary_key;
|
||||
|
||||
$model->join($through)->on($join_col1, '=', $join_col2)
|
||||
->on(($this->_disable_join_table_name ? '' : $through.'.').'site_id', '=', ($this->_disable_join_table_name ? '' : $model->_object_name.'.').'site_id');
|
||||
|
||||
// Through table's source foreign key (foreign_key) should be this model's primary key
|
||||
$col = ($this->_disable_join_table_name ? '' : $through.'.').$this->_has_many[$column]['foreign_key'];
|
||||
$val = $this->pk();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Simple has_many relationship, search where target model's foreign key is this model's primary key
|
||||
$col = ($this->_disable_join_table_name ? '' : $model->_object_name.'.').$this->_has_many[$column]['foreign_key'];
|
||||
$val = $this->_object[$this->_has_many[$column]['far_key']];
|
||||
}
|
||||
|
||||
return $model->where($col, '=', $val);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach ($this->_has_many[$column]['foreign_key'] as $mk => $fk)
|
||||
{
|
||||
if (isset($this->_has_many[$column]['through']))
|
||||
{
|
||||
throw new Kohana_Exception('This code hasnt been written yet!');
|
||||
}
|
||||
else
|
||||
{
|
||||
// Simple has_many relationship, search where target model's foreign key is this model's primary key
|
||||
$col = ($this->_disable_join_table_name ? '' : $model->_object_name.'.').$fk;
|
||||
$val = $this->_object[$mk];
|
||||
}
|
||||
|
||||
$model = $model->where($col, '=', $val);
|
||||
}
|
||||
|
||||
return $model;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Kohana_Exception('The :property property does not exist in the :class class',
|
||||
array(':property' => $column, ':class' => get_class($this)));
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
@ -10,5 +10,16 @@
|
||||
* @license http://dev.phpldapadmin.org/license.html
|
||||
*/
|
||||
class Model_LDAP extends ORM_LDAP {
|
||||
public $_reload_on_wakeup = FALSE;
|
||||
|
||||
protected $_has_one = array(
|
||||
'bp_manager'=>array('model'=>'LDAP','foreign_key'=>'dn','far_key'=>'manager'),
|
||||
'tl_manager'=>array('model'=>'LDAP','foreign_key'=>'dn','far_key'=>'glteamlead'),
|
||||
);
|
||||
|
||||
// Unused - by required for page rendering for admin menu items
|
||||
public function isAdmin() {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
Reference in New Issue
Block a user