diff options
-rw-r--r-- | modules/tag/controllers/tag.php | 2 | ||||
-rw-r--r-- | modules/tag/models/tag.php | 68 |
2 files changed, 69 insertions, 1 deletions
diff --git a/modules/tag/controllers/tag.php b/modules/tag/controllers/tag.php index 21117150..54ce3f49 100644 --- a/modules/tag/controllers/tag.php +++ b/modules/tag/controllers/tag.php @@ -42,7 +42,7 @@ class Tag_Controller extends REST_Controller { } public function _show($tag) { - throw new Exception("@todo Tag_Controller::_show NOT IMPLEMENTED"); + Albums_Controller::_show($tag); } public function _create($tag) { diff --git a/modules/tag/models/tag.php b/modules/tag/models/tag.php index 0bf85843..b25afc58 100644 --- a/modules/tag/models/tag.php +++ b/modules/tag/models/tag.php @@ -20,6 +20,74 @@ class Tag_Model extends ORM { protected $has_and_belongs_to_many = array("items"); + protected $_children = array(); + var $rules = array( "name" => "required|length[4,32]"); + + /** + * Emulate the album method charactistics so that the tag looks like an album to the framework. + */ + public function __call($function, $args) { + if ($function == "children") { + return $this->_get_tag_children($args[0], $args[1]); + } else if ($function == "children_count") { + return $this->_get_children_count(); + } else if ($function == "parents") { + return ORM::factory("item", 1); + } else { + return parent::__call($function, $args); + } + } + + /** + * Emulate the album property charactistics so that the tag looks like an album to the framework. + */ + public function __get($property) { + if ($property == "title" || $property == "title_edit" || $property == "name_edit") { + return $this->name; + } else if ($property == "description_edit") { + return ""; + } else if ($property == "owner") { + return null; + } else { + return parent::__get($property); + } + } + + /** + * Get the item children. This code was borrowed from the ORM::__get($column) method and modified + * to allow for the specification of the limit and offset. + * @param int $limit + * @param int $offset + * @return ORM_Iterator + */ + private function _get_tag_children($limit, $offset) { + // Load the child model + $model = ORM::factory(inflector::singular("items")); + + // Load JOIN info + $join_table = $model->join_table($this->table_name); + $join_col1 = $model->foreign_key(NULL, $join_table); + $join_col2 = $model->foreign_key(TRUE); + + // one<>alias:many relationship + return $model + ->join($join_table, $join_col1, $join_col2) + ->where($this->foreign_key(NULL, $join_table), $this->object[$this->primary_key]) + ->find_all($limit, $offset); + } + + /** + * Get the total number of children. + * @return int + */ + private function _get_children_count() { + return Database::instance() + ->select("COUNT(*) AS count") + ->from("items_tags") + ->where("tag_id", $this->id) + ->get() + ->current()->count; + } }
\ No newline at end of file |