Личный кабинет. Много полей read only для пользователя

  • 15 Ответов
  • 1417 Просмотров

White Mouse

  • Сообщений: 44
    • Просмотр профиля
    • TRAVEL.wmouse.ru — поездки, путешествия, автопрогулки
Здравствуйте.
Есть необходимость добавить в ЛК пользователя МНОГО полей, которые может заполнять и редактировать только админ. А для юзера они read only.  Может кто посоветовать, как и что?

А может быть, можно сделать два блока доп. полей? Один блок — как есть сейчас, т.е. юзер может редактировать содержимое. А второй — для админа.
И там он уж сможет сам, не лазая каждый раз в базу или в код, добавлять и удалять нужные поля.
А кофе на клавиатуру тоже вирус пролил?

Neon

  • Сообщений: 878
    • Просмотр профиля
    • Danneo CMS
White Mouse, по теме,
основное что вам нужно уже есть в системе.

В панели, пользователи => дополнительные поля
Столбцы «Профиль» «Регистрация», ставьте или снимайте галки где нужно.
Какие поля должны быть видны в профиле пользователя, какие при регистрации.
На админа эти настройки не распространяются. При редактировании профиля пользователя, у него все поля открыты.
DANNEO ™

Neon

  • Сообщений: 878
    • Просмотр профиля
    • Danneo CMS
mod/user/index.php
Сейчас... со строки 162
if ($item['profile'] == 'yes')
{
    // Код доп. лей с html элементами форм
}
Изменить...
if ($item['profile'] == 'yes')
{
    // Код доп. лей с html элементами формы
} else {
    // Вывод только значений $value, можно обернуть в <div>, без элементов формы
}
DANNEO ™

White Mouse

  • Сообщений: 44
    • Просмотр профиля
    • TRAVEL.wmouse.ru — поездки, путешествия, автопрогулки
Neon, супер. Большое спасибо! Работает!! (тут должен быть радостно подпрыгивающий и хлопающий в ладоши смайлик)

Но если пользователь что-нибудь напишет в доступном для редактирования поле и сохранит, то вся введённая доселе информация пропадает. :(



Сразу ещё вопрос. Где поправить, чтобы в текстовом поле можно было вводить двоеточие? Там кадастровый номер надобно забить... А сейчас при просмотре ЛК просто пустая строка выходит.
« Последнее редактирование: 24 Апреля 2020, 21:24:51 от White Mouse »
А кофе на клавиатуру тоже вирус пролил?

Neon

  • Сообщений: 878
    • Просмотр профиля
    • Danneo CMS
По второму вопросу:
admin/mod/user/index.php
Строка: 739
Разрешить пунктуацию в регулярном выражении для preg_match()
Добавить \p{P}
preg_match('/^[\p{L}\p{Nd}\-\s\.(),!?]+$/ui',$fields[$v['fieldname']])
заменить на
preg_match('/^[\p{L}\p{P}\p{Nd}\-\s\.(),!?]+$/ui',$fields[$v['fieldname']])
DANNEO ™

Neon

  • Сообщений: 878
    • Просмотр профиля
    • Danneo CMS
По первому вопросу:
$newfield = '';
$value = (isset($user[$item['fieldid']])) ? $user[$item['fieldid']] : '';
if ($item['profile'] == 'yes')
{
    // Код доп. полей с html элементами формы
} else {
    // Продублированный код доп. полей с html элементами формы
// Для текстовых полей добавить "readonly"
// Для переключателей и выпадающих списков добавить "disabled"
}
// Вывод
$field .= $tm->parse(array
(
'name'  => $item['name'],
'empty' => $empty,
'req'   => $requires,
'field' => $newfield
),
$tm->manuale['field']);
Верхние две строки с переменными ($newfield и $value) должны быть выше проверок, их нужно вынести. Сейчас они внутри.
Вывод в шаблон, также нужно вынести, ниже проверок. Сейчас он тоже внутри.
Примерно так.
DANNEO ™

White Mouse

  • Сообщений: 44
    • Просмотр профиля
    • TRAVEL.wmouse.ru — поездки, путешествия, автопрогулки
Супер, супер, супер!!!! Большое спасибо, то, что надо.

Ещё в mod/user/index.php  в метке  «Дополнительные данные» тоже добавить  pP
preg_match('/^[\pL\pP\pNd\-\s\.(),!?]+$/ui',$fields[$v['fieldname']])

И для юзеров вывести подсказочку, если соответствующее поле read only:
$newfield = '<input type="text" readonly name="'.$name.'" maxlength="'.$item['maxlen'].'" value="'.$value.'"'.$place.'><span class="help" title="Вы не можете редактировать это поле">!</span>';
А кофе на клавиатуру тоже вирус пролил?

White Mouse

  • Сообщений: 44
    • Просмотр профиля
    • TRAVEL.wmouse.ru — поездки, путешествия, автопрогулки
Продолжение обсуждения этого вопроса см. в ветке «Заполняешь форму — получаешь бланк», начиная с ответа № 11... :)

