Finish task#3262 各个表单的必填项字段可以自定义,cost:16 left:0
This commit is contained in:
@@ -127,3 +127,5 @@ $config->objectTables['custom'] = TABLE_LANG;
|
||||
$config->objectTables['branch'] = TABLE_BRANCH;
|
||||
$config->objectTables['module'] = TABLE_MODULE;
|
||||
$config->objectTables['caselib'] = TABLE_TESTSUITE;
|
||||
$config->objectTables['entry'] = TABLE_ENTRY;
|
||||
$config->objectTables['webhook'] = TABLE_WEBHOOK;
|
||||
|
||||
@@ -8,3 +8,40 @@ $config->custom->canAdd['testtask'] = 'priList';
|
||||
$config->custom->canAdd['todo'] = 'priList,typeList';
|
||||
$config->custom->canAdd['user'] = 'roleList';
|
||||
$config->custom->canAdd['block'] = '';
|
||||
|
||||
$config->custom->requiredModules[10] = 'todo';
|
||||
|
||||
$config->custom->requiredModules[15] = 'product';
|
||||
$config->custom->requiredModules[20] = 'story';
|
||||
$config->custom->requiredModules[25] = 'productplan';
|
||||
$config->custom->requiredModules[30] = 'release';
|
||||
|
||||
$config->custom->requiredModules[35] = 'project';
|
||||
$config->custom->requiredModules[40] = 'task';
|
||||
$config->custom->requiredModules[45] = 'build';
|
||||
|
||||
$config->custom->requiredModules[50] = 'bug';
|
||||
$config->custom->requiredModules[55] = 'testcase';
|
||||
$config->custom->requiredModules[60] = 'testsuite';
|
||||
$config->custom->requiredModules[65] = 'testreport';
|
||||
$config->custom->requiredModules[70] = 'testtask';
|
||||
|
||||
$config->custom->requiredModules[75] = 'doc';
|
||||
|
||||
$config->custom->requiredModules[80] = 'group';
|
||||
$config->custom->requiredModules[85] = 'user';
|
||||
|
||||
$config->custom->requiredModules[95] = 'entry';
|
||||
$config->custom->requiredModules[100] = 'webhook';
|
||||
|
||||
$config->custom->fieldList['group'] = 'name,desc';
|
||||
|
||||
$config->custom->excludeFieldList['product'] = 'order';
|
||||
$config->custom->excludeFieldList['story'] = 'version,duplicateStory,linkStories,childStories,toBug,fromBug';
|
||||
$config->custom->excludeFieldList['project'] = 'order';
|
||||
$config->custom->excludeFieldList['task'] = 'fromBug';
|
||||
$config->custom->excludeFieldList['bug'] = 'storyVersion,toTask,toStory,hardware,found,confirmed,activatedCount,activatedDate,linkBug,case,caseVersion,result,testtask,repo';
|
||||
$config->custom->excludeFieldList['testcase'] = 'version,lastRunResult,lastRunDate,lastRunner,linkCase,fromBug';
|
||||
$config->custom->excludeFieldList['testreport'] = 'objectType';
|
||||
$config->custom->excludeFieldList['doc'] = 'version';
|
||||
$config->custom->excludeFieldList['user'] = 'ranzhi,visits,ip,last';
|
||||
|
||||
@@ -230,6 +230,51 @@ class custom extends control
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Required.
|
||||
*
|
||||
* @param string $moduleName
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function required($moduleName = '')
|
||||
{
|
||||
if($_POST)
|
||||
{
|
||||
$this->custom->saveRequiredFields($moduleName);
|
||||
die(js::reload('parent.parent'));
|
||||
}
|
||||
|
||||
if(empty($moduleName)) $moduleName = current($this->config->custom->requiredModules);
|
||||
|
||||
foreach($this->config->custom->requiredModules as $requiredModule) $this->app->loadLang($requiredModule);
|
||||
|
||||
/* Get this module requiredFields. */
|
||||
$this->loadModel($moduleName);
|
||||
$requiredFields = $this->custom->getRequiredFields($this->config->$moduleName);
|
||||
|
||||
if($moduleName == 'doc')
|
||||
{
|
||||
unset($requiredFields['createLib']);
|
||||
unset($requiredFields['editLib']);
|
||||
}
|
||||
|
||||
$fields = $this->custom->getDBFields($moduleName);
|
||||
if($moduleName == 'testsuite')
|
||||
{
|
||||
$this->app->loadLang('testcase');
|
||||
$this->view->caseFields = $this->custom->getDBFields('testcase');
|
||||
}
|
||||
|
||||
$this->view->title = $this->lang->custom->required;
|
||||
$this->view->position[] = $this->lang->custom->required;
|
||||
|
||||
$this->view->requiredFields = $requiredFields;
|
||||
$this->view->moduleName = $moduleName;
|
||||
$this->view->fields = $fields;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax save custom fields.
|
||||
*
|
||||
@@ -383,4 +428,20 @@ class custom extends control
|
||||
$this->loadModel('setting')->deleteItems("owner={$account}&module=common§ion=customMenu");
|
||||
die(js::reload('parent.parent'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset required.
|
||||
*
|
||||
* @param srting $module
|
||||
* @param string $confirm
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function resetRequired($module, $confirm = 'no')
|
||||
{
|
||||
if($confirm == 'no') die(js::confirm($this->lang->custom->confirmRestore, inlink('resetRequired', "module=$module&confirm=yes")));
|
||||
|
||||
$this->loadModel('setting')->deleteItems("owner=system&module={$module}&key=requiredFields");
|
||||
die(js::reload('parent.parent'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ $lang->custom->module = 'Module';
|
||||
$lang->custom->section = 'Section';
|
||||
$lang->custom->lang = 'Language';
|
||||
$lang->custom->setPublic = 'Set Public';
|
||||
$lang->custom->required = 'Required';
|
||||
|
||||
$lang->custom->object['story'] = 'Story';
|
||||
$lang->custom->object['task'] = 'Task';
|
||||
|
||||
@@ -14,6 +14,7 @@ $lang->custom->module = '模块';
|
||||
$lang->custom->section = '附加部分';
|
||||
$lang->custom->lang = '所属语言';
|
||||
$lang->custom->setPublic = '设为公共';
|
||||
$lang->custom->required = '必填项';
|
||||
|
||||
$lang->custom->object['story'] = '需求';
|
||||
$lang->custom->object['task'] = '任务';
|
||||
|
||||
@@ -375,4 +375,100 @@ class customModel extends model
|
||||
|
||||
$this->loadModel('setting')->setItem($settingKey, $menu);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get required fields by config.
|
||||
*
|
||||
* @param object $moduleConfig
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getRequiredFields($moduleConfig)
|
||||
{
|
||||
$requiredFields = array();
|
||||
foreach($moduleConfig as $method => $subConfig)
|
||||
{
|
||||
if(is_object($subConfig) and isset($subConfig->requiredFields)) $requiredFields[$method] = trim(str_replace(' ', '', $subConfig->requiredFields));
|
||||
}
|
||||
|
||||
return $requiredFields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get module fields.
|
||||
*
|
||||
* @param string $moduleName
|
||||
* @param string $method
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getDBFields($moduleName, $method = '')
|
||||
{
|
||||
$fields = array();
|
||||
$moduleLang = $this->lang->$moduleName;
|
||||
$customFields = $this->config->custom->fieldList;
|
||||
if(isset($customFields[$moduleName]))
|
||||
{
|
||||
$fieldList = isset($customFields[$moduleName][$method]) ? $customFields[$moduleName][$method] : $customFields[$moduleName];
|
||||
foreach(explode(',', $fieldList) as $fieldName)
|
||||
{
|
||||
if(isset($moduleLang->$fieldName) and is_string($moduleLang->$fieldName)) $fields[$fieldName] = $moduleLang->$fieldName;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$table = zget($this->config->objectTables, $moduleName, '');
|
||||
if($table)
|
||||
{
|
||||
$excludeFieldList = zget($this->config->custom->excludeFieldList, $moduleName, '');
|
||||
foreach($this->dao->query("DESC $table")->fetchAll() as $field)
|
||||
{
|
||||
$fieldName = $field->Field;
|
||||
if($fieldName == 'id' or $fieldName == 'deleted') continue;
|
||||
if($fieldName == 'openedBy' or $fieldName == 'createdBy' or $fieldName == 'addedBy') continue;
|
||||
if($fieldName == 'openedDate' or $fieldName == 'createdDate' or $fieldName == 'addedDate') continue;
|
||||
if($fieldName == 'lastEditedBy' or $fieldName == 'editedBy') continue;
|
||||
if($fieldName == 'lastEditedDate' or $fieldName == 'editedDate') continue;
|
||||
if(isset($excludeFieldList) and strpos(",{$excludeFieldList},", ",$fieldName,") !== false) continue;
|
||||
if(isset($moduleLang->$fieldName) and is_string($moduleLang->$fieldName)) $fields[$fieldName] = $moduleLang->$fieldName;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save required fields.
|
||||
*
|
||||
* @param int $moduleName
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function saveRequiredFields($moduleName)
|
||||
{
|
||||
if(isset($this->config->system->$moduleName)) unset($this->config->system->$moduleName);
|
||||
if(isset($this->config->personal->$moduleName)) unset($this->config->personal->$moduleName);
|
||||
|
||||
$this->loadModel($moduleName);
|
||||
$systemFields = $this->getRequiredFields($this->config->$moduleName);
|
||||
|
||||
$data = fixer::input('post')->get();
|
||||
$requiredFields = array();
|
||||
foreach($data->requiredFields as $method => $fields)
|
||||
{
|
||||
$method = strtolower($method);
|
||||
$systemField = $this->config->$moduleName->$method->requiredFields;
|
||||
|
||||
$fields = join(',', $fields);
|
||||
foreach(explode(',', $systemField) as $field)
|
||||
{
|
||||
$field = trim($field);
|
||||
if(strpos(",$fields,", ",$field,") === false) $fields .= ",$field";
|
||||
}
|
||||
|
||||
$requiredFields[$method]['requiredFields'] = $fields;
|
||||
}
|
||||
|
||||
$this->loadModel('setting')->setItems("system.{$moduleName}", $requiredFields);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,24 +10,7 @@
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id='featurebar'>
|
||||
<ul class='nav'>
|
||||
<?php
|
||||
foreach($lang->custom->object as $object => $name)
|
||||
{
|
||||
echo "<li id='{$object}Tab'>";
|
||||
common::printLink('custom', 'set', "module=$object", $name);
|
||||
echo '</li>';
|
||||
}
|
||||
echo "<li class='active'>";
|
||||
common::printLink('custom', 'flow', "", $lang->custom->flow);
|
||||
echo '</li><li>';
|
||||
common::printLink('custom', 'working', '', $lang->custom->working);
|
||||
echo '</li>';
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php include 'header.html.php';?>
|
||||
<div class='main'>
|
||||
<form method='post' class='form-condensed' target='hiddenwin'>
|
||||
<table class='table table-form'>
|
||||
@@ -49,4 +32,10 @@
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
$('#featurebar #flowTab').addClass('active');
|
||||
})
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id='featurebar'>
|
||||
<ul class='nav'>
|
||||
<?php
|
||||
foreach($lang->custom->object as $object => $name)
|
||||
{
|
||||
echo "<li id='{$object}Tab'>";
|
||||
common::printLink('custom', 'set', "module=$object", $name);
|
||||
echo '</li>';
|
||||
}
|
||||
echo "<li id='flowTab'>";
|
||||
common::printLink('custom', 'flow', "", $lang->custom->flow);
|
||||
echo "</li><li id='workingTab'>";
|
||||
common::printLink('custom', 'working', '', $lang->custom->working);
|
||||
echo "</li><li id='requiredTab'>";
|
||||
common::printLink('custom', 'required', '', $lang->custom->required);
|
||||
echo '</li>';
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
/**
|
||||
* The required view file of custom 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 Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package custom
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include 'header.html.php';?>
|
||||
<div class='side'>
|
||||
<div class='list-group'>
|
||||
<?php
|
||||
foreach($config->custom->requiredModules as $requiredModule)
|
||||
{
|
||||
echo "<li class='list-group-item' id='{$requiredModule}Tab'>" . html::a(inlink('required', "module=$requiredModule"), $lang->$requiredModule->common) . "</li>";
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
<div class='main'>
|
||||
<form method='post' class='form-condensed' target='hiddenwin'>
|
||||
<div class='panel panel-sm'>
|
||||
<div class='panel-heading'>
|
||||
<strong><?php echo $lang->$moduleName->common?></strong>
|
||||
</div>
|
||||
<table class='table table-form mw-800px'>
|
||||
<?php foreach($requiredFields as $method => $requiredField):?>
|
||||
<tr>
|
||||
<th class='w-100px'>
|
||||
<?php
|
||||
$fieldList = $fields;
|
||||
if($moduleName == 'testsuite' and $method == 'createlib') $method = 'createLib';
|
||||
if($moduleName == 'testsuite' and $method == 'createcase')
|
||||
{
|
||||
$fieldList = $caseFields;
|
||||
$method = 'createCase';
|
||||
}
|
||||
echo $lang->$moduleName->$method;
|
||||
?>
|
||||
</th>
|
||||
<td><?php echo html::select("requiredFields[{$method}][]", $fieldList, $requiredField, "class='form-control chosen' multiple");?></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>
|
||||
<?php
|
||||
echo html::submitButton();
|
||||
if(common::hasPriv('custom', 'resetRequired')) echo html::a(inlink('resetRequired', "module=$moduleName"), $lang->custom->restore, 'hiddenwin', "class='btn'");
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
$('#featurebar #requiredTab').addClass('active');
|
||||
$('.side #<?php echo $moduleName?>Tab').addClass('active');
|
||||
})
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
@@ -10,7 +10,7 @@
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include 'header.html.php';?>
|
||||
<?php
|
||||
$itemRow = <<<EOT
|
||||
<tr class='text-center'>
|
||||
@@ -31,23 +31,6 @@ EOT;
|
||||
<?php js::set('itemRow', $itemRow)?>
|
||||
<?php js::set('module', $module)?>
|
||||
<?php js::set('field', $field)?>
|
||||
<div id='featurebar'>
|
||||
<ul class='nav'>
|
||||
<?php
|
||||
foreach($lang->custom->object as $object => $name)
|
||||
{
|
||||
echo "<li id='{$object}Tab'>";
|
||||
common::printLink('custom', 'set', "module=$object", $name);
|
||||
echo '</li>';
|
||||
}
|
||||
echo '<li>';
|
||||
common::printLink('custom', 'flow', "", $lang->custom->flow);
|
||||
echo '</li><li>';
|
||||
common::printLink('custom', 'working', '', $lang->custom->working);
|
||||
echo '</li>';
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
<div class='side'>
|
||||
<div class='list-group'>
|
||||
<?php
|
||||
|
||||
@@ -10,24 +10,7 @@
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id='featurebar'>
|
||||
<ul class='nav'>
|
||||
<?php
|
||||
foreach($lang->custom->object as $object => $name)
|
||||
{
|
||||
echo "<li id='{$object}Tab'>";
|
||||
common::printLink('custom', 'set', "module=$object", $name);
|
||||
echo '</li>';
|
||||
}
|
||||
echo '<li>';
|
||||
common::printLink('custom', 'flow', "", $lang->custom->flow);
|
||||
echo "</li><li class='active'>";
|
||||
common::printLink('custom', 'working', '', $lang->custom->working);
|
||||
echo '</li>';
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php include 'header.html.php';?>
|
||||
<div class='main'>
|
||||
<form method='post' class='form-condensed' target='hiddenwin'>
|
||||
<table class='table table-form'>
|
||||
@@ -39,4 +22,10 @@
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
$('#featurebar #workingTab').addClass('active');
|
||||
})
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
Reference in New Issue
Block a user