Moving to GitHub.
[platal.git] / classes / jobterms.php
index 460b74e..b17033c 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2010 Polytechnique.org                              *
+ *  Copyright (C) 2003-2014 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -25,7 +25,15 @@ class JobTerms {
     const ONLY_JOBS = 'jobs';
     const ONLY_MENTORS = 'mentors';
 
-    static public function getSubTerms($parent_jtid, $filter = self::ALL) {
+    /** Retreives subterms of a term to display in a tree
+     * @param $parent_jtid the id of the parent jobterm
+     * @param $filter enable filtering on jobterms that have been used in jobs or in mentors, in
+     *  that case, each row as an 'nb' field that counts all profiles that match
+     * @param $token_filter a text (usually ending by %) the retreived subterms to jobterms that
+     *  contains this tokens or that one of their children contains it.
+     * @return an iterator over jobterms with jtid, name, full_name and nb
+     */
+    static public function getSubTerms($parent_jtid, $filter = self::ALL, $token_filter = null) {
         switch ($filter) {
           case self::ALL:
           default:
@@ -38,14 +46,32 @@ class JobTerms {
             $table = 'profile_mentor_term';
             break;
         }
+        // we are in a tree looking for certain job terms:
+        $countingterms = false;
         if ($table) {
             $count = ', COUNT(DISTINCT j.pid) AS nb';
             $join = ' INNER JOIN  profile_job_term_relation AS r2 ON (r2.jtid_1 = e.jtid)
                       INNER JOIN  '.$table.' AS j ON (j.jtid = r2.jtid_2)';
+            $countingterms = 'j.jtid';
         } else {
             $count = $join = '';
         }
-        return XDB::iterator('SELECT  e.jtid, e.name, e.full_name'.$count.'
+        if (!empty($token_filter)) {
+            $join .= ' INNER JOIN  profile_job_term_relation AS rtf ON (rtf.jtid_1 = e.jtid) '.
+                self::token_join_query(self::tokenize($token_filter), 'rtf', 'jtid_2');
+            if (!$countingterms) {
+                $countingterms = 'rtf.jtid_2';
+            }
+        }
+        if (!$countingterms) {
+            $select_leaf = 'IF(r_subbranch.jtid_1 IS NULL,1,0)';
+            $join .= ' LEFT JOIN  profile_job_term_relation AS r_subbranch ON (r_subbranch.jtid_1 = e.jtid AND r_subbranch.computed = "original") ';
+        } else {
+            // branches that have counting terms different that
+            // main branch will have subbranches
+            $select_leaf = 'MIN('.$countingterms.' = e.jtid)';
+        }
+        return XDB::iterator('SELECT  e.jtid, e.name, e.full_name'.$count.', '.$select_leaf.' AS leaf
                                 FROM  profile_job_term_enum AS e
                           INNER JOIN  profile_job_term_relation AS r ON (r.jtid_2 = e.jtid)'.$join.'
                                WHERE  r.jtid_1 = {?} AND r.computed = "original"
@@ -64,11 +90,14 @@ class JobTerms {
      * is chosen
      * @param Env::v('treeid') tree id that will be given as first argument of attrfunc function
      * the second argument will be the chosen job term id and the third one the chosen job's full name.
+     * @param Env::v('text_filter') a string (usually ending by %) that will be used to filter
+     * subbranches, keeping only the one containing this text in its title or in the title of one of
+     * its subbranches.
      */
-    static public function ajaxGetBranch(&$page, $filter = self::ALL) {
+    static public function ajaxGetBranch($page, $filter = self::ALL) {
         pl_content_headers('application/json');
         $page->changeTpl('include/jobterms.branch.tpl', NO_SKIN);
-        $subTerms = self::getSubTerms(Env::v('jtid'), $filter);
+        $subTerms = self::getSubTerms(Env::v('jtid'), $filter, Env::v('text_filter'));
         $page->assign('subTerms', $subTerms);
         switch ($filter) {
           case self::ONLY_JOBS:
@@ -78,6 +107,8 @@ class JobTerms {
             $page->assign('filter', 'mentor');
             break;
         }
+        $page->assign('jtid', Env::v('jtid'));
+        $page->assign('text_filter', Env::v('text_filter'));
         $page->assign('attrfunc', Env::v('attrfunc'));
         $page->assign('treeid', Env::v('treeid'));
     }
@@ -86,15 +117,19 @@ class JobTerms {
         return '$("'.addslashes($domElement).'").jstree({
             "core" : {"strings":{"loading":"Chargement ..."}},
             "plugins" : ["themes","json_data"],
-            "themes" : { "url" : platal_baseurl + "css/jstree.css" },
+            "themes" : { "url" : $.plURL("css/jstree.css") },
             "json_data" : { "ajax" : {
-                "url" : platal_baseurl + "'.addslashes($platalpage).'",
+                "url" : $.plURL("'.addslashes($platalpage).'"),
                 "data" : function(nod) {
                     var jtid = 0;
                     if (nod != -1) {
                         jtid = nod.attr("id").replace(/^.*_([0-9]+)$/, "$1");
                     }
-                    return { "jtid" : jtid, "treeid" : "'.addslashes($treeid).'", "attrfunc" : "'.addslashes($attrfunc).'" }
+                    return {
+                        "jtid" : jtid,
+                        "treeid" : "'.addslashes($treeid).'",
+                        "attrfunc" : "'.addslashes($attrfunc).'"
+                     }
                 }
             }} });';
     }
@@ -102,7 +137,7 @@ class JobTerms {
     /**
      * Extract search token from term
      * @param $term a utf-8 string that can contain any char
-     * @param an array of elementary tokens
+     * @return an array of elementary tokens
      */
     static public function tokenize($term)
     {
@@ -127,18 +162,19 @@ class JobTerms {
      * Create the INNER JOIN query to restrict search to some job terms
      * @param $tokens an array of the job terms to look for (LIKE comp)
      * @param $table_alias the alias or name of the table with a jtid field to restrict
+     * @param $table_field the name of the field to restrict in table_alias, usually jtid
      * @return a partial SQL query
      */
-    static public function token_join_query(array $tokens, $table_alias) {
+    static public function token_join_query(array $tokens, $table_alias, $table_field = 'jtid') {
         $joins = '';
         $i = 0;
         foreach ($tokens as $t) {
             ++$i;
-             $joins .= ' INNER JOIN  profile_job_term_search AS s'.$i.' ON(s'.$i.'.jtid = '.$table_alias.'.jtid AND s'.$i.'.search LIKE '.XDB::escape($t).')';
+             $joins .= ' INNER JOIN  profile_job_term_search AS s'.$i.' ON(s'.$i.'.jtid = '.$table_alias.'.'.$table_field.' AND s'.$i.'.search LIKE '.XDB::escape($t).')';
         }
         return $joins;
     }
 }
 
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
 ?>