Adding extra fields status à la Redmine see BT#6174

skala
Julio Montoya 13 years ago
parent 96d0dbcb36
commit cff1476e0b
  1. 196
      main/admin/extra_field_workflow.php
  2. 124
      main/inc/Entity/ExtraFieldOptionRelRole.php
  3. 119
      main/inc/lib/extra_field.lib.php

@ -0,0 +1,196 @@
<?php
/* For licensing terms, see /license.txt */
/**
* @package chamilo.admin
*/
// Language files that need to be included.
$language_file = array('admin');
$cidReset = true;
require_once '../inc/global.inc.php';
$this_section = SECTION_PLATFORM_ADMIN;
$type = isset($_REQUEST['type']) ? $_REQUEST['type'] : null;
if ($type == 'question') {
if (!(api_is_platform_admin() || api_is_question_manager())) {
api_not_allowed(true);
}
} else {
api_protect_admin_script();
}
// setting breadcrumbs
$interbreadcrumb[] = array('url' => 'index.php','name' => get_lang('PlatformAdmin'));
$tool_name = null;
$action = isset($_GET['action']) ? $_GET['action'] : null;
$field_id = isset($_GET['field_id']) ? $_GET['field_id'] : null;
if (empty($field_id)) {
api_not_allowed();
}
if (!in_array($type, ExtraField::getValidExtraFieldTypes())) {
api_not_allowed();
}
$extraField = new ExtraField($type);
$extraFieldInfo = $extraField->get($field_id);
$check = Security::check_token('request');
$token = Security::get_token();
if ($action == 'add') {
$interbreadcrumb[]=array('url' => 'extra_fields.php?type='.$extraField->type,'name' => $extraField->pageName);
$interbreadcrumb[]=array('url' => 'extra_fields.php?type='.$extraField->type.'&action=edit&id='.$extraFieldInfo['id'],'name' => $extraFieldInfo['field_display_text']);
$interbreadcrumb[]=array('url' => 'extra_field_options.php?type='.$extraField->type.'&field_id='.$extraFieldInfo['id'], 'name' => get_lang('EditExtraFieldOptions'));
$interbreadcrumb[]=array('url' => '#','name' => get_lang('Add'));
} elseif ($action == 'edit') {
$interbreadcrumb[]=array('url' => 'extra_fields.php?type='.$extraField->type,'name' => $extraField->pageName);
$interbreadcrumb[]=array('url' => 'extra_fields.php?type='.$extraField->type.'&action=edit&id='.$extraFieldInfo['id'],'name' => $extraFieldInfo['field_display_text']);
$interbreadcrumb[]=array('url' => 'extra_field_options.php?type='.$extraField->type.'&field_id='.$extraFieldInfo['id'], 'name' => get_lang('EditExtraFieldOptions'));
$interbreadcrumb[]=array('url' => '#','name' => get_lang('Edit'));
} else {
$interbreadcrumb[]=array('url' => 'extra_fields.php?type='.$extraField->type,'name' => $extraField->pageName);
$interbreadcrumb[]=array('url' => 'extra_fields.php?type='.$extraField->type.'&action=edit&id='.$extraFieldInfo['id'],'name' => $extraFieldInfo['field_display_text']);
$interbreadcrumb[]=array('url' => '#','name' => get_lang('EditExtraFieldOptions'));
}
$roleId = isset($_REQUEST['roleId']) ? $_REQUEST['roleId'] : null;
//jqgrid will use this URL to do the selects
$params = 'field_id='.$field_id.'&type='.$extraField->type.'&roleId='.$roleId;
$paramsNoRole = 'field_id='.$field_id.'&type='.$extraField->type;
//The order is important you need to check the the $column variable in the model.ajax.php file
$columns = array(get_lang('Name'), get_lang('Value'), get_lang('Order'), get_lang('Actions'));
$htmlHeadXtra[]='<script>
function setHidden(obj) {
var name = $(obj).attr("name");
var hiddenName = "hidden_" + name;
if ($("#" + hiddenName).attr("value") == 1) {
$("#" + hiddenName).attr("value", 0);
} else {
$("#" + hiddenName).attr("value", 1);
}
}
function changeStatus(obj) {
var roleId = $(obj).find(":selected").val();
window.location.replace("'.api_get_self().'?'.$paramsNoRole.'&roleId="+roleId);
}
</script>';
// The header.
Display::display_header($tool_name);
echo Display::page_header($extraFieldInfo['field_display_text']);
$obj = new ExtraFieldOption($type);
$columns = array('option_display_text', 'option_value', 'option_order');
$result = Database::select('*', $obj->table, array('where' => array("field_id = ? " => $field_id), 'order'=>"option_order ASC"));
$table = new HTML_Table(array('class' => 'data_table'));
$column = 0;
$row = 0;
$table->setHeaderContents($row, $column, get_lang('CurrentStatus'));
$column++;
foreach ($result as $item) {
$table->setHeaderContents($row, $column, $item['option_display_text']);
$column++;
}
$row++;
$form = new FormValidator('workflow', 'post', api_get_self().'?'.$params);
$options = api_get_user_roles();
$form->addElement('select', 'status', get_lang('SelectStatus'), $options, array('onclick' => 'changeStatus(this)'));
$checks = $app['orm.em']->getRepository('Entity\ExtraFieldOptionRelFieldOption')->findBy(array('fieldId' => $field_id, 'roleId' => $roleId));
$includedFields = array();
if (!empty($checks)) {
foreach ($checks as $availableField) {
$includedFields[$availableField->getFieldOptionId()][] = $availableField->getRelatedFieldOptionId();
}
}
foreach ($result as $item) {
$column = 0;
$table->setCellContents($row, $column, $item['option_display_text']);
$column++;
$value = null;
foreach ($result as $itemCol) {
$id = 'extra_field_status_'.$item['id'].'_'.$itemCol['id'];
$idForm = 'extra_field_status['.$item['id'].']['.$itemCol['id'].']';
$attributes = array('onclick' => 'setHidden(this)');
$value = 0;
if (isset($includedFields[$itemCol['id']]) && in_array($item['id'], $includedFields[$itemCol['id']])) {
$value = 1;
$attributes['checked'] = 'checked';
}
$element = Display::input('checkbox', $id, null, $attributes);
$table->setCellContents($row, $column, $element);
$form->addElement('hidden', 'hidden_'.$idForm, $value, array('id' => 'hidden_'.$id));
$column++;
}
$row++;
}
if (!empty($roleId)) {
$form->addElement('html', $table->toHtml());
$form->addElement('button', 'submit', get_lang('Save'));
$form->setDefaults(array('status' => $roleId));
} else {
$form->addElement('button', 'submit', get_lang('Edit'));
}
$form->display();
if ($form->validate()) {
$values = $form->getSubmitValues();
$result = $values['hidden_extra_field_status'];
if (!empty($result)) {
foreach ($result as $id => $items) {
foreach ($items as $subItemId => $value) {
$extraFieldOptionRelFieldOption = $app['orm.em']->getRepository('Entity\ExtraFieldOptionRelFieldOption')->findOneBy(
array(
'fieldId' => $field_id,
'fieldOptionId' => $subItemId,
'roleId' => $roleId,
'relatedFieldOptionId' => $id
)
);
if ($value == 1) {
if (empty($extraFieldOptionRelFieldOption)) {
$extraFieldOptionRelFieldOption = new Entity\ExtraFieldOptionRelFieldOption();
$extraFieldOptionRelFieldOption->setFieldId($field_id);
$extraFieldOptionRelFieldOption->setFieldOptionId($subItemId);
$extraFieldOptionRelFieldOption->setRelatedFieldOptionId($id);
$extraFieldOptionRelFieldOption->setRoleId($roleId);
$app['orm.em']->persist($extraFieldOptionRelFieldOption);
}
} else {
if ($extraFieldOptionRelFieldOption) {
$app['orm.em']->remove($extraFieldOptionRelFieldOption);
}
}
}
}
$app['orm.em']->flush();
header('Location:'.api_get_self().'?'.$params);
exit;
}
}
Display :: display_footer();

@ -0,0 +1,124 @@
<?php
namespace Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* ExtraFieldOptionRelRole
*
* @ORM\Table(name="extra_field_option_rel_role", uniqueConstraints={@ORM\UniqueConstraint(name="idx", columns={"role_id", "field_id", "field_option_id"})})
* @ORM\Entity
*/
class ExtraFieldOptionRelRole
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", precision=0, scale=0, nullable=false, unique=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var integer
*
* @ORM\Column(name="role_id", type="integer", precision=0, scale=0, nullable=true, unique=false)
*/
private $roleId;
/**
* @var integer
*
* @ORM\Column(name="field_id", type="integer", precision=0, scale=0, nullable=true, unique=false)
*/
private $fieldId;
/**
* @var integer
*
* @ORM\Column(name="field_option_id", type="integer", precision=0, scale=0, nullable=true, unique=false)
*/
private $fieldOptionId;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set roleId
*
* @param integer $roleId
* @return EntityExtraFieldOptionRelRole
*/
public function setRoleId($roleId)
{
$this->roleId = $roleId;
return $this;
}
/**
* Get roleId
*
* @return integer
*/
public function getRoleId()
{
return $this->roleId;
}
/**
* Set fieldId
*
* @param integer $fieldId
* @return EntityExtraFieldOptionRelRole
*/
public function setFieldId($fieldId)
{
$this->fieldId = $fieldId;
return $this;
}
/**
* Get fieldId
*
* @return integer
*/
public function getFieldId()
{
return $this->fieldId;
}
/**
* Set fieldOptionId
*
* @param integer $fieldOptionId
* @return EntityExtraFieldOptionRelRole
*/
public function setFieldOptionId($fieldOptionId)
{
$this->fieldOptionId = $fieldOptionId;
return $this;
}
/**
* Get fieldOptionId
*
* @return integer
*/
public function getFieldOptionId()
{
return $this->fieldOptionId;
}
}

