extra_field.lib.php 135 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. use Chamilo\CoreBundle\Entity\ExtraField as EntityExtraField;
  4. /**
  5. * Class ExtraField
  6. */
  7. class ExtraField extends Model
  8. {
  9. public $columns = array(
  10. 'id',
  11. 'field_type',
  12. 'variable',
  13. 'display_text',
  14. 'default_value',
  15. 'field_order',
  16. 'visible_to_self',
  17. 'visible_to_others',
  18. 'changeable',
  19. 'filter',
  20. 'extra_field_type',
  21. //Enable this when field_loggeable is introduced as a table field (2.0)
  22. //'field_loggeable',
  23. 'created_at'
  24. );
  25. public $ops = array(
  26. 'eq' => '=', //equal
  27. 'ne' => '<>', //not equal
  28. 'lt' => '<', //less than
  29. 'le' => '<=', //less than or equal
  30. 'gt' => '>', //greater than
  31. 'ge' => '>=', //greater than or equal
  32. 'bw' => 'LIKE', //begins with
  33. 'bn' => 'NOT LIKE', //doesn't begin with
  34. 'in' => 'LIKE', //is in
  35. 'ni' => 'NOT LIKE', //is not in
  36. 'ew' => 'LIKE', //ends with
  37. 'en' => 'NOT LIKE', //doesn't end with
  38. 'cn' => 'LIKE', //contains
  39. 'nc' => 'NOT LIKE' //doesn't contain
  40. );
  41. const FIELD_TYPE_TEXT = 1;
  42. const FIELD_TYPE_TEXTAREA = 2;
  43. const FIELD_TYPE_RADIO = 3;
  44. const FIELD_TYPE_SELECT = 4;
  45. const FIELD_TYPE_SELECT_MULTIPLE = 5;
  46. const FIELD_TYPE_DATE = 6;
  47. const FIELD_TYPE_DATETIME = 7;
  48. const FIELD_TYPE_DOUBLE_SELECT = 8;
  49. const FIELD_TYPE_DIVIDER = 9;
  50. const FIELD_TYPE_TAG = 10;
  51. const FIELD_TYPE_TIMEZONE = 11;
  52. const FIELD_TYPE_SOCIAL_PROFILE = 12;
  53. const FIELD_TYPE_CHECKBOX = 13;
  54. const FIELD_TYPE_MOBILE_PHONE_NUMBER = 14;
  55. const FIELD_TYPE_INTEGER = 15;
  56. const FIELD_TYPE_FILE_IMAGE = 16;
  57. const FIELD_TYPE_FLOAT = 17;
  58. const FIELD_TYPE_FILE = 18;
  59. const FIELD_TYPE_VIDEO_URL = 19;
  60. const FIELD_TYPE_LETTERS_ONLY = 20;
  61. const FIELD_TYPE_ALPHANUMERIC = 21;
  62. const FIELD_TYPE_LETTERS_SPACE = 22;
  63. const FIELD_TYPE_ALPHANUMERIC_SPACE = 23;
  64. const FIELD_TYPE_GEOLOCALIZATION = 24;
  65. const FIELD_TYPE_GEOLOCALIZATION_COORDINATES = 25;
  66. const FIELD_TYPE_SELECT_WITH_TEXT_FIELD = 26;
  67. const FIELD_TYPE_TRIPLE_SELECT = 27;
  68. public $type = 'user';
  69. public $pageName;
  70. public $pageUrl;
  71. public $extraFieldType = 0;
  72. public $table_field_options;
  73. public $table_field_values;
  74. public $table_field_tag;
  75. public $table_field_rel_tag;
  76. public $handler_id;
  77. public $primaryKey;
  78. /**
  79. * @param string $type
  80. */
  81. public function __construct($type)
  82. {
  83. parent::__construct();
  84. $this->type = $type;
  85. $this->table = Database::get_main_table(TABLE_EXTRA_FIELD);
  86. $this->table_field_options = Database::get_main_table(TABLE_EXTRA_FIELD_OPTIONS);
  87. $this->table_field_values = Database::get_main_table(TABLE_EXTRA_FIELD_VALUES);
  88. $this->table_field_tag = Database::get_main_table(TABLE_MAIN_TAG);
  89. $this->table_field_rel_tag = Database::get_main_table(TABLE_MAIN_EXTRA_FIELD_REL_TAG);
  90. $this->handler_id = 'item_id';
  91. switch ($this->type) {
  92. case 'calendar_event':
  93. $this->extraFieldType = EntityExtraField::CALENDAR_FIELD_TYPE;
  94. break;
  95. case 'course':
  96. $this->extraFieldType = EntityExtraField::COURSE_FIELD_TYPE;
  97. $this->primaryKey = 'id';
  98. break;
  99. case 'user':
  100. $this->extraFieldType = EntityExtraField::USER_FIELD_TYPE;
  101. $this->primaryKey = 'id';
  102. break;
  103. case 'session':
  104. $this->extraFieldType = EntityExtraField::SESSION_FIELD_TYPE;
  105. $this->primaryKey = 'id';
  106. break;
  107. case 'question':
  108. $this->extraFieldType = EntityExtraField::QUESTION_FIELD_TYPE;
  109. break;
  110. case 'lp':
  111. $this->extraFieldType = EntityExtraField::LP_FIELD_TYPE;
  112. break;
  113. case 'lp_item':
  114. $this->extraFieldType = EntityExtraField::LP_ITEM_FIELD_TYPE;
  115. break;
  116. case 'skill':
  117. $this->extraFieldType = EntityExtraField::SKILL_FIELD_TYPE;
  118. break;
  119. case 'work':
  120. $this->extraFieldType = EntityExtraField::WORK_FIELD_TYPE;
  121. break;
  122. case 'career':
  123. $this->extraFieldType = EntityExtraField::CAREER_FIELD_TYPE;
  124. break;
  125. case 'user_certificate':
  126. $this->extraFieldType = EntityExtraField::USER_CERTIFICATE;
  127. break;
  128. case 'survey':
  129. $this->extraFieldType = EntityExtraField::SURVEY_FIELD_TYPE;
  130. break;
  131. }
  132. $this->pageUrl = 'extra_fields.php?type='.$this->type;
  133. // Example QuestionFields
  134. $this->pageName = get_lang(ucwords($this->type).'Fields');
  135. }
  136. /**
  137. * @return int
  138. */
  139. public function getExtraFieldType()
  140. {
  141. return (int) $this->extraFieldType;
  142. }
  143. /**
  144. * @return array
  145. */
  146. public static function getValidExtraFieldTypes()
  147. {
  148. return array(
  149. 'user',
  150. 'course',
  151. 'session',
  152. 'question',
  153. 'lp',
  154. 'calendar_event',
  155. 'lp_item',
  156. 'skill',
  157. 'work',
  158. 'career',
  159. 'user_certificate',
  160. 'survey'
  161. );
  162. }
  163. /**
  164. * @return int
  165. */
  166. public function get_count()
  167. {
  168. $em = Database::getManager();
  169. $query = $em->getRepository('ChamiloCoreBundle:ExtraField')->createQueryBuilder('e');
  170. $query->select('count(e.id)');
  171. $query->where('e.extraFieldType = :type');
  172. $query->setParameter('type', $this->getExtraFieldType());
  173. return $query->getQuery()->getSingleScalarResult();
  174. }
  175. /**
  176. * @param string $sidx
  177. * @param string $sord
  178. * @param int $start
  179. * @param int $limit
  180. *
  181. * @return array
  182. */
  183. public function getAllGrid($sidx, $sord, $start, $limit)
  184. {
  185. switch ($sidx) {
  186. case 'field_order':
  187. $sidx = 'e.fieldOrder';
  188. break;
  189. case 'variable':
  190. $sidx = 'e.variable';
  191. break;
  192. case 'display_text':
  193. $sidx = 'e.displayText';
  194. break;
  195. case 'changeable':
  196. $sidx = 'e.changeable';
  197. break;
  198. case 'visible_to_self':
  199. $sidx = 'e.visibleToSelf';
  200. break;
  201. case 'visible_to_others':
  202. $sidx = 'e.visibleToOthers';
  203. break;
  204. case 'filter':
  205. $sidx = 'e.filter';
  206. break;
  207. case 'display_text':
  208. $sidx = 'e.fieldType';
  209. break;
  210. }
  211. $em = Database::getManager();
  212. $query = $em->getRepository('ChamiloCoreBundle:ExtraField')->createQueryBuilder('e');
  213. $query->select('e')
  214. ->where('e.extraFieldType = :type')
  215. ->setParameter('type', $this->getExtraFieldType())
  216. ->orderBy($sidx, $sord)
  217. ->setFirstResult($start)
  218. ->setMaxResults($limit);
  219. //echo $query->getQuery()->getSQL();
  220. return $query->getQuery()->getArrayResult();
  221. }
  222. /**
  223. * @param array $conditions
  224. * @param null $order_field_options_by
  225. *
  226. * @return array
  227. */
  228. public function get_all($conditions = [], $order_field_options_by = null)
  229. {
  230. $conditions = Database::parse_conditions(array('where' => $conditions));
  231. if (empty($conditions)) {
  232. $conditions .= " WHERE extra_field_type = ".$this->extraFieldType;
  233. } else {
  234. $conditions .= " AND extra_field_type = ".$this->extraFieldType;
  235. }
  236. $sql = "SELECT * FROM $this->table
  237. $conditions
  238. ORDER BY field_order ASC
  239. ";
  240. $result = Database::query($sql);
  241. $extraFields = Database::store_result($result, 'ASSOC');
  242. $option = new ExtraFieldOption($this->type);
  243. if (!empty($extraFields)) {
  244. foreach ($extraFields as &$extraField) {
  245. $extraField['display_text'] = self::translateDisplayName(
  246. $extraField['variable'],
  247. $extraField['display_text']
  248. );
  249. $extraField['options'] = $option->get_field_options_by_field(
  250. $extraField['id'],
  251. false,
  252. $order_field_options_by
  253. );
  254. }
  255. }
  256. return $extraFields;
  257. }
  258. /**
  259. * @param string $variable
  260. *
  261. * @return array|bool
  262. */
  263. public function get_handler_field_info_by_field_variable($variable)
  264. {
  265. $variable = Database::escape_string($variable);
  266. $sql = "SELECT * FROM {$this->table}
  267. WHERE
  268. variable = '$variable' AND
  269. extra_field_type = $this->extraFieldType";
  270. $result = Database::query($sql);
  271. if (Database::num_rows($result)) {
  272. $row = Database::fetch_array($result, 'ASSOC');
  273. $row['display_text'] = self::translateDisplayName(
  274. $row['variable'],
  275. $row['display_text']
  276. );
  277. // All the options of the field
  278. $sql = "SELECT * FROM $this->table_field_options
  279. WHERE field_id='".intval($row['id'])."'
  280. ORDER BY option_order ASC";
  281. $result = Database::query($sql);
  282. while ($option = Database::fetch_array($result)) {
  283. $row['options'][$option['id']] = $option;
  284. }
  285. return $row;
  286. } else {
  287. return false;
  288. }
  289. }
  290. /**
  291. * Get all the field info for tags
  292. * @param string $variable
  293. *
  294. * @return array|bool
  295. */
  296. public function get_handler_field_info_by_tags($variable)
  297. {
  298. $variable = Database::escape_string($variable);
  299. $sql = "SELECT * FROM {$this->table}
  300. WHERE
  301. variable = '$variable' AND
  302. extra_field_type = $this->extraFieldType";
  303. $result = Database::query($sql);
  304. if (Database::num_rows($result)) {
  305. $row = Database::fetch_array($result, 'ASSOC');
  306. $row['display_text'] = self::translateDisplayName(
  307. $row['variable'],
  308. $row['display_text']
  309. );
  310. // All the tags of the field
  311. $sql = "SELECT * FROM $this->table_field_tag
  312. WHERE field_id='".intval($row['id'])."'
  313. ORDER BY id ASC";
  314. $result = Database::query($sql);
  315. while ($option = Database::fetch_array($result, 'ASSOC')) {
  316. $row['options'][$option['id']] = $option;
  317. }
  318. return $row;
  319. } else {
  320. return false;
  321. }
  322. }
  323. /**
  324. * @param int $fieldId
  325. *
  326. * @return array|bool
  327. */
  328. public function getFieldInfoByFieldId($fieldId)
  329. {
  330. $fieldId = intval($fieldId);
  331. $sql = "SELECT * FROM {$this->table}
  332. WHERE
  333. id = '$fieldId' AND
  334. extra_field_type = $this->extraFieldType";
  335. $result = Database::query($sql);
  336. if (Database::num_rows($result)) {
  337. $row = Database::fetch_array($result, 'ASSOC');
  338. // All the options of the field
  339. $sql = "SELECT * FROM $this->table_field_options
  340. WHERE field_id='".$fieldId."'
  341. ORDER BY option_order ASC";
  342. $result = Database::query($sql);
  343. while ($option = Database::fetch_array($result)) {
  344. $row['options'][$option['id']] = $option;
  345. }
  346. return $row;
  347. } else {
  348. return false;
  349. }
  350. }
  351. /**
  352. * @return int
  353. */
  354. public function get_max_field_order()
  355. {
  356. $sql = "SELECT MAX(field_order)
  357. FROM {$this->table}
  358. WHERE
  359. extra_field_type = '.$this->extraFieldType.'";
  360. $res = Database::query($sql);
  361. $order = 0;
  362. if (Database::num_rows($res) > 0) {
  363. $row = Database::fetch_row($res);
  364. $order = $row[0] + 1;
  365. }
  366. return $order;
  367. }
  368. /**
  369. * @param string $handler
  370. *
  371. * @return array
  372. */
  373. public static function get_extra_fields_by_handler($handler)
  374. {
  375. $types = array();
  376. $types[self::FIELD_TYPE_TEXT] = get_lang('FieldTypeText');
  377. $types[self::FIELD_TYPE_TEXTAREA] = get_lang('FieldTypeTextarea');
  378. $types[self::FIELD_TYPE_RADIO] = get_lang('FieldTypeRadio');
  379. $types[self::FIELD_TYPE_SELECT] = get_lang('FieldTypeSelect');
  380. $types[self::FIELD_TYPE_SELECT_MULTIPLE] = get_lang('FieldTypeSelectMultiple');
  381. $types[self::FIELD_TYPE_DATE] = get_lang('FieldTypeDate');
  382. $types[self::FIELD_TYPE_DATETIME] = get_lang('FieldTypeDatetime');
  383. $types[self::FIELD_TYPE_DOUBLE_SELECT] = get_lang('FieldTypeDoubleSelect');
  384. $types[self::FIELD_TYPE_DIVIDER] = get_lang('FieldTypeDivider');
  385. $types[self::FIELD_TYPE_TAG] = get_lang('FieldTypeTag');
  386. $types[self::FIELD_TYPE_TIMEZONE] = get_lang('FieldTypeTimezone');
  387. $types[self::FIELD_TYPE_SOCIAL_PROFILE] = get_lang('FieldTypeSocialProfile');
  388. $types[self::FIELD_TYPE_MOBILE_PHONE_NUMBER] = get_lang('FieldTypeMobilePhoneNumber');
  389. $types[self::FIELD_TYPE_CHECKBOX] = get_lang('FieldTypeCheckbox');
  390. $types[self::FIELD_TYPE_INTEGER] = get_lang('FieldTypeInteger');
  391. $types[self::FIELD_TYPE_FILE_IMAGE] = get_lang('FieldTypeFileImage');
  392. $types[self::FIELD_TYPE_FLOAT] = get_lang('FieldTypeFloat');
  393. $types[self::FIELD_TYPE_FILE] = get_lang('FieldTypeFile');
  394. $types[self::FIELD_TYPE_VIDEO_URL] = get_lang('FieldTypeVideoUrl');
  395. $types[self::FIELD_TYPE_LETTERS_ONLY] = get_lang('FieldTypeOnlyLetters');
  396. $types[self::FIELD_TYPE_ALPHANUMERIC] = get_lang('FieldTypeAlphanumeric');
  397. $types[self::FIELD_TYPE_LETTERS_SPACE] = get_lang(
  398. 'FieldTypeLettersSpaces'
  399. );
  400. $types[self::FIELD_TYPE_ALPHANUMERIC_SPACE] = get_lang(
  401. 'FieldTypeAlphanumericSpaces'
  402. );
  403. $types[self::FIELD_TYPE_GEOLOCALIZATION] = get_lang(
  404. 'Geolocalization'
  405. );
  406. $types[self::FIELD_TYPE_GEOLOCALIZATION_COORDINATES] = get_lang(
  407. 'GeolocalizationCoordinates'
  408. );
  409. $types[self::FIELD_TYPE_SELECT_WITH_TEXT_FIELD] = get_lang('FieldTypeSelectWithTextField');
  410. $types[self::FIELD_TYPE_TRIPLE_SELECT] = get_lang('FieldTypeTripleSelect');
  411. switch ($handler) {
  412. case 'course':
  413. // no break
  414. case 'session':
  415. // no break
  416. case 'user':
  417. // no break
  418. case 'skill':
  419. break;
  420. }
  421. return $types;
  422. }
  423. /**
  424. * Add elements to a form
  425. *
  426. * @param FormValidator $form
  427. * @param int $itemId
  428. * @param array $exclude variables of extra field to exclude
  429. * @param bool $filter
  430. * @param bool $useTagAsSelect
  431. * @param array $showOnlyTheseFields
  432. * @param array $orderFields
  433. * @param bool $adminPermissions
  434. *
  435. * @return array|bool
  436. */
  437. public function addElements(
  438. $form,
  439. $itemId = 0,
  440. $exclude = [],
  441. $filter = false,
  442. $useTagAsSelect = false,
  443. $showOnlyTheseFields = [],
  444. $orderFields = [],
  445. $adminPermissions = false
  446. ) {
  447. if (empty($form)) {
  448. return false;
  449. }
  450. $itemId = (int) $itemId;
  451. $form->addHidden('item_id', $itemId);
  452. $extraData = false;
  453. if (!empty($itemId)) {
  454. $extraData = self::get_handler_extra_data($itemId);
  455. if ($form) {
  456. if (!empty($showOnlyTheseFields)) {
  457. $setData = [];
  458. foreach ($showOnlyTheseFields as $variable) {
  459. $extraName = 'extra_'.$variable;
  460. if (in_array($extraName, array_keys($extraData))) {
  461. $setData[$extraName] = $extraData[$extraName];
  462. }
  463. }
  464. $form->setDefaults($setData);
  465. } else {
  466. $form->setDefaults($extraData);
  467. }
  468. }
  469. }
  470. $conditions = [];
  471. if ($filter) {
  472. $conditions = ['filter = ?' => 1];
  473. }
  474. $extraFields = $this->get_all($conditions, 'option_order');
  475. $extra = $this->set_extra_fields_in_form(
  476. $form,
  477. $extraData,
  478. $adminPermissions,
  479. $extraFields,
  480. $itemId,
  481. $exclude,
  482. $useTagAsSelect,
  483. $showOnlyTheseFields,
  484. $orderFields
  485. );
  486. return $extra;
  487. }
  488. /**
  489. * @param int $itemId (session_id, question_id, course id)
  490. *
  491. * @return array
  492. */
  493. public function get_handler_extra_data($itemId)
  494. {
  495. if (empty($itemId)) {
  496. return array();
  497. }
  498. $extra_data = array();
  499. $fields = self::get_all();
  500. $field_values = new ExtraFieldValue($this->type);
  501. if (!empty($fields) > 0) {
  502. foreach ($fields as $field) {
  503. $field_value = $field_values->get_values_by_handler_and_field_id(
  504. $itemId,
  505. $field['id']
  506. );
  507. if ($field['field_type'] == self::FIELD_TYPE_TAG) {
  508. $tags = UserManager::get_user_tags_to_string(
  509. $itemId,
  510. $field['id'],
  511. false
  512. );
  513. $extra_data['extra_'.$field['variable']] = $tags;
  514. continue;
  515. }
  516. if ($field_value) {
  517. $variable = $field['variable'];
  518. $field_value = $field_value['value'];
  519. switch ($field['field_type']) {
  520. case self::FIELD_TYPE_TAG:
  521. $tags = UserManager::get_user_tags_to_string(
  522. $itemId,
  523. $field['id'],
  524. false
  525. );
  526. $extra_data['extra_'.$field['variable']] = $tags;
  527. break;
  528. case self::FIELD_TYPE_DOUBLE_SELECT:
  529. //no break
  530. case self::FIELD_TYPE_SELECT_WITH_TEXT_FIELD:
  531. $selected_options = explode(
  532. '::',
  533. $field_value
  534. );
  535. $firstOption = isset($selected_options[0]) ? $selected_options[0] : '';
  536. $secondOption = isset($selected_options[1]) ? $selected_options[1] : '';
  537. $extra_data['extra_'.$field['variable']]['extra_'.$field['variable']] = $firstOption;
  538. $extra_data['extra_'.$field['variable']]['extra_'.$field['variable'].'_second'] = $secondOption;
  539. break;
  540. case self::FIELD_TYPE_SELECT_MULTIPLE:
  541. $field_value = explode(';', $field_value);
  542. $extra_data['extra_'.$field['variable']] = $field_value;
  543. break;
  544. case self::FIELD_TYPE_RADIO:
  545. $extra_data['extra_'.$field['variable']]['extra_'.$field['variable']] = $field_value;
  546. break;
  547. case self::FIELD_TYPE_TRIPLE_SELECT:
  548. list($level1, $level2, $level3) = explode(';', $field_value);
  549. $extra_data["extra_$variable"]["extra_$variable"] = $level1;
  550. $extra_data["extra_$variable"]["extra_{$variable}_second"] = $level2;
  551. $extra_data["extra_$variable"]["extra_{$variable}_third"] = $level3;
  552. break;
  553. default:
  554. $extra_data['extra_'.$field['variable']] = $field_value;
  555. break;
  556. }
  557. } else {
  558. // Set default values
  559. if (isset($field['field_default_value']) &&
  560. !empty($field['field_default_value'])
  561. ) {
  562. $extra_data['extra_'.$field['variable']] = $field['field_default_value'];
  563. }
  564. }
  565. }
  566. }
  567. return $extra_data;
  568. }
  569. /**
  570. * @param string $field_type
  571. *
  572. * @return array
  573. */
  574. public function get_all_extra_field_by_type($field_type)
  575. {
  576. // all the information of the field
  577. $sql = "SELECT * FROM {$this->table}
  578. WHERE
  579. field_type = '".Database::escape_string($field_type)."' AND
  580. extra_field_type = $this->extraFieldType
  581. ";
  582. $result = Database::query($sql);
  583. $return = array();
  584. while ($row = Database::fetch_array($result)) {
  585. $return[] = $row['id'];
  586. }
  587. return $return;
  588. }
  589. /**
  590. * @return array
  591. */
  592. public function get_field_types()
  593. {
  594. return self::get_extra_fields_by_handler($this->type);
  595. }
  596. /**
  597. * @param int $id
  598. *
  599. * @return null
  600. */
  601. public function get_field_type_by_id($id)
  602. {
  603. $types = self::get_field_types();
  604. if (isset($types[$id])) {
  605. return $types[$id];
  606. }
  607. return null;
  608. }
  609. /**
  610. * Converts a string like this:
  611. * France:Paris;Bretagne;Marseille;Lyon|Belgique:Bruxelles;Namur;Liège;Bruges|Peru:Lima;Piura;
  612. * into
  613. * array(
  614. * 'France' =>
  615. * array('Paris', 'Bretagne', 'Marseille'),
  616. * 'Belgique' =>
  617. * array('Namur', 'Liège')
  618. * ), etc
  619. * @param string $string
  620. *
  621. * @return array
  622. */
  623. public static function extra_field_double_select_convert_string_to_array($string)
  624. {
  625. $options = explode('|', $string);
  626. $options_parsed = array();
  627. $id = 0;
  628. if (!empty($options)) {
  629. foreach ($options as $sub_options) {
  630. $options = explode(':', $sub_options);
  631. $sub_sub_options = isset($options[1]) ? explode(';', $options[1]) : [];
  632. $options_parsed[$id] = array(
  633. 'label' => $options[0],
  634. 'options' => $sub_sub_options,
  635. );
  636. $id++;
  637. }
  638. }
  639. return $options_parsed;
  640. }
  641. /**
  642. * @param $string
  643. * @return array
  644. */
  645. public static function tripleSelectConvertStringToArray($string)
  646. {
  647. $options = [];
  648. foreach (explode('|', $string) as $i => $item0) {
  649. $level1 = explode('\\', $item0);
  650. foreach ($level1 as $j => $item1) {
  651. if (0 === $j) {
  652. $options[] = ['label' => $item1, 'options' => []];
  653. continue;
  654. }
  655. foreach (explode(':', $item1) as $k => $item2) {
  656. if (0 === $k) {
  657. $options[$i]['options'][] = ['label' => $item2, 'options' => []];
  658. continue;
  659. }
  660. $options[$i]['options'][$j - 1]['options'][] = explode(';', $item2);
  661. }
  662. }
  663. }
  664. array_walk_recursive($options, function (&$item) {
  665. $item = trim($item);
  666. });
  667. return $options;
  668. }
  669. /**
  670. * @param array $options
  671. *
  672. * @return array
  673. */
  674. public static function extra_field_double_select_convert_array_to_ordered_array($options)
  675. {
  676. $options_parsed = array();
  677. if (!empty($options)) {
  678. foreach ($options as $option) {
  679. if ($option['option_value'] == 0) {
  680. $options_parsed[$option['id']][] = $option;
  681. } else {
  682. $options_parsed[$option['option_value']][] = $option;
  683. }
  684. }
  685. }
  686. return $options_parsed;
  687. }
  688. /**
  689. * @param array $options
  690. * @param int $parentId
  691. * @return array
  692. */
  693. private static function getOptionsFromTripleSelect(array $options, $parentId) {
  694. return array_filter($options, function ($option) use ($parentId) {
  695. return $option['option_value'] == $parentId;
  696. });
  697. }
  698. /**
  699. * @param array $options
  700. * @return array
  701. */
  702. public static function tripleSelectConvertArrayToOrderedArray(array $options)
  703. {
  704. $level1 = self::getOptionsFromTripleSelect($options, 0);
  705. $level2 = [];
  706. $level3 = [];
  707. foreach ($level1 as $item1) {
  708. $level2 += self::getOptionsFromTripleSelect($options, $item1['id']);
  709. }
  710. foreach ($level2 as $item2) {
  711. $level3 += self::getOptionsFromTripleSelect($options, $item2['id']);
  712. }
  713. return ['level1' => $level1, 'level2' => $level2, 'level3' => $level3];
  714. }
  715. /**
  716. * @param array $options the result of the get_field_options_by_field() array
  717. *
  718. * @return string
  719. */
  720. public static function extra_field_double_select_convert_array_to_string($options)
  721. {
  722. $string = null;
  723. $options_parsed = self::extra_field_double_select_convert_array_to_ordered_array($options);
  724. if (!empty($options_parsed)) {
  725. foreach ($options_parsed as $option) {
  726. foreach ($option as $key => $item) {
  727. $string .= $item['display_text'];
  728. if ($key == 0) {
  729. $string .= ':';
  730. } else {
  731. if (isset($option[$key + 1])) {
  732. $string .= ';';
  733. }
  734. }
  735. }
  736. $string .= '|';
  737. }
  738. }
  739. if (!empty($string)) {
  740. $string = substr($string, 0, strlen($string) - 1);
  741. }
  742. return $string;
  743. }
  744. /**
  745. * @param array $options The result of the get_field_options_by_field() array
  746. * @return string
  747. */
  748. public static function extrafieldSelectWithTextConvertArrayToString(array $options)
  749. {
  750. $string = '';
  751. $parsedOptions = self::extra_field_double_select_convert_array_to_ordered_array($options);
  752. if (empty($parsedOptions)) {
  753. return '';
  754. }
  755. foreach ($parsedOptions as $options) {
  756. $option = current($options);
  757. $string .= $option['display_text'];
  758. $string .= '|';
  759. }
  760. return rtrim($string, '|');
  761. }
  762. /**
  763. * @param array $options
  764. * @return string
  765. */
  766. public static function tripleSelectConvertArrayToString(array $options)
  767. {
  768. $string = '';
  769. $parsedOptions = self::tripleSelectConvertArrayToOrderedArray($options);
  770. foreach ($parsedOptions['level1'] as $item1) {
  771. $string .= $item1['display_text'];
  772. $level2 = self::getOptionsFromTripleSelect($parsedOptions['level2'], $item1['id']);
  773. foreach ($level2 as $item2) {
  774. $string .= '\\'.$item2['display_text'].':';
  775. $level3 = self::getOptionsFromTripleSelect($parsedOptions['level3'], $item2['id']);
  776. $string .= implode(';', array_column($level3, 'display_text'));
  777. }
  778. $string .= '|';
  779. }
  780. return trim($string, '\\|;');
  781. }
  782. /**
  783. * @param array $params
  784. *
  785. * @return array
  786. */
  787. public function clean_parameters($params)
  788. {
  789. if (!isset($params['variable']) || empty($params['variable'])) {
  790. $params['variable'] = $params['display_text'];
  791. }
  792. $params['variable'] = trim(strtolower(str_replace(" ", "_", $params['variable'])));
  793. if (!isset($params['field_order'])) {
  794. $max_order = self::get_max_field_order();
  795. $params['field_order'] = $max_order;
  796. } else {
  797. $params['field_order'] = (int) $params['field_order'];
  798. }
  799. return $params;
  800. }
  801. /**
  802. * @param array $params
  803. * @param bool $show_query
  804. *
  805. * @return bool
  806. */
  807. public function save($params, $show_query = false)
  808. {
  809. $fieldInfo = self::get_handler_field_info_by_field_variable($params['variable']);
  810. $params = self::clean_parameters($params);
  811. $params['extra_field_type'] = $this->extraFieldType;
  812. if ($fieldInfo) {
  813. return $fieldInfo['id'];
  814. } else {
  815. $id = parent::save($params, $show_query);
  816. if ($id) {
  817. $session_field_option = new ExtraFieldOption($this->type);
  818. $params['field_id'] = $id;
  819. $session_field_option->save($params);
  820. }
  821. return $id;
  822. }
  823. }
  824. /**
  825. * @param array $params
  826. *
  827. * @return bool|void
  828. */
  829. public function update($params)
  830. {
  831. $params = self::clean_parameters($params);
  832. if (isset($params['id'])) {
  833. $field_option = new ExtraFieldOption($this->type);
  834. $params['field_id'] = $params['id'];
  835. $field_option->save($params);
  836. }
  837. parent::update($params);
  838. }
  839. /**
  840. * @param $id
  841. *
  842. * @return bool|void
  843. */
  844. public function delete($id)
  845. {
  846. $em = Database::getManager();
  847. $items = $em->getRepository('ChamiloCoreBundle:ExtraFieldSavedSearch')->findBy(['field' => $id]);
  848. if ($items) {
  849. foreach ($items as $item) {
  850. $em->remove($item);
  851. }
  852. $em->flush();
  853. }
  854. $field_option = new ExtraFieldOption($this->type);
  855. $field_option->delete_all_options_by_field_id($id);
  856. $session_field_values = new ExtraFieldValue($this->type);
  857. $session_field_values->delete_all_values_by_field_id($id);
  858. parent::delete($id);
  859. }
  860. /**
  861. * @param \FormValidator $form
  862. * @param array $fieldDetails
  863. * @param array $extraData
  864. * @param bool $freezeElement
  865. * @return string JavaScript code
  866. */
  867. private function addDoubleSelectElement(FormValidator $form, $fieldDetails, $extraData, $freezeElement = false)
  868. {
  869. $firstSelectId = 'first_extra_'.$fieldDetails['variable'];
  870. $secondSelectId = 'second_extra_'.$fieldDetails['variable'];
  871. $jqueryReadyContent = "
  872. $('#$firstSelectId').on('change', function() {
  873. var id = $(this).val();
  874. if (!id) {
  875. $('#$secondSelectId').empty().selectpicker('refresh');
  876. return;
  877. }
  878. $.getJSON(_p.web_ajax + 'extra_field.ajax.php?1=1&a=get_second_select_options', {
  879. 'type': '{$this->type}',
  880. 'field_id': {$fieldDetails['id']},
  881. 'option_value_id': id
  882. })
  883. .done(function(data) {
  884. $('#$secondSelectId').empty();
  885. $.each(data, function(index, value) {
  886. $('#second_extra_{$fieldDetails['variable']}').append(
  887. $('<option>', {value: index, text: value})
  888. );
  889. });
  890. $('#$secondSelectId').selectpicker('refresh');
  891. });
  892. });
  893. ";
  894. $firstId = null;
  895. if (!empty($extraData)) {
  896. if (isset($extraData['extra_'.$fieldDetails['variable']])) {
  897. $firstId = $extraData['extra_'.$fieldDetails['variable']]['extra_'.$fieldDetails['variable']];
  898. }
  899. }
  900. $options = self::extra_field_double_select_convert_array_to_ordered_array($fieldDetails['options']);
  901. $values = array('' => get_lang('Select'));
  902. $second_values = array();
  903. if (!empty($options)) {
  904. foreach ($options as $option) {
  905. foreach ($option as $sub_option) {
  906. if ($sub_option['option_value'] == '0') {
  907. $values[$sub_option['id']] = $sub_option['display_text'];
  908. continue;
  909. }
  910. if ($firstId === $sub_option['option_value']) {
  911. $second_values[$sub_option['id']] = $sub_option['display_text'];
  912. }
  913. }
  914. }
  915. }
  916. $form
  917. ->defaultRenderer()
  918. ->setGroupElementTemplate('<p>{element}</p>', 'extra_'.$fieldDetails['variable']);
  919. $group = array();
  920. $group[] = $form->createElement(
  921. 'select',
  922. 'extra_'.$fieldDetails['variable'],
  923. null,
  924. $values,
  925. array('id' => $firstSelectId)
  926. );
  927. $group[] = $form->createElement(
  928. 'select',
  929. 'extra_'.$fieldDetails['variable'].'_second',
  930. null,
  931. $second_values,
  932. array('id' => $secondSelectId)
  933. );
  934. $form->addGroup(
  935. $group,
  936. 'extra_'.$fieldDetails['variable'],
  937. $fieldDetails['display_text']
  938. );
  939. if ($freezeElement) {
  940. $form->freeze('extra_'.$fieldDetails['variable']);
  941. }
  942. return $jqueryReadyContent;
  943. }
  944. /**
  945. * @param \FormValidator $form
  946. * @param array $fieldDetails
  947. * @param bool $freezeElement Optional
  948. * @return string JavaScript code
  949. */
  950. private function addSelectWithTextFieldElement(
  951. FormValidator $form,
  952. array $fieldDetails,
  953. $freezeElement = false
  954. )
  955. {
  956. $firstSelectId = 'slct_extra_'.$fieldDetails['variable'];
  957. $txtSelectId = 'txt_extra_'.$fieldDetails['variable'];
  958. $jqueryReadyContent = "
  959. $('#$firstSelectId').on('change', function() {
  960. var id = $(this).val();
  961. if (!id) {
  962. $('#$txtSelectId').val('');
  963. }
  964. });
  965. ";
  966. $options = self::extra_field_double_select_convert_array_to_ordered_array($fieldDetails['options']);
  967. $values = array('' => get_lang('Select'));
  968. if (!empty($options)) {
  969. foreach ($options as $option) {
  970. foreach ($option as $sub_option) {
  971. if ($sub_option['option_value'] != '0') {
  972. continue;
  973. }
  974. $values[$sub_option['id']] = $sub_option['display_text'];
  975. }
  976. }
  977. }
  978. $form
  979. ->defaultRenderer()
  980. ->setGroupElementTemplate('<p>{element}</p>', 'extra_'.$fieldDetails['variable']);
  981. $group = array();
  982. $group[] = $form->createElement(
  983. 'select',
  984. 'extra_'.$fieldDetails['variable'],
  985. null,
  986. $values,
  987. array('id' => $firstSelectId)
  988. );
  989. $group[] = $form->createElement(
  990. 'text',
  991. 'extra_'.$fieldDetails['variable'].'_second',
  992. null,
  993. ['id' => $txtSelectId]
  994. );
  995. $form->addGroup(
  996. $group,
  997. 'extra_'.$fieldDetails['variable'],
  998. $fieldDetails['display_text']
  999. );
  1000. if ($freezeElement) {
  1001. $form->freeze('extra_'.$fieldDetails['variable']);
  1002. }
  1003. return $jqueryReadyContent;
  1004. }
  1005. /**
  1006. * @param \FormValidator $form
  1007. * @param array $fieldDetails
  1008. * @param array $extraData
  1009. * @param boolean $freezeElement
  1010. * @return string
  1011. */
  1012. private function addTripleSelectElement(
  1013. FormValidator $form,
  1014. array $fieldDetails,
  1015. array $extraData,
  1016. $freezeElement
  1017. )
  1018. {
  1019. $variable = $fieldDetails['variable'];
  1020. $id = $fieldDetails['id'];
  1021. $slctFirstId = "first_extra$variable";
  1022. $slctSecondId = "second_extra$variable";
  1023. $slctThirdId = "thrid_extra$variable";
  1024. $langSelect = get_lang('Select');
  1025. $js = "
  1026. (function () {
  1027. var slctFirst = $('#$slctFirstId'),
  1028. slctSecond = $('#$slctSecondId'),
  1029. slctThrid = $('#$slctThirdId');
  1030. slctFirst.on('change', function () {
  1031. slctSecond.empty().selectpicker('refresh');
  1032. slctThrid.empty().selectpicker('refresh');
  1033. var level = $(this).val();
  1034. if (!level) {
  1035. return;
  1036. }
  1037. $.getJSON(_p.web_ajax + 'extra_field.ajax.php', {
  1038. 'a': 'get_second_select_options',
  1039. 'type': '$this->type',
  1040. 'field_id': $id,
  1041. 'option_value_id': level
  1042. })
  1043. .done(function (data) {
  1044. slctSecond.append(
  1045. $('<option>', {value: '', text: '$langSelect'})
  1046. );
  1047. $.each(data, function (index, value) {
  1048. slctSecond.append(
  1049. $('<option>', {value: index, text: value})
  1050. );
  1051. });
  1052. slctSecond.selectpicker('refresh');
  1053. });
  1054. });
  1055. slctSecond.on('change', function () {
  1056. slctThrid.empty().selectpicker('refresh');
  1057. var level = $(this).val();
  1058. if (!level) {
  1059. return;
  1060. }
  1061. $.getJSON(_p.web_ajax + 'extra_field.ajax.php', {
  1062. 'a': 'get_second_select_options',
  1063. 'type': '$this->type',
  1064. 'field_id': $id,
  1065. 'option_value_id': level
  1066. })
  1067. .done(function (data) {
  1068. slctThrid.append(
  1069. $('<option>', {value: '', text: '$langSelect'})
  1070. );
  1071. $.each(data, function (index, value) {
  1072. slctThrid.append(
  1073. $('<option>', {value: index, text: value})
  1074. );
  1075. });
  1076. slctThrid.selectpicker('refresh');
  1077. });
  1078. });
  1079. })();
  1080. ";
  1081. $firstId = isset($extraData["extra_$variable"]["extra_$variable"])
  1082. ? $extraData["extra_$variable"]["extra_$variable"]
  1083. : '';
  1084. $secondId = isset($extraData["extra_$variable"]["extra_{$variable}_second"])
  1085. ? $extraData["extra_$variable"]["extra_{$variable}_second"]
  1086. : '';
  1087. $options = self::tripleSelectConvertArrayToOrderedArray($fieldDetails['options']);
  1088. $values1 = ['' => $langSelect];
  1089. $values2 = ['' => $langSelect];
  1090. $values3 = ['' => $langSelect];
  1091. $level1 = self::getOptionsFromTripleSelect($options['level1'], 0);
  1092. $level2 = self::getOptionsFromTripleSelect($options['level2'], $firstId);
  1093. $level3 = self::getOptionsFromTripleSelect($options['level3'], $secondId);
  1094. foreach ($level1 as $item1) {
  1095. $values1[$item1['id']] = $item1['display_text'];
  1096. }
  1097. foreach ($level2 as $item2) {
  1098. $values2[$item2['id']] = $item2['display_text'];
  1099. }
  1100. foreach ($level3 as $item3) {
  1101. $values3[$item3['id']] = $item3['display_text'];
  1102. }
  1103. $form
  1104. ->defaultRenderer()
  1105. ->setGroupElementTemplate('<p>{element}</p>', "extra_$variable");
  1106. $group = [];
  1107. $group[] = $form->createElement('select', "extra_$variable", null, $values1, ['id' => $slctFirstId]);
  1108. $group[] = $form->createElement('select', "extra_{$variable}_second", null, $values2, ['id' => $slctSecondId]);
  1109. $group[] = $form->createElement('select', "extra_{$variable}_third", null, $values3, ['id' => $slctThirdId]);
  1110. $form->addGroup($group, "extra_$variable", $fieldDetails['display_text']);
  1111. if ($freezeElement) {
  1112. $form->freeze('extra_'.$fieldDetails['variable']);
  1113. }
  1114. return $js;
  1115. }
  1116. /**
  1117. * Add an element that matches the given extra field to the given $form object
  1118. * @param FormValidator $form
  1119. * @param array $extraData
  1120. * @param bool $adminPermissions
  1121. * @param array $extra
  1122. * @param int $itemId
  1123. * @param array $exclude variables of extra field to exclude
  1124. * @param bool $useTagAsSelect
  1125. * @param array $showOnlyTheseFields
  1126. * @param array $orderFields
  1127. *
  1128. * @return array If relevant, returns a one-element array with JS code to be added to the page HTML headers
  1129. */
  1130. public function set_extra_fields_in_form(
  1131. $form,
  1132. $extraData,
  1133. $adminPermissions = false,
  1134. $extra = array(),
  1135. $itemId = null,
  1136. $exclude = [],
  1137. $useTagAsSelect = false,
  1138. $showOnlyTheseFields = [],
  1139. $orderFields = []
  1140. ) {
  1141. $jquery_ready_content = null;
  1142. if (!empty($extra)) {
  1143. $newOrder = [];
  1144. if (!empty($orderFields)) {
  1145. foreach ($orderFields as $order) {
  1146. foreach ($extra as $field_details) {
  1147. if ($order == $field_details['variable']) {
  1148. $newOrder[] = $field_details;
  1149. }
  1150. }
  1151. }
  1152. $extra = $newOrder;
  1153. }
  1154. foreach ($extra as $field_details) {
  1155. if (!empty($showOnlyTheseFields)) {
  1156. if (!in_array($field_details['variable'], $showOnlyTheseFields)) {
  1157. continue;
  1158. }
  1159. }
  1160. // Getting default value id if is set
  1161. $defaultValueId = null;
  1162. if (isset($field_details['options']) && !empty($field_details['options'])) {
  1163. $valueToFind = null;
  1164. if (isset($field_details['field_default_value'])) {
  1165. $valueToFind = $field_details['field_default_value'];
  1166. }
  1167. // If a value is found we override the default value
  1168. if (isset($extraData['extra_'.$field_details['variable']])) {
  1169. $valueToFind = $extraData['extra_'.$field_details['variable']];
  1170. }
  1171. foreach ($field_details['options'] as $option) {
  1172. if ($option['option_value'] == $valueToFind) {
  1173. $defaultValueId = $option['id'];
  1174. }
  1175. }
  1176. }
  1177. if (!$adminPermissions) {
  1178. if ($field_details['visible_to_self'] == 0) {
  1179. continue;
  1180. }
  1181. if (in_array($field_details['variable'], $exclude)) {
  1182. continue;
  1183. }
  1184. }
  1185. $freezeElement = false;
  1186. if (!$adminPermissions) {
  1187. $freezeElement = $field_details['visible_to_self'] == 0 || $field_details['changeable'] == 0;
  1188. }
  1189. switch ($field_details['field_type']) {
  1190. case self::FIELD_TYPE_TEXT:
  1191. $form->addElement(
  1192. 'text',
  1193. 'extra_'.$field_details['variable'],
  1194. $field_details['display_text'],
  1195. array(
  1196. 'id' => 'extra_'.$field_details['variable']
  1197. )
  1198. );
  1199. $form->applyFilter(
  1200. 'extra_'.$field_details['variable'],
  1201. 'stripslashes'
  1202. );
  1203. $form->applyFilter(
  1204. 'extra_'.$field_details['variable'],
  1205. 'trim'
  1206. );
  1207. if ($freezeElement) {
  1208. $form->freeze('extra_'.$field_details['variable']);
  1209. }
  1210. break;
  1211. case self::FIELD_TYPE_TEXTAREA:
  1212. $form->addHtmlEditor(
  1213. 'extra_'.$field_details['variable'],
  1214. $field_details['display_text'],
  1215. false,
  1216. false,
  1217. array(
  1218. 'ToolbarSet' => 'Profile',
  1219. 'Width' => '100%',
  1220. 'Height' => '130',
  1221. 'id' => 'extra_'.$field_details['variable']
  1222. )
  1223. );
  1224. $form->applyFilter('extra_'.$field_details['variable'], 'stripslashes');
  1225. $form->applyFilter('extra_'.$field_details['variable'], 'trim');
  1226. if ($freezeElement) {
  1227. $form->freeze('extra_'.$field_details['variable']);
  1228. }
  1229. break;
  1230. case self::FIELD_TYPE_RADIO:
  1231. $group = array();
  1232. if (isset($field_details['options']) &&
  1233. !empty($field_details['options'])
  1234. ) {
  1235. foreach ($field_details['options'] as $option_details) {
  1236. $options[$option_details['option_value']] = $option_details['display_text'];
  1237. $group[] = $form->createElement(
  1238. 'radio',
  1239. 'extra_'.$field_details['variable'],
  1240. $option_details['option_value'],
  1241. $option_details['display_text'].'<br />',
  1242. $option_details['option_value']
  1243. );
  1244. }
  1245. }
  1246. $form->addGroup(
  1247. $group,
  1248. 'extra_'.$field_details['variable'],
  1249. $field_details['display_text']
  1250. );
  1251. if ($freezeElement) {
  1252. $form->freeze('extra_'.$field_details['variable']);
  1253. }
  1254. break;
  1255. case self::FIELD_TYPE_CHECKBOX:
  1256. $group = array();
  1257. if (isset($field_details['options']) &&
  1258. !empty($field_details['options'])
  1259. ) {
  1260. foreach ($field_details['options'] as $option_details) {
  1261. $options[$option_details['option_value']] = $option_details['display_text'];
  1262. $group[] = $form->createElement(
  1263. 'checkbox',
  1264. 'extra_'.$field_details['variable'],
  1265. $option_details['option_value'],
  1266. $option_details['display_text'].'<br />',
  1267. $option_details['option_value']
  1268. );
  1269. }
  1270. } else {
  1271. $fieldVariable = "extra_{$field_details['variable']}";
  1272. $checkboxAttributes = array();
  1273. if (is_array($extraData) &&
  1274. array_key_exists($fieldVariable, $extraData)
  1275. ) {
  1276. if (!empty($extraData[$fieldVariable])) {
  1277. $checkboxAttributes['checked'] = 1;
  1278. }
  1279. }
  1280. // We assume that is a switch on/off with 1 and 0 as values
  1281. $group[] = $form->createElement(
  1282. 'checkbox',
  1283. 'extra_'.$field_details['variable'],
  1284. null,
  1285. //$field_details['display_text'].'<br />',
  1286. get_lang('Yes'),
  1287. $checkboxAttributes
  1288. );
  1289. }
  1290. $form->addGroup(
  1291. $group,
  1292. 'extra_'.$field_details['variable'],
  1293. $field_details['display_text']
  1294. );
  1295. if ($freezeElement) {
  1296. $form->freeze('extra_'.$field_details['variable']);
  1297. }
  1298. break;
  1299. case self::FIELD_TYPE_SELECT:
  1300. $get_lang_variables = false;
  1301. if (in_array(
  1302. $field_details['variable'],
  1303. array('mail_notify_message', 'mail_notify_invitation', 'mail_notify_group_message')
  1304. )
  1305. ) {
  1306. $get_lang_variables = true;
  1307. }
  1308. // Get extra field workflow
  1309. $userInfo = api_get_user_info();
  1310. $addOptions = array();
  1311. $optionsExists = false;
  1312. global $app;
  1313. // Check if exist $app['orm.em'] object
  1314. if (isset($app['orm.em']) && is_object($app['orm.em'])) {
  1315. $optionsExists = $app['orm.em']
  1316. ->getRepository('ChamiloLMS\Entity\ExtraFieldOptionRelFieldOption')
  1317. ->findOneBy(array('fieldId' => $field_details['id']));
  1318. }
  1319. if ($optionsExists) {
  1320. if (isset($userInfo['status']) &&
  1321. !empty($userInfo['status'])
  1322. ) {
  1323. $fieldWorkFlow = $app['orm.em']
  1324. ->getRepository('ChamiloLMS\Entity\ExtraFieldOptionRelFieldOption')
  1325. ->findBy(
  1326. array(
  1327. 'fieldId' => $field_details['id'],
  1328. 'relatedFieldOptionId' => $defaultValueId,
  1329. 'roleId' => $userInfo['status']
  1330. )
  1331. );
  1332. foreach ($fieldWorkFlow as $item) {
  1333. $addOptions[] = $item->getFieldOptionId();
  1334. }
  1335. }
  1336. }
  1337. $options = array();
  1338. if (empty($defaultValueId)) {
  1339. $options[''] = get_lang('SelectAnOption');
  1340. }
  1341. $optionList = array();
  1342. if (!empty($field_details['options'])) {
  1343. foreach ($field_details['options'] as $option_details) {
  1344. $optionList[$option_details['id']] = $option_details;
  1345. if ($get_lang_variables) {
  1346. $options[$option_details['option_value']] = $option_details['display_text'];
  1347. } else {
  1348. if ($optionsExists) {
  1349. // Adding always the default value
  1350. if ($option_details['id'] == $defaultValueId) {
  1351. $options[$option_details['option_value']] = $option_details['display_text'];
  1352. } else {
  1353. if (isset($addOptions) && !empty($addOptions)) {
  1354. // Parsing filters
  1355. if (in_array($option_details['id'], $addOptions)) {
  1356. $options[$option_details['option_value']] = $option_details['display_text'];
  1357. }
  1358. }
  1359. }
  1360. } else {
  1361. // Normal behaviour
  1362. $options[$option_details['option_value']] = $option_details['display_text'];
  1363. }
  1364. }
  1365. }
  1366. if (isset($optionList[$defaultValueId])) {
  1367. if (isset($optionList[$defaultValueId]['option_value']) &&
  1368. $optionList[$defaultValueId]['option_value'] == 'aprobada'
  1369. ) {
  1370. // @todo function don't exists api_is_question_manager
  1371. /*if (api_is_question_manager() == false) {
  1372. $form->freeze();
  1373. }*/
  1374. }
  1375. }
  1376. // Setting priority message
  1377. if (isset($optionList[$defaultValueId]) &&
  1378. isset($optionList[$defaultValueId]['priority'])
  1379. ) {
  1380. if (!empty($optionList[$defaultValueId]['priority'])) {
  1381. $priorityId = $optionList[$defaultValueId]['priority'];
  1382. $option = new ExtraFieldOption($this->type);
  1383. $messageType = $option->getPriorityMessageType($priorityId);
  1384. $form->addElement(
  1385. 'label',
  1386. null,
  1387. Display::return_message(
  1388. $optionList[$defaultValueId]['priority_message'],
  1389. $messageType
  1390. )
  1391. );
  1392. }
  1393. }
  1394. }
  1395. // chzn-select doesn't work for sessions??
  1396. $form->addElement(
  1397. 'select',
  1398. 'extra_'.$field_details['variable'],
  1399. $field_details['display_text'],
  1400. $options,
  1401. array('id' => 'extra_'.$field_details['variable'])
  1402. );
  1403. /* Enable this when field_loggeable is introduced as a table field (2.0)
  1404. if ($optionsExists && $field_details['field_loggeable'] && !empty($defaultValueId)) {
  1405. $form->addElement(
  1406. 'textarea',
  1407. 'extra_' . $field_details['variable'] . '_comment',
  1408. $field_details['display_text'] . ' ' . get_lang('Comment')
  1409. );
  1410. $extraFieldValue = new ExtraFieldValue($this->type);
  1411. $repo = $app['orm.em']->getRepository($extraFieldValue->entityName);
  1412. $repoLog = $app['orm.em']->getRepository('Gedmo\Loggable\Entity\LogEntry');
  1413. $newEntity = $repo->findOneBy(
  1414. array(
  1415. $this->handlerEntityId => $itemId,
  1416. 'fieldId' => $field_details['id']
  1417. )
  1418. );
  1419. // @todo move this in a function inside the class
  1420. if ($newEntity) {
  1421. $logs = $repoLog->getLogEntries($newEntity);
  1422. if (!empty($logs)) {
  1423. $html = '<b>' . get_lang('LatestChanges') . '</b><br /><br />';
  1424. $table = new HTML_Table(array('class' => 'data_table'));
  1425. $table->setHeaderContents(0, 0, get_lang('Value'));
  1426. $table->setHeaderContents(0, 1, get_lang('Comment'));
  1427. $table->setHeaderContents(0, 2, get_lang('ModifyDate'));
  1428. $table->setHeaderContents(0, 3, get_lang('Username'));
  1429. $row = 1;
  1430. foreach ($logs as $log) {
  1431. $column = 0;
  1432. $data = $log->getData();
  1433. $fieldValue = isset($data['fieldValue']) ? $data['fieldValue'] : null;
  1434. $comment = isset($data['comment']) ? $data['comment'] : null;
  1435. $table->setCellContents($row, $column, $fieldValue);
  1436. $column++;
  1437. $table->setCellContents($row, $column, $comment);
  1438. $column++;
  1439. $table->setCellContents($row, $column, api_get_local_time($log->getLoggedAt()->format('Y-m-d H:i:s')));
  1440. $column++;
  1441. $table->setCellContents($row, $column, $log->getUsername());
  1442. $row++;
  1443. }
  1444. $form->addElement('label', null, $html.$table->toHtml());
  1445. }
  1446. }
  1447. }
  1448. */
  1449. if ($freezeElement) {
  1450. $form->freeze('extra_'.$field_details['variable']);
  1451. }
  1452. break;
  1453. case self::FIELD_TYPE_SELECT_MULTIPLE:
  1454. $options = array();
  1455. foreach ($field_details['options'] as $option_id => $option_details) {
  1456. $options[$option_details['option_value']] = $option_details['display_text'];
  1457. }
  1458. $form->addElement(
  1459. 'select',
  1460. 'extra_'.$field_details['variable'],
  1461. $field_details['display_text'],
  1462. $options,
  1463. array(
  1464. 'multiple' => 'multiple',
  1465. 'id' => 'extra_'.$field_details['variable']
  1466. )
  1467. );
  1468. if ($freezeElement) {
  1469. $form->freeze('extra_'.$field_details['variable']);
  1470. }
  1471. break;
  1472. case self::FIELD_TYPE_DATE:
  1473. $form->addDatePicker('extra_'.$field_details['variable'], $field_details['display_text']);
  1474. if ($freezeElement) {
  1475. $form->freeze('extra_'.$field_details['variable']);
  1476. }
  1477. break;
  1478. case self::FIELD_TYPE_DATETIME:
  1479. $form->addDateTimePicker(
  1480. 'extra_'.$field_details['variable'],
  1481. $field_details['display_text']
  1482. );
  1483. $defaults['extra_'.$field_details['variable']] = api_get_local_time();
  1484. if (!isset($form->_defaultValues['extra_'.$field_details['variable']])) {
  1485. $form->setDefaults($defaults);
  1486. }
  1487. if ($freezeElement) {
  1488. $form->freeze('extra_'.$field_details['variable']);
  1489. }
  1490. break;
  1491. case self::FIELD_TYPE_DOUBLE_SELECT:
  1492. $jquery_ready_content .= self::addDoubleSelectElement(
  1493. $form,
  1494. $field_details,
  1495. $extraData,
  1496. $freezeElement
  1497. );
  1498. break;
  1499. case self::FIELD_TYPE_DIVIDER:
  1500. $form->addHtml('
  1501. <div class="form-group ">
  1502. <div class="col-sm-12">
  1503. <div class="panel-separator">
  1504. <h4 id="'.$field_details['variable'].'" class="form-separator">'
  1505. .$field_details['display_text'].'
  1506. </h4>
  1507. </div>
  1508. </div>
  1509. </div>
  1510. ');
  1511. break;
  1512. case self::FIELD_TYPE_TAG:
  1513. $variable = $field_details['variable'];
  1514. $field_id = $field_details['id'];
  1515. $tagsSelect = $form->addSelect(
  1516. "extra_{$field_details['variable']}",
  1517. $field_details['display_text'],
  1518. [],
  1519. ['style' => 'width: 100%;']
  1520. );
  1521. if ($useTagAsSelect == false) {
  1522. $tagsSelect->setAttribute('class', null);
  1523. }
  1524. $tagsSelect->setAttribute('id', "extra_{$field_details['variable']}");
  1525. $tagsSelect->setMultiple(true);
  1526. $selectedOptions = [];
  1527. if ($this->type === 'user') {
  1528. // The magic should be here
  1529. $user_tags = UserManager::get_user_tags($itemId, $field_details['id']);
  1530. if (is_array($user_tags) && count($user_tags) > 0) {
  1531. foreach ($user_tags as $tag) {
  1532. if (empty($tag['tag'])) {
  1533. continue;
  1534. }
  1535. $tagsSelect->addOption(
  1536. $tag['tag'],
  1537. $tag['tag']
  1538. );
  1539. $selectedOptions[] = $tag['tag'];
  1540. }
  1541. }
  1542. $url = api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php';
  1543. } else {
  1544. $em = Database::getManager();
  1545. $fieldTags = $em
  1546. ->getRepository('ChamiloCoreBundle:ExtraFieldRelTag')
  1547. ->findBy([
  1548. 'fieldId' => $field_id,
  1549. 'itemId' => $itemId
  1550. ]);
  1551. /** @var \Chamilo\CoreBundle\Entity\ExtraFieldRelTag $fieldTag */
  1552. foreach ($fieldTags as $fieldTag) {
  1553. /** @var \Chamilo\CoreBundle\Entity\Tag $tag */
  1554. $tag = $em->find('ChamiloCoreBundle:Tag', $fieldTag->getTagId());
  1555. if (empty($tag)) {
  1556. continue;
  1557. }
  1558. $tagsSelect->addOption(
  1559. $tag->getTag(),
  1560. $tag->getTag()
  1561. );
  1562. $selectedOptions[] = $tag->getTag();
  1563. }
  1564. if ($useTagAsSelect) {
  1565. $fieldTags = $em
  1566. ->getRepository('ChamiloCoreBundle:ExtraFieldRelTag')
  1567. ->findBy([
  1568. 'fieldId' => $field_id
  1569. ]);
  1570. $tagsAdded = [];
  1571. foreach ($fieldTags as $fieldTag) {
  1572. $tag = $em->find('ChamiloCoreBundle:Tag', $fieldTag->getTagId());
  1573. if (empty($tag)) {
  1574. continue;
  1575. }
  1576. $tagText = $tag->getTag();
  1577. if (in_array($tagText, $tagsAdded)) {
  1578. continue;
  1579. }
  1580. $tagsSelect->addOption(
  1581. $tag->getTag(),
  1582. $tag->getTag(),
  1583. []
  1584. );
  1585. $tagsAdded[] = $tagText;
  1586. }
  1587. }
  1588. $url = api_get_path(WEB_AJAX_PATH).'extra_field.ajax.php';
  1589. }
  1590. $form->setDefaults(
  1591. [
  1592. 'extra_'.$field_details['variable'] => $selectedOptions
  1593. ]
  1594. );
  1595. if ($useTagAsSelect == false) {
  1596. $jquery_ready_content .= "
  1597. $('#extra_$variable').select2({
  1598. ajax: {
  1599. url: '$url?a=search_tags&field_id=$field_id&type={$this->type}',
  1600. processResults: function (data) {
  1601. return {
  1602. results: data.items
  1603. }
  1604. }
  1605. },
  1606. cache: false,
  1607. tags: true,
  1608. tokenSeparators: [','],
  1609. placeholder: '".get_lang('StartToType')."'
  1610. });
  1611. ";
  1612. }
  1613. break;
  1614. case self::FIELD_TYPE_TIMEZONE:
  1615. $form->addElement(
  1616. 'select',
  1617. 'extra_'.$field_details['variable'],
  1618. $field_details['display_text'],
  1619. api_get_timezones(),
  1620. ''
  1621. );
  1622. if ($freezeElement) {
  1623. $form->freeze('extra_'.$field_details['variable']);
  1624. }
  1625. break;
  1626. case self::FIELD_TYPE_SOCIAL_PROFILE:
  1627. // get the social network's favicon
  1628. $extra_data_variable = isset($extraData['extra_'.$field_details['variable']])
  1629. ? $extraData['extra_'.$field_details['variable']]
  1630. : null;
  1631. $field_default_value = isset($field_details['field_default_value'])
  1632. ? $field_details['field_default_value']
  1633. : null;
  1634. $icon_path = UserManager::get_favicon_from_url(
  1635. $extra_data_variable,
  1636. $field_default_value
  1637. );
  1638. // special hack for hi5
  1639. $leftpad = '1.7';
  1640. $top = '0.4';
  1641. $domain = parse_url($icon_path, PHP_URL_HOST);
  1642. if ($domain == 'www.hi5.com' or $domain == 'hi5.com') {
  1643. $leftpad = '3';
  1644. $top = '0';
  1645. }
  1646. // print the input field
  1647. $form->addElement(
  1648. 'text',
  1649. 'extra_'.$field_details['variable'],
  1650. $field_details['display_text'],
  1651. array(
  1652. 'size' => 60,
  1653. 'size' => implode(
  1654. '; ',
  1655. [
  1656. "background-image: url('$icon_path')",
  1657. 'background-repeat: no-repeat',
  1658. "background-position: 0.4em {$top}em",
  1659. "padding-left: {$leftpad}em"
  1660. ]
  1661. )
  1662. )
  1663. );
  1664. $form->applyFilter('extra_'.$field_details['variable'], 'stripslashes');
  1665. $form->applyFilter('extra_'.$field_details['variable'], 'trim');
  1666. if ($freezeElement) {
  1667. $form->freeze('extra_'.$field_details['variable']);
  1668. }
  1669. break;
  1670. case self::FIELD_TYPE_MOBILE_PHONE_NUMBER:
  1671. $form->addElement(
  1672. 'text',
  1673. 'extra_'.$field_details['variable'],
  1674. $field_details['display_text']." (".get_lang('CountryDialCode').")",
  1675. array('size' => 40, 'placeholder' => '(xx)xxxxxxxxx')
  1676. );
  1677. $form->applyFilter('extra_'.$field_details['variable'], 'stripslashes');
  1678. $form->applyFilter('extra_'.$field_details['variable'], 'trim');
  1679. $form->applyFilter('extra_'.$field_details['variable'], 'mobile_phone_number_filter');
  1680. $form->addRule(
  1681. 'extra_'.$field_details['variable'],
  1682. get_lang('MobilePhoneNumberWrong'),
  1683. 'mobile_phone_number'
  1684. );
  1685. if ($freezeElement) {
  1686. $form->freeze('extra_'.$field_details['variable']);
  1687. }
  1688. break;
  1689. case self::FIELD_TYPE_INTEGER:
  1690. $form->addElement(
  1691. 'number',
  1692. 'extra_'.$field_details['variable'],
  1693. $field_details['display_text'],
  1694. array('class' => 'span1', 'step' => 1)
  1695. );
  1696. $form->applyFilter('extra_'.$field_details['variable'], 'stripslashes');
  1697. $form->applyFilter('extra_'.$field_details['variable'], 'trim');
  1698. $form->applyFilter('extra_'.$field_details['variable'], 'intval');
  1699. if ($freezeElement) {
  1700. $form->freeze('extra_'.$field_details['variable']);
  1701. }
  1702. break;
  1703. case self::FIELD_TYPE_FILE_IMAGE:
  1704. $fieldVariable = "extra_{$field_details['variable']}";
  1705. $fieldTexts = [
  1706. $field_details['display_text']
  1707. ];
  1708. if (is_array($extraData) && array_key_exists($fieldVariable, $extraData)) {
  1709. if (file_exists(api_get_path(SYS_UPLOAD_PATH).$extraData[$fieldVariable])) {
  1710. $fieldTexts[] = Display::img(
  1711. api_get_path(WEB_UPLOAD_PATH).$extraData[$fieldVariable],
  1712. $field_details['display_text'],
  1713. ['width' => '300']
  1714. );
  1715. }
  1716. }
  1717. if ($fieldTexts[0] === 'Image') {
  1718. $fieldTexts[0] = get_lang($fieldTexts[0]);
  1719. }
  1720. $form->addFile(
  1721. $fieldVariable,
  1722. $fieldTexts,
  1723. ['accept' => 'image/*', 'id' => 'extra_image', 'crop_image' => 'true']
  1724. );
  1725. $form->applyFilter('extra_'.$field_details['variable'], 'stripslashes');
  1726. $form->applyFilter('extra_'.$field_details['variable'], 'trim');
  1727. $allowed_picture_types = ['jpg', 'jpeg', 'png', 'gif'];
  1728. $form->addRule(
  1729. 'extra_'.$field_details['variable'],
  1730. get_lang('OnlyImagesAllowed').' ('.implode(',', $allowed_picture_types).')',
  1731. 'filetype',
  1732. $allowed_picture_types
  1733. );
  1734. if ($freezeElement) {
  1735. $form->freeze('extra_'.$field_details['variable']);
  1736. }
  1737. break;
  1738. case self::FIELD_TYPE_FLOAT:
  1739. $form->addElement(
  1740. 'number',
  1741. 'extra_'.$field_details['variable'],
  1742. $field_details['display_text'],
  1743. array('class' => 'span1', 'step' => '0.01')
  1744. );
  1745. $form->applyFilter('extra_'.$field_details['variable'], 'stripslashes');
  1746. $form->applyFilter('extra_'.$field_details['variable'], 'trim');
  1747. $form->applyFilter('extra_'.$field_details['variable'], 'floatval');
  1748. if ($freezeElement) {
  1749. $form->freeze('extra_'.$field_details['variable']);
  1750. }
  1751. break;
  1752. case self::FIELD_TYPE_FILE:
  1753. $fieldVariable = "extra_{$field_details['variable']}";
  1754. $fieldTexts = array(
  1755. $field_details['display_text']
  1756. );
  1757. if (is_array($extraData) &&
  1758. array_key_exists($fieldVariable, $extraData)
  1759. ) {
  1760. if (file_exists(api_get_path(SYS_UPLOAD_PATH).$extraData[$fieldVariable])) {
  1761. $fieldTexts[] = Display::url(
  1762. api_get_path(WEB_UPLOAD_PATH).$extraData[$fieldVariable],
  1763. api_get_path(WEB_UPLOAD_PATH).$extraData[$fieldVariable],
  1764. array(
  1765. 'title' => $field_details['display_text'],
  1766. 'target' => '_blank'
  1767. )
  1768. );
  1769. }
  1770. }
  1771. $form->addElement(
  1772. 'file',
  1773. $fieldVariable,
  1774. $fieldTexts,
  1775. array()
  1776. );
  1777. $form->applyFilter('extra_'.$field_details['variable'], 'stripslashes');
  1778. $form->applyFilter('extra_'.$field_details['variable'], 'trim');
  1779. if ($freezeElement) {
  1780. $form->freeze('extra_'.$field_details['variable']);
  1781. }
  1782. break;
  1783. case self::FIELD_TYPE_VIDEO_URL:
  1784. $form->addUrl(
  1785. "extra_{$field_details['variable']}",
  1786. $field_details['display_text'],
  1787. false,
  1788. ['placeholder' => 'https://']
  1789. );
  1790. if ($freezeElement) {
  1791. $form->freeze('extra_'.$field_details['variable']);
  1792. }
  1793. break;
  1794. case self::FIELD_TYPE_LETTERS_ONLY:
  1795. $form->addTextLettersOnly(
  1796. "extra_{$field_details['variable']}",
  1797. $field_details['display_text']
  1798. );
  1799. $form->applyFilter('extra_'.$field_details['variable'], 'stripslashes');
  1800. if ($freezeElement) {
  1801. $form->freeze('extra_'.$field_details['variable']);
  1802. }
  1803. break;
  1804. case self::FIELD_TYPE_ALPHANUMERIC:
  1805. $form->addTextAlphanumeric(
  1806. "extra_{$field_details['variable']}",
  1807. $field_details['display_text']
  1808. );
  1809. $form->applyFilter(
  1810. 'extra_'.$field_details['variable'],
  1811. 'stripslashes'
  1812. );
  1813. if ($freezeElement) {
  1814. $form->freeze('extra_'.$field_details['variable']);
  1815. }
  1816. break;
  1817. case self::FIELD_TYPE_LETTERS_SPACE:
  1818. $form->addTextLettersAndSpaces(
  1819. "extra_{$field_details['variable']}",
  1820. $field_details['display_text']
  1821. );
  1822. $form->applyFilter('extra_'.$field_details['variable'], 'stripslashes');
  1823. if ($freezeElement) {
  1824. $form->freeze('extra_'.$field_details['variable']);
  1825. }
  1826. break;
  1827. case self::FIELD_TYPE_ALPHANUMERIC_SPACE:
  1828. $form->addTextAlphanumericAndSpaces(
  1829. "extra_{$field_details['variable']}",
  1830. $field_details['display_text']
  1831. );
  1832. $form->applyFilter(
  1833. 'extra_'.$field_details['variable'],
  1834. 'stripslashes'
  1835. );
  1836. if ($freezeElement) {
  1837. $form->freeze('extra_'.$field_details['variable']);
  1838. }
  1839. break;
  1840. case self::FIELD_TYPE_GEOLOCALIZATION:
  1841. $dataValue = isset($extraData['extra_'.$field_details['variable']])
  1842. ? $extraData['extra_'.$field_details['variable']]
  1843. : '';
  1844. $form->addElement(
  1845. 'text',
  1846. 'extra_'.$field_details['variable'],
  1847. $field_details['display_text'],
  1848. ['id' => 'extra_'.$field_details['variable']]
  1849. );
  1850. $form->applyFilter('extra_'.$field_details['variable'], 'stripslashes');
  1851. $form->applyFilter('extra_'.$field_details['variable'], 'trim');
  1852. if ($freezeElement) {
  1853. $form->freeze('extra_'.$field_details['variable']);
  1854. }
  1855. $form->addHtml("
  1856. <script>
  1857. $(document).ready(function() {
  1858. if (typeof google === 'object') {
  1859. var address = '$dataValue';
  1860. initializeGeo{$field_details['variable']}(address, false);
  1861. $('#geolocalization_extra_{$field_details['variable']}').on('click', function() {
  1862. var address = $('#extra_{$field_details['variable']}').val();
  1863. initializeGeo{$field_details['variable']}(address, false);
  1864. return false;
  1865. });
  1866. $('#myLocation_extra_{$field_details['variable']}').on('click', function() {
  1867. myLocation{$field_details['variable']}();
  1868. return false;
  1869. });
  1870. $('#extra_{$field_details['variable']}').keypress(function(event) {
  1871. if (event.which == 13) {
  1872. $('#geolocalization_extra_{$field_details['variable']}').click();
  1873. return false;
  1874. }
  1875. });
  1876. return;
  1877. }
  1878. $('#map_extra_{$field_details['variable']}')
  1879. .html('<div class=\"alert alert-info\">"
  1880. .get_lang('YouNeedToActivateTheGoogleMapsPluginInAdminPlatformToSeeTheMap')
  1881. ."</div>');
  1882. });
  1883. function myLocation{$field_details['variable']}() {
  1884. if (navigator.geolocation) {
  1885. var geoPosition = function(position) {
  1886. var lat = position.coords.latitude;
  1887. var lng = position.coords.longitude;
  1888. var latLng = new google.maps.LatLng(lat, lng);
  1889. initializeGeo{$field_details['variable']}(false, latLng)
  1890. };
  1891. var geoError = function(error) {
  1892. console.log(error);
  1893. alert('Geocode ".get_lang('Error').": ' + error);
  1894. };
  1895. var geoOptions = {
  1896. enableHighAccuracy: true
  1897. };
  1898. navigator.geolocation.getCurrentPosition(geoPosition, geoError, geoOptions);
  1899. }
  1900. }
  1901. function initializeGeo{$field_details['variable']}(address, latLng) {
  1902. var geocoder = new google.maps.Geocoder();
  1903. var latlng = new google.maps.LatLng(-34.397, 150.644);
  1904. var myOptions = {
  1905. zoom: 15,
  1906. center: latlng,
  1907. mapTypeControl: true,
  1908. mapTypeControlOptions: {
  1909. style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
  1910. },
  1911. navigationControl: true,
  1912. mapTypeId: google.maps.MapTypeId.ROADMAP
  1913. };
  1914. map_{$field_details['variable']} = new google.maps.Map(
  1915. document.getElementById('map_extra_{$field_details['variable']}'),
  1916. myOptions
  1917. );
  1918. var parameter = address ? {'address': address} : latLng ? {'latLng': latLng} : false;
  1919. if (geocoder && parameter) {
  1920. geocoder.geocode(parameter, function(results, status) {
  1921. if (status == google.maps.GeocoderStatus.OK) {
  1922. if (status != google.maps.GeocoderStatus.ZERO_RESULTS) {
  1923. map_{$field_details['variable']}.setCenter(results[0].geometry.location);
  1924. if (!address) {
  1925. $('#extra_{$field_details['variable']}').val(results[0].formatted_address);
  1926. }
  1927. var infowindow = new google.maps.InfoWindow({
  1928. content: '<b>' + $('#extra_{$field_details['variable']}').val() + '</b>',
  1929. size: new google.maps.Size(150, 50)
  1930. });
  1931. var marker = new google.maps.Marker({
  1932. position: results[0].geometry.location,
  1933. map: map_{$field_details['variable']},
  1934. title: $('#extra_{$field_details['variable']}').val()
  1935. });
  1936. google.maps.event.addListener(marker, 'click', function() {
  1937. infowindow.open(map_{$field_details['variable']}, marker);
  1938. });
  1939. } else {
  1940. alert('".get_lang('NotFound')."');
  1941. }
  1942. } else {
  1943. alert('Geocode ".get_lang('Error').": ".get_lang("AddressField")
  1944. ." ".get_lang('NotFound')."');
  1945. }
  1946. });
  1947. }
  1948. }
  1949. </script>
  1950. ");
  1951. $form->addHtml('
  1952. <div class="form-group">
  1953. <label for="geolocalization_extra_'.$field_details['variable'].'"
  1954. class="col-sm-2 control-label"></label>
  1955. <div class="col-sm-8">
  1956. <button class="null btn btn-default "
  1957. id="geolocalization_extra_'.$field_details['variable'].'"
  1958. name="geolocalization_extra_'.$field_details['variable'].'"
  1959. type="submit">
  1960. <em class="fa fa-map-marker"></em> '.get_lang('Geolocalization').'
  1961. </button>
  1962. <button class="null btn btn-default " id="myLocation_extra_'.$field_details['variable'].'"
  1963. name="myLocation_extra_'.$field_details['variable'].'"
  1964. type="submit">
  1965. <em class="fa fa-crosshairs"></em> '.get_lang('MyLocation').'
  1966. </button>
  1967. </div>
  1968. </div>
  1969. ');
  1970. $form->addHtml('
  1971. <div class="form-group">
  1972. <label for="map_extra_'.$field_details['variable'].'" class="col-sm-2 control-label">
  1973. '.$field_details['display_text'].' - '.get_lang('Map').'
  1974. </label>
  1975. <div class="col-sm-8">
  1976. <div name="map_extra_'.$field_details['variable'].'"
  1977. id="map_extra_'.$field_details['variable'].'" style="width:100%; height:300px;">
  1978. </div>
  1979. </div>
  1980. </div>
  1981. ');
  1982. break;
  1983. case self::FIELD_TYPE_GEOLOCALIZATION_COORDINATES:
  1984. $dataValue = isset($extraData['extra_'.$field_details['variable']])
  1985. ? $extraData['extra_'.$field_details['variable']]
  1986. : '';
  1987. $form->addElement(
  1988. 'text',
  1989. 'extra_'.$field_details['variable'],
  1990. $field_details['display_text'],
  1991. ['id' => 'extra_'.$field_details['variable']]
  1992. );
  1993. $form->applyFilter('extra_'.$field_details['variable'], 'stripslashes');
  1994. $form->applyFilter('extra_'.$field_details['variable'], 'trim');
  1995. if ($freezeElement) {
  1996. $form->freeze('extra_'.$field_details['variable']);
  1997. }
  1998. $latLag = explode(",", $dataValue);
  1999. // if no value, set default coordinates value
  2000. if (empty($dataValue)) {
  2001. $lat = '-34.397';
  2002. $lng = '150.644';
  2003. } else {
  2004. $lat = $latLag[0];
  2005. $lng = $latLag[1];
  2006. }
  2007. $form->addHtml("
  2008. <script>
  2009. $(document).ready(function() {
  2010. if (typeof google === 'object') {
  2011. var lat = '$lat';
  2012. var lng = '$lng';
  2013. var latLng = new google.maps.LatLng(lat, lng);
  2014. initializeGeo{$field_details['variable']}(false, latLng);
  2015. $('#geolocalization_extra_{$field_details['variable']}').on('click', function() {
  2016. var latLng = $('#extra_{$field_details['variable']}').val().split(',');
  2017. var lat = latLng[0];
  2018. var lng = latLng[1];
  2019. var latLng = new google.maps.LatLng(lat, lng);
  2020. initializeGeo{$field_details['variable']}(false, latLng);
  2021. return false;
  2022. });
  2023. $('#myLocation_extra_{$field_details['variable']}').on('click', function() {
  2024. myLocation{$field_details['variable']}();
  2025. return false;
  2026. });
  2027. $('#extra_{$field_details['variable']}').keypress(function (event) {
  2028. if (event.which == 13) {
  2029. $('#geolocalization_extra_{$field_details['variable']}').click();
  2030. return false;
  2031. }
  2032. });
  2033. return;
  2034. }
  2035. $('#map_extra_{$field_details['variable']}')
  2036. .html('<div class=\"alert alert-info\">"
  2037. .get_lang('YouNeedToActivateTheGoogleMapsPluginInAdminPlatformToSeeTheMap')
  2038. ."</div>');
  2039. });
  2040. function myLocation{$field_details['variable']}() {
  2041. if (navigator.geolocation) {
  2042. var geoPosition = function(position) {
  2043. var lat = position.coords.latitude;
  2044. var lng = position.coords.longitude;
  2045. var latLng = new google.maps.LatLng(lat, lng);
  2046. initializeGeo{$field_details['variable']}(false, latLng)
  2047. };
  2048. var geoError = function(error) {
  2049. alert('Geocode ".get_lang('Error').": ' + error);
  2050. };
  2051. var geoOptions = {
  2052. enableHighAccuracy: true
  2053. };
  2054. navigator.geolocation.getCurrentPosition(geoPosition, geoError, geoOptions);
  2055. }
  2056. }
  2057. function initializeGeo{$field_details['variable']}(address, latLng) {
  2058. var geocoder = new google.maps.Geocoder();
  2059. var latlng = new google.maps.LatLng(-34.397, 150.644);
  2060. var myOptions = {
  2061. zoom: 15,
  2062. center: latlng,
  2063. mapTypeControl: true,
  2064. mapTypeControlOptions: {
  2065. style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
  2066. },
  2067. navigationControl: true,
  2068. mapTypeId: google.maps.MapTypeId.ROADMAP
  2069. };
  2070. map_{$field_details['variable']} = new google.maps.Map(
  2071. document.getElementById('map_extra_{$field_details['variable']}'),
  2072. myOptions
  2073. );
  2074. var parameter = address ? {'address': address} : latLng ? {'latLng': latLng} : false;
  2075. if (geocoder && parameter) {
  2076. geocoder.geocode(parameter, function(results, status) {
  2077. if (status == google.maps.GeocoderStatus.OK) {
  2078. if (status != google.maps.GeocoderStatus.ZERO_RESULTS) {
  2079. map_{$field_details['variable']}.setCenter(results[0].geometry.location);
  2080. $('#extra_{$field_details['variable']}')
  2081. .val(results[0].geometry.location.lat() + ',' + results[0].geometry.location.lng());
  2082. var infowindow = new google.maps.InfoWindow({
  2083. content: '<b>' + $('#extra_{$field_details['variable']}').val() + '</b>',
  2084. size: new google.maps.Size(150, 50)
  2085. });
  2086. var marker = new google.maps.Marker({
  2087. position: results[0].geometry.location,
  2088. map: map_{$field_details['variable']},
  2089. title: $('#extra_{$field_details['variable']}').val()
  2090. });
  2091. google.maps.event.addListener(marker, 'click', function() {
  2092. infowindow.open(map_{$field_details['variable']}, marker);
  2093. });
  2094. } else {
  2095. alert('".get_lang("NotFound")."');
  2096. }
  2097. } else {
  2098. alert('Geocode ".get_lang('Error').": ' + status);
  2099. }
  2100. });
  2101. }
  2102. }
  2103. </script>
  2104. ");
  2105. $form->addHtml('
  2106. <div class="form-group">
  2107. <label for="geolocalization_extra_'.$field_details['variable'].'"
  2108. class="col-sm-2 control-label"></label>
  2109. <div class="col-sm-8">
  2110. <button class="null btn btn-default "
  2111. id="geolocalization_extra_'.$field_details['variable'].'"
  2112. name="geolocalization_extra_'.$field_details['variable'].'"
  2113. type="submit">
  2114. <em class="fa fa-map-marker"></em> '.get_lang('Geolocalization').'
  2115. </button>
  2116. <button class="null btn btn-default"
  2117. id="myLocation_extra_'.$field_details['variable'].'"
  2118. name="myLocation_extra_'.$field_details['variable'].'" type="submit">
  2119. <em class="fa fa-crosshairs"></em> '.get_lang('MyLocation').'
  2120. </button>
  2121. </div>
  2122. </div>
  2123. ');
  2124. $form->addHtml('
  2125. <div class="form-group">
  2126. <label for="map_extra_'.$field_details['variable'].'" class="col-sm-2 control-label">
  2127. '.$field_details['display_text'].' - '.get_lang('Map').'
  2128. </label>
  2129. <div class="col-sm-8">
  2130. <div name="map_extra_'.$field_details['variable'].'"
  2131. id="map_extra_'.$field_details['variable'].'"
  2132. style="width:100%; height:300px;">
  2133. </div>
  2134. </div>
  2135. </div>
  2136. ');
  2137. break;
  2138. case self::FIELD_TYPE_SELECT_WITH_TEXT_FIELD:
  2139. $jquery_ready_content .= self::addSelectWithTextFieldElement(
  2140. $form,
  2141. $field_details,
  2142. $freezeElement
  2143. );
  2144. break;
  2145. case self::FIELD_TYPE_TRIPLE_SELECT:
  2146. $jquery_ready_content .= self::addTripleSelectElement(
  2147. $form,
  2148. $field_details,
  2149. $extraData,
  2150. $freezeElement
  2151. );
  2152. break;
  2153. }
  2154. }
  2155. }
  2156. $return = array();
  2157. $return['jquery_ready_content'] = $jquery_ready_content;
  2158. return $return;
  2159. }
  2160. /**
  2161. * @param $breadcrumb
  2162. * @param $action
  2163. */
  2164. public function setupBreadcrumb(&$breadcrumb, $action)
  2165. {
  2166. if ($action == 'add') {
  2167. $breadcrumb[] = array('url' => $this->pageUrl, 'name' => $this->pageName);
  2168. $breadcrumb[] = array('url' => '#', 'name' => get_lang('Add'));
  2169. } elseif ($action == 'edit') {
  2170. $breadcrumb[] = array('url' => $this->pageUrl, 'name' => $this->pageName);
  2171. $breadcrumb[] = array('url' => '#', 'name' => get_lang('Edit'));
  2172. } else {
  2173. $breadcrumb[] = array('url' => '#', 'name' => $this->pageName);
  2174. }
  2175. }
  2176. /**
  2177. * Displays the title + grid
  2178. */
  2179. public function display()
  2180. {
  2181. // action links
  2182. echo '<div class="actions">';
  2183. echo '<a href="../admin/index.php">'.Display::return_icon(
  2184. 'back.png',
  2185. get_lang('BackTo').' '.get_lang('PlatformAdmin'),
  2186. '',
  2187. ICON_SIZE_MEDIUM
  2188. ).'</a>';
  2189. echo '<a href="'.api_get_self().'?action=add&type='.$this->type.'">'.Display::return_icon(
  2190. 'add_user_fields.png',
  2191. get_lang('Add'),
  2192. '',
  2193. ICON_SIZE_MEDIUM
  2194. ).'</a>';
  2195. echo '</div>';
  2196. echo Display::grid_html($this->type.'_fields');
  2197. }
  2198. /**
  2199. * @return array
  2200. */
  2201. public function getJqgridColumnNames()
  2202. {
  2203. return array(
  2204. get_lang('Name'),
  2205. get_lang('FieldLabel'),
  2206. get_lang('Type'),
  2207. get_lang('FieldChangeability'),
  2208. get_lang('VisibleToSelf'),
  2209. get_lang('VisibleToOthers'),
  2210. get_lang('Filter'),
  2211. get_lang('FieldOrder'),
  2212. get_lang('Actions')
  2213. );
  2214. }
  2215. /**
  2216. * @return array
  2217. */
  2218. public function getJqgridColumnModel()
  2219. {
  2220. return array(
  2221. array(
  2222. 'name' => 'display_text',
  2223. 'index' => 'display_text',
  2224. 'width' => '140',
  2225. 'align' => 'left',
  2226. ),
  2227. array(
  2228. 'name' => 'variable',
  2229. 'index' => 'variable',
  2230. 'width' => '90',
  2231. 'align' => 'left',
  2232. 'sortable' => 'true',
  2233. ),
  2234. array(
  2235. 'name' => 'field_type',
  2236. 'index' => 'field_type',
  2237. 'width' => '70',
  2238. 'align' => 'left',
  2239. 'sortable' => 'true',
  2240. ),
  2241. array(
  2242. 'name' => 'changeable',
  2243. 'index' => 'changeable',
  2244. 'width' => '35',
  2245. 'align' => 'left',
  2246. 'sortable' => 'true',
  2247. ),
  2248. array(
  2249. 'name' => 'visible_to_self',
  2250. 'index' => 'visible_to_self',
  2251. 'width' => '45',
  2252. 'align' => 'left',
  2253. 'sortable' => 'true',
  2254. ),
  2255. array(
  2256. 'name' => 'visible_to_others',
  2257. 'index' => 'visible_to_others',
  2258. 'width' => '35',
  2259. 'align' => 'left',
  2260. 'sortable' => 'true',
  2261. ),
  2262. array(
  2263. 'name' => 'filter',
  2264. 'index' => 'filter',
  2265. 'width' => '30',
  2266. 'align' => 'left',
  2267. 'sortable' => 'true',
  2268. ),
  2269. array(
  2270. 'name' => 'field_order',
  2271. 'index' => 'field_order',
  2272. 'width' => '25',
  2273. 'align' => 'left',
  2274. 'sortable' => 'true',
  2275. ),
  2276. array(
  2277. 'name' => 'actions',
  2278. 'index' => 'actions',
  2279. 'width' => '40',
  2280. 'align' => 'left',
  2281. 'formatter' => 'action_formatter',
  2282. 'sortable' => 'false',
  2283. ),
  2284. );
  2285. }
  2286. /**
  2287. * @param string $url
  2288. * @param string $action
  2289. * @return FormValidator
  2290. */
  2291. public function return_form($url, $action)
  2292. {
  2293. $form = new FormValidator($this->type.'_field', 'post', $url);
  2294. $form->addElement('hidden', 'type', $this->type);
  2295. $id = isset($_GET['id']) ? intval($_GET['id']) : null;
  2296. $form->addElement('hidden', 'id', $id);
  2297. // Setting the form elements
  2298. $header = get_lang('Add');
  2299. $defaults = array();
  2300. if ($action == 'edit') {
  2301. $header = get_lang('Modify');
  2302. // Setting the defaults
  2303. $defaults = $this->get($id, false);
  2304. }
  2305. $form->addElement('header', $header);
  2306. if ($action == 'edit') {
  2307. $translateUrl = api_get_path(WEB_CODE_PATH).'extrafield/translate.php?'
  2308. .http_build_query(['extra_field' => $id]);
  2309. $translateButton = Display::toolbarButton(get_lang('TranslateThisTerm'), $translateUrl, 'language', 'link');
  2310. $form->addText(
  2311. 'display_text',
  2312. [get_lang('Name'), $translateButton]
  2313. );
  2314. } else {
  2315. $form->addElement('text', 'display_text', get_lang('Name'));
  2316. }
  2317. // Field type
  2318. $types = self::get_field_types();
  2319. $form->addElement(
  2320. 'select',
  2321. 'field_type',
  2322. get_lang('FieldType'),
  2323. $types,
  2324. array('id' => 'field_type')
  2325. );
  2326. $form->addElement('label', get_lang('Example'), '<div id="example">-</div>');
  2327. $form->addElement('text', 'variable', get_lang('FieldLabel'), array('class' => 'span5'));
  2328. $form->addElement(
  2329. 'text',
  2330. 'field_options',
  2331. get_lang('FieldPossibleValues'),
  2332. array('id' => 'field_options', 'class' => 'span6')
  2333. );
  2334. $fieldWithOptions = array(
  2335. self::FIELD_TYPE_RADIO,
  2336. self::FIELD_TYPE_SELECT_MULTIPLE,
  2337. self::FIELD_TYPE_SELECT,
  2338. self::FIELD_TYPE_TAG,
  2339. self::FIELD_TYPE_DOUBLE_SELECT,
  2340. self::FIELD_TYPE_SELECT_WITH_TEXT_FIELD,
  2341. self::FIELD_TYPE_TRIPLE_SELECT
  2342. );
  2343. if ($action == 'edit') {
  2344. if (in_array($defaults['field_type'], $fieldWithOptions)) {
  2345. $url = Display::url(
  2346. get_lang('EditExtraFieldOptions'),
  2347. 'extra_field_options.php?type='.$this->type.'&field_id='.$id
  2348. );
  2349. $form->addElement('label', null, $url);
  2350. if ($defaults['field_type'] == self::FIELD_TYPE_SELECT) {
  2351. $urlWorkFlow = Display::url(
  2352. get_lang('EditExtraFieldWorkFlow'),
  2353. 'extra_field_workflow.php?type='.$this->type.'&field_id='.$id
  2354. );
  2355. $form->addElement('label', null, $urlWorkFlow);
  2356. }
  2357. $form->freeze('field_options');
  2358. }
  2359. }
  2360. $form->addElement(
  2361. 'text',
  2362. 'default_value',
  2363. get_lang('FieldDefaultValue'),
  2364. array('id' => 'default_value')
  2365. );
  2366. $group = array();
  2367. $group[] = $form->createElement('radio', 'visible_to_self', null, get_lang('Yes'), 1);
  2368. $group[] = $form->createElement('radio', 'visible_to_self', null, get_lang('No'), 0);
  2369. $form->addGroup($group, '', get_lang('VisibleToSelf'), null, false);
  2370. $group = array();
  2371. $group[] = $form->createElement('radio', 'visible_to_others', null, get_lang('Yes'), 1);
  2372. $group[] = $form->createElement('radio', 'visible_to_others', null, get_lang('No'), 0);
  2373. $form->addGroup($group, '', get_lang('VisibleToOthers'), null, false);
  2374. $group = array();
  2375. $group[] = $form->createElement('radio', 'changeable', null, get_lang('Yes'), 1);
  2376. $group[] = $form->createElement('radio', 'changeable', null, get_lang('No'), 0);
  2377. $form->addGroup($group, '', get_lang('FieldChangeability'), null, false);
  2378. $group = array();
  2379. $group[] = $form->createElement('radio', 'filter', null, get_lang('Yes'), 1);
  2380. $group[] = $form->createElement('radio', 'filter', null, get_lang('No'), 0);
  2381. $form->addGroup($group, '', get_lang('FieldFilter'), null, false);
  2382. /* Enable this when field_loggeable is introduced as a table field (2.0)
  2383. $group = array();
  2384. $group[] = $form->createElement('radio', 'field_loggeable', null, get_lang('Yes'), 1);
  2385. $group[] = $form->createElement('radio', 'field_loggeable', null, get_lang('No'), 0);
  2386. $form->addGroup($group, '', get_lang('FieldLoggeable'), '', false);
  2387. */
  2388. $form->addElement('text', 'field_order', get_lang('FieldOrder'));
  2389. if ($action == 'edit') {
  2390. $option = new ExtraFieldOption($this->type);
  2391. $defaults['field_options'] = $option->get_field_options_by_field_to_string($id);
  2392. $form->addButtonUpdate(get_lang('Modify'));
  2393. } else {
  2394. $defaults['visible_to_self'] = 0;
  2395. $defaults['visible_to_others'] = 0;
  2396. $defaults['changeable'] = 0;
  2397. $defaults['filter'] = 0;
  2398. $form->addButtonCreate(get_lang('Add'));
  2399. }
  2400. /*if (!empty($defaults['created_at'])) {
  2401. $defaults['created_at'] = api_convert_and_format_date($defaults['created_at']);
  2402. }
  2403. if (!empty($defaults['updated_at'])) {
  2404. $defaults['updated_at'] = api_convert_and_format_date($defaults['updated_at']);
  2405. }*/
  2406. $form->setDefaults($defaults);
  2407. // Setting the rules
  2408. $form->addRule('display_text', get_lang('ThisFieldIsRequired'), 'required');
  2409. $form->addRule('field_type', get_lang('ThisFieldIsRequired'), 'required');
  2410. return $form;
  2411. }
  2412. /**
  2413. * @param $token
  2414. * @return string
  2415. */
  2416. public function getJqgridActionLinks($token)
  2417. {
  2418. //With this function we can add actions to the jgrid (edit, delete, etc)
  2419. $editIcon = Display::return_icon('edit.png', get_lang('Edit'), '', ICON_SIZE_SMALL);
  2420. $deleteIcon = Display::return_icon('delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL);
  2421. $confirmMessage = addslashes(
  2422. api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES)
  2423. );
  2424. $editButton = <<<JAVASCRIPT
  2425. <a href="?action=edit&type={$this->type}&id=' + options.rowId + '" class="btn btn-link btn-xs">\
  2426. $editIcon\
  2427. </a>
  2428. JAVASCRIPT;
  2429. $deleteButton = <<<JAVASCRIPT
  2430. <a \
  2431. onclick="if (!confirm(\'$confirmMessage\')) {return false;}" \
  2432. href="?sec_token=$token&type={$this->type}&id=' + options.rowId + '&action=delete" \
  2433. class="btn btn-link btn-xs">\
  2434. $deleteIcon\
  2435. </a>
  2436. JAVASCRIPT;
  2437. return "function action_formatter(cellvalue, options, rowObject) {
  2438. return '$editButton $deleteButton';
  2439. }";
  2440. }
  2441. /**
  2442. * @param array $columns
  2443. * @param array $column_model
  2444. * @param array $extraFields
  2445. * @return array
  2446. */
  2447. public function getRules(&$columns, &$column_model, $extraFields = array(), $checkExtraFieldExistence = false)
  2448. {
  2449. $fields = $this->get_all(
  2450. array(
  2451. 'visible_to_self = ? AND filter = ?' => array(1, 1)
  2452. ),
  2453. 'display_text'
  2454. );
  2455. $extraFieldOption = new ExtraFieldOption($this->type);
  2456. $rules = array();
  2457. if (!empty($fields)) {
  2458. foreach ($fields as $field) {
  2459. $search_options = array();
  2460. $type = 'text';
  2461. if (in_array($field['field_type'], array(self::FIELD_TYPE_SELECT, self::FIELD_TYPE_DOUBLE_SELECT))) {
  2462. $type = 'select';
  2463. $search_options['sopt'] = array('eq', 'ne'); //equal not equal
  2464. } else {
  2465. $search_options['sopt'] = array('cn', 'nc'); //contains not contains
  2466. }
  2467. $search_options['searchhidden'] = 'true';
  2468. $search_options['defaultValue'] = isset($search_options['field_default_value'])
  2469. ? $search_options['field_default_value']
  2470. : null;
  2471. if ($field['field_type'] == self::FIELD_TYPE_DOUBLE_SELECT) {
  2472. //Add 2 selects
  2473. $options = $extraFieldOption->get_field_options_by_field($field['id']);
  2474. $options = self::extra_field_double_select_convert_array_to_ordered_array($options);
  2475. $first_options = array();
  2476. if (!empty($options)) {
  2477. foreach ($options as $option) {
  2478. foreach ($option as $sub_option) {
  2479. if ($sub_option['option_value'] == 0) {
  2480. $first_options[] = $sub_option['field_id'].'#'.$sub_option['id'].':'
  2481. .$sub_option['display_text'];
  2482. }
  2483. }
  2484. }
  2485. }
  2486. $search_options['value'] = implode(';', $first_options);
  2487. $search_options['dataInit'] = 'fill_second_select';
  2488. // First
  2489. $column_model[] = array(
  2490. 'name' => 'extra_'.$field['variable'],
  2491. 'index' => 'extra_'.$field['variable'],
  2492. 'width' => '100',
  2493. 'hidden' => 'true',
  2494. 'search' => 'true',
  2495. 'stype' => 'select',
  2496. 'searchoptions' => $search_options,
  2497. );
  2498. $columns[] = $field['display_text'].' (1)';
  2499. $rules[] = array(
  2500. 'field' => 'extra_'.$field['variable'],
  2501. 'op' => 'cn',
  2502. );
  2503. // Second
  2504. $search_options['value'] = $field['id'].':';
  2505. $search_options['dataInit'] = 'register_second_select';
  2506. $column_model[] = array(
  2507. 'name' => 'extra_'.$field['variable'].'_second',
  2508. 'index' => 'extra_'.$field['variable'].'_second',
  2509. 'width' => '100',
  2510. 'hidden' => 'true',
  2511. 'search' => 'true',
  2512. 'stype' => 'select',
  2513. 'searchoptions' => $search_options,
  2514. );
  2515. $columns[] = $field['display_text'].' (2)';
  2516. $rules[] = array('field' => 'extra_'.$field['variable'].'_second', 'op' => 'cn');
  2517. continue;
  2518. } else {
  2519. $search_options['value'] = $extraFieldOption->getFieldOptionsToString(
  2520. $field['id'],
  2521. false,
  2522. 'display_text'
  2523. );
  2524. }
  2525. $column_model[] = array(
  2526. 'name' => 'extra_'.$field['variable'],
  2527. 'index' => 'extra_'.$field['variable'],
  2528. 'width' => '100',
  2529. 'hidden' => 'true',
  2530. 'search' => 'true',
  2531. 'stype' => $type,
  2532. 'searchoptions' => $search_options,
  2533. );
  2534. $columns[] = $field['display_text'];
  2535. $rules[] = array(
  2536. 'field' => 'extra_'.$field['variable'],
  2537. 'op' => 'cn'
  2538. );
  2539. }
  2540. }
  2541. return $rules;
  2542. }
  2543. /**
  2544. * @param array $options
  2545. * @return array
  2546. */
  2547. public function parseConditions($options)
  2548. {
  2549. $inject_extra_fields = null;
  2550. $extraFieldOption = new ExtraFieldOption($this->type);
  2551. $double_fields = array();
  2552. if (isset($options['extra'])) {
  2553. $extra_fields = $options['extra'];
  2554. if (!empty($extra_fields)) {
  2555. $counter = 1;
  2556. foreach ($extra_fields as &$extra) {
  2557. $extra_field_obj = new ExtraField($this->type);
  2558. $extra_field_info = $extra_field_obj->get($extra['id']);
  2559. $extra['extra_field_info'] = $extra_field_info;
  2560. if (isset($extra_field_info['field_type']) &&
  2561. in_array(
  2562. $extra_field_info['field_type'],
  2563. array(
  2564. self::FIELD_TYPE_SELECT,
  2565. self::FIELD_TYPE_SELECT,
  2566. self::FIELD_TYPE_DOUBLE_SELECT
  2567. )
  2568. )
  2569. ) {
  2570. $inject_extra_fields .= " fvo$counter.display_text as {$extra['field']}, ";
  2571. } else {
  2572. $inject_extra_fields .= " fv$counter.value as {$extra['field']}, ";
  2573. }
  2574. if (isset($extra_fields_info[$extra['id']])) {
  2575. $info = $extra_fields_info[$extra['id']];
  2576. } else {
  2577. $info = $this->get($extra['id']);
  2578. $extra_fields_info[$extra['id']] = $info;
  2579. }
  2580. if (isset($info['field_type']) && $info['field_type'] == self::FIELD_TYPE_DOUBLE_SELECT) {
  2581. $double_fields[$info['id']] = $info;
  2582. }
  2583. $counter++;
  2584. }
  2585. }
  2586. }
  2587. $options_by_double = array();
  2588. foreach ($double_fields as $double) {
  2589. $my_options = $extraFieldOption->get_field_options_by_field(
  2590. $double['id'],
  2591. true
  2592. );
  2593. $options_by_double['extra_'.$double['variable']] = $my_options;
  2594. }
  2595. $field_value_to_join = array();
  2596. //filter can be all/any = and/or
  2597. $inject_joins = null;
  2598. $inject_where = null;
  2599. $where = null;
  2600. if (!empty($options['where'])) {
  2601. if (!empty($options['extra'])) {
  2602. // Removing double 1=1
  2603. $options['where'] = str_replace(' 1 = 1 AND', '', $options['where']);
  2604. // Always OR
  2605. $counter = 1;
  2606. foreach ($extra_fields as $extra_info) {
  2607. $extra_field_info = $extra_info['extra_field_info'];
  2608. $inject_joins .= " INNER JOIN $this->table_field_values fv$counter
  2609. ON (s.".$this->primaryKey." = fv$counter.".$this->handler_id.") ";
  2610. // Add options
  2611. if (isset($extra_field_info['field_type']) &&
  2612. in_array(
  2613. $extra_field_info['field_type'],
  2614. array(
  2615. self::FIELD_TYPE_SELECT,
  2616. self::FIELD_TYPE_SELECT,
  2617. self::FIELD_TYPE_DOUBLE_SELECT
  2618. )
  2619. )
  2620. ) {
  2621. $options['where'] = str_replace(
  2622. $extra_info['field'],
  2623. 'fv'.$counter.'.field_id = '.$extra_info['id'].' AND fvo'.$counter.'.option_value',
  2624. $options['where']
  2625. );
  2626. $inject_joins .= "
  2627. INNER JOIN $this->table_field_options fvo$counter
  2628. ON (
  2629. fv$counter.field_id = fvo$counter.field_id AND
  2630. fv$counter.value = fvo$counter.option_value
  2631. )
  2632. ";
  2633. } else {
  2634. if (isset($extra_field_info['field_type']) &&
  2635. $extra_field_info['field_type'] == self::FIELD_TYPE_TAG
  2636. ) {
  2637. $options['where'] = str_replace(
  2638. $extra_info['field'],
  2639. 'tag'.$counter.'.tag ',
  2640. $options['where']
  2641. );
  2642. $inject_joins .= "
  2643. INNER JOIN $this->table_field_rel_tag tag_rel$counter
  2644. ON (
  2645. tag_rel$counter.field_id = ".$extra_info['id']." AND
  2646. tag_rel$counter.item_id = s.".$this->primaryKey."
  2647. )
  2648. INNER JOIN $this->table_field_tag tag$counter
  2649. ON (tag$counter.id = tag_rel$counter.tag_id)
  2650. ";
  2651. } else {
  2652. //text, textarea, etc
  2653. $options['where'] = str_replace(
  2654. $extra_info['field'],
  2655. 'fv'.$counter.'.field_id = '.$extra_info['id'].' AND fv'.$counter.'.value',
  2656. $options['where']
  2657. );
  2658. }
  2659. }
  2660. $field_value_to_join[] = " fv$counter.$this->handler_id ";
  2661. $counter++;
  2662. }
  2663. if (!empty($field_value_to_join)) {
  2664. //$inject_where .= " AND s.id = ".implode(' = ', $field_value_to_join);
  2665. }
  2666. }
  2667. $where .= ' AND '.$options['where'];
  2668. }
  2669. $order = null;
  2670. if (!empty($options['order'])) {
  2671. $order = " ORDER BY ".$options['order'];
  2672. }
  2673. $limit = null;
  2674. if (!empty($options['limit'])) {
  2675. $limit = " LIMIT ".$options['limit'];
  2676. }
  2677. return array(
  2678. 'order' => $order,
  2679. 'limit' => $limit,
  2680. 'where' => $where,
  2681. 'inject_where' => $inject_where,
  2682. 'inject_joins' => $inject_joins,
  2683. 'field_value_to_join' => $field_value_to_join,
  2684. 'inject_extra_fields' => $inject_extra_fields,
  2685. );
  2686. }
  2687. //@todo move this in the display_class or somewhere else
  2688. /**
  2689. * @param $col
  2690. * @param $oper
  2691. * @param $val
  2692. * @return string
  2693. */
  2694. public function get_where_clause($col, $oper, $val)
  2695. {
  2696. if (empty($col)) {
  2697. return '';
  2698. }
  2699. if ($oper == 'bw' || $oper == 'bn') {
  2700. $val .= '%';
  2701. }
  2702. if ($oper == 'ew' || $oper == 'en') {
  2703. $val = '%'.$val;
  2704. }
  2705. if ($oper == 'cn' || $oper == 'nc' || $oper == 'in' || $oper == 'ni') {
  2706. if (is_array($val)) {
  2707. $result = '"%'.implode(';', $val).'%"';
  2708. foreach ($val as $item) {
  2709. $item = trim($item);
  2710. $result .= ' OR '.$col.' LIKE "%'.$item.'%"';
  2711. }
  2712. $val = $result;
  2713. return " $col {$this->ops[$oper]} $val ";
  2714. } else {
  2715. $val = '%'.$val.'%';
  2716. }
  2717. }
  2718. $val = \Database::escape_string($val);
  2719. return " $col {$this->ops[$oper]} '$val' ";
  2720. }
  2721. /**
  2722. * @param $filters
  2723. * @param string $stringToSearch
  2724. * @return array
  2725. */
  2726. public function getExtraFieldRules($filters, $stringToSearch = 'extra_')
  2727. {
  2728. $extra_fields = array();
  2729. // Getting double select if exists
  2730. $double_select = array();
  2731. foreach ($filters->rules as $rule) {
  2732. if (empty($rule)) {
  2733. continue;
  2734. }
  2735. if (strpos($rule->field, '_second') === false) {
  2736. } else {
  2737. $my_field = str_replace('_second', '', $rule->field);
  2738. $double_select[$my_field] = $rule->data;
  2739. }
  2740. }
  2741. $condition_array = array();
  2742. foreach ($filters->rules as $rule) {
  2743. if (empty($rule)) {
  2744. continue;
  2745. }
  2746. if (strpos($rule->field, $stringToSearch) === false) {
  2747. // normal fields
  2748. $field = $rule->field;
  2749. if (isset($rule->data) && is_string($rule->data) && $rule->data != -1) {
  2750. $condition_array[] = $this->get_where_clause($field, $rule->op, $rule->data);
  2751. }
  2752. } else {
  2753. // Extra fields
  2754. if (strpos($rule->field, '_second') === false) {
  2755. //No _second
  2756. $original_field = str_replace($stringToSearch, '', $rule->field);
  2757. $field_option = $this->get_handler_field_info_by_field_variable($original_field);
  2758. if ($field_option['field_type'] == self::FIELD_TYPE_DOUBLE_SELECT) {
  2759. if (isset($double_select[$rule->field])) {
  2760. $data = explode('#', $rule->data);
  2761. $rule->data = $data[1].'::'.$double_select[$rule->field];
  2762. } else {
  2763. // only was sent 1 select
  2764. if (is_string($rule->data)) {
  2765. $data = explode('#', $rule->data);
  2766. $rule->data = $data[1];
  2767. }
  2768. }
  2769. if (!isset($rule->data)) {
  2770. $condition_array[] = ' ('
  2771. .$this->get_where_clause($rule->field, $rule->op, $rule->data)
  2772. .') ';
  2773. $extra_fields[] = array('field' => $rule->field, 'id' => $field_option['id']);
  2774. }
  2775. } else {
  2776. if (isset($rule->data)) {
  2777. if ($rule->data == -1) {
  2778. continue;
  2779. }
  2780. $condition_array[] = ' ('
  2781. .$this->get_where_clause($rule->field, $rule->op, $rule->data)
  2782. .') ';
  2783. $extra_fields[] = array(
  2784. 'field' => $rule->field,
  2785. 'id' => $field_option['id'],
  2786. 'data' => $rule->data
  2787. );
  2788. }
  2789. }
  2790. } else {
  2791. $my_field = str_replace('_second', '', $rule->field);
  2792. $original_field = str_replace($stringToSearch, '', $my_field);
  2793. $field_option = $this->get_handler_field_info_by_field_variable($original_field);
  2794. $extra_fields[] = array(
  2795. 'field' => $rule->field,
  2796. 'id' => $field_option['id']
  2797. );
  2798. }
  2799. }
  2800. }
  2801. return array(
  2802. 'extra_fields' => $extra_fields,
  2803. 'condition_array' => $condition_array
  2804. );
  2805. }
  2806. /**
  2807. * Get the extra fields and their formatted values
  2808. * @param int|string $itemId The item ID (It could be a session_id, course_id or user_id)
  2809. * @return array The extra fields data
  2810. */
  2811. public function getDataAndFormattedValues($itemId)
  2812. {
  2813. $valuesData = array();
  2814. $fields = $this->get_all();
  2815. $em = Database::getManager();
  2816. foreach ($fields as $field) {
  2817. if ($field['visible_to_self'] != '1') {
  2818. continue;
  2819. }
  2820. $fieldValue = new ExtraFieldValue($this->type);
  2821. $valueData = $fieldValue->get_values_by_handler_and_field_id(
  2822. $itemId,
  2823. $field['id'],
  2824. true
  2825. );
  2826. if ($field['field_type'] == ExtraField::FIELD_TYPE_TAG) {
  2827. $tags = $em
  2828. ->getRepository('ChamiloCoreBundle:ExtraFieldRelTag')
  2829. ->findBy(
  2830. [
  2831. 'fieldId' => $field['id'],
  2832. 'itemId' => $itemId,
  2833. ]
  2834. );
  2835. if ($tags) {
  2836. /** @var \Chamilo\CoreBundle\Entity\ExtraFieldRelTag $tag */
  2837. $data = [];
  2838. foreach ($tags as $extraFieldTag) {
  2839. /** @var \Chamilo\CoreBundle\Entity\Tag $tag */
  2840. $tag = $em->find('ChamiloCoreBundle:Tag', $extraFieldTag->getTagId());
  2841. /*$data[] = [
  2842. 'id' => $extraFieldTag->getTagId(),
  2843. 'value' => $tag->getTag()
  2844. ];*/
  2845. $data[] = $tag->getTag();
  2846. }
  2847. $valueData = implode(',', $data);
  2848. }
  2849. }
  2850. if (!$valueData) {
  2851. continue;
  2852. }
  2853. $displayedValue = get_lang('None');
  2854. switch ($field['field_type']) {
  2855. case self::FIELD_TYPE_CHECKBOX:
  2856. if ($valueData !== false && $valueData['value'] == '1') {
  2857. $displayedValue = get_lang('Yes');
  2858. } else {
  2859. $displayedValue = get_lang('No');
  2860. }
  2861. break;
  2862. case self::FIELD_TYPE_DATE:
  2863. if ($valueData !== false && !empty($valueData['value'])) {
  2864. $displayedValue = api_format_date($valueData['value'], DATE_FORMAT_LONG_NO_DAY);
  2865. }
  2866. break;
  2867. case self::FIELD_TYPE_TAG:
  2868. if (!empty($valueData)) {
  2869. $displayedValue = $valueData;
  2870. }
  2871. break;
  2872. case self::FIELD_TYPE_FILE_IMAGE:
  2873. if ($valueData === false || empty($valueData['value'])) {
  2874. break;
  2875. }
  2876. if (!file_exists(api_get_path(SYS_UPLOAD_PATH).$valueData['value'])) {
  2877. break;
  2878. }
  2879. $image = Display::img(
  2880. api_get_path(WEB_UPLOAD_PATH).$valueData['value'],
  2881. $field['display_text'],
  2882. array('width' => '300')
  2883. );
  2884. $displayedValue = Display::url(
  2885. $image,
  2886. api_get_path(WEB_UPLOAD_PATH).$valueData['value'],
  2887. array('target' => '_blank')
  2888. );
  2889. break;
  2890. case self::FIELD_TYPE_FILE:
  2891. if ($valueData === false || empty($valueData['value'])) {
  2892. break;
  2893. }
  2894. if (!file_exists(api_get_path(SYS_UPLOAD_PATH).$valueData['value'])) {
  2895. break;
  2896. }
  2897. $displayedValue = Display::url(
  2898. get_lang('Download'),
  2899. api_get_path(WEB_UPLOAD_PATH).$valueData['value'],
  2900. array(
  2901. 'title' => $field['display_text'],
  2902. 'target' => '_blank'
  2903. )
  2904. );
  2905. break;
  2906. default:
  2907. $displayedValue = $valueData['value'];
  2908. break;
  2909. }
  2910. $valuesData[] = array(
  2911. 'text' => $field['display_text'],
  2912. 'value' => $displayedValue
  2913. );
  2914. }
  2915. return $valuesData;
  2916. }
  2917. /**
  2918. * Gets an element
  2919. * @param int $id
  2920. * @param bool $translateDisplayText Optional
  2921. * @return array
  2922. */
  2923. public function get($id, $translateDisplayText = true)
  2924. {
  2925. $info = parent::get($id);
  2926. if ($translateDisplayText) {
  2927. $info['display_text'] = self::translateDisplayName($info['variable'], $info['display_text']);
  2928. }
  2929. return $info;
  2930. }
  2931. /**
  2932. * Translate the display text for a extra field
  2933. * @param string $variable
  2934. * @param string $defaultDisplayText
  2935. * @return string
  2936. */
  2937. public static function translateDisplayName($variable, $defaultDisplayText)
  2938. {
  2939. $camelCase = api_underscore_to_camel_case($variable);
  2940. return isset($GLOBALS[$camelCase]) ? $GLOBALS[$camelCase] : $defaultDisplayText;
  2941. }
  2942. /**
  2943. * @param int $fieldId
  2944. * @param string $tag
  2945. *
  2946. * @return array
  2947. */
  2948. public function getAllUserPerTag($fieldId, $tag)
  2949. {
  2950. $tagRelUserTable = Database::get_main_table(TABLE_MAIN_USER_REL_TAG);
  2951. $tag = Database::escape_string($tag);
  2952. $fieldId = (int) $fieldId;
  2953. $sql = "SELECT user_id
  2954. FROM {$this->table_field_tag} f INNER JOIN $tagRelUserTable ft
  2955. ON tag_id = f.id
  2956. WHERE tag = '$tag' AND f.field_id = $fieldId;
  2957. ";
  2958. $result = Database::query($sql);
  2959. return Database::store_result($result, 'ASSOC');
  2960. }
  2961. /**
  2962. * @param int $fieldId
  2963. * @param int $tagId
  2964. *
  2965. * @return array
  2966. */
  2967. public function getAllSkillPerTag($fieldId, $tagId)
  2968. {
  2969. $skillTable = Database::get_main_table(TABLE_MAIN_SKILL);
  2970. $tagRelExtraTable = Database::get_main_table(TABLE_MAIN_EXTRA_FIELD_REL_TAG);
  2971. $fieldId = intval($fieldId);
  2972. $tagId = intval($tagId);
  2973. $sql = "SELECT s.id
  2974. FROM $skillTable s INNER JOIN $tagRelExtraTable t
  2975. ON t.item_id = s.id
  2976. WHERE tag_id = $tagId AND t.field_id = $fieldId;
  2977. ";
  2978. $result = Database::query($sql);
  2979. $result = Database::store_result($result, 'ASSOC');
  2980. $skillList = [];
  2981. foreach ($result as $index => $value) {
  2982. $skillList[$value['id']] = $value['id'];
  2983. }
  2984. return $skillList;
  2985. }
  2986. /**
  2987. * @param string $from
  2988. * @param string $search
  2989. *
  2990. * @return array
  2991. */
  2992. public function searchOptionsFromTags($from, $search, $options)
  2993. {
  2994. $extraFieldInfo = $this->get_handler_field_info_by_field_variable(
  2995. str_replace('extra_', '', $from)
  2996. );
  2997. $extraFieldInfoTag = $this->get_handler_field_info_by_field_variable(
  2998. str_replace('extra_', '', $search)
  2999. );
  3000. if (empty($extraFieldInfo) || empty($extraFieldInfoTag)) {
  3001. return [];
  3002. }
  3003. $id = $extraFieldInfo['id'];
  3004. $tagId = $extraFieldInfoTag['id'];
  3005. $table = Database::get_main_table(TABLE_EXTRA_FIELD_VALUES);
  3006. $tagRelExtraTable = Database::get_main_table(TABLE_MAIN_EXTRA_FIELD_REL_TAG);
  3007. $tagTable = Database::get_main_table(TABLE_MAIN_TAG);
  3008. $optionsTable = Database::get_main_table(TABLE_EXTRA_FIELD_OPTIONS);
  3009. $sql = "SELECT DISTINCT t.*, v.value, o.display_text
  3010. FROM $tagRelExtraTable te
  3011. INNER JOIN $tagTable t
  3012. ON (t.id = te.tag_id AND te.field_id = t.field_id AND te.field_id = $tagId)
  3013. INNER JOIN $table v
  3014. ON (te.item_id = v.item_id AND v.field_id = $id)
  3015. INNER JOIN $optionsTable o
  3016. ON (o.option_value = v.value)
  3017. WHERE v.value IN ('".implode("','", $options)."')
  3018. ORDER BY o.option_order, t.tag
  3019. ";
  3020. $result = Database::query($sql);
  3021. $result = Database::store_result($result);
  3022. return $result;
  3023. }
  3024. }