extra_field_option.lib.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. use Chamilo\CoreBundle\Entity\ExtraFieldOptions;
  4. /**
  5. * Class ExtraFieldOption
  6. * Handles the extra fields for various objects (users, sessions, courses)
  7. */
  8. class ExtraFieldOption extends Model
  9. {
  10. public $columns = [
  11. 'id',
  12. 'field_id',
  13. 'option_value',
  14. 'display_text',
  15. 'option_order',
  16. 'priority',
  17. 'priority_message',
  18. 'tms'
  19. ];
  20. public $extraField;
  21. public $fieldId;
  22. /**
  23. * Gets the table for the type of object for which we are using an extra field
  24. * @param string $type Type of object (course, user or session)
  25. */
  26. public function __construct($type)
  27. {
  28. parent::__construct();
  29. $this->type = $type;
  30. $extraField = new ExtraField($this->type);
  31. $this->extraField = $extraField;
  32. $this->table = Database::get_main_table(TABLE_EXTRA_FIELD_OPTIONS);
  33. $this->tableExtraField = Database::get_main_table(TABLE_EXTRA_FIELD);
  34. }
  35. /**
  36. * @return ExtraField
  37. */
  38. public function getExtraField()
  39. {
  40. return $this->extraField;
  41. }
  42. /**
  43. * Gets the number of options already available in the table for this item type
  44. * @return int Number of options available
  45. * @assert () >= 0
  46. */
  47. /*public function get_count()
  48. {
  49. $row = Database::select('count(*) as count', $this->table, array(), 'first');
  50. return $row['count'];
  51. }*/
  52. /**
  53. * Gets the number of options available for this field
  54. * @param int $fieldId
  55. *
  56. * @return int Number of options
  57. * @assert ('') === false
  58. * @assert (-1) == 0
  59. * @assert (0) == 0
  60. */
  61. public function get_count_by_field_id($fieldId)
  62. {
  63. if (empty($fieldId)) {
  64. return false;
  65. }
  66. $extraFieldType = $this->getExtraField()->getExtraFieldType();
  67. $fieldId = intval($fieldId);
  68. $sql = "SELECT count(*) as count
  69. FROM $this->table o
  70. INNER JOIN $this->tableExtraField e
  71. ON o.field_id = e.id
  72. WHERE
  73. o.field_id = $fieldId AND
  74. e.extra_field_type = $extraFieldType ";
  75. $result = Database::query($sql);
  76. $result = Database::fetch_array($result);
  77. return $result['count'];
  78. }
  79. /**
  80. * Returns a list of options for a specific field, separated by ";"
  81. * @param int $field_id
  82. * @param bool $add_id_in_array Indicates whether we want the results to be given with their id
  83. * @param string $ordered_by Order by clause (without the "order by") to be added to the SQL query
  84. * @return string List of options separated by ;
  85. * @assert (-1, false, null) == ''
  86. */
  87. public function getFieldOptionsToString($field_id, $add_id_in_array = false, $ordered_by = null)
  88. {
  89. $options = self::get_field_options_by_field($field_id, $add_id_in_array, $ordered_by);
  90. $new_options = [];
  91. if (!empty($options)) {
  92. foreach ($options as $option) {
  93. $new_options[] = $option['option_value'].':'.$option['display_text'];
  94. }
  95. $string = implode(';', $new_options);
  96. return $string;
  97. }
  98. return '';
  99. }
  100. /**
  101. * Delete all the options of a specific field
  102. * @param int $field_id
  103. *
  104. * @return void
  105. * @assert (-1) === false
  106. */
  107. public function delete_all_options_by_field_id($field_id)
  108. {
  109. $field_id = intval($field_id);
  110. $sql = "DELETE FROM {$this->table} WHERE field_id = $field_id";
  111. $r = Database::query($sql);
  112. return $r;
  113. }
  114. /**
  115. * @param array $params
  116. * @param bool $showQuery
  117. *
  118. * @return int
  119. */
  120. public function saveOptions($params, $showQuery = false)
  121. {
  122. $optionInfo = self::get_field_option_by_field_and_option(
  123. $params['field_id'],
  124. $params['option_value']
  125. );
  126. if ($optionInfo == false) {
  127. $optionValue = api_replace_dangerous_char($params['option_value']);
  128. $order = self::get_max_order($params['field_id']);
  129. $newParams = [
  130. 'field_id' => $params['field_id'],
  131. 'value' => trim($optionValue),
  132. 'display_text' => trim($params['display_text']),
  133. 'option_order' => $order
  134. ];
  135. return parent::save($newParams, $showQuery);
  136. }
  137. return false;
  138. }
  139. /**
  140. * Saves an option into the corresponding *_field_options table
  141. * @param array $params Parameters to be considered for the insertion
  142. * @param bool $showQuery Whether to show the query (sent to the parent save() method)
  143. *
  144. * @return bool True on success, false on error
  145. * @assert (array('field_id'=>0), false) === false
  146. * @assert (array('field_id'=>1), false) === true
  147. */
  148. public function save($params, $showQuery = false)
  149. {
  150. $field_id = intval($params['field_id']);
  151. if (empty($field_id)) {
  152. return false;
  153. }
  154. $parseOptions = in_array(
  155. $params['field_type'],
  156. [
  157. ExtraField::FIELD_TYPE_RADIO,
  158. ExtraField::FIELD_TYPE_SELECT,
  159. ExtraField::FIELD_TYPE_SELECT_MULTIPLE,
  160. ExtraField::FIELD_TYPE_DOUBLE_SELECT,
  161. ExtraField::FIELD_TYPE_SELECT_WITH_TEXT_FIELD,
  162. ExtraField::FIELD_TYPE_TRIPLE_SELECT
  163. ]
  164. );
  165. if (empty($params['field_options']) || !$parseOptions) {
  166. return true;
  167. };
  168. switch ($params['field_type']) {
  169. case ExtraField::FIELD_TYPE_DOUBLE_SELECT:
  170. //$params['field_options'] = France:Paris;Bretagne;Marseilles;Lyon|Belgique:Bruxelles;Namur;Liège;Bruges|Peru:Lima;Piura;
  171. case ExtraField::FIELD_TYPE_SELECT_WITH_TEXT_FIELD:
  172. //$params['field_options'] = Option 1|Option 2|Option 3
  173. $options_parsed = ExtraField::extra_field_double_select_convert_string_to_array(
  174. $params['field_options']
  175. );
  176. if (empty($options_parsed)) {
  177. break;
  178. }
  179. foreach ($options_parsed as $key => $option) {
  180. $new_params = [
  181. 'field_id' => $field_id,
  182. 'option_value' => 0,
  183. 'display_text' => $option['label'],
  184. 'option_order' => 0,
  185. ];
  186. // Looking if option already exists:
  187. $option_info = self::get_field_option_by_field_id_and_option_display_text(
  188. $field_id,
  189. $option['label']
  190. );
  191. if (empty($option_info)) {
  192. $sub_id = parent::save($new_params, $showQuery);
  193. } else {
  194. $sub_id = $option_info['id'];
  195. $new_params['id'] = $sub_id;
  196. parent::update($new_params, $showQuery);
  197. }
  198. if ($params['field_type'] == ExtraField::FIELD_TYPE_SELECT_WITH_TEXT_FIELD) {
  199. continue;
  200. }
  201. foreach ($option['options'] as $sub_option) {
  202. if (empty($sub_option)) {
  203. continue;
  204. }
  205. $new_params = [
  206. 'field_id' => $field_id,
  207. 'option_value' => $sub_id,
  208. 'display_text' => $sub_option,
  209. 'option_order' => 0,
  210. ];
  211. $option_info = self::getFieldOptionByFieldIdAndOptionDisplayTextAndOptionValue(
  212. $field_id,
  213. $sub_option,
  214. $sub_id
  215. );
  216. if (empty($option_info)) {
  217. parent::save($new_params, $showQuery);
  218. continue;
  219. }
  220. $new_params['id'] = $option_info['id'];
  221. parent::update($new_params, $showQuery);
  222. }
  223. }
  224. break;
  225. case ExtraField::FIELD_TYPE_TRIPLE_SELECT:
  226. //Format: Option1\Option11:Option111;Option112\Option12:Option121|Option2\Option21:Option211
  227. $options = ExtraField::tripleSelectConvertStringToArray($params['field_options']);
  228. if (!$options) {
  229. break;
  230. }
  231. foreach ($options as $level1) {
  232. $level1Params = [
  233. 'field_id' => $field_id,
  234. 'option_value' => 0,
  235. 'display_text' => $level1['label'],
  236. 'option_order' => 0,
  237. ];
  238. $optionInfo = self::get_field_option_by_field_id_and_option_display_text(
  239. $field_id,
  240. $level1['label']
  241. );
  242. if (empty($optionInfo)) {
  243. $level1Id = parent::save($level1Params);
  244. } else {
  245. $level1Id = $optionInfo['id'];
  246. $level1Params['id'] = $level1Id;
  247. parent::update($level1Params);
  248. }
  249. foreach ($level1['options'] as $level2) {
  250. $level2Params = [
  251. 'field_id' => $field_id,
  252. 'option_value' => $level1Id,
  253. 'display_text' => $level2['label'],
  254. 'display_order' => 0
  255. ];
  256. $optionInfo = self::getFieldOptionByFieldIdAndOptionDisplayTextAndOptionValue(
  257. $field_id,
  258. $level2['label'],
  259. $level1Id
  260. );
  261. if (empty($optionInfo)) {
  262. $level2Id = parent::save($level2Params);
  263. } else {
  264. $level2Id = $optionInfo['id'];
  265. $level2Params['id'] = $level2Id;
  266. parent::update($level2Params);
  267. }
  268. foreach ($level2['options'] as $level3) {
  269. foreach ($level3 as $item) {
  270. $level3Params = [
  271. 'field_id' => $field_id,
  272. 'option_value' => $level2Id,
  273. 'display_text' => $item,
  274. 'display_order' => 0
  275. ];
  276. $optionInfo = self::getFieldOptionByFieldIdAndOptionDisplayTextAndOptionValue(
  277. $field_id,
  278. $item,
  279. $level2Id
  280. );
  281. if (empty($optionInfo)) {
  282. parent::save($level3Params);
  283. } else {
  284. $level3Params['id'] = $optionInfo['id'];
  285. parent::update($level3Params);
  286. }
  287. }
  288. }
  289. }
  290. }
  291. break;
  292. default:
  293. $list = explode(';', $params['field_options']);
  294. foreach ($list as $option) {
  295. $option_info = self::get_field_option_by_field_and_option($field_id, $option);
  296. // Use URLify only for new items
  297. $optionValue = api_replace_dangerous_char($option);
  298. $option = trim($option);
  299. if ($option_info != false) {
  300. continue;
  301. }
  302. $order = self::get_max_order($field_id);
  303. $new_params = [
  304. 'field_id' => $field_id,
  305. 'option_value' => trim($optionValue),
  306. 'display_text' => trim($option),
  307. 'option_order' => $order,
  308. ];
  309. parent::save($new_params, $showQuery);
  310. }
  311. break;
  312. }
  313. return true;
  314. }
  315. /**
  316. * Save one option item at a time
  317. * @param array $params Parameters specific to the option
  318. * @param bool $show_query Whether to show the query (sent to parent save() method)
  319. * @param bool $insert_repeated Whether to insert even if the option already exists
  320. * @return bool True on success, false on failure
  321. * @assert (array('field_id'=>0),false) === false
  322. * @assert (array('field_id'=>0),false) === true
  323. */
  324. public function save_one_item($params, $show_query = false, $insert_repeated = true)
  325. {
  326. $field_id = intval($params['field_id']);
  327. if (empty($field_id)) {
  328. return false;
  329. }
  330. if (isset($params['option_value'])) {
  331. $params['option_value'] = trim($params['option_value']);
  332. }
  333. if (isset($params['display_text'])) {
  334. $params['display_text'] = trim($params['display_text']);
  335. }
  336. if (empty($params['option_order'])) {
  337. $order = self::get_max_order($field_id);
  338. $params['option_order'] = $order;
  339. }
  340. if ($insert_repeated) {
  341. parent::save($params, $show_query);
  342. } else {
  343. $check = self::get_field_option_by_field_and_option(
  344. $field_id,
  345. $params['option_value']
  346. );
  347. if ($check == false) {
  348. parent::save($params, $show_query);
  349. }
  350. }
  351. return true;
  352. }
  353. /**
  354. * Get the complete row of a specific option of a specific field
  355. * @param int $field_id
  356. * @param string $option_value Value of the option
  357. * @return mixed The row on success or false on failure
  358. * @assert (0,'') === false
  359. */
  360. public function get_field_option_by_field_and_option($field_id, $option_value)
  361. {
  362. $field_id = intval($field_id);
  363. $option_value = Database::escape_string($option_value);
  364. $extraFieldType = $this->getExtraField()->getExtraFieldType();
  365. $sql = "SELECT s.* FROM {$this->table} s
  366. INNER JOIN {$this->tableExtraField} sf
  367. ON (s.field_id = sf.id)
  368. WHERE
  369. field_id = $field_id AND
  370. option_value = '".$option_value."' AND
  371. sf.extra_field_type = $extraFieldType
  372. ";
  373. $result = Database::query($sql);
  374. if (Database::num_rows($result) > 0) {
  375. return Database::store_result($result, 'ASSOC');
  376. }
  377. return false;
  378. }
  379. /**
  380. * Get the complete row of a specific option's display text of a specific field
  381. * @param int $field_id
  382. * @param string $option_display_text Display value of the option
  383. * @return mixed The row on success or false on failure
  384. * @assert (0, '') === false
  385. */
  386. public function get_field_option_by_field_id_and_option_display_text($field_id, $option_display_text)
  387. {
  388. $field_id = intval($field_id);
  389. $option_display_text = Database::escape_string($option_display_text);
  390. $extraFieldType = $this->getExtraField()->getExtraFieldType();
  391. $sql = "SELECT s.* FROM {$this->table} s
  392. INNER JOIN {$this->tableExtraField} sf
  393. ON (s.field_id = sf.id)
  394. WHERE
  395. field_id = $field_id AND
  396. s.display_text = '".$option_display_text."' AND
  397. sf.extra_field_type = $extraFieldType
  398. ";
  399. $result = Database::query($sql);
  400. if (Database::num_rows($result) > 0) {
  401. return Database::fetch_array($result, 'ASSOC');
  402. }
  403. return false;
  404. }
  405. /**
  406. * Get the complete row of a specific option's display text of a specific field
  407. * @param int $field_id
  408. * @param string $option_display_text Display value of the option
  409. * @param string $option_value Value of the option
  410. *
  411. * @return mixed The row on success or false on failure
  412. * @assert (0, '', '') === false
  413. */
  414. public function getFieldOptionByFieldIdAndOptionDisplayTextAndOptionValue(
  415. $field_id,
  416. $option_display_text,
  417. $option_value
  418. ) {
  419. $field_id = intval($field_id);
  420. $option_display_text = Database::escape_string($option_display_text);
  421. $option_value = Database::escape_string($option_value);
  422. $extraFieldType = $this->getExtraField()->getExtraFieldType();
  423. $sql = "SELECT s.* FROM {$this->table} s
  424. INNER JOIN {$this->tableExtraField} sf
  425. ON (s.field_id = sf.id)
  426. WHERE
  427. field_id = $field_id AND
  428. sf.display_text = '".$option_display_text."' AND
  429. option_value = '$option_value' AND
  430. sf.extra_field_type = ".$extraFieldType."
  431. ";
  432. $result = Database::query($sql);
  433. if (Database::num_rows($result) > 0) {
  434. return Database::fetch_array($result, 'ASSOC');
  435. }
  436. return false;
  437. }
  438. /**
  439. * Gets an array of options for a specific field
  440. * @param int $field_id The field ID
  441. * @param bool $add_id_in_array Whether to add the row ID in the result
  442. * @param null $ordered_by Extra ordering query bit
  443. * @return array The options if they exists. Otherwise return false
  444. */
  445. public function get_field_options_by_field($field_id, $add_id_in_array = false, $ordered_by = null)
  446. {
  447. $field_id = intval($field_id);
  448. $orderBy = null;
  449. switch ($ordered_by) {
  450. case 'id':
  451. $orderBy = ['id' => 'ASC'];
  452. break;
  453. case 'field_id':
  454. $orderBy = ['fieldId' => 'ASC'];
  455. break;
  456. case 'option_value':
  457. $orderBy = ['optionValue' => 'ASC'];
  458. break;
  459. case 'display_text':
  460. $orderBy = ['displayText' => 'ASC'];
  461. break;
  462. case 'priority':
  463. $orderBy = ['priority' => 'ASC'];
  464. break;
  465. case 'priority_message':
  466. $orderBy = ['priorityMessage' => 'ASC'];
  467. break;
  468. case 'option_order':
  469. $orderBy = ['optionOrder' => 'ASC'];
  470. break;
  471. }
  472. $result = Database::getManager()
  473. ->getRepository('ChamiloCoreBundle:ExtraFieldOptions')
  474. ->findBy(['field' => $field_id], $orderBy);
  475. if (!$result) {
  476. return false;
  477. }
  478. $options = [];
  479. /** @var ExtraFieldOptions $row */
  480. foreach ($result as $row) {
  481. $option = [
  482. 'id' => $row->getId(),
  483. 'field_id' => $row->getField()->getId(),
  484. 'option_value' => $row->getValue(),
  485. 'display_text' => self::translateDisplayName($row->getDisplayText()),
  486. 'priority' => $row->getPriority(),
  487. 'priority_message' => $row->getPriorityMessage(),
  488. 'option_order' => $row->getOptionOrder()
  489. ];
  490. if ($add_id_in_array) {
  491. $options[$row->getId()] = $option;
  492. continue;
  493. }
  494. $options[] = $option;
  495. }
  496. return $options;
  497. }
  498. /**
  499. * Get options for a specific field as array or in JSON format suited for the double-select format
  500. * @param int $option_value_id Option value ID
  501. * @param bool $to_json Return format (whether it should be formatted to JSON or not)
  502. * @return mixed Row/JSON on success
  503. */
  504. public function get_second_select_field_options_by_field($option_value_id, $to_json = false)
  505. {
  506. $em = Database::getManager();
  507. $option = $em->find('ChamiloCoreBundle:ExtraFieldOptions', intval($option_value_id));
  508. if (!$option) {
  509. return !$to_json ? [] : '{}';
  510. }
  511. $subOptions = $em
  512. ->getRepository('ChamiloCoreBundle:ExtraFieldOptions')
  513. ->findSecondaryOptions($option);
  514. $optionsInfo = [];
  515. /** @var ExtraFieldOptions $subOption */
  516. foreach ($subOptions as $subOption) {
  517. $optionsInfo[] = [
  518. 'id' => $subOption->getId(),
  519. 'field_id' => $subOption->getField()->getId(),
  520. 'option_value' => $subOption->getValue(),
  521. 'display_text' => $subOption->getDisplayText(),
  522. 'priority' => $subOption->getPriority(),
  523. 'priority_message' => $subOption->getPriorityMessage(),
  524. 'option_order' => $subOption->getOptionOrder()
  525. ];
  526. }
  527. if (!$to_json) {
  528. return $optionsInfo;
  529. }
  530. $json = [];
  531. foreach ($optionsInfo as $optionInfo) {
  532. $json[$optionInfo['id']] = $optionInfo['display_text'];
  533. }
  534. return json_encode($json);
  535. }
  536. /**
  537. * Get options for a specific field as string split by ;
  538. * @param int $field_id
  539. * @param string $ordered_by Extra query bit for reordering
  540. * @return string HTML string of options
  541. * @assert (0, '') === null
  542. */
  543. public function get_field_options_by_field_to_string($field_id, $ordered_by = null)
  544. {
  545. $field = new ExtraField($this->type);
  546. $field_info = $field->get($field_id);
  547. $options = self::get_field_options_by_field($field_id, false, $ordered_by);
  548. $elements = [];
  549. if (!empty($options)) {
  550. switch ($field_info['field_type']) {
  551. case ExtraField::FIELD_TYPE_DOUBLE_SELECT:
  552. $html = ExtraField::extra_field_double_select_convert_array_to_string($options);
  553. break;
  554. case ExtraField::FIELD_TYPE_SELECT_WITH_TEXT_FIELD:
  555. $html = ExtraField::extrafieldSelectWithTextConvertArrayToString($options);
  556. break;
  557. case ExtraField::FIELD_TYPE_TRIPLE_SELECT:
  558. $html = ExtraField::tripleSelectConvertArrayToString($options);
  559. break;
  560. default:
  561. foreach ($options as $option) {
  562. $elements[] = $option['option_value'];
  563. }
  564. $html = implode(';', $elements);
  565. break;
  566. }
  567. return $html;
  568. }
  569. return null;
  570. }
  571. /**
  572. * Get the maximum order value for a specific field
  573. * @param int $field_id
  574. * @return int Current max ID + 1 (we start from 0)
  575. * @assert (0, '') === 1
  576. */
  577. public function get_max_order($field_id)
  578. {
  579. $field_id = intval($field_id);
  580. $sql = "SELECT MAX(option_order)
  581. FROM {$this->table}
  582. WHERE field_id = $field_id";
  583. $res = Database::query($sql);
  584. $max = 1;
  585. if (Database::num_rows($res) > 0) {
  586. $row = Database::fetch_array($res);
  587. $max = $row[0] + 1;
  588. }
  589. return $max;
  590. }
  591. /**
  592. * Display a form with the options for the field_id given in REQUEST
  593. * @return void Prints output
  594. */
  595. public function display()
  596. {
  597. // action links
  598. echo '<div class="actions">';
  599. $field_id = isset($_REQUEST['field_id']) ? intval($_REQUEST['field_id']) : null;
  600. echo '<a href="'.api_get_self().'?action=add&type='.$this->type.'&field_id='.$field_id.'">'.
  601. Display::return_icon('add_user_fields.png', get_lang('Add'), '', ICON_SIZE_MEDIUM).'</a>';
  602. echo '</div>';
  603. echo Display::grid_html('extra_field_options');
  604. }
  605. /**
  606. * @return array
  607. */
  608. public function getPriorityOptions()
  609. {
  610. return [
  611. '' => get_lang('SelectAnOption'),
  612. 1 => get_lang('Success'),
  613. 2 => get_lang('Info'),
  614. 3 => get_lang('Warning'),
  615. 4 => get_lang('Error'),
  616. ];
  617. }
  618. /**
  619. * @param $priority
  620. * @return null|string
  621. */
  622. public function getPriorityMessageType($priority)
  623. {
  624. switch ($priority) {
  625. case 1:
  626. return 'success';
  627. case 2:
  628. return 'info';
  629. case 3:
  630. return 'warning';
  631. case 4:
  632. return 'error';
  633. }
  634. return null;
  635. }
  636. /**
  637. * Returns an HTML form for the current field
  638. * @param string URL to send the form to (action=...)
  639. * @param string Type of action to offer through the form (edit, usually)
  640. *
  641. * @return FormValidator
  642. */
  643. public function return_form($url, $action)
  644. {
  645. $form_name = $this->type.'_field';
  646. $form = new FormValidator($form_name, 'post', $url);
  647. // Setting the form elements
  648. $header = get_lang('Add');
  649. if ($action == 'edit') {
  650. $header = get_lang('Modify');
  651. }
  652. $form->addElement('header', $header);
  653. $id = isset($_GET['id']) ? intval($_GET['id']) : '';
  654. $form->addElement('hidden', 'id', $id);
  655. $form->addElement('hidden', 'type', $this->type);
  656. $form->addElement('hidden', 'field_id', $this->fieldId);
  657. if ($action == 'edit') {
  658. $translateUrl = api_get_path(WEB_CODE_PATH).'extrafield/translate.php?'.http_build_query([
  659. 'extra_field_option' => $id
  660. ]);
  661. $translateButton = Display::toolbarButton(
  662. get_lang('TranslateThisTerm'),
  663. $translateUrl,
  664. 'language',
  665. 'link'
  666. );
  667. $form->addText(
  668. 'display_text',
  669. [get_lang('Name'), $translateButton]
  670. );
  671. } else {
  672. $form->addElement('text', 'display_text', get_lang('Name'));
  673. }
  674. $form->addElement('text', 'option_value', get_lang('Value'));
  675. $form->addElement('text', 'option_order', get_lang('Order'));
  676. $form->addElement('select', 'priority', get_lang('Priority'), $this->getPriorityOptions());
  677. $form->addElement('textarea', 'priority_message', get_lang('PriorityOfMessage'));
  678. $defaults = [];
  679. if ($action == 'edit') {
  680. // Setting the defaults
  681. $defaults = $this->get($id, false);
  682. $form->freeze('option_value');
  683. $form->addButtonUpdate(get_lang('Modify'));
  684. } else {
  685. $form->addButtonCreate(get_lang('Add'));
  686. }
  687. $form->setDefaults($defaults);
  688. // Setting the rules
  689. $form->addRule('display_text', get_lang('ThisFieldIsRequired'), 'required');
  690. $form->addRule('option_value', get_lang('ThisFieldIsRequired'), 'required');
  691. return $form;
  692. }
  693. /**
  694. * @param string $tag
  695. * @param int $field_id
  696. * @param int $limit
  697. * @return array
  698. */
  699. public function searchByField($tag, $field_id, $limit = 10)
  700. {
  701. $field_id = intval($field_id);
  702. $limit = intval($limit);
  703. $tag = Database::escape_string($tag);
  704. $sql = "SELECT DISTINCT id, option_display_text
  705. FROM {$this->table}
  706. WHERE
  707. field_id = '".$field_id."' AND
  708. option_value LIKE '%$tag%'
  709. ORDER BY option_value
  710. LIMIT 0, $limit
  711. ";
  712. $result = Database::query($sql);
  713. $values = [];
  714. if (Database::num_rows($result)) {
  715. $values = Database::store_result($result, 'ASSOC');
  716. }
  717. return $values;
  718. }
  719. /**
  720. * @param string $tag
  721. * @param int $field_id
  722. * @param int $limit
  723. *
  724. * @return string
  725. */
  726. public function getSearchOptionsByField($tag, $field_id, $limit = 10)
  727. {
  728. $result = $this->searchByField($tag, $field_id, $limit = 10);
  729. $values = [];
  730. $json = null;
  731. if (!empty($result)) {
  732. foreach ($result as $item) {
  733. $values[] = [
  734. 'value' => $item['id'],
  735. 'caption' => $item['option_display_text'],
  736. ];
  737. }
  738. $json = json_encode($values);
  739. }
  740. return $json;
  741. }
  742. /**
  743. * Gets an element
  744. * @param int $id
  745. * @param bool $translateDisplayText Optional
  746. * @return array
  747. */
  748. public function get($id, $translateDisplayText = true)
  749. {
  750. $info = parent::get($id);
  751. if ($translateDisplayText) {
  752. $info['display_text'] = self::translateDisplayName($info['display_text']);
  753. }
  754. return $info;
  755. }
  756. /**
  757. * Translate the display text for a extra field option
  758. * @param string $defaultDisplayText
  759. * @return string
  760. */
  761. public static function translateDisplayName($defaultDisplayText)
  762. {
  763. $variableLanguage = self::getLanguageVariable($defaultDisplayText);
  764. return isset($GLOBALS[$variableLanguage]) ? $GLOBALS[$variableLanguage] : $defaultDisplayText;
  765. }
  766. /**
  767. * @param $defaultDisplayText
  768. * @return mixed|string
  769. */
  770. public static function getLanguageVariable($defaultDisplayText)
  771. {
  772. $variableLanguage = api_replace_dangerous_char($defaultDisplayText);
  773. $variableLanguage = str_replace('-', '_', $variableLanguage);
  774. $variableLanguage = api_underscore_to_camel_case($variableLanguage);
  775. return $variableLanguage;
  776. }
  777. /**
  778. * @param null $options
  779. * @return array
  780. */
  781. public function get_all($options = null)
  782. {
  783. $result = parent::get_all($options);
  784. foreach ($result as &$row) {
  785. $row['display_text'] = self::translateDisplayName($row['display_text']);
  786. }
  787. return $result;
  788. }
  789. }