1: <?php
2: /**
3: * Extended User Profile
4: *
5: * You may not change or alter any portion of this comment or credits
6: * of supporting developers from this source code or any supporting source code
7: * which is considered copyrighted (c) material of the original comment or credit authors.
8: * This program is distributed in the hope that it will be useful,
9: * but WITHOUT ANY WARRANTY; without even the implied warranty of
10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11: *
12: * @copyright (c) 2000-2016 XOOPS Project (www.xoops.org)
13: * @license GNU GPL 2 (https://www.gnu.org/licenses/gpl-2.0.html)
14: * @package profile
15: * @since 2.3.0
16: * @author Jan Pedersen
17: * @author Taiwen Jiang <phppp@users.sourceforge.net>
18: */
19: include_once __DIR__ . '/admin_header.php';
20: xoops_cp_header();
21: $indexAdmin = new ModuleAdmin();
22:
23: $indexAdmin->addItemButton(_ADD . ' ' . _PROFILE_AM_FIELD, 'field.php?op=new', 'add', '');
24:
25: echo $indexAdmin->addNavigation(basename(__FILE__));
26: echo $indexAdmin->renderButton('right', '');
27:
28: $op = isset($_REQUEST['op']) ? $_REQUEST['op'] : (isset($_REQUEST['id']) ? 'edit' : 'list');
29: /** @var XoopsModuleHandler $profilefield_handler */
30: $profilefield_handler = xoops_getModuleHandler('field');
31:
32: switch ($op) {
33: default:
34: case 'list':
35: $fields = $profilefield_handler->getObjects(null, true, false);
36:
37: /** @var XoopsModuleHandler $module_handler */
38: $module_handler = xoops_getHandler('module');
39: $modules = $module_handler->getObjects(null, true);
40:
41: /** @var XoopsModuleHandler $cat_handler */
42: $cat_handler = xoops_getModuleHandler('category');
43: $criteria = new CriteriaCompo();
44: $criteria->setSort('cat_weight');
45: $cats = $cat_handler->getObjects($criteria, true);
46: unset($criteria);
47:
48: $categories[0] = _PROFILE_AM_DEFAULT;
49: if (count($cats) > 0) {
50: foreach (array_keys($cats) as $i) {
51: $categories[$cats[$i]->getVar('cat_id')] = $cats[$i]->getVar('cat_title');
52: }
53: }
54: $GLOBALS['xoopsTpl']->assign('categories', $categories);
55: unset($categories);
56: $valuetypes = array(
57: XOBJ_DTYPE_ARRAY => _PROFILE_AM_ARRAY,
58: XOBJ_DTYPE_EMAIL => _PROFILE_AM_EMAIL,
59: XOBJ_DTYPE_INT => _PROFILE_AM_INT,
60: XOBJ_DTYPE_TXTAREA => _PROFILE_AM_TXTAREA,
61: XOBJ_DTYPE_TXTBOX => _PROFILE_AM_TXTBOX,
62: XOBJ_DTYPE_URL => _PROFILE_AM_URL,
63: XOBJ_DTYPE_OTHER => _PROFILE_AM_OTHER,
64: XOBJ_DTYPE_MTIME => _PROFILE_AM_DATE);
65:
66: $fieldtypes = array(
67: 'checkbox' => _PROFILE_AM_CHECKBOX,
68: 'group' => _PROFILE_AM_GROUP,
69: 'group_multi' => _PROFILE_AM_GROUPMULTI,
70: 'language' => _PROFILE_AM_LANGUAGE,
71: 'radio' => _PROFILE_AM_RADIO,
72: 'select' => _PROFILE_AM_SELECT,
73: 'select_multi' => _PROFILE_AM_SELECTMULTI,
74: 'textarea' => _PROFILE_AM_TEXTAREA,
75: 'dhtml' => _PROFILE_AM_DHTMLTEXTAREA,
76: 'textbox' => _PROFILE_AM_TEXTBOX,
77: 'timezone' => _PROFILE_AM_TIMEZONE,
78: 'yesno' => _PROFILE_AM_YESNO,
79: 'date' => _PROFILE_AM_DATE,
80: 'datetime' => _PROFILE_AM_DATETIME,
81: 'longdate' => _PROFILE_AM_LONGDATE,
82: 'theme' => _PROFILE_AM_THEME,
83: 'autotext' => _PROFILE_AM_AUTOTEXT,
84: 'rank' => _PROFILE_AM_RANK);
85:
86: foreach (array_keys($fields) as $i) {
87: $fields[$i]['canEdit'] = $fields[$i]['field_config'] || $fields[$i]['field_show'] || $fields[$i]['field_edit'];
88: $fields[$i]['canDelete'] = $fields[$i]['field_config'];
89: $fields[$i]['fieldtype'] = $fieldtypes[$fields[$i]['field_type']];
90: $fields[$i]['valuetype'] = $valuetypes[$fields[$i]['field_valuetype']];
91: $categories[$fields[$i]['cat_id']][] = $fields[$i];
92: $weights[$fields[$i]['cat_id']][] = $fields[$i]['field_weight'];
93: }
94: //sort fields order in categories
95: foreach (array_keys($categories) as $i) {
96: array_multisort($weights[$i], SORT_ASC, array_keys($categories[$i]), SORT_ASC, $categories[$i]);
97: }
98: ksort($categories);
99: $GLOBALS['xoopsTpl']->assign('fieldcategories', $categories);
100: $GLOBALS['xoopsTpl']->assign('token', $GLOBALS['xoopsSecurity']->getTokenHTML());
101: $template_main = 'profile_admin_fieldlist.tpl';
102: break;
103:
104: case 'new':
105: include_once dirname(__DIR__) . '/include/forms.php';
106: $obj = $profilefield_handler->create();
107: $form = profile_getFieldForm($obj);
108: $form->display();
109: break;
110:
111: case 'edit':
112: $obj = $profilefield_handler->get($_REQUEST['id']);
113: if (!$obj->getVar('field_config') && !$obj->getVar('field_show') && !$obj->getVar('field_edit')) { //If no configs exist
114: redirect_header('field.php', 2, _PROFILE_AM_FIELDNOTCONFIGURABLE);
115: }
116: include_once dirname(__DIR__) . '/include/forms.php';
117: $form = profile_getFieldForm($obj);
118: $form->display();
119: break;
120:
121: case 'edit-option-strings':
122: $obj = $profilefield_handler->get($_REQUEST['id']);
123: $fieldOptions = $obj->getVar('field_options');
124: if (empty($fieldOptions)) { //If no option strings exist
125: redirect_header('field.php', 2, _PROFILE_AM_FIELDNOTCONFIGURABLE);
126: }
127: include_once dirname(__DIR__) . '/include/forms.php';
128: $form = profile_getFieldOptionForm($obj);
129: $form->display();
130: break;
131:
132: case 'reorder':
133: if (!$GLOBALS['xoopsSecurity']->check()) {
134: redirect_header('field.php', 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
135: }
136: if (isset($_POST['field_ids']) && count($_POST['field_ids']) > 0) {
137: $oldweight = $_POST['oldweight'];
138: $oldcat = $_POST['oldcat'];
139: $category = $_POST['category'];
140: $weight = $_POST['weight'];
141: $ids = array();
142: foreach ($_POST['field_ids'] as $field_id) {
143: if ($oldweight[$field_id] != $weight[$field_id] || $oldcat[$field_id] != $category[$field_id]) {
144: //if field has changed
145: $ids[] = (int)$field_id;
146: }
147: }
148: if (count($ids) > 0) {
149: $errors = array();
150: //if there are changed fields, fetch the fieldcategory objects
151: /** @var XoopsModuleHandler $field_handler */
152: $field_handler = xoops_getModuleHandler('field');
153: $fields = $field_handler->getObjects(new Criteria('field_id', '(' . implode(',', $ids) . ')', 'IN'), true);
154: foreach ($ids as $i) {
155: $fields[$i]->setVar('field_weight', (int)$weight[$i]);
156: $fields[$i]->setVar('cat_id', (int)$category[$i]);
157: if (!$field_handler->insert($fields[$i])) {
158: $errors = array_merge($errors, $fields[$i]->getErrors());
159: }
160: }
161: if (count($errors) == 0) {
162: //no errors
163: redirect_header('field.php', 2, sprintf(_PROFILE_AM_SAVEDSUCCESS, _PROFILE_AM_FIELDS));
164: } else {
165: redirect_header('field.php', 3, implode('<br>', $errors));
166: }
167: }
168: }
169: break;
170:
171: case 'save':
172: if (!$GLOBALS['xoopsSecurity']->check()) {
173: redirect_header('field.php', 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
174: }
175: $redirect_to_edit = false;
176: if (isset($_REQUEST['id'])) {
177: $obj = $profilefield_handler->get($_REQUEST['id']);
178: if (!$obj->getVar('field_config') && !$obj->getVar('field_show') && !$obj->getVar('field_edit')) { //If no configs exist
179: redirect_header('admin.php', 2, _PROFILE_AM_FIELDNOTCONFIGURABLE);
180: }
181: } else {
182: $obj = $profilefield_handler->create();
183: $obj->setVar('field_name', $_REQUEST['field_name']);
184: $obj->setVar('field_moduleid', $GLOBALS['xoopsModule']->getVar('mid'));
185: $obj->setVar('field_show', 1);
186: $obj->setVar('field_edit', 1);
187: $obj->setVar('field_config', 1);
188: $redirect_to_edit = true;
189: }
190: $obj->setVar('field_title', $_REQUEST['field_title']);
191: $obj->setVar('field_description', $_REQUEST['field_description']);
192: if ($obj->getVar('field_config')) {
193: $obj->setVar('field_type', $_REQUEST['field_type']);
194: if (isset($_REQUEST['field_valuetype'])) {
195: $obj->setVar('field_valuetype', $_REQUEST['field_valuetype']);
196: }
197: $options = $obj->getVar('field_options');
198:
199: if (isset($_REQUEST['removeOptions']) && \is_array($_REQUEST['removeOptions'])) {
200: foreach ($_REQUEST['removeOptions'] as $index) {
201: unset($options[$index]);
202: }
203: $redirect_to_edit = true;
204: }
205:
206: if (!empty($_REQUEST['addOption'])) {
207: foreach ($_REQUEST['addOption'] as $option) {
208: if (empty($option['value'])) {
209: continue;
210: }
211: $options[$option['key']] = $option['value'];
212: $redirect_to_edit = true;
213: }
214: }
215: $obj->setVar('field_options', $options);
216: }
217: if ($obj->getVar('field_edit')) {
218: $required = isset($_REQUEST['field_required']) ? $_REQUEST['field_required'] : 0;
219: $obj->setVar('field_required', $required); //0 = no, 1 = yes
220: if (isset($_REQUEST['field_maxlength'])) {
221: $obj->setVar('field_maxlength', $_REQUEST['field_maxlength']);
222: }
223: if (isset($_REQUEST['field_default'])) {
224: $field_default = $obj->getValueForSave($_REQUEST['field_default']);
225: //Check for multiple selections
226: if (is_array($field_default)) {
227: $obj->setVar('field_default', serialize($field_default));
228: } else {
229: $obj->setVar('field_default', $field_default);
230: }
231: }
232: }
233:
234: if ($obj->getVar('field_show')) {
235: $obj->setVar('field_weight', $_REQUEST['field_weight']);
236: $obj->setVar('cat_id', $_REQUEST['field_category']);
237: }
238: if (/*$obj->getVar('field_edit') && */
239: isset($_REQUEST['step_id'])
240: ) {
241: $obj->setVar('step_id', $_REQUEST['step_id']);
242: }
243: if ($profilefield_handler->insert($obj)) {
244: /** @var XoopsGroupPermHandler $groupperm_handler */
245: $groupperm_handler = xoops_getHandler('groupperm');
246:
247: $perm_arr = array();
248: if ($obj->getVar('field_show')) {
249: $perm_arr[] = 'profile_show';
250: $perm_arr[] = 'profile_visible';
251: }
252: if ($obj->getVar('field_edit')) {
253: $perm_arr[] = 'profile_edit';
254: }
255: if ($obj->getVar('field_edit') || $obj->getVar('field_show')) {
256: $perm_arr[] = 'profile_search';
257: }
258: if (count($perm_arr) > 0) {
259: foreach ($perm_arr as $perm) {
260: $criteria = new CriteriaCompo(new Criteria('gperm_name', $perm));
261: $criteria->add(new Criteria('gperm_itemid', (int)$obj->getVar('field_id')));
262: $criteria->add(new Criteria('gperm_modid', (int)$GLOBALS['xoopsModule']->getVar('mid')));
263: if (isset($_REQUEST[$perm]) && \is_array($_REQUEST[$perm])) {
264: $perms = $groupperm_handler->getObjects($criteria);
265: if (count($perms) > 0) {
266: foreach (array_keys($perms) as $i) {
267: $groups[$perms[$i]->getVar('gperm_groupid')] =& $perms[$i];
268: }
269: } else {
270: $groups = array();
271: }
272: foreach ($_REQUEST[$perm] as $groupid) {
273: $groupid = (int)$groupid;
274: if (!isset($groups[$groupid])) {
275: $perm_obj = $groupperm_handler->create();
276: $perm_obj->setVar('gperm_name', $perm);
277: $perm_obj->setVar('gperm_itemid', (int)$obj->getVar('field_id'));
278: $perm_obj->setVar('gperm_modid', $GLOBALS['xoopsModule']->getVar('mid'));
279: $perm_obj->setVar('gperm_groupid', $groupid);
280: $groupperm_handler->insert($perm_obj);
281: unset($perm_obj);
282: }
283: }
284: $removed_groups = array_diff(array_keys($groups), $_REQUEST[$perm]);
285: if (count($removed_groups) > 0) {
286: $criteria->add(new Criteria('gperm_groupid', '(' . implode(',', $removed_groups) . ')', 'IN'));
287: $groupperm_handler->deleteAll($criteria);
288: }
289: unset($groups);
290: } else {
291: $groupperm_handler->deleteAll($criteria);
292: }
293: unset($criteria);
294: }
295: }
296: $url = $redirect_to_edit ? 'field.php?op=edit&amp;id=' . $obj->getVar('field_id') : 'field.php';
297: redirect_header($url, 3, sprintf(_PROFILE_AM_SAVEDSUCCESS, _PROFILE_AM_FIELD));
298: }
299: include_once dirname(__DIR__) . '/include/forms.php';
300: echo $obj->getHtmlErrors();
301: $form = profile_getFieldForm($obj);
302: $form->display();
303: break;
304:
305: case 'save-option-strings':
306: if (!$GLOBALS['xoopsSecurity']->check()) {
307: redirect_header('field.php', 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
308: }
309: $obj = $profilefield_handler->get($_REQUEST['id']);
310: $fieldOptions = \Xmf\Request::getArray('field_options');
311: if (empty($fieldOptions)) { //If no option strings exist
312: redirect_header('field.php', 2, _PROFILE_AM_FIELDNOTCONFIGURABLE);
313: }
314: $obj->setVar('field_options', $fieldOptions);
315: if ($profilefield_handler->insert($obj)) {
316: redirect_header('field.php', 2, sprintf(_PROFILE_AM_SAVEDSUCCESS, _PROFILE_AM_FIELD));
317: }
318: redirect_header('field.php', 2, implode(',', $obj->getErrors()));
319: break;
320:
321: case 'delete':
322: $obj = $profilefield_handler->get($_REQUEST['id']);
323: if (!$obj->getVar('field_config')) {
324: redirect_header('index.php', 2, _PROFILE_AM_FIELDNOTCONFIGURABLE);
325: }
326: if (isset($_REQUEST['ok']) && $_REQUEST['ok'] == 1) {
327: if (!$GLOBALS['xoopsSecurity']->check()) {
328: redirect_header('field.php', 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
329: }
330: if ($profilefield_handler->delete($obj)) {
331: redirect_header('field.php', 3, sprintf(_PROFILE_AM_DELETEDSUCCESS, _PROFILE_AM_FIELD));
332: } else {
333: echo $obj->getHtmlErrors();
334: }
335: } else {
336: xoops_confirm(array(
337: 'ok' => 1,
338: 'id' => $_REQUEST['id'],
339: 'op' => 'delete'), $_SERVER['REQUEST_URI'], sprintf(_PROFILE_AM_RUSUREDEL, $obj->getVar('field_title')));
340: }
341: break;
342:
343: case 'toggle':
344: if (isset($_REQUEST['field_id'])) {
345: $field_id = (int)$_REQUEST['field_id'];
346: if (isset($_REQUEST['field_required'])) {
347: $field_required = (int)$_REQUEST['field_required'];
348: profile_visible_toggle($field_id, $field_required);
349: }
350: }
351: break;
352: }
353:
354: if (isset($template_main)) {
355: $GLOBALS['xoopsTpl']->display("db:{$template_main}");
356: }
357:
358: /**
359: * @param $field_id
360: * @param $field_required
361: */
362: function profile_visible_toggle($field_id, $field_required)
363: {
364: $field_required = ($field_required == 1) ? 0 : 1;
365: $this_handler = xoops_getModuleHandler('field', 'profile');
366: $obj = $this_handler->get($field_id);
367: $obj->setVar('field_required', $field_required);
368: if ($this_handler->insert($obj, true)) {
369: redirect_header('field.php', 1, _PROFILE_AM_REQUIRED_TOGGLE_SUCCESS);
370: } else {
371: redirect_header('field.php', 1, _PROFILE_AM_REQUIRED_TOGGLE_FAILED);
372: }
373: }
374:
375: include_once __DIR__ . '/admin_footer.php';
376: