extra_field_value.lib.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * Class ExtraFieldValue
  5. * Declaration for the ExtraFieldValue class, managing the values in extra
  6. * fields for any data type
  7. * @package chamilo.library
  8. *
  9. */
  10. class ExtraFieldValue extends Model
  11. {
  12. public $type = null;
  13. public $columns = array('id', 'field_id', 'field_value', 'tms', 'comment');
  14. /** @var string session_id, course_code, user_id, question id */
  15. public $handler_id = null;
  16. public $entityName;
  17. /**
  18. * Formats the necessary elements for the given datatype
  19. * @param string The type of data to which this extra field applies (user, course, session, ...)
  20. * @return void (or false if unmanaged datatype)
  21. * @assert (-1) === false
  22. */
  23. public function __construct($type)
  24. {
  25. $this->type = $type;
  26. $extra_field = new ExtraField($this->type);
  27. $this->handler_id = $extra_field->handler_id;
  28. switch ($this->type) {
  29. case 'course':
  30. $this->table = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES);
  31. $this->table_handler_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD);
  32. $this->author_id = 'user_id';
  33. $this->entityName = 'ChamiloLMS\Entity\CourseFieldValues';
  34. break;
  35. case 'user':
  36. $this->table = Database::get_main_table(TABLE_MAIN_USER_FIELD_VALUES);
  37. $this->table_handler_field = Database::get_main_table(TABLE_MAIN_USER_FIELD);
  38. $this->author_id = 'author_id';
  39. $this->entityName = 'ChamiloLMS\Entity\UserFieldValues';
  40. break;
  41. case 'session':
  42. $this->table = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES);
  43. $this->table_handler_field = Database::get_main_table(TABLE_MAIN_SESSION_FIELD);
  44. $this->author_id = 'user_id';
  45. $this->entityName = 'ChamiloLMS\Entity\SessionFieldValues';
  46. break;
  47. case 'question':
  48. $this->table = Database::get_main_table(TABLE_MAIN_QUESTION_FIELD_VALUES);
  49. $this->table_handler_field = Database::get_main_table(TABLE_MAIN_QUESTION_FIELD);
  50. $this->author_id = 'user_id';
  51. $this->entityName = 'ChamiloLMS\Entity\QuestionFieldValues';
  52. break;
  53. case 'lp':
  54. $this->table = Database::get_main_table(TABLE_MAIN_LP_FIELD_VALUES);
  55. $this->table_handler_field = Database::get_main_table(TABLE_MAIN_LP_FIELD);
  56. $this->author_id = 'lp_id';
  57. //$this->entityName = 'ChamiloLMS\Entity\QuestionFieldValues';
  58. break;
  59. default:
  60. //unmanaged datatype, return false to let the caller know it
  61. // didn't work
  62. return false;
  63. }
  64. $this->columns[] = $this->handler_id;
  65. $this->columns[] = $this->author_id;
  66. }
  67. /**
  68. * Gets the number of values stored in the table (all fields together)
  69. * for this type of resource
  70. * @return integer Number of rows in the table
  71. * @assert () !== false
  72. */
  73. public function get_count()
  74. {
  75. $row = Database::select('count(*) as count', $this->table, array(), 'first');
  76. return $row['count'];
  77. }
  78. /**
  79. * Saves a series of records given as parameter into the coresponding table
  80. * @param array Structured parameter for the insertion into the *_field_values table
  81. * @return mixed false on empty params, void otherwise
  82. * @assert (array()) === false
  83. */
  84. public function save_field_values($params)
  85. {
  86. $extra_field = new ExtraField($this->type);
  87. if (empty($params[$this->handler_id])) {
  88. return false;
  89. }
  90. foreach ($params as $key => $value) {
  91. $found = strpos($key, '__persist__');
  92. if ($found) {
  93. $tempKey = str_replace('__persist__', '', $key);
  94. if (!isset($params[$tempKey])) {
  95. $params[$tempKey] = array();
  96. }
  97. }
  98. }
  99. // Parse params.
  100. foreach ($params as $key => $value) {
  101. if (substr($key, 0, 6) == 'extra_') {
  102. // An extra field.
  103. $field_variable = substr($key, 6);
  104. $extra_field_info = $extra_field->get_handler_field_info_by_field_variable($field_variable);
  105. if ($extra_field_info) {
  106. $commentVariable = 'extra_'.$field_variable.'_comment';
  107. $comment = isset($params[$commentVariable]) ? $params[$commentVariable] : null;
  108. switch ($extra_field_info['field_type']) {
  109. case ExtraField::FIELD_TYPE_TAG :
  110. $old = self::getAllValuesByItemAndField(
  111. $params[$this->handler_id],
  112. $extra_field_info['id']
  113. );
  114. $deleteItems = array();
  115. if (!empty($old)) {
  116. $oldIds = array();
  117. foreach ($old as $oldItem) {
  118. $oldIds[] = $oldItem['field_value'];
  119. }
  120. $deleteItems = array_diff($oldIds, $value);
  121. }
  122. foreach ($value as $optionId) {
  123. $new_params = array(
  124. $this->handler_id => $params[$this->handler_id],
  125. 'field_id' => $extra_field_info['id'],
  126. 'field_value' => $optionId,
  127. 'comment' => $comment
  128. );
  129. self::save($new_params);
  130. }
  131. if (!empty($deleteItems)) {
  132. foreach ($deleteItems as $deleteFieldValue) {
  133. self::deleteValuesByHandlerAndFieldAndValue(
  134. $params[$this->handler_id],
  135. $extra_field_info['id'],
  136. $deleteFieldValue
  137. );
  138. }
  139. }
  140. break;
  141. default;
  142. $new_params = array(
  143. $this->handler_id => $params[$this->handler_id],
  144. 'field_id' => $extra_field_info['id'],
  145. 'field_value' => $value,
  146. 'comment' => $comment
  147. );
  148. self::save($new_params);
  149. }
  150. }
  151. }
  152. }
  153. }
  154. /**
  155. * Save values in the *_field_values table
  156. * @param array Structured array with the values to save
  157. * @param boolean Whether to show the insert query (passed to the parent save() method)
  158. * @result mixed The result sent from the parent method
  159. * @assert (array()) === false
  160. */
  161. public function save($params, $show_query = false)
  162. {
  163. $extra_field = new ExtraField($this->type);
  164. // Setting value to insert.
  165. $value = $params['field_value'];
  166. $value_to_insert = null;
  167. if (is_array($value)) {
  168. $value_to_insert = implode(';', $value);
  169. } else {
  170. $value_to_insert = Database::escape_string($value);
  171. }
  172. $params['field_value'] = $value_to_insert;
  173. //If field id exists
  174. $extra_field_info = $extra_field->get($params['field_id']);
  175. if ($extra_field_info) {
  176. switch ($extra_field_info['field_type']) {
  177. case ExtraField::FIELD_TYPE_RADIO:
  178. case ExtraField::FIELD_TYPE_SELECT:
  179. case ExtraField::FIELD_TYPE_SELECT_MULTIPLE:
  180. //$field_options = $session_field_option->get_field_options_by_field($params['field_id']);
  181. //$params['field_value'] = split(';', $value_to_insert);
  182. /*
  183. if ($field_options) {
  184. $check = false;
  185. foreach ($field_options as $option) {
  186. if (in_array($option['option_value'], $values)) {
  187. $check = true;
  188. break;
  189. }
  190. }
  191. if (!$check) {
  192. return false; //option value not found
  193. }
  194. } else {
  195. return false; //enumerated type but no option found
  196. }*/
  197. break;
  198. case ExtraField::FIELD_TYPE_TEXT:
  199. case ExtraField::FIELD_TYPE_TEXTAREA:
  200. break;
  201. case ExtraField::FIELD_TYPE_DOUBLE_SELECT:
  202. if (is_array($value)) {
  203. if (isset($value['extra_'.$extra_field_info['field_variable']]) &&
  204. isset($value['extra_'.$extra_field_info['field_variable'].'_second'])
  205. ) {
  206. $value_to_insert = $value['extra_'.$extra_field_info['field_variable']].'::'.$value['extra_'.$extra_field_info['field_variable'].'_second'];
  207. } else {
  208. $value_to_insert = null;
  209. }
  210. }
  211. break;
  212. default:
  213. break;
  214. }
  215. if ($extra_field_info['field_type'] == ExtraField::FIELD_TYPE_TAG) {
  216. $field_values = self::getAllValuesByItemAndFieldAndValue(
  217. $params[$this->handler_id],
  218. $params['field_id'],
  219. $value
  220. );
  221. } else {
  222. $field_values = self::get_values_by_handler_and_field_id(
  223. $params[$this->handler_id],
  224. $params['field_id']
  225. );
  226. }
  227. $params['field_value'] = $value_to_insert;
  228. $params['tms'] = api_get_utc_datetime();
  229. $params[$this->author_id] = api_get_user_id();
  230. // Insert
  231. if (empty($field_values)) {
  232. if ($extra_field_info['field_loggeable'] == 1) {
  233. global $app;
  234. switch($this->type) {
  235. case 'question':
  236. $extraFieldValue = new ChamiloLMS\Entity\QuestionFieldValues();
  237. $extraFieldValue->setUserId(api_get_user_id());
  238. $extraFieldValue->setQuestionId($params[$this->handler_id]);
  239. break;
  240. case 'course':
  241. $extraFieldValue = new ChamiloLMS\Entity\CourseFieldValues();
  242. $extraFieldValue->setUserId(api_get_user_id());
  243. $extraFieldValue->setQuestionId($params[$this->handler_id]);
  244. break;
  245. case 'user':
  246. $extraFieldValue = new ChamiloLMS\Entity\UserFieldValues();
  247. $extraFieldValue->setUserId($params[$this->handler_id]);
  248. $extraFieldValue->setAuthorId(api_get_user_id());
  249. break;
  250. case 'session':
  251. $extraFieldValue = new ChamiloLMS\Entity\SessionFieldValues();
  252. $extraFieldValue->setUserId(api_get_user_id());
  253. $extraFieldValue->setSessionId($params[$this->handler_id]);
  254. break;
  255. }
  256. if (isset($extraFieldValue)) {
  257. if (!empty($params['field_value'])) {
  258. $extraFieldValue->setComment($params['comment']);
  259. $extraFieldValue->setFieldValue($params['field_value']);
  260. $extraFieldValue->setFieldId($params['field_id']);
  261. $extraFieldValue->setTms(api_get_utc_datetime(null, false, true));
  262. $app['orm.ems']['db_write']->persist($extraFieldValue);
  263. $app['orm.ems']['db_write']->flush();
  264. }
  265. }
  266. } else {
  267. if ($extra_field_info['field_type'] == ExtraField::FIELD_TYPE_TAG) {
  268. $option = new ExtraFieldOption($this->type);
  269. $optionExists = $option->get($params['field_value']);
  270. if (empty($optionExists)) {
  271. $optionParams = array(
  272. 'field_id' => $params['field_id'],
  273. 'option_value' => $params['field_value']
  274. );
  275. $optionId = $option->saveOptions($optionParams);
  276. } else {
  277. $optionId = $optionExists['id'];
  278. }
  279. $params['field_value'] = $optionId;
  280. if ($optionId) {
  281. return parent::save($params, $show_query);
  282. }
  283. } else {
  284. return parent::save($params, $show_query);
  285. }
  286. }
  287. } else {
  288. // Update
  289. if ($extra_field_info['field_loggeable'] == 1) {
  290. global $app;
  291. switch($this->type) {
  292. case 'question':
  293. $extraFieldValue = $app['orm.ems']['db_write']->getRepository('ChamiloLMS\Entity\QuestionFieldValues')->find($field_values['id']);
  294. $extraFieldValue->setUserId(api_get_user_id());
  295. $extraFieldValue->setQuestionId($params[$this->handler_id]);
  296. break;
  297. case 'course':
  298. $extraFieldValue = $app['orm.ems']['db_write']->getRepository('ChamiloLMS\Entity\CourseFieldValues')->find($field_values['id']);
  299. $extraFieldValue->setUserId(api_get_user_id());
  300. $extraFieldValue->setCourseCode($params[$this->handler_id]);
  301. break;
  302. case 'user':
  303. $extraFieldValue = $app['orm.ems']['db_write']->getRepository('ChamiloLMS\Entity\UserFieldValues')->find($field_values['id']);
  304. $extraFieldValue->setUserId(api_get_user_id());
  305. $extraFieldValue->setAuthorId(api_get_user_id());
  306. break;
  307. case 'session':
  308. $extraFieldValue = $app['orm.ems']['db_write']->getRepository('ChamiloLMS\Entity\SessionFieldValues')->find($field_values['id']);
  309. $extraFieldValue->setUserId(api_get_user_id());
  310. $extraFieldValue->setSessionId($params[$this->handler_id]);
  311. break;
  312. }
  313. if (isset($extraFieldValue)) {
  314. if (!empty($params['field_value'])) {
  315. /*
  316. * If the field value is similar to the previous value then the comment will be the same
  317. in order to no save in the log an empty record
  318. */
  319. if ($extraFieldValue->getFieldValue() == $params['field_value']) {
  320. if (empty($params['comment'])) {
  321. $params['comment'] = $extraFieldValue->getComment();
  322. }
  323. }
  324. $extraFieldValue->setComment($params['comment']);
  325. $extraFieldValue->setFieldValue($params['field_value']);
  326. $extraFieldValue->setFieldId($params['field_id']);
  327. $extraFieldValue->setTms(api_get_utc_datetime(null, false, true));
  328. $app['orm.ems']['db_write']->persist($extraFieldValue);
  329. $app['orm.ems']['db_write']->flush();
  330. }
  331. }
  332. } else {
  333. $params['id'] = $field_values['id'];
  334. return parent::update($params, $show_query);
  335. }
  336. }
  337. }
  338. }
  339. /**
  340. * Returns the value of the given extra field on the given resource
  341. * @param int Item ID (It could be a session_id, course_id or user_id)
  342. * @param int Field ID (the ID from the *_field table)
  343. * @param bool Whether to transform the result to a human readable strings
  344. * @return mixed A structured array with the field_id and field_value, or false on error
  345. * @assert (-1,-1) === false
  346. */
  347. public function get_values_by_handler_and_field_id($item_id, $field_id, $transform = false)
  348. {
  349. $field_id = intval($field_id);
  350. $item_id = Database::escape_string($item_id);
  351. $sql = "SELECT s.*, field_type FROM {$this->table} s
  352. INNER JOIN {$this->table_handler_field} sf ON (s.field_id = sf.id)
  353. WHERE {$this->handler_id} = '$item_id' AND
  354. field_id = '".$field_id."'
  355. ORDER BY id";
  356. $result = Database::query($sql);
  357. if (Database::num_rows($result)) {
  358. $result = Database::fetch_array($result, 'ASSOC');
  359. if ($transform) {
  360. if (!empty($result['field_value'])) {
  361. switch ($result['field_type']) {
  362. case ExtraField::FIELD_TYPE_DOUBLE_SELECT:
  363. $field_option = new ExtraFieldOption($this->type);
  364. $options = explode('::', $result['field_value']);
  365. // only available for PHP 5.4 :( $result['field_value'] = $field_option->get($options[0])['id'].' -> ';
  366. $result = $field_option->get($options[0]);
  367. $result_second = $field_option->get($options[1]);
  368. if (!empty($result)) {
  369. $result['field_value'] = $result['option_display_text'].' -> ';
  370. $result['field_value'] .= $result_second['option_display_text'];
  371. }
  372. break;
  373. case ExtraField::FIELD_TYPE_SELECT:
  374. $field_option = new ExtraFieldOption($this->type);
  375. $extra_field_option_result = $field_option->get_field_option_by_field_and_option(
  376. $result['field_id'],
  377. $result['field_value']
  378. );
  379. if (isset($extra_field_option_result[0])) {
  380. $result['field_value'] = $extra_field_option_result[0]['option_display_text'];
  381. }
  382. break;
  383. }
  384. }
  385. }
  386. return $result;
  387. } else {
  388. return false;
  389. }
  390. }
  391. /**
  392. * @param string $tag
  393. * @param int $field_id
  394. * @param int $limit
  395. * @return array
  396. */
  397. public function searchValuesByField($tag, $field_id, $limit = 10)
  398. {
  399. $field_id = intval($field_id);
  400. $limit = intval($limit);
  401. $tag = Database::escape_string($tag);
  402. $sql = "SELECT DISTINCT s.field_value, s.field_id
  403. FROM {$this->table} s
  404. INNER JOIN {$this->table_handler_field} sf ON (s.field_id = sf.id)
  405. WHERE
  406. field_id = '".$field_id."' AND
  407. field_value LIKE '%$tag%'
  408. ORDER BY field_value
  409. LIMIT 0, $limit
  410. ";
  411. $result = Database::query($sql);
  412. $values = array();
  413. if (Database::num_rows($result)) {
  414. $values = Database::store_result($result, 'ASSOC');
  415. }
  416. return $values;
  417. }
  418. /**
  419. * Gets a structured array of the original item and its extra values, using
  420. * a specific original item and a field name (like "branch", or "birthdate")
  421. * @param int Item ID from the original table
  422. * @param string The name of the field we are looking for
  423. * @return mixed Array of results, or false on error or not found
  424. * @assert (-1,'') === false
  425. */
  426. public function get_values_by_handler_and_field_variable($item_id, $field_variable, $transform = false)
  427. {
  428. $item_id = Database::escape_string($item_id);
  429. $field_variable = Database::escape_string($field_variable);
  430. $sql = "SELECT s.*, field_type FROM {$this->table} s
  431. INNER JOIN {$this->table_handler_field} sf
  432. ON (s.field_id = sf.id)
  433. WHERE
  434. {$this->handler_id} = '$item_id' AND
  435. field_variable = '".$field_variable."'
  436. ORDER BY id";
  437. $result = Database::query($sql);
  438. if (Database::num_rows($result)) {
  439. $result = Database::fetch_array($result, 'ASSOC');
  440. if ($transform) {
  441. if ($result['field_type'] == ExtraField::FIELD_TYPE_DOUBLE_SELECT) {
  442. if (!empty($result['field_value'])) {
  443. $field_option = new ExtraFieldOption($this->type);
  444. $options = explode('::', $result['field_value']);
  445. // only available for PHP 5.4 :( $result['field_value'] = $field_option->get($options[0])['id'].' -> ';
  446. $result = $field_option->get($options[0]);
  447. $result_second = $field_option->get($options[1]);
  448. if (!empty($result)) {
  449. $result['field_value'] = $result['option_display_text'].' -> ';
  450. $result['field_value'] .= $result_second['option_display_text'];
  451. }
  452. }
  453. }
  454. }
  455. return $result;
  456. } else {
  457. return false;
  458. }
  459. }
  460. /**
  461. * Gets the ID from the item (course, session, etc) for which
  462. * the given field is defined with the given value
  463. * @param string Field (type of data) we want to check
  464. * @param string Data we are looking for in the given field
  465. * @param bool Whether to transform the result to a human readable strings
  466. * @param bool Whether to return the last element or simply the first one we get
  467. * @return mixed Give the ID if found, or false on failure or not found
  468. * @assert (-1,-1) === false
  469. */
  470. public function get_item_id_from_field_variable_and_field_value(
  471. $field_variable,
  472. $field_value,
  473. $transform = false,
  474. $last = false
  475. ) {
  476. $field_value = Database::escape_string($field_value);
  477. $field_variable = Database::escape_string($field_variable);
  478. $sql = "SELECT {$this->handler_id} FROM {$this->table} s
  479. INNER JOIN {$this->table_handler_field} sf
  480. ON (s.field_id = sf.id)
  481. WHERE
  482. field_value = '$field_value' AND
  483. field_variable = '".$field_variable."'
  484. ORDER BY {$this->handler_id}
  485. ";
  486. if ($last) {
  487. // If we want the last element instead of the first
  488. // This is useful in special cases where there might
  489. // (erroneously) be more than one row for an item
  490. $sql .= ' DESC';
  491. }
  492. $result = Database::query($sql);
  493. if ($result !== false && Database::num_rows($result)) {
  494. $result = Database::fetch_array($result, 'ASSOC');
  495. return $result;
  496. } else {
  497. return false;
  498. }
  499. }
  500. /**
  501. * Get all values for a specific field id
  502. * @param int Field ID
  503. * @return mixed Array of values on success, false on failure or not found
  504. * @assert (-1) === false
  505. */
  506. public function get_values_by_field_id($field_id)
  507. {
  508. $field_id = intval($field_id);
  509. $sql = "SELECT s.*, field_type FROM {$this->table} s
  510. INNER JOIN {$this->table_handler_field} sf
  511. ON (s.field_id = sf.id)
  512. WHERE field_id = '".$field_id."' ORDER BY id";
  513. $result = Database::query($sql);
  514. if (Database::num_rows($result)) {
  515. return Database::store_result($result, 'ASSOC');
  516. }
  517. return false;
  518. }
  519. /**
  520. * @param int $itemId
  521. * @param int $fieldId
  522. * @return array
  523. */
  524. public function getAllValuesByItemAndField($itemId, $fieldId)
  525. {
  526. $fieldId = intval($fieldId);
  527. $itemId = intval($itemId);
  528. $sql = "SELECT s.* FROM {$this->table} s
  529. INNER JOIN {$this->table_handler_field} sf
  530. ON (s.field_id = sf.id)
  531. WHERE
  532. field_id = '".$fieldId."' AND
  533. {$this->handler_id} = '$itemId'
  534. ORDER BY field_value";
  535. $result = Database::query($sql);
  536. if (Database::num_rows($result)) {
  537. return Database::store_result($result, 'ASSOC');
  538. }
  539. return false;
  540. }
  541. /**
  542. * @param int $itemId
  543. * @param int $fieldId
  544. * @param string $fieldValue
  545. * @return array|bool
  546. */
  547. public function getAllValuesByItemAndFieldAndValue($itemId, $fieldId, $fieldValue)
  548. {
  549. $fieldId = intval($fieldId);
  550. $itemId = intval($itemId);
  551. $fieldValue = Database::escape_string($fieldValue);
  552. $sql = "SELECT s.* FROM {$this->table} s
  553. INNER JOIN {$this->table_handler_field} sf
  554. ON (s.field_id = sf.id)
  555. WHERE
  556. field_id = '".$fieldId."' AND
  557. {$this->handler_id} = '$itemId' AND
  558. field_value = $fieldValue
  559. ORDER BY field_value";
  560. $result = Database::query($sql);
  561. if (Database::num_rows($result)) {
  562. return Database::store_result($result, 'ASSOC');
  563. }
  564. return false;
  565. }
  566. /**
  567. * Deletes all the values related to a specific field ID
  568. * @param int Field ID
  569. * @return void
  570. * @assert ('a') == null
  571. */
  572. public function delete_all_values_by_field_id($field_id)
  573. {
  574. $field_id = intval($field_id);
  575. $sql = "DELETE FROM {$this->table} WHERE field_id = $field_id";
  576. Database::query($sql);
  577. }
  578. /**
  579. * Deletes values of a specific field for a specific item
  580. * @param int Item ID (session id, course id, etc)
  581. * @param int Field ID
  582. * @return void
  583. * @assert (-1,-1) == null
  584. */
  585. public function delete_values_by_handler_and_field_id($item_id, $field_id)
  586. {
  587. $field_id = intval($field_id);
  588. $item_id = Database::escape_string($item_id);
  589. $sql = "DELETE FROM {$this->table} WHERE {$this->handler_id} = '$item_id' AND field_id = '".$field_id."' ";
  590. Database::query($sql);
  591. }
  592. /**
  593. * @param int $itemId
  594. * @param int $fieldId
  595. * @param int $fieldValue
  596. */
  597. public function deleteValuesByHandlerAndFieldAndValue($itemId, $fieldId, $fieldValue)
  598. {
  599. $itemId = intval($itemId);
  600. $fieldId = intval($fieldId);
  601. $fieldValue = Database::escape_string($fieldValue);
  602. $sql = "DELETE FROM {$this->table}
  603. WHERE
  604. {$this->handler_id} = '$itemId' AND
  605. field_id = '".$fieldId."' AND
  606. field_value = '$fieldValue'";
  607. Database::query($sql);
  608. }
  609. /**
  610. * Not yet implemented - Compares the field values of two items
  611. * @param int Item 1
  612. * @param int Item 2
  613. * @return mixed Differential array generated from the comparison
  614. */
  615. public function compare_item_values($item_id, $item_to_compare)
  616. {
  617. }
  618. }