Уважаемый админ форума, а можно перенести относящиеся к этой теме ответы из той ветки сюда?
А кофе на клавиатуру тоже вирус пролил?

Neon

  • Сообщений: 878
    • Просмотр профиля
    • Danneo CMS
Перенес
DANNEO ™

White Mouse

  • Сообщений: 44
    • Просмотр профиля
    • TRAVEL.wmouse.ru — поездки, путешествия, автопрогулки
Всё в продолжение темы с личным кабинетом и регистрацией... :)

Сделала в админке доп. поле fieldhint, появляющееся в placeholder как подсказка к заполнению при регистрации пользователя.


admin/mod/user/index.php

* Дополнительные поля


//Шапка таблицы. После
<th class="work-no-sort">'.$lang['type_field'].'</th>

//дописать
<th class="work-no-sort">'.$lang['fieldhint'].'</th>

//После
<td class="'.$style.'">
<input type="text" name="form['.$item['fieldid'].'][name]" size="40" maxlength="255" value="'.$item['name'].'">';
if ($item['requires'] == 'yes')
{
$tm->outhint($lang['minlen_symbol'].':&nbsp; '.$item['minlen'].'<br> '.$lang['maxlen_symbol'].':&nbsp; '.$item['maxlen']);
}
echo ' </td>

//добавить
<td class="'.$style.'">
<input type="text" name="form['.$item['fieldid'].'][fieldhint]" size="40" maxlength="255" value="'.$item['fieldhint'].'"></td>

