@ -56,6 +56,12 @@ class ExtraFieldValue extends Model
$this->author_id = 'user_id';
$this->author_id = 'user_id';
$this->entityName = 'ChamiloLMS\Entity\QuestionFieldValues';
$this->entityName = 'ChamiloLMS\Entity\QuestionFieldValues';
break;
break;
case 'lp':
$this->table = Database::get_main_table(TABLE_MAIN_LP_FIELD_VALUES);
$this->table_handler_field = Database::get_main_table(TABLE_MAIN_LP_FIELD);
$this->author_id = 'lp_id';
//$this->entityName = 'ChamiloLMS\Entity\QuestionFieldValues';
break;
default:
default:
//unmanaged datatype, return false to let the caller know it
//unmanaged datatype, return false to let the caller know it
// didn't work
// didn't work
@ -86,18 +92,71 @@ class ExtraFieldValue extends Model
public function save_field_values($params)
public function save_field_values($params)
{
{
$extra_field = new ExtraField($this->type);
$extra_field = new ExtraField($this->type);
if (empty($params[$this->handler_id])) {
if (empty($params[$this->handler_id])) {
return false;
return false;
}
}
foreach ($params as $key => $value) {
$found = strpos($key, '__persist__');
if ($found) {
$tempKey = str_replace('__persist__', '', $key);
if (!isset($params[$tempKey])) {
$params[$tempKey] = array();
}
break;
}
}
// Parse params.
// Parse params.
foreach ($params as $key => $value) {
foreach ($params as $key => $value) {
if (substr($key, 0, 6) == 'extra_') {
if (substr($key, 0, 6) == 'extra_') {
// An extra field.
// An extra field.
$field_variable = substr($key, 6);
$field_variable = substr($key, 6);
$extra_field_info = $extra_field->get_handler_field_info_by_field_variable($field_variable);
$extra_field_info = $extra_field->get_handler_field_info_by_field_variable($field_variable);
if ($extra_field_info) {
if ($extra_field_info) {
$commentVariable = 'extra_'.$field_variable.'_comment';
$commentVariable = 'extra_'.$field_variable.'_comment';
$comment = isset($params[$commentVariable]) ? $params[$commentVariable] : null;
$comment = isset($params[$commentVariable]) ? $params[$commentVariable] : null;
switch ($extra_field_info['field_type']) {
case ExtraField::FIELD_TYPE_TAG :
$old = self::getAllValuesByItemAndField(
$extra_field_info['id'],
$params[$this->handler_id]
);
$deleteItems = array();
if (!empty($old)) {
$oldIds = array();
foreach ($old as $oldItem) {
$oldIds[] = $oldItem['field_value'];
}
$deleteItems = array_diff($oldIds, $value);
}
foreach ($value as $optionId) {
$new_params = array(
$this->handler_id => $params[$this->handler_id],
'field_id' => $extra_field_info['id'],
'field_value' => $optionId,
'comment' => $comment
);
self::save($new_params);
}
if (!empty($deleteItems)) {
foreach ($deleteItems as $deleteFieldValue) {
self::deleteValuesByHandlerAndFieldAndValue(
$extra_field_info['id'],
$params[$this->handler_id],
$deleteFieldValue
);
}
}
break;
default;
$new_params = array(
$new_params = array(
$this->handler_id => $params[$this->handler_id],
$this->handler_id => $params[$this->handler_id],
'field_id' => $extra_field_info['id'],
'field_id' => $extra_field_info['id'],
@ -109,6 +168,7 @@ class ExtraFieldValue extends Model
}
}
}
}
}
}
}
/**
/**
* Save values in the *_field_values table
* Save values in the *_field_values table
@ -123,7 +183,6 @@ class ExtraFieldValue extends Model
// Setting value to insert.
// Setting value to insert.
$value = $params['field_value'];
$value = $params['field_value'];
$value_to_insert = null;
$value_to_insert = null;
if (is_array($value)) {
if (is_array($value)) {
@ -131,6 +190,7 @@ class ExtraFieldValue extends Model
} else {
} else {
$value_to_insert = Database::escape_string($value);
$value_to_insert = Database::escape_string($value);
}
}
$params['field_value'] = $value_to_insert;
$params['field_value'] = $value_to_insert;
//If field id exists
//If field id exists
@ -138,8 +198,6 @@ class ExtraFieldValue extends Model
if ($extra_field_info) {
if ($extra_field_info) {
switch ($extra_field_info['field_type']) {
switch ($extra_field_info['field_type']) {
case ExtraField::FIELD_TYPE_TAG:
break;
case ExtraField::FIELD_TYPE_RADIO:
case ExtraField::FIELD_TYPE_RADIO:
case ExtraField::FIELD_TYPE_SELECT:
case ExtraField::FIELD_TYPE_SELECT:
case ExtraField::FIELD_TYPE_SELECT_MULTIPLE:
case ExtraField::FIELD_TYPE_SELECT_MULTIPLE:
@ -179,7 +237,18 @@ class ExtraFieldValue extends Model
break;
break;
}
}
$field_values = self::get_values_by_handler_and_field_id($params[$this->handler_id], $params['field_id']);
if ($extra_field_info['field_type'] == ExtraField::FIELD_TYPE_TAG) {
$field_values = self::getAllValuesByItemAndFieldAndValue(
$params[$this->handler_id],
$params['field_id'],
$value
);
} else {
$field_values = self::get_values_by_handler_and_field_id(
$params[$this->handler_id],
$params['field_id']
);
}
$params['field_value'] = $value_to_insert;
$params['field_value'] = $value_to_insert;
$params['tms'] = api_get_utc_datetime();
$params['tms'] = api_get_utc_datetime();
@ -221,13 +290,30 @@ class ExtraFieldValue extends Model
$app['orm.ems']['db_write']->flush();
$app['orm.ems']['db_write']->flush();
}
}
}
}
} else {
if ($extra_field_info['field_type'] == ExtraField::FIELD_TYPE_TAG) {
$option = new ExtraFieldOption($this->type);
$optionExists = $option->get($params['field_value']);
if (empty($optionExists)) {
$optionParams = array(
'field_id' => $params['field_id'],
'option_value' => $params['field_value']
);
$optionId = $option->saveOptions($optionParams);
} else {
$optionId = $optionExists['id'];
}
$params['field_value'] = $optionId;
if ($optionId) {
return parent::save($params, $show_query);
}
} else {
} else {
return parent::save($params, $show_query);
return parent::save($params, $show_query);
}
}
}
} else {
} else {
//self::delete_values_by_handler_and_field_id($params[$this->handler_id], $params['field_id']);
// Update
// Update
if ($extra_field_info['field_loggeable'] == 1) {
if ($extra_field_info['field_loggeable'] == 1) {
global $app;
global $app;
@ -283,13 +369,12 @@ class ExtraFieldValue extends Model
}
}
}
}
/**
/**
* Returns the value of the given extra field on the given resource
* Returns the value of the given extra field on the given resource
* @param int Item ID (It could be a session_id, course_id or user_id)
* @param int Item ID (It could be a session_id, course_id or user_id)
* @param int Field ID (the ID from the *_field table)
* @param int Field ID (the ID from the *_field table)
* @param bool Whether to transform the result to a human readable strings
* @param bool Whether to transform the result to a human readable strings
* @return mixed A structured array with the field_id and field_value, or fals on error
* @return mixed A structured array with the field_id and field_value, or false on error
* @assert (-1,-1) === false
* @assert (-1,-1) === false
*/
*/
public function get_values_by_handler_and_field_id($item_id, $field_id, $transform = false)
public function get_values_by_handler_and_field_id($item_id, $field_id, $transform = false)
@ -309,7 +394,6 @@ class ExtraFieldValue extends Model
if (!empty($result['field_value'])) {
if (!empty($result['field_value'])) {
switch ($result['field_type']) {
switch ($result['field_type']) {
case ExtraField::FIELD_TYPE_DOUBLE_SELECT:
case ExtraField::FIELD_TYPE_DOUBLE_SELECT:
$field_option = new ExtraFieldOption($this->type);
$field_option = new ExtraFieldOption($this->type);
$options = explode('::', $result['field_value']);
$options = explode('::', $result['field_value']);
// only available for PHP 5.4 :( $result['field_value'] = $field_option->get($options[0])['id'].' -> ';
// only available for PHP 5.4 :( $result['field_value'] = $field_option->get($options[0])['id'].' -> ';
@ -322,7 +406,10 @@ class ExtraFieldValue extends Model
break;
break;
case ExtraField::FIELD_TYPE_SELECT:
case ExtraField::FIELD_TYPE_SELECT:
$field_option = new ExtraFieldOption($this->type);
$field_option = new ExtraFieldOption($this->type);
$extra_field_option_result = $field_option->get_field_option_by_field_and_option($result['field_id'], $result['field_value']);
$extra_field_option_result = $field_option->get_field_option_by_field_and_option(
$result['field_id'],
$result['field_value']
);
if (isset($extra_field_option_result[0])) {
if (isset($extra_field_option_result[0])) {
$result['field_value'] = $extra_field_option_result[0]['option_display_text'];
$result['field_value'] = $extra_field_option_result[0]['option_display_text'];
}
}
@ -336,6 +423,34 @@ class ExtraFieldValue extends Model
}
}
}
}
/**
* @param string $tag
* @param int $field_id
* @param int $limit
* @return array
*/
public function searchValuesByField($tag, $field_id, $limit = 10)
{
$field_id = intval($field_id);
$limit = intval($limit);
$tag = Database::escape_string($tag);
$sql = "SELECT DISTINCT s.field_value, s.field_id
FROM {$this->table} s
INNER JOIN {$this->table_handler_field} sf ON (s.field_id = sf.id)
WHERE
field_id = '".$field_id."' AND
field_value LIKE '%$tag%'
ORDER BY field_value
LIMIT 0, $limit
";
$result = Database::query($sql);
$values = array();
if (Database::num_rows($result)) {
$values = Database::store_result($result, 'ASSOC');
}
return $values;
}
/**
/**
* Gets a structured array of the original item and its extra values, using
* Gets a structured array of the original item and its extra values, using
* a specific original item and a field name (like "branch", or "birthdate")
* a specific original item and a field name (like "branch", or "birthdate")
@ -350,8 +465,10 @@ class ExtraFieldValue extends Model
$field_variable = Database::escape_string($field_variable);
$field_variable = Database::escape_string($field_variable);
$sql = "SELECT s.*, field_type FROM {$this->table} s
$sql = "SELECT s.*, field_type FROM {$this->table} s
INNER JOIN {$this->table_handler_field} sf ON (s.field_id = sf.id)
INNER JOIN {$this->table_handler_field} sf
WHERE {$this->handler_id} = '$item_id' AND
ON (s.field_id = sf.id)
WHERE
{$this->handler_id} = '$item_id' AND
field_variable = '".$field_variable."'
field_variable = '".$field_variable."'
ORDER BY id";
ORDER BY id";
$result = Database::query($sql);
$result = Database::query($sql);
@ -386,13 +503,16 @@ class ExtraFieldValue extends Model
* @return mixed Give the ID if found, or false on failure or not found
* @return mixed Give the ID if found, or false on failure or not found
* @assert (-1,-1) === false
* @assert (-1,-1) === false
*/
*/
public function get_item_id_from_field_variable_and_field_value($field_variable, $field_value, $transform = false) {
public function get_item_id_from_field_variable_and_field_value($field_variable, $field_value, $transform = false)
{
$field_value = Database::escape_string($field_value);
$field_value = Database::escape_string($field_value);
$field_variable = Database::escape_string($field_variable);
$field_variable = Database::escape_string($field_variable);
$sql = "SELECT {$this->handler_id} FROM {$this->table} s
$sql = "SELECT {$this->handler_id} FROM {$this->table} s
INNER JOIN {$this->table_handler_field} sf ON (s.field_id = sf.id)
INNER JOIN {$this->table_handler_field} sf
WHERE field_value = '$field_value' AND
ON (s.field_id = sf.id)
WHERE
field_value = '$field_value' AND
field_variable = '".$field_variable."'
field_variable = '".$field_variable."'
";
";
@ -413,7 +533,10 @@ class ExtraFieldValue extends Model
*/
*/
public function get_values_by_field_id($field_id)
public function get_values_by_field_id($field_id)
{
{
$sql = "SELECT s.*, field_type FROM {$this->table} s INNER JOIN {$this->table_handler_field} sf ON (s.field_id = sf.id)
$field_id = intval($field_id);
$sql = "SELECT s.*, field_type FROM {$this->table} s
INNER JOIN {$this->table_handler_field} sf
ON (s.field_id = sf.id)
WHERE field_id = '".$field_id."' ORDER BY id";
WHERE field_id = '".$field_id."' ORDER BY id";
$result = Database::query($sql);
$result = Database::query($sql);
if (Database::num_rows($result)) {
if (Database::num_rows($result)) {
@ -422,13 +545,64 @@ class ExtraFieldValue extends Model
return false;
return false;
}
}
/**
* @param int $itemId
* @param int $fieldId
* @return array
*/
public function getAllValuesByItemAndField($itemId, $fieldId)
{
$fieldId = intval($fieldId);
$itemId = intval($itemId);
$sql = "SELECT s.* FROM {$this->table} s
INNER JOIN {$this->table_handler_field} sf
ON (s.field_id = sf.id)
WHERE
field_id = '".$fieldId."' AND
{$this->handler_id} = '$itemId'
ORDER BY field_value";
$result = Database::query($sql);
if (Database::num_rows($result)) {
return Database::store_result($result, 'ASSOC');
}
return false;
}
/**
* @param int $itemId
* @param int $fieldId
* @param string $fieldValue
* @return array|bool
*/
public function getAllValuesByItemAndFieldAndValue($itemId, $fieldId, $fieldValue)
{
$fieldId = intval($fieldId);
$itemId = intval($itemId);
$fieldValue = Database::escape_string($fieldValue);
$sql = "SELECT s.* FROM {$this->table} s
INNER JOIN {$this->table_handler_field} sf
ON (s.field_id = sf.id)
WHERE
field_id = '".$fieldId."' AND
{$this->handler_id} = '$itemId' AND
field_value = $fieldValue
ORDER BY field_value";
$result = Database::query($sql);
if (Database::num_rows($result)) {
return Database::store_result($result, 'ASSOC');
}
return false;
}
/**
/**
* Deletes all the values related to a specific field ID
* Deletes all the values related to a specific field ID
* @param int Field ID
* @param int Field ID
* @return void
* @return void
* @assert ('a') == null
* @assert ('a') == null
*/
*/
public function delete_all_values_by_field_id($field_id) {
public function delete_all_values_by_field_id($field_id)
{
$field_id = intval($field_id);
$field_id = intval($field_id);
$sql = "DELETE FROM {$this->table} WHERE field_id = $field_id";
$sql = "DELETE FROM {$this->table} WHERE field_id = $field_id";
Database::query($sql);
Database::query($sql);
@ -449,6 +623,25 @@ class ExtraFieldValue extends Model
Database::query($sql);
Database::query($sql);
}
}
/**
* @param int $itemId
* @param int $fieldId
* @param int $fieldValue
*/
public function deleteValuesByHandlerAndFieldAndValue($itemId, $fieldId, $fieldValue)
{
$itemId = intval($itemId);
$fieldId = intval($fieldId);
$fieldValue = Database::escape_string($fieldValue);
$sql = "DELETE FROM {$this->table}
WHERE
{$this->handler_id} = '$itemId' AND
field_id = '".$fieldId."' AND
field_value = '$fieldValue'";
Database::query($sql);
}
/**
/**
* Not yet implemented - Compares the field values of two items
* Not yet implemented - Compares the field values of two items
* @param int Item 1
* @param int Item 1