diff --git a/application/config/fhcomplete.php b/application/config/fhcomplete.php index 493d3f371..e893464f9 100644 --- a/application/config/fhcomplete.php +++ b/application/config/fhcomplete.php @@ -4,5 +4,7 @@ $config['fhc_version'] = '3.2'; $config['fhc_acl'] = array ( - 'public.tbl_prestudent' => 'basis/person' + 'public.tbl_person' => 'basis/person', + 'public.tbl_prestudent' => 'basis/person', + 'public.tbl_organisationseinheit' => 'basis/organisationseinheit' ); diff --git a/application/config/template.php b/application/config/template.php new file mode 100644 index 000000000..5dbf44178 --- /dev/null +++ b/application/config/template.php @@ -0,0 +1,15 @@ + + * @see http://codeigniter.com/user_guide/general/urls.html + * @return void + */ + public function index() + { + $this->session->uid='admin'; // Should normaly be set through auth + $this->load->model('person/Prestudent_model'); + $id=null; + + // Insert PreStudent + $data = array + ( + 'aufmerksamdurch_kurzbz' => 'k.A.', + 'person_id' => 1, + 'studiengang_kz' => 0 + ); + $res = $this->Prestudent_model->insert($data); + if ($res->error) + echo 'Error: ',$res->error, ', Code: ',$res->code,' -> ',$res->msg,': ',$res->retval,'
'; + else + $id=$res->retval; + + // Update PreStudent + $data = array + ( + 'zgvort' => 'Wien', + 'zgvdatum' => '2012-12-12', + 'facheinschlberuf' => true + ); + $res = $this->Prestudent_model->update($id, $data); + if ($res->error) + echo 'Error: ',$res->error, ', Code: ',$res->code,' -> ',$res->msg,': ',$res->retval,'
'; + else + $id=$res->retval; + + // Replace PreStudent + /*$data = array + ( + 'prestudent_id' => $id, + 'zgvmaort' => 'Linz', + 'zgvmadatum' => '2011-11-11', + 'facheinschlberuf' => false + ); + $res = $this->Prestudent_model->replace($data); + if ($res->error) + echo 'Error: ',$res->error, ', Code: ',$res->code,' -> ',$res->msg,': ',$res->retval; + else + echo 'Error: ',$res->error, ', Code: ',$res->code,' -> ',$res->msg,': ',$res->retval;*/ + + // Load PreStudent + $res = $this->Prestudent_model->load($id); + if ($res->error) + echo 'Error: ',$res->error, ', Code: ',$res->code,' -> ',$res->msg,': ',$res->retval,'
'; + else + var_dump($res->retval); + + // Delete PreStudent + $res = $this->Prestudent_model->delete($id); + if ($res->error) + echo 'Error: ',$res->error, ', Code: ',$res->code,' -> ',$res->msg,': ',$res->retval,'
'; + else + var_dump($res->retval); + + $this->load->model('organisation/Organisationseinheit_model'); + // Insert OE + $data = array + ( + 'oe_kurzbz' => 'testoe', + 'bezeichnung' => 'testoe', + 'organisationseinheittyp_kurzbz' => 'Institut', + 'standort_id' => null + ); + $res = $this->Organisationseinheit_model->insert($data); + if ($res->error) + echo 'Error: ',$res->error, ', Code: ',$res->code,' -> ',$res->msg,': ',$res->retval,'
'; + else + $id = $data['oe_kurzbz']; + var_dump($res); + + // Update PreStudent + $data = array + ( + 'freigabegrenze' => 1234.56, + 'kurzzeichen' => 'TestOE', + 'lehre' => false + ); + $res = $this->Organisationseinheit_model->update($id, $data); + if ($res->error) + echo 'Error: ',$res->error, ', Code: ',$res->code,' -> ',$res->msg,': ',$res->retval,'
'; + else + $id=$res->retval; + + // Delete PreStudent + $res = $this->Organisationseinheit_model->delete($id); + if ($res->error) + echo 'Error: ',$res->error, ', Code: ',$res->code,' -> ',$res->msg,': ',$res->retval,'
'; + else + var_dump($res->retval); + } +} diff --git a/application/core/DB_Model.php b/application/core/DB_Model.php index c154e27e6..5d84e3ee4 100644 --- a/application/core/DB_Model.php +++ b/application/core/DB_Model.php @@ -32,7 +32,7 @@ class DB_Model extends FHC_Model // Check rights if (! $this->fhc_db_acl->isBerechtigt((string)($this->acl[$this->dbTable]), 'i')) - return $this->_error(lang('fhc_'.FHC_NORIGHT), FHC_MODEL_ERROR); + return $this->_error(lang('fhc_'.FHC_NORIGHT).' -> '.$this->acl[$this->dbTable], FHC_MODEL_ERROR); // DB-INSERT if ($this->db->insert($this->dbTable, $data)) @@ -55,7 +55,7 @@ class DB_Model extends FHC_Model // Check rights if (! $this->fhc_db_acl->isBerechtigt((string)($this->acl[$this->dbTable]), 'ui')) - return $this->_error(lang('fhc_'.FHC_NORIGHT), FHC_MODEL_ERROR); + return $this->_error(lang('fhc_'.FHC_NORIGHT).' -> '.$this->acl[$this->dbTable], FHC_MODEL_ERROR); // DB-REPLACE if ($this->db->replace($this->dbTable, $data)) @@ -81,7 +81,7 @@ class DB_Model extends FHC_Model // Check rights if (! $this->fhc_db_acl->isBerechtigt((string)($this->acl[$this->dbTable]), 'u')) - return $this->_error(lang('fhc_'.FHC_NORIGHT), FHC_MODEL_ERROR); + return $this->_error(lang('fhc_'.FHC_NORIGHT).' -> '.$this->acl[$this->dbTable], FHC_MODEL_ERROR); // DB-UPDATE $this->db->where($this->pk, $id); @@ -92,9 +92,9 @@ class DB_Model extends FHC_Model } /** --------------------------------------------------------------- - * Replace Data in DB-Table + * Load data from DB-Table * - * @param array $data DataArray for Replacement + * @param string $id Primary Key for SELECT * @return array */ public function load($id) @@ -107,7 +107,7 @@ class DB_Model extends FHC_Model // Check rights if (! $this->fhc_db_acl->isBerechtigt((string)($this->acl[$this->dbTable]), 's')) - return $this->_error(lang('fhc_'.FHC_NORIGHT), FHC_MODEL_ERROR); + return $this->_error(lang('fhc_'.FHC_NORIGHT).' -> '.$this->acl[$this->dbTable], FHC_MODEL_ERROR); // DB-SELECT if ($this->db->get_where($this->dbTable, array($this->pk => $id))) @@ -116,6 +116,31 @@ class DB_Model extends FHC_Model return $this->_error($this->db->error(), FHC_DB_ERROR); } + /** --------------------------------------------------------------- + * Delete data from DB-Table + * + * @param string $id Primary Key for DELETE + * @return array + */ + public function delete($id) + { + // Check Class-Attributes + if(is_null($this->dbTable)) + return $this->_error(lang('fhc_'.FHC_NODBTABLE), FHC_MODEL_ERROR); + if(is_null($this->pk)) + return $this->_error(lang('fhc_'.FHC_NOPK), FHC_MODEL_ERROR); + + // Check rights + if (! $this->fhc_db_acl->isBerechtigt($this->acl[$this->dbTable], 'd')) + return $this->_error(lang('fhc_'.FHC_NORIGHT).' -> '.$this->acl[$this->dbTable], FHC_MODEL_ERROR); + + // DB-DELETE + if ($this->db->delete($this->dbTable, array($this->pk => $id))) + return $this->_success($id); + else + return $this->_error($this->db->error(), FHC_DB_ERROR); + } + /** --------------------------------------------------------------- * Invalid ID * diff --git a/application/language/de-AT/fhc_model_lang.php b/application/language/de-AT/fhc_model_lang.php index 5d0e2b143..4acf23341 100644 --- a/application/language/de-AT/fhc_model_lang.php +++ b/application/language/de-AT/fhc_model_lang.php @@ -5,3 +5,5 @@ if ( ! defined('BASEPATH')) // DB-Errormessages $lang['fhc_'.FHC_MODEL_ERROR] = 'Fehler in Model'; $lang['fhc_'.FHC_NODBTABLE] = '"dbTable" ist nicht gesetzt!'; +$lang['fhc_'.FHC_NORIGHT] = 'Rechte sind nicht ausreichend!'; + diff --git a/application/language/en-US/fhc_model_lang.php b/application/language/en-US/fhc_model_lang.php index b36d6de2d..c000598a6 100644 --- a/application/language/en-US/fhc_model_lang.php +++ b/application/language/en-US/fhc_model_lang.php @@ -5,3 +5,4 @@ if ( ! defined('BASEPATH')) // DB-Errormessages $lang['fhc_'.FHC_MODEL_ERROR] = 'Error in Model'; $lang['fhc_'.FHC_NODBTABLE] = 'dbTable is not set!'; +$lang['fhc_'.FHC_NORIGHT] = 'rights are missing!'; diff --git a/application/libraries/Template.php b/application/libraries/Template.php new file mode 100644 index 000000000..07bccd949 --- /dev/null +++ b/application/libraries/Template.php @@ -0,0 +1,629 @@ +_ci = & get_instance(); + + // set the default widget path with APPPATH + $this->_widget_path = APPPATH . 'widgets/'; + + if (!empty($config)) + $this->initialize($config); + + log_message('debug', 'Template library initialized'); + } + + /** + * Initialize with configuration array + * @param array $config + * @return Template + */ + public function initialize($config = array()) + { + foreach ($config as $key => $val) + $this->{'_' . $key} = $val; + + if ($this->_widget_path == '') + $this->_widget_path = APPPATH . 'widgets/'; + + if ($this->_parser && !class_exists('CI_Parser')) + $this->_ci->load->library('parser'); + } + + /** + * Set a partial's content. This will create a new partial when not existing + * @param string $index + * @param mixed $value + */ + public function __set($name, $value) + { + $this->partial($name)->set($value); + } + + /** + * Access to partials for method chaining + * @param string $name + * @return mixed + */ + public function __get($name) + { + return $this->partial($name); + } + + /** + * Check if a partial exists + * @param string $index + * @return boolean + */ + public function exists($index) + { + return array_key_exists($index, $this->_partials); + } + + /** + * Set the template file + * @param string $template + */ + public function set_template($template) + { + $this->_template = $template; + } + + /** + * Publish the template with the current partials + * You can manually pass a template file with extra data, or use the default template from the config file + * @param string $template + * @param array $data + */ + public function publish($template = FALSE, $data = array()) { + if (is_array($template) || is_object($template)) { + $data = $template; + } else if ($template) { + $this->_template = $template; + } + + if (!$this->_template) { + show_error('There was no template file selected for the current template'); + } + + if (is_array($data) || is_object($data)) { + foreach ($data as $name => $content) { + $this->partial($name)->set($content); + } + } + + unset($data); + + if ($this->_parser) { + $this->_ci->parser->parse($this->_template, $this->_partials); + } else { + $this->_ci->load->view($this->_template, $this->_partials); + } + } + + /** + * Create a partial object with an optional default content + * Can be usefull to use straight from the template file + * @param string $name + * @param string $default + * @return Partial + */ + public function partial($name, $default = FALSE) { + if ($this->exists($name)) { + $partial = $this->_partials[$name]; + } else { + // create new partial + $partial = new Partial($name); + if ($this->_cache_ttl) { + $partial->cache($this->_cache_ttl); + } + + // detect local triggers + if (method_exists($this, 'trigger_' . $name)) { + $partial->bind($this, 'trigger_' . $name); + } + + $this->_partials[$name] = $partial; + } + + if (!$partial->content() && $default) { + $partial->set($default); + } + + return $partial; + } + + /** + * Create a widget object with optional parameters + * Can be usefull to use straight from the template file + * @param string $name + * @param array $data + * @return Widget + */ + public function widget($name, $data = array()) { + $class = str_replace('.php', '', trim($name, '/')); + + // determine path and widget class name + $path = $this->_widget_path; + if (($last_slash = strrpos($class, '/')) !== FALSE) { + $path += substr($class, 0, $last_slash); + $class = substr($class, $last_slash + 1); + } + + // new widget + if(!class_exists($class)) { + // try both lowercase and capitalized versions + foreach (array(ucfirst($class), strtolower($class)) as $class) { + if (file_exists($path . $class . '.php')) { + include_once ($path . $class . '.php'); + + // found the file, stop looking + break; + } + } + } + + if (!class_exists($class)) { + show_error("Widget '" . $class . "' was not found."); + } + + return new $class($class, $data); + } + + /** + * Enable cache for all partials with TTL, default TTL is 60 + * @param int $ttl + * @param mixed $identifier + */ + public function cache($ttl = 60, $identifier = '') { + foreach ($this->_partials as $partial) { + $partial->cache($ttl, $identifier); + } + + $this->_cache_ttl = $ttl; + } + + // ---- TRIGGERS ----------------------------------------------------------------- + + /** + * Stylesheet trigger + * @param string $source + */ + public function trigger_stylesheet($url, $attributes = FALSE) { + // array support + if (is_array($url)) { + $return = ''; + foreach ($url as $u) { + $return .= $this->trigger_stylesheet($u, $attributes); + } + return $return; + } + + if (!stristr($url, 'http://') && !stristr($url, 'https://') && substr($url, 0, 2) != '//') { + $url = $this->_ci->config->item('base_url') . $url; + } + + // legacy support for media + if (is_string($attributes)) { + $attributes = array('media' => $attributes); + } + + if (is_array($attributes)) { + $attributeString = ""; + + foreach ($attributes as $key => $value) { + $attributeString .= $key . '="' . $value . '" '; + } + + return '' . "\n\t"; + } else { + return '' . "\n\t"; + } + } + + /** + * Javascript trigger + * @param string $source + */ + public function trigger_javascript($url) { + // array support + if (is_array($url)) { + $return = ''; + foreach ($url as $u) { + $return .= $this->trigger_javascript($u); + } + return $return; + } + + if (!stristr($url, 'http://') && !stristr($url, 'https://') && substr($url, 0, 2) != '//') { + $url = $this->_ci->config->item('base_url') . $url; + } + + return '' . "\n\t"; + } + + /** + * Meta trigger + * @param string $name + * @param mixed $value + * @param enum $type + */ + public function trigger_meta($name, $value, $type = 'meta') { + $name = htmlspecialchars(strip_tags($name)); + $value = htmlspecialchars(strip_tags($value)); + + if ($name == 'keywords' and !strpos($value, ',')) { + $content = preg_replace('/[\s]+/', ', ', trim($value)); + } + + switch ($type) { + case 'meta' : + $content = '' . "\n\t"; + break; + case 'link' : + $content = '' . "\n\t"; + break; + } + + return $content; + } + + /** + * Title trigger, keeps it clean + * @param string $name + * @param mixed $value + * @param enum $type + */ + public function trigger_title($title) { + return htmlspecialchars(strip_tags($title)); + } + + /** + * Title trigger, keeps it clean + * @param string $name + * @param mixed $value + * @param enum $type + */ + public function trigger_description($description) { + return htmlspecialchars(strip_tags($description)); + } + +} + +class Partial +{ + + protected $_ci, $_content, $_name, $_cache_ttl = 0, $_cached = false, $_identifier, $_trigger; + protected $_args = array(); + + /** + * Construct with optional parameters + * @param array $args + */ + public function __construct($name, $args = array()) { + $this->_ci = &get_instance(); + $this->_args = $args; + $this->_name = $name; + } + + /** + * Gives access to codeigniter's functions from this class if needed + * This will be handy in extending classes + * @param string $index + */ + function __get($name) { + return $this->_ci->$name; + } + + /** + * Alias methods + */ + function __call($name, $args) { + switch ($name) { + case 'default' : + return call_user_func_array(array($this, 'set_default'), $args); + break; + case 'add' : + return call_user_func_array(array($this, 'append'), $args); + break; + } + } + + /** + * Returns the content when converted to a string + * @return string + */ + public function __toString() { + return (string) $this->content(); + } + + /** + * Returns the content + * @return string + */ + public function content() { + if ($this->_cache_ttl && !$this->_cached) { + $this->cache->save($this->cache_id(), $this->_content, $this->_cache_ttl); + } + + return $this->_content; + } + + /** + * Overwrite the content + * @param mixed $content + * @return Partial + */ + public function set() { + if (!$this->_cached) { + $this->_content = (string) $this->trigger(func_get_args()); + } + + return $this; + } + + /** + * Append something to the content + * @param mixed $content + * @return Partial + */ + public function append() { + if (!$this->_cached) { + $this->_content .= (string) $this->trigger(func_get_args()); + } + + return $this; + } + + /** + * Prepend something to the content + * @param mixed $content + * @return Partial + */ + public function prepend() { + if (!$this->_cached) { + $this->_content = (string) $this->trigger(func_get_args()) . $this->_content; + } + + return $this; + } + + /** + * Set content if partial is empty + * @param mixed $default + * @return Partial + */ + public function set_default($default) { + if (!$this->_cached) { + if (!$this->_content) { + $this->_content = $default; + } + } + + return $this; + } + + /** + * Load a view inside this partial, overwrite if wanted + * @param string $view + * @param array $data + * @param bool $overwrite + * @return Partial + */ + public function view($view, $data = array(), $overwrite = false) { + if (!$this->_cached) { + + // better object to array + if (is_object($data)) { + $array = array(); + foreach ($data as $k => $v) { + $array[$k] = $v; + } + $data = $array; + } + + $content = $this->_ci->load->view($view, $data, true); + + if ($overwrite) { + $this->set($content); + } else { + $this->append($content); + } + } + return $this; + } + + /** + * Parses a view inside this partial, overwrite if wanted + * @param string $view + * @param array $data + * @param bool $overwrite + * @return Partial + */ + public function parse($view, $data = array(), $overwrite = false) { + if (!$this->_cached) { + if (!class_exists('CI_Parser')) { + $this->_ci->load->library('parser'); + } + + // better object to array + if (is_object($data)) { + $array = array(); + foreach ($data as $k => $v) { + $array[$k] = $v; + } + $data = $array; + } + + $content = $this->_ci->parser->parse($view, $data, true); + + if ($overwrite) { + $this->set($content); + } else { + $this->append($content); + } + } + + return $this; + } + + /** + * Loads a widget inside this partial, overwrite if wanted + * @param string $name + * @param array $data + * @param bool $overwrite + * @return Partial + */ + public function widget($name, $data = array(), $overwrite = false) { + if (!$this->_cached) { + $widget = $this->template->widget($name, $data); + + if ($overwrite) { + $this->set($widget->content()); + } else { + $this->append($widget->content()); + } + } + return $this; + } + + /** + * Enable cache with TTL, default TTL is 60 + * @param int $ttl + * @param mixed $identifier + */ + public function cache($ttl = 60, $identifier = '') { + if (!class_exists('CI_Cache')) { + $this->_ci->load->driver('cache', array('adapter' => 'file')); + } + + $this->_cache_ttl = $ttl; + $this->_identifier = $identifier; + + if ($cached = $this->_ci->cache->get($this->cache_id())) { + $this->_cached = true; + $this->_content = $cached; + } + return $this; + } + + /** + * Used for cache identification + * @return string + */ + private function cache_id() { + if ($this->_identifier) { + return $this->_name . '_' . $this->_identifier . '_' . md5(get_class($this) . implode('', $this->_args)); + } else { + return $this->_name . '_' . md5(get_class($this) . implode('', $this->_args)); + } + } + + /** + * Trigger returns the result if a trigger is set + * @param array $args + * @return string + */ + public function trigger($args) { + if (!$this->_trigger) { + return implode('', $args); + } else { + return call_user_func_array($this->_trigger, $args); + } + } + + /** + * Bind a trigger function + * Can be used like bind($this, "function") or bind("function") + * @param mixed $arg + */ + public function bind() { + if ($count = func_num_args()) { + if ($count >= 2) { + $args = func_get_args(); + $obj = array_shift($args); + $func = array_pop($args); + + foreach ($args as $trigger) { + $obj = $obj->$trigger; + } + + $this->_trigger = array($obj, $func); + } else { + $args = func_get_args(); + $this->_trigger = reset($args); + } + } else { + $this->_trigger = FALSE; + } + } +} + +class Widget extends Partial +{ + + /* (non-PHPdoc) + * @see Partial::content() + */ + public function content() { + if (!$this->_cached) { + if (method_exists($this, 'display')) { + // capture output + ob_start(); + $this->display($this->_args); + $buffer = ob_get_clean(); + + // if no content is produced but there was direct ouput we set + // that output as content + if (!$this->_content && $buffer) { + $this->set($buffer); + } + } + } + + return parent::content(); + } +} diff --git a/application/models/organisation/Organisationseinheit_model.php b/application/models/organisation/Organisationseinheit_model.php new file mode 100644 index 000000000..2a90bf328 --- /dev/null +++ b/application/models/organisation/Organisationseinheit_model.php @@ -0,0 +1,16 @@ +dbTable='public.tbl_organisationseinheit'; + $this->pk='oe_kurzbz'; + } +}