* Дополнительные поля (сохранение)
//после
foreach ($form as $k => $v)
{
$name = preparse($v['name'], THIS_TRIM, 1, 255);

//добавить
$fieldhint = preparse($v['fieldhint'], THIS_TRIM, 1, 255);
  …

//и здесь ещё
"UPDATE ".$basepref."_user_field SET
name     = '".$db->escape($name)."',
fieldhint     = '".$db->escape($fieldhint)."',

* Добавление дополнительного поля

//добавляем подсказки у текстовых полей
if ($type == 'text')
{
echo '

//дописать
<tr><td>'.$lang['fieldhint'].'</td>
       <td><input type="text" name="fieldhint" size="70" maxlength="255" value=""></td>
</tr>
//перед
<tr>
        <td>'.$lang['all_not_empty'].'</td>
        <td><input name="requires" value="yes" type="checkbox"></td>
</tr>

* Добавление дополнительного поля (сохранение)

Добавить в строку Global  переменную   $fieldhint,

"INSERT INTO ".$basepref."_user_field VALUES (
NULL,
  …
'".$db->escape($name)."',

// добавить
'".$db->escape($fieldhint)."',



Добавить в MySQL таблицу user_field после  name переменную  fieldhint
fieldhint   varchar(255)   utf8_general_ci      Нет


Добавить языковую переменную в группу Пользователи
Значение – fieldhint
Замена  – Подсказка к заполнению


Ну и
Mod/user/register.php

* Доп.поля
if ($item['fieldtype'] == 'text')
{   
$hint = (isset($item['fieldhint'])) ? $item['fieldhint'] : '';
$val.= '<input class="width" type="text" id="'.$name.'" name="'.$name.'" placeholder="'.$hint.'" maxlength="'.$item['maxlen'].'" value=""'.$required.'>';
}

//и сюда не забыть
$fields.= $tm->parse(array(
'name'     => $item['name'],
'key'      => $item['fieldname'],
'hint'     => $item['fieldhint'],



Чтобы placeholder исчезал при постановке курсора в поле, добавить в screen.css  в /* input-placeholder */ (в Lite после 1402 строки)

:focus::-webkit-input-placeholder {color: transparent}
:focus::-moz-placeholder          {color: transparent}

Вроде, ничего не забыла...
А кофе на клавиатуру тоже вирус пролил?

White Mouse

  • Сообщений: 44
    • Просмотр профиля
    • TRAVEL.wmouse.ru — поездки, путешествия, автопрогулки
Ещё вопрос по этим самым доп. полям.

В поля вводится текст, зачастую состоящий из нескольких слов, то есть в проверку preg_match входит пробел.
А как настроить, чтобы нельзя было ввести одни только пробелы?
А кофе на клавиатуру тоже вирус пролил?

Neon

  • Сообщений: 878
    • Просмотр профиля
    • Danneo CMS
if ( ! ( trim ($text) ) ) {
    echo "Строка содержит только пробелы";
}
DANNEO ™

White Mouse

  • Сообщений: 44
    • Просмотр профиля
    • TRAVEL.wmouse.ru — поездки, путешествия, автопрогулки
Подписала в mod/user/register.php так:
if ($v['method'] == 'text')
{
  if ($v['requires'] == 'yes')
{
   $newfield[$v['fieldid']] = (mb_strlen($fields[$v['fieldname']]) < $v['minlen'] OR mb_strlen($fields[$v['fieldname']]) > $v['maxlen'] OR ! preg_match('/^[\pL\pP\pNd\s\.(),!?№]+$/u', $fields[$v['fieldname']])) ? '' : $fields[$v['fieldname']];
if ( ! $newfield[$v['fieldid']]) {
$error = 1;
$list.= $v['name'].', ';
}
if ( ! ( trim ($text) ) ) {
    echo "Строка содержит только пробелы";
}
}
else
{
   $newfield[$v['fieldid']] = $api->siteuni($fields[$v['fieldname']]);
}
}

Не работает. :(  По-прежнему можно забить форму пробелами и зарегистрироваться.
А кофе на клавиатуру тоже вирус пролил?

Neon

  • Сообщений: 878
    • Просмотр профиля
    • Danneo CMS
Подписала в mod/user/register.php так:
Не работает. :(  По-прежнему можно забить форму пробелами и зарегистрироваться.
White Mouse, я привел как общий пример проверки пробелов.
В вашем случае нужно проверять переменную $fields[$v['fieldname']]
Рабочий код
if ($v['method'] == 'text')
{
    if ($v['requires'] == 'yes')
    {
        $newfield[$v['fieldid']] = (mb_strlen($fields[$v['fieldname']]) < $v['minlen'] OR mb_strlen($fields[$v['fieldname']]) > $v['maxlen'] OR ! preg_match('/^[\pL\pNd\-\s\.(),!?]+$/ui',$fields[$v['fieldname']])) ? '' : $fields[$v['fieldname']];
        if ( ! $newfield[$v['fieldid']] OR ! (trim($fields[$v['fieldname']]))) {
            $error = 1;
            $list.= $v['name'].', ';
        }
    }
    else
    {
        if (preg_match('/^[\pL\pNd\-\s\.(),!?]+$/ui',$fields[$v['fieldname']])) {
            $newfield[$v['fieldid']] =  $api->siteuni($fields[$v['fieldname']]);
        } else {
            $newfield[$v['fieldid']] = '';
        }
    }
}
Строка:
if ( ! $newfield[$v['fieldid']]) {
заменена на
if ( ! $newfield[$v['fieldid']] OR ! (trim($fields[$v['fieldname']]))) {
DANNEO ™

White Mouse

  • Сообщений: 44
    • Просмотр профиля
    • TRAVEL.wmouse.ru — поездки, путешествия, автопрогулки
Neon, большое спасибо. Теперь всё работает. Вы извините, что зачастую спрашиваю очевидные и элементарные для вас вещи, но для меня-то они совсем не очевидные. :)
А кофе на клавиатуру тоже вирус пролил?