Files
2024-04-03 14:05:10 +08:00

391 lines
12 KiB
PHP

<?php
/**
* The model file of dataview module of ZenTaoPMS.
*
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
* @package company
* @version $Id: model.php 5086 2013-07-10 02:25:22Z wyd621@gmail.com $
* @link http://www.zentao.net
*/
?>
<?php
class dataviewModel extends model
{
/**
* Construct.
*
* @access public
* @return void
*/
public function __construct()
{
parent::__construct();
$this->loadBIDAO();
}
/**
* Verify the sql with select statement.
*
* @param string $sql
* @access public
* @return void
*/
public function verifySqlWithModify($sql)
{
$this->app->loadClass('sqlparser', true);
$parser = new sqlparser($sql);
if(count($parser->statements) == 0) return array('result' => 'fail', 'message' => $this->lang->dataview->empty);
if(count($parser->statements) > 1) return array('result' => 'fail', 'message' => $this->lang->dataview->onlyOne);
$statement = $parser->statements[0];
if($statement instanceof PhpMyAdmin\SqlParser\Statements\SelectStatement == false) return array('result' => 'fail', 'message' => $this->lang->dataview->allowSelect);
return true;
}
/**
* Get module names.
*
* @param string $tables
* @access public
* @return array
*/
public function getModuleNames($tables)
{
$moduleNames = array();
foreach($tables as $table)
{
if(strpos($table, $this->config->db->prefix) === false) continue;
$module = str_replace($this->config->db->prefix, '', $table);
if(!preg_match("/^[a-zA-Z]+$/", $module)) continue;
if($module == 'case') $module = 'testcase';
if($module == 'module') $module = 'tree';
/* Code for workflow.*/
if(strpos($module, 'flow_') !== false)
{
$moduleName = substr($module, 5);
$flowFields = $this->loadModel('workflowfield')->getFieldPairs($moduleName);
$this->lang->$moduleName = new stdclass();
foreach($flowFields as $flowField => $fieldName)
{
if(!$flowField) continue;
$this->lang->$moduleName->$flowField = $fieldName;
}
$moduleNames[$table] = $module;
}
else
{
if($this->app->loadLang($module))
{
if($module == 'project') $this->lang->project->statusList += $this->lang->dataview->projectStatusList;
$moduleNames[$table] = $module;
}
}
}
return $moduleNames;
}
/**
* Get alias names.
*
* @param object $statement
* @param array $moduleNames
* @access public
* @return array
*/
public function getAliasNames($statement, $moduleNames)
{
$aliasNames = array();
if(isset($statement->from))
{
foreach($statement->from as $from)
{
if(isset($moduleNames[$from->table]))
{
$aliasNames[$from->alias] = $from->table;
}
}
}
if(isset($statement->join))
{
foreach($statement->join as $join)
{
if(isset($moduleNames[$join->expr->table]))
{
$aliasNames[$join->expr->alias] = $join->expr->table;
}
}
}
return $aliasNames;
}
/**
* Merge fields.
*
* @param array $dataFields
* @param array $sqlFields
* @param array $moduleNames
* @param array $aliasNames
* @access public
* @return void
*/
public function mergeFields($dataFields, $sqlFields, $moduleNames, $aliasNames = array())
{
$mergeFields = array();
$relatedObject = array();
foreach($dataFields as $field)
{
$mergeFields[$field] = $field;
$relatedObject[$field] = current($moduleNames);
/* Such as $sqlFields['id'] = zt_task.id. */
if(isset($sqlFields[$field]) and strrpos($sqlFields[$field], '.') !== false)
{
$sqlField = $sqlFields[$field];
$table = substr($sqlField, 0, strrpos($sqlField, '.'));
$fieldName = substr($sqlField, strrpos($sqlField, '.') + 1);
if(isset($moduleNames[$table]))
{
$moduleName = $moduleNames[$table];
if(strpos($moduleName, 'flow_') !== false) $moduleName = substr($moduleName, 5);
$mergeFields[$field] = isset($this->lang->$moduleName->$fieldName) ? $this->lang->$moduleName->$fieldName : $field;
$relatedObject[$field] = $moduleName;
continue;
}
elseif(isset($aliasNames[$table]))
{
$moduleName = $aliasNames[$table];
if(strpos($moduleName, 'flow_') !== false) $moduleName = substr($moduleName, 5);
$mergeFields[$field] = isset($this->lang->$moduleName->$fieldName) ? $this->lang->$moduleName->$fieldName : $field;
$relatedObject[$field] = $moduleName;
continue;
}
}
if(strpos(join(',', $sqlFields), '.*') !== false)
{
/* Such as $sqlFields['zt_task.*'] = zt_task.*. */
$existField = false;
foreach($sqlFields as $sqlField)
{
if(strrpos($sqlField, '.*') !== false)
{
$table = substr($sqlField, 0, strrpos($sqlField, '.'));
if(isset($moduleNames[$table]))
{
$moduleName = $moduleNames[$table];
if(strpos($moduleName, 'flow_') !== false) $moduleName = substr($moduleName, 5);
$mergeFields[$field] = isset($this->lang->$moduleName->$field) ? $this->lang->$moduleName->$field : $field;
$relatedObject[$field] = $moduleName;
$existField = true;
break;
}
}
}
if($existField) continue;
}
foreach($moduleNames as $table => $moduleName)
{
if(strpos($moduleName, 'flow_') !== false) $moduleName = substr($moduleName, 5);
if(isset($this->lang->$moduleName) and isset($this->lang->$moduleName->$field) and is_string($this->lang->$moduleName->$field))
{
$mergeFields[$field] = $this->lang->$moduleName->$field;
$relatedObject[$field] = $moduleName;
break;
}
$mergeFields[$field] = $field;
$relatedObject[$field] = $moduleName;
}
}
foreach($mergeFields as $fieldName => $fieldValue)
{
if(empty($fieldValue)) $mergeFields[$fieldName] = $fieldName;
}
foreach($mergeFields as $field => $name) $mergeFields[$field] = $this->replace4Workflow($name);
return array($mergeFields, $relatedObject);
}
/**
* Get table data.
*
* @param string $sql
* @access public
* @return array
*/
public function getColumns($sql, $columns = null)
{
if(empty($columns)) $columns = $this->dao->getColumns($sql);
$columnTypes = new stdclass();
foreach($columns as $column)
{
$field = $column['name'];
$nativeType = $column['native_type'];
$type = $this->config->dataview->columnTypes->$nativeType;
if(isset($columnTypes->$field)) $field = $column['table'] . $field;
$columnTypes->$field = $type;
}
return $columnTypes;
}
/**
* Check that the column of an sql query is unique.
*
* @param string $sql
* @param bool $repeat
* @access public
* @return bool
*/
public function checkUniColumn($sql, $repeat = false, $columns = null)
{
if(empty($columns)) $columns = $this->dao->getColumns($sql);
$isUnique = true;
$columnList = array();
$repeatColumn = array();
foreach($columns as $column)
{
$field = $column['name'];
if(isset($columnTypes[$field]))
{
$isUnique = false;
$repeatColumn[$field] = $field;
}
$columnTypes[$field] = $field;
}
if($repeat) return array($isUnique, $repeatColumn);
return $isUnique;
}
/**
* Get type options
*
* @param string $objectName
* @access public
* @return array
*/
public function getTypeOptions($objectName)
{
$schema = $this->includeTable($objectName);
if(empty($schema)) return array();
$options = array();
foreach($schema->fields as $key => $field)
{
//if($field['type'] == 'object') continue;
$options[$key] = $field;
}
return $options;
}
/**
* Replace title for workflow.
*
* @param string $title
* @access public
* @return string
*/
public function replace4Workflow($title)
{
$clientLang = $this->app->getClientLang();
$productCommonList = isset($this->config->productCommonList[$clientLang]) ? $this->config->productCommonList[$clientLang] : $this->config->productCommonList['en'];
$projectCommonList = isset($this->config->projectCommonList[$clientLang]) ? $this->config->projectCommonList[$clientLang] : $this->config->projectCommonList['en'];
$productCommon = $productCommonList[0];
$projectCommon = $projectCommonList[0];
if(strpos($title, strtolower($productCommon)) !== false) $title = str_replace(strtolower($productCommon), strtolower($this->lang->productCommon), $title);
if(strpos($title, $productCommon) !== false) $title = str_replace($productCommon, $this->lang->productCommon, $title);
return $title;
}
/**
* Include table
*
* @param string $table
* @access public
* @return void
*/
public function includeTable($table)
{
$path = __DIR__ . DS . 'table' . DS . "$table.php";
if(file_exists($path))
{
include $path;
return $schema;
}
$path = $this->app->getExtensionRoot() . 'custom' . DS . 'dataview' . DS . 'table' . DS . "$table.php";
if(file_exists($path))
{
include $path;
return $schema;
}
}
/**
* Gen tree options.
*
* @param object $tree
* @param array $values
* @param array $paths
* @access public
* @return void
*/
public function genTreeOptions(&$moduleTree, $values, $paths)
{
$path = $paths[0];
if(!isset($moduleTree->children))$moduleTree->children = array();
foreach($moduleTree->children as $child)
{
if($child->value == $path)
{
if(count($paths) > 1) return $this->genTreeOptions($child, $values, array_slice($paths, 1));
return;
}
}
$child = new stdclass();
$child->title = $values[$path];
$child->value = $path;
$moduleTree->children[] = $child;
if(count($paths) > 1) return $this->genTreeOptions($child, $values, array_slice($paths, 1));
}
/**
* Adjust the action is clickable.
*
* @param object $dataview
* @param string $action
* @static
* @access public
* @return bool
*/
public static function isClickable($dataview, $action)
{
return true;
}
}