PHP Classes

File: htdocs/modules/profile/admin/field.php

Recommend this page to a friend!
  Packages of Michael Beck   Xoops 2.5   htdocs/modules/profile/admin/field.php   Download  
File: htdocs/modules/profile/admin/field.php
Role: Example script
Content type: text/plain
Description: Example script
Class: Xoops 2.5
Modular content management publication system
Author: By
Last change: copyright update
Null coalescing operator
PER-CS formatting
short array
Merge pull request #1239 from Andrew-Staves-Activ/notificationhandler_subscribe_success

Merge branch 'feature/php8_templates' of https://github.com/mambax7/XoopsCore25 into feature/php8_templates

# Conflicts:
# htdocs/themes/xswatch4/modules/publisher/publisher_item.tpl
Add options text editing to profile field edit

Options taken from language files cannot be changed after
installing the profile module.

This change adds an edit link to the form for any field that
has options such as a select field. The edit screen presented
allows updating the option text only, not the values.

Initial report here:
https://xoops.org/modules/newbb/viewtopic.php?topic_id=78808
Merge xswatch4
Date: 2 months ago
Size: 16,996 bytes
 

Contents

Class file image Download
<?php /** * Extended User Profile * * You may not change or alter any portion of this comment or credits * of supporting developers from this source code or any supporting source code * which is considered copyrighted (c) material of the original comment or credit authors. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * @copyright (c) 2000-2025 XOOPS Project (https://xoops.org) * @license GNU GPL 2 (https://www.gnu.org/licenses/gpl-2.0.html) * @package profile * @since 2.3.0 * @author Jan Pedersen * @author Taiwen Jiang <phppp@users.sourceforge.net> */ include_once __DIR__ . '/admin_header.php'; xoops_cp_header(); $indexAdmin = new ModuleAdmin(); $indexAdmin->addItemButton(_ADD . ' ' . _PROFILE_AM_FIELD, 'field.php?op=new', 'add', ''); echo $indexAdmin->addNavigation(basename(__FILE__)); echo $indexAdmin->renderButton('right', ''); $op = $_REQUEST['op'] ?? (isset($_REQUEST['id']) ? 'edit' : 'list'); /** @var XoopsModuleHandler $profilefield_handler */ $profilefield_handler = xoops_getModuleHandler('field'); switch ($op) { default: case 'list': $fields = $profilefield_handler->getObjects(null, true, false); /** @var XoopsModuleHandler $module_handler */ $module_handler = xoops_getHandler('module'); $modules = $module_handler->getObjects(null, true); /** @var XoopsModuleHandler $cat_handler */ $cat_handler = xoops_getModuleHandler('category'); $criteria = new CriteriaCompo(); $criteria->setSort('cat_weight'); $cats = $cat_handler->getObjects($criteria, true); unset($criteria); $categories[0] = _PROFILE_AM_DEFAULT; if (count($cats) > 0) { foreach (array_keys($cats) as $i) { $categories[$cats[$i]->getVar('cat_id')] = $cats[$i]->getVar('cat_title'); } } $GLOBALS['xoopsTpl']->assign('categories', $categories); unset($categories); $valuetypes = [ XOBJ_DTYPE_ARRAY => _PROFILE_AM_ARRAY, XOBJ_DTYPE_EMAIL => _PROFILE_AM_EMAIL, XOBJ_DTYPE_INT => _PROFILE_AM_INT, XOBJ_DTYPE_TXTAREA => _PROFILE_AM_TXTAREA, XOBJ_DTYPE_TXTBOX => _PROFILE_AM_TXTBOX, XOBJ_DTYPE_URL => _PROFILE_AM_URL, XOBJ_DTYPE_OTHER => _PROFILE_AM_OTHER, XOBJ_DTYPE_MTIME => _PROFILE_AM_DATE, ]; $fieldtypes = [ 'checkbox' => _PROFILE_AM_CHECKBOX, 'group' => _PROFILE_AM_GROUP, 'group_multi' => _PROFILE_AM_GROUPMULTI, 'language' => _PROFILE_AM_LANGUAGE, 'radio' => _PROFILE_AM_RADIO, 'select' => _PROFILE_AM_SELECT, 'select_multi' => _PROFILE_AM_SELECTMULTI, 'textarea' => _PROFILE_AM_TEXTAREA, 'dhtml' => _PROFILE_AM_DHTMLTEXTAREA, 'textbox' => _PROFILE_AM_TEXTBOX, 'timezone' => _PROFILE_AM_TIMEZONE, 'yesno' => _PROFILE_AM_YESNO, 'date' => _PROFILE_AM_DATE, 'datetime' => _PROFILE_AM_DATETIME, 'longdate' => _PROFILE_AM_LONGDATE, 'theme' => _PROFILE_AM_THEME, 'autotext' => _PROFILE_AM_AUTOTEXT, 'rank' => _PROFILE_AM_RANK, ]; foreach (array_keys($fields) as $i) { $fields[$i]['canEdit'] = $fields[$i]['field_config'] || $fields[$i]['field_show'] || $fields[$i]['field_edit']; $fields[$i]['canDelete'] = $fields[$i]['field_config']; $fields[$i]['fieldtype'] = $fieldtypes[$fields[$i]['field_type']]; $fields[$i]['valuetype'] = $valuetypes[$fields[$i]['field_valuetype']]; $categories[$fields[$i]['cat_id']][] = $fields[$i]; $weights[$fields[$i]['cat_id']][] = $fields[$i]['field_weight']; } //sort fields order in categories foreach (array_keys($categories) as $i) { array_multisort($weights[$i], SORT_ASC, array_keys($categories[$i]), SORT_ASC, $categories[$i]); } ksort($categories); $GLOBALS['xoopsTpl']->assign('fieldcategories', $categories); $GLOBALS['xoopsTpl']->assign('token', $GLOBALS['xoopsSecurity']->getTokenHTML()); $template_main = 'profile_admin_fieldlist.tpl'; break; case 'new': include_once dirname(__DIR__) . '/include/forms.php'; $obj = $profilefield_handler->create(); $form = profile_getFieldForm($obj); $form->display(); break; case 'edit': $obj = $profilefield_handler->get($_REQUEST['id']); if (!$obj->getVar('field_config') && !$obj->getVar('field_show') && !$obj->getVar('field_edit')) { //If no configs exist redirect_header('field.php', 2, _PROFILE_AM_FIELDNOTCONFIGURABLE); } include_once dirname(__DIR__) . '/include/forms.php'; $form = profile_getFieldForm($obj); $form->display(); break; case 'edit-option-strings': $obj = $profilefield_handler->get($_REQUEST['id']); $fieldOptions = $obj->getVar('field_options'); if (empty($fieldOptions)) { //If no option strings exist redirect_header('field.php', 2, _PROFILE_AM_FIELDNOTCONFIGURABLE); } include_once dirname(__DIR__) . '/include/forms.php'; $form = profile_getFieldOptionForm($obj); $form->display(); break; case 'reorder': if (!$GLOBALS['xoopsSecurity']->check()) { redirect_header('field.php', 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors())); } if (isset($_POST['field_ids']) && count($_POST['field_ids']) > 0) { $oldweight = $_POST['oldweight']; $oldcat = $_POST['oldcat']; $category = $_POST['category']; $weight = $_POST['weight']; $ids = []; foreach ($_POST['field_ids'] as $field_id) { if ($oldweight[$field_id] != $weight[$field_id] || $oldcat[$field_id] != $category[$field_id]) { //if field has changed $ids[] = (int) $field_id; } } if (count($ids) > 0) { $errors = []; //if there are changed fields, fetch the fieldcategory objects /** @var XoopsModuleHandler $field_handler */ $field_handler = xoops_getModuleHandler('field'); $fields = $field_handler->getObjects(new Criteria('field_id', '(' . implode(',', $ids) . ')', 'IN'), true); foreach ($ids as $i) { $fields[$i]->setVar('field_weight', (int) $weight[$i]); $fields[$i]->setVar('cat_id', (int) $category[$i]); if (!$field_handler->insert($fields[$i])) { $errors = array_merge($errors, $fields[$i]->getErrors()); } } if (count($errors) == 0) { //no errors redirect_header('field.php', 2, sprintf(_PROFILE_AM_SAVEDSUCCESS, _PROFILE_AM_FIELDS)); } else { redirect_header('field.php', 3, implode('<br>', $errors)); } } } break; case 'save': if (!$GLOBALS['xoopsSecurity']->check()) { redirect_header('field.php', 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors())); } $redirect_to_edit = false; if (isset($_REQUEST['id'])) { $obj = $profilefield_handler->get($_REQUEST['id']); if (!$obj->getVar('field_config') && !$obj->getVar('field_show') && !$obj->getVar('field_edit')) { //If no configs exist redirect_header('admin.php', 2, _PROFILE_AM_FIELDNOTCONFIGURABLE); } } else { $obj = $profilefield_handler->create(); $obj->setVar('field_name', $_REQUEST['field_name']); $obj->setVar('field_moduleid', $GLOBALS['xoopsModule']->getVar('mid')); $obj->setVar('field_show', 1); $obj->setVar('field_edit', 1); $obj->setVar('field_config', 1); $redirect_to_edit = true; } $obj->setVar('field_title', $_REQUEST['field_title']); $obj->setVar('field_description', $_REQUEST['field_description']); if ($obj->getVar('field_config')) { $obj->setVar('field_type', $_REQUEST['field_type']); if (isset($_REQUEST['field_valuetype'])) { $obj->setVar('field_valuetype', $_REQUEST['field_valuetype']); } $options = $obj->getVar('field_options'); if (isset($_REQUEST['removeOptions']) && \is_array($_REQUEST['removeOptions'])) { foreach ($_REQUEST['removeOptions'] as $index) { unset($options[$index]); } $redirect_to_edit = true; } if (!empty($_REQUEST['addOption'])) { foreach ($_REQUEST['addOption'] as $option) { if (empty($option['value'])) { continue; } $options[$option['key']] = $option['value']; $redirect_to_edit = true; } } $obj->setVar('field_options', $options); } if ($obj->getVar('field_edit')) { $required = $_REQUEST['field_required'] ?? 0; $obj->setVar('field_required', $required); //0 = no, 1 = yes if (isset($_REQUEST['field_maxlength'])) { $obj->setVar('field_maxlength', $_REQUEST['field_maxlength']); } if (isset($_REQUEST['field_default'])) { $field_default = $obj->getValueForSave($_REQUEST['field_default']); //Check for multiple selections if (is_array($field_default)) { $obj->setVar('field_default', serialize($field_default)); } else { $obj->setVar('field_default', $field_default); } } } if ($obj->getVar('field_show')) { $obj->setVar('field_weight', $_REQUEST['field_weight']); $obj->setVar('cat_id', $_REQUEST['field_category']); } if (/*$obj->getVar('field_edit') && */ isset($_REQUEST['step_id']) ) { $obj->setVar('step_id', $_REQUEST['step_id']); } if ($profilefield_handler->insert($obj)) { /** @var XoopsGroupPermHandler $groupperm_handler */ $groupperm_handler = xoops_getHandler('groupperm'); $perm_arr = []; if ($obj->getVar('field_show')) { $perm_arr[] = 'profile_show'; $perm_arr[] = 'profile_visible'; } if ($obj->getVar('field_edit')) { $perm_arr[] = 'profile_edit'; } if ($obj->getVar('field_edit') || $obj->getVar('field_show')) { $perm_arr[] = 'profile_search'; } if (count($perm_arr) > 0) { foreach ($perm_arr as $perm) { $criteria = new CriteriaCompo(new Criteria('gperm_name', $perm)); $criteria->add(new Criteria('gperm_itemid', (int) $obj->getVar('field_id'))); $criteria->add(new Criteria('gperm_modid', (int) $GLOBALS['xoopsModule']->getVar('mid'))); if (isset($_REQUEST[$perm]) && \is_array($_REQUEST[$perm])) { $perms = $groupperm_handler->getObjects($criteria); if (count($perms) > 0) { foreach (array_keys($perms) as $i) { $groups[$perms[$i]->getVar('gperm_groupid')] = & $perms[$i]; } } else { $groups = []; } foreach ($_REQUEST[$perm] as $groupid) { $groupid = (int) $groupid; if (!isset($groups[$groupid])) { $perm_obj = $groupperm_handler->create(); $perm_obj->setVar('gperm_name', $perm); $perm_obj->setVar('gperm_itemid', (int) $obj->getVar('field_id')); $perm_obj->setVar('gperm_modid', $GLOBALS['xoopsModule']->getVar('mid')); $perm_obj->setVar('gperm_groupid', $groupid); $groupperm_handler->insert($perm_obj); unset($perm_obj); } } $removed_groups = array_diff(array_keys($groups), $_REQUEST[$perm]); if (count($removed_groups) > 0) { $criteria->add(new Criteria('gperm_groupid', '(' . implode(',', $removed_groups) . ')', 'IN')); $groupperm_handler->deleteAll($criteria); } unset($groups); } else { $groupperm_handler->deleteAll($criteria); } unset($criteria); } } $url = $redirect_to_edit ? 'field.php?op=edit&amp;id=' . $obj->getVar('field_id') : 'field.php'; redirect_header($url, 3, sprintf(_PROFILE_AM_SAVEDSUCCESS, _PROFILE_AM_FIELD)); } include_once dirname(__DIR__) . '/include/forms.php'; echo $obj->getHtmlErrors(); $form = profile_getFieldForm($obj); $form->display(); break; case 'save-option-strings': if (!$GLOBALS['xoopsSecurity']->check()) { redirect_header('field.php', 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors())); } $obj = $profilefield_handler->get($_REQUEST['id']); $fieldOptions = \Xmf\Request::getArray('field_options'); if (empty($fieldOptions)) { //If no option strings exist redirect_header('field.php', 2, _PROFILE_AM_FIELDNOTCONFIGURABLE); } $obj->setVar('field_options', $fieldOptions); if ($profilefield_handler->insert($obj)) { redirect_header('field.php', 2, sprintf(_PROFILE_AM_SAVEDSUCCESS, _PROFILE_AM_FIELD)); } redirect_header('field.php', 2, implode(',', $obj->getErrors())); break; case 'delete': $obj = $profilefield_handler->get($_REQUEST['id']); if (!$obj->getVar('field_config')) { redirect_header('index.php', 2, _PROFILE_AM_FIELDNOTCONFIGURABLE); } if (isset($_REQUEST['ok']) && $_REQUEST['ok'] == 1) { if (!$GLOBALS['xoopsSecurity']->check()) { redirect_header('field.php', 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors())); } if ($profilefield_handler->delete($obj)) { redirect_header('field.php', 3, sprintf(_PROFILE_AM_DELETEDSUCCESS, _PROFILE_AM_FIELD)); } else { echo $obj->getHtmlErrors(); } } else { xoops_confirm( [ 'ok' => 1, 'id' => $_REQUEST['id'], 'op' => 'delete', ], $_SERVER['REQUEST_URI'], sprintf(_PROFILE_AM_RUSUREDEL, $obj->getVar('field_title')), ); } break; case 'toggle': if (isset($_REQUEST['field_id'])) { $field_id = (int) $_REQUEST['field_id']; if (isset($_REQUEST['field_required'])) { $field_required = (int) $_REQUEST['field_required']; profile_visible_toggle($field_id, $field_required); } } break; } if (isset($template_main)) { $GLOBALS['xoopsTpl']->display("db:{$template_main}"); } /** * @param $field_id * @param $field_required */ function profile_visible_toggle($field_id, $field_required) { $field_required = ($field_required == 1) ? 0 : 1; $this_handler = xoops_getModuleHandler('field', 'profile'); $obj = $this_handler->get($field_id); $obj->setVar('field_required', $field_required); if ($this_handler->insert($obj, true)) { redirect_header('field.php', 1, _PROFILE_AM_REQUIRED_TOGGLE_SUCCESS); } else { redirect_header('field.php', 1, _PROFILE_AM_REQUIRED_TOGGLE_FAILED); } } include_once __DIR__ . '/admin_footer.php';