From cff1476e0bed74e320d06d046f2d9d097cea56ea Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Fri, 17 May 2013 11:46:04 +0200 Subject: [PATCH] =?UTF-8?q?Adding=20extra=20fields=20status=20=C3=A0=20la?= =?UTF-8?q?=20Redmine=20see=20BT#6174?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/admin/extra_field_workflow.php | 196 ++++++++++++++++++++ main/inc/Entity/ExtraFieldOptionRelRole.php | 124 +++++++++++++ main/inc/lib/extra_field.lib.php | 119 ++++++++++-- 3 files changed, 425 insertions(+), 14 deletions(-) create mode 100644 main/admin/extra_field_workflow.php create mode 100644 main/inc/Entity/ExtraFieldOptionRelRole.php diff --git a/main/admin/extra_field_workflow.php b/main/admin/extra_field_workflow.php new file mode 100644 index 0000000000..c6586960a7 --- /dev/null +++ b/main/admin/extra_field_workflow.php @@ -0,0 +1,196 @@ + '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[]=''; + +// 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(); diff --git a/main/inc/Entity/ExtraFieldOptionRelRole.php b/main/inc/Entity/ExtraFieldOptionRelRole.php new file mode 100644 index 0000000000..b1cb6cce88 --- /dev/null +++ b/main/inc/Entity/ExtraFieldOptionRelRole.php @@ -0,0 +1,124 @@ +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; + } +} diff --git a/main/inc/lib/extra_field.lib.php b/main/inc/lib/extra_field.lib.php index d49fc06dc1..55edd5a3fd 100644 --- a/main/inc/lib/extra_field.lib.php +++ b/main/inc/lib/extra_field.lib.php @@ -1,6 +1,9 @@ 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'), '
-
'); - - //$form->addElement('advanced_settings',''.get_lang('AdvancedParameters').''); - //$form->addElement('html','