_a['table'] = 'idf_tags'; $this->_a['model'] = __CLASS__; $this->_a['cols'] = array( // It is mandatory to have an "id" column. 'id' => array( 'type' => 'Pluf_DB_Field_Sequence', //It is automatically added. 'blank' => true, ), 'project' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'IDF_Project', 'blank' => true, 'is_null' => true, 'default' => null, 'verbose' => __('project'), ), 'class' => array( 'type' => 'Pluf_DB_Field_Varchar', 'blank' => false, 'default' => IDF_TAG_DEFAULT_CLASS, 'verbose' => __('tag class'), 'help_text' => __('The class of the tag.'), ), 'name' => array( 'type' => 'Pluf_DB_Field_Varchar', 'blank' => false, 'verbose' => __('name'), ), 'lcname' => array( 'type' => 'Pluf_DB_Field_Varchar', 'blank' => false, 'editable' => false, 'verbose' => __('lcname'), 'help_text' => __('Lower case version of the name for fast searching.'), ), ); $table = $this->_con->pfx.'idf_project_idf_tag_assoc'; $cols = implode(', ', array_keys($this->_a['cols'])); $this->_a['views'] = array( 'join_projects' => array( 'join' => 'LEFT JOIN '.$table .' ON idf_tag_id=id', 'select' => $this->getSelect().',COUNT(idf_project_id) as project_count', 'group' => $cols, 'props' => array('project_count' => 'project_count'), ), ); $this->_a['idx'] = array( 'lcname_idx' => array( 'col' => 'lcname', 'type' => 'normal', ), 'class_idx' => array( 'col' => 'class', 'type' => 'normal', ), ); } function preSave($create=false) { $this->lcname = mb_strtolower($this->name); } /** * Add a project-specific tag if not already existing. * * @param string Name of the tag. * @param IDF_Project Project of the tag. * @param string Class of the tag (IDF_TAG_DEFAULT_CLASS) * @return IDF_Tag The tag. */ public static function add($name, $project, $class=IDF_TAG_DEFAULT_CLASS) { $class = trim($class); $name = trim($name); $gtag = new IDF_Tag(); $sql = new Pluf_SQL('class=%s AND lcname=%s AND project=%s', array($class, mb_strtolower($name), $project->id)); $tags = $gtag->getList(array('filter' => $sql->gen())); if ($tags->count() < 1) { // create a new tag $tag = new IDF_Tag(); $tag->name = $name; $tag->class = $class; $tag->project = $project; $tag->create(); return $tag; } return $tags[0]; } /** * Add a global tag if not already existing * * @param string Name of the tag. * @param string Class of the tag (IDF_TAG_DEFAULT_CLASS) * @return IDF_Tag The tag. */ public static function addGlobal($name, $class=IDF_TAG_DEFAULT_CLASS) { $class = trim($class); $name = trim($name); $gtag = new IDF_Tag(); $sql = new Pluf_SQL('class=%s AND lcname=%s AND project IS NULL', array($class, mb_strtolower($name))); $tags = $gtag->getList(array('filter' => $sql->gen())); if ($tags->count() < 1) { // create a new tag $tag = new IDF_Tag(); $tag->name = $name; $tag->class = $class; $tag->project = null; $tag->create(); return $tag; } return $tags[0]; } function __toString() { if ($this->class != IDF_TAG_DEFAULT_CLASS) { return $this->class.':'.$this->name; } return $this->name; } }