@ -1,6 +1,9 @@
<?php
/* For licensing terms, see /license.txt */
/**
* Class ExtraField
*/
class ExtraField extends Model
{
public $columns = array(
@ -178,6 +181,8 @@ class ExtraField extends Model
}
/**
* Add elements to a form
*
* @param FormValidator $form
* @param int $item_id
* @return array|bool
@ -194,7 +199,7 @@ class ExtraField extends Model
$form->setDefaults($extra_data);
}
}
$extra_fields = self::get_all();
$extra_fields = self::get_all(null, 'option_order');
$extra = ExtraField::set_extra_fields_in_form(
$form,
@ -209,12 +214,17 @@ class ExtraField extends Model
return $extra;
}
/**
*
* @param int $item_id (session_id, question_id, course id)
* @return array
*/
public function get_handler_extra_data($item_id)
{
if (empty($item_id)) {
return array();
}
$extra_data = array();
$fields = self::get_all();
$field_values = new ExtraFieldValue($this->type);
@ -239,12 +249,14 @@ class ExtraField extends Model
case ExtraField::FIELD_TYPE_RADIO:
$extra_data['extra_'.$field['field_variable']]['extra_'.$field['field_variable']] = $field_value;
break;
/*case ExtraField::FIELD_TYPE_DATETIME:
break;*/
default:
$extra_data['extra_'.$field['field_variable']] = $field_value;
break;
}
} else {
// Set default values
if (isset($field['field_default_value']) && !empty($field['field_default_value'])) {
$extra_data['extra_'.$field['field_variable']] = $field['field_default_value'];
}
}
}
@ -411,6 +423,17 @@ class ExtraField extends Model
$session_field_values->delete_all_values_by_field_id($id);
}
/**
*
* @param FormValidator $form
* @param array $extra_data
* @param string $form_name
* @param bool $admin_permissions
* @param null $user_id
* @param string $type
* @param null $extra
* @return array
*/
public static function set_extra_fields_in_form(
$form,
$extra_data,
@ -432,6 +455,27 @@ class ExtraField extends Model
if (!empty($extra)) {
foreach ($extra as $field_details) {
// Getting default value id if is set
$defaultValueId = null;
if (isset($field_details['options']) && !empty($field_details['options'])) {
$valueToFind = null;
if (isset($field_details['field_default_value'])) {
$valueToFind = $field_details['field_default_value'];
}
// If a value is found we override the default value
if (isset($extra_data['extra_'.$field_details['field_variable']])) {
$valueToFind = $extra_data['extra_'.$field_details['field_variable']];
}
foreach ($field_details['options'] as $option) {
if ($option['option_value'] == $valueToFind) {
$defaultValueId = $option['id'];
}
}
}
if (!$admin_permissions) {
if ($field_details['field_visible'] == 0) {
continue;
@ -548,17 +592,59 @@ class ExtraField extends Model
) {
$get_lang_variables = true;
}
// Get extra field workflow
$userInfo = api_get_user_info();
$addOptions = array();
global $app;
$optionsExists = $app['orm.em']->getRepository('Entity\ExtraFieldOptionRelFieldOption')->
findOneBy(array('fieldId' => $field_details['id']));
if ($optionsExists) {
if (isset($userInfo['status']) && !empty($userInfo['status'])) {
$fieldWorkFlow = $app['orm.em']->getRepository('Entity\ExtraFieldOptionRelFieldOption')
->findBy(
array(
'fieldId' => $field_details['id'],
'relatedFieldOptionId' => $defaultValueId,
'roleId' => $userInfo['status']
)
);
foreach ($fieldWorkFlow as $item) {
$addOptions[] = $item->getFieldOptionId();
}
}
}
$options = array();
$options[''] = get_lang('SelectAnOption');
if (empty($defaultValueId)) {
$options[''] = get_lang('SelectAnOption');
}
if (!empty($field_details['options'])) {
foreach ($field_details['options'] as $option_details) {
if ($get_lang_variables) {
$options[$option_details['option_value']] = get_lang(
$option_details['option_display_text']
);
$options[$option_details['option_value']] = get_lang($option_details['option_display_text']);
} else {
$options[$option_details['option_value']] = $option_details['option_display_text'];
if ($optionsExists) {
// Adding always the default value
if ($option_details['id'] == $defaultValueId) {
$options[$option_details['option_value']] = $option_details['option_display_text'];
} else {
if (isset($addOptions) && !empty($addOptions)) {
// Parsing filters
if (in_array($option_details['id'], $addOptions)) {
$options[$option_details['option_value']] = $option_details['option_display_text'];
}
}
}
} else {
// Normal behaviour
$options[$option_details['option_value']] = $option_details['option_display_text'];
}
}
}
}
@ -963,10 +1049,6 @@ EOF;
array('id' => 'field_type', 'class' => 'chzn-select', 'data-placeholder' => get_lang('Select'))
);
$form->addElement('label', get_lang('Example'), '<div id="example">-</div>');
//$form->addElement('advanced_settings','<a class="btn btn-show" id="advanced_parameters" href="javascript://">'.get_lang('AdvancedParameters').'</a>');
//$form->addElement('html','<div id="options" style="display:none">');
$form->addElement('text', 'field_variable', get_lang('FieldLabel'), array('class' => 'span5'));
$form->addElement(
'text',
@ -985,6 +1067,15 @@ EOF;
'extra_field_options.php?type='.$this->type.'&field_id='.$id
);
$form->addElement('label', null, $url);
if ($defaults['field_type'] == ExtraField::FIELD_TYPE_SELECT) {
$urlWorkFlow = Display::url(
get_lang('EditExtraFieldWorkFlow'),
'extra_field_workflow.php?type='.$this->type.'&field_id='.$id
);
$form->addElement('label', null, $urlWorkFlow);
}
$form->freeze('field_options');
}
}

Loading…
Cancel
Save