예제 #1
0
 function getTitles($ordered = true, $genericKeys = false, $ignoreLimit = false)
 {
     $app =& Dataface_Application::getInstance();
     if (!isset($this->_titles[$ordered][$genericKeys][$ignoreLimit])) {
         $titleColumn = $this->_table->titleColumn();
         $keys = array_keys($this->_table->keys());
         if (!is_array($keys) || count($keys) == 0) {
             throw new Exception(df_translate('No primary key defined', 'There is no primary key defined on table "' . $this->_table->tablename . '". Please define a primary key.', array('table' => $this->_table->tablename, 'stack_trace' => '')), E_USER_ERROR);
         }
         $len = strlen($titleColumn);
         if ($titleColumn[$len - 1] != ')' and $titleColumn[$len - 1] != '`') {
             $titleColumn = '`' . $titleColumn . '`';
         }
         $builder = new Dataface_QueryBuilder($this->_tablename, $this->_query);
         $builder->action = 'select';
         $from = $builder->_from();
         $sql = "SELECT `" . implode('`,`', $keys) . "`,{$titleColumn} as `__titleColumn__` {$from}";
         $where = $builder->_where();
         $where = $builder->_secure($where);
         $limit = $builder->_limit();
         if (strlen($where) > 0) {
             $sql .= " {$where}";
         }
         if ($ordered) {
             $sql .= " ORDER BY `__titleColumn__`";
         } else {
             $sql .= $builder->_orderby();
         }
         if (strlen($limit) > 0 and !$ignoreLimit) {
             $sql .= " {$limit}";
         } else {
             if (!$ignoreLimit) {
                 $sql .= " LIMIT 250";
             }
         }
         $res = $this->dbObj->query($sql, $this->_table->db, null, true);
         if (!$res and !is_array($res)) {
             $app->refreshSchemas($this->_table->tablename);
             // updates meta tables such as workflow tables to make sure that they
             // are up to date.
             $res = $this->dbObj->query($sql, $this->_table->db, null, true);
             if (!$res and !is_array($res)) {
                 throw new Exception(df_translate('scripts.Dataface.QueryTool.getTitles.ERROR_ERROR_RETRIEVING_TITLES', "Error retrieving title from database in Dataface_QueryTool::getTitles(): ") . $sql . xf_db_error($this->_table->db), E_USER_ERROR);
             }
         }
         $titles = array();
         //while ( $row = xf_db_fetch_row($res) ){
         foreach ($res as $row) {
             $title = array_pop($row);
             if (!$genericKeys) {
                 $keyvals = array();
                 reset($keys);
                 while (sizeof($row) > 0) {
                     $keyvals[current($keys)] = array_shift($row);
                     next($keys);
                 }
                 $keystr = '';
                 foreach ($keyvals as $keykey => $keyval) {
                     $keystr .= urlencode($keykey) . "=" . urlencode($keyval) . "&";
                 }
                 $keystr = substr($keystr, 0, strlen($keystr) - 1);
                 $titles[$keystr] = $title;
             } else {
                 $titles[] = $title;
             }
         }
         //@xf_db_free_result($res);
         $this->_titles[$ordered][$genericKeys][$ignoreLimit] =& $titles;
     }
     return $this->_titles[$ordered][$genericKeys][$ignoreLimit];
 }