tushov.ru

блог php-программиста, преподавателя и конcультанта

Joomla

Дополнительные поля формы регистрации пользователя в Joomla 1.5

Недавно, в одном проекте понадобилось добавить пару полей на форму регистрации пользователя в Jooml’e, а именно ФИО, номер телефона, ICQ, адрес и т.д. Подходящих компонентов для Joomla 1.5 найти не удалось. Потому предлагаю свое решение данной проблемы самым простым как мне кажется способом:
1) Качаем, устанавливаем и включаем мой плагин Extension User Data
2) Добавляем необходимые дополнительные поля в файлы: \administrator\components\com_users\models\user.xml и \administrator\components\com_users\models\registered.xml, к примеру:

[php]<?xml version="1.0" encoding="utf-8"?>
<form>
<name>Registered User Type</name>
<params>
<param name="language" type="languages" client="site" default="" label="Front-end Language" description="paramLanguage" />
<param name="timezone" type="timezones" default="" label="Time Zone" description="Time Zone for this User" />
<param name="familiya" type="text" label="Фамилия" size="60" />
</params>
</form>
[/php]

Здесь добавлено поле familiya. Добавлять можно сколько угодно полей различных типов, все значения полей для конкретного пользователя будут храниться в поле params таблицы jos_users
3) И последнее, не забудьте отредактировать форму регистрации, находится она в файле \components\com_user\views\register\tmpl\default.php или же \templates\ваш_шаблон\html\com_user\register\default.php. Кроме того, я не советую редактировать  файл \components\com_user\views\register\tmpl\default.php (если файл \templates\ваш_шаблон\html\com_user\register\default.php не существует), лучше скопируйте его в папку своего шаблона и Joomla сама подключит его (данный файл должен лежать в \templates\ваш_шаблон\html\com_user\register\default.php). В форме регистрации имена дополнительных полей должны быть ключами массива params, т.е. к примеру для примера выше с полем familiya:
<input type="text" name="params[familiya]" />

Ну вот и все =)

83 Comments

  1. андрей

    Невозможно скопировать выбранный файл.
    JInstaller::install: Ошибка при копировании файла: …/install_4ab7e39c97dcb/extusdata.php в …/plugins/user/extusdata.php
    Установить Плагин: Ошибка

  2. Тушов Леонид

    скорее всего у вас нет прав записи на папку plugins. Проверьте права на папку, в меню админки Jooml’ы можно через Помощь / Системная информация / Права доступа к папкам

  3. андрей

    спасибо большое за подсказку, установился плагин

  4. Спасибо за плагин, а как смотреть-то потом дополнительные поля? В БД записалось все, нормально, а в панели администратора в просмотре пользователей — все по старому…

  5. Тушов Леонид

    а вы редактировали файл \administrator\components\com_users\models\user.xml ?? или же \administrator\components\com_users\models\registered.xml ???

  6. Спасибо! Добавил новые поля в registered.xml и все отлично!

  7. Дайте подробную инструкцию о том, как изменть файлі для отображения данных новых форм в Админке и использовать на сайте. К примеру вывод skype пользователя.

    Спасибо!

  8. Тушов Леонид

    «Дайте подробную инструкцию о том, как изменть файлі для отображения данных новых форм в Админке и использовать на сайте. К примеру вывод skype пользователя.»

    1) для того чтобы значения «расширенных полей» (см. выше в посте) выводились в админке Jooml’ы при просмотре пользователя необходимо отредактировать файл \administrator\components\com_users\models\user.xml (т.е. внести в него дополнительные поля в формате описанном выше…)

    2) Для использования дополнительных полей где-нибудь на сайте (Front-End) в любом компонте или модуле вам надо получить параметры компонента com_user:
    $params =& JComponentHelper::getParams( ‘com_user’ );
    echo $params-get(‘familiya’); // выводим значение дополнительного полня с именем familiya

    там где уже инициализирован объект параметров, к примеру в стандартной форме Joomla 1.5 для зарегистрированных пользователей (\components\com_user\views\user\tmpl\form.php), все еще проще:
    кусок из формы позволяющий юзерам обновлять информацию своего профиля на сайте:
    [php]
    <tr>
    <td>E-mail</td>
    <td>< ?php echo $this->escape($this->user->get(‘email’));?></td>
    </tr>
    <tr>
    <td>Фамилия</td>
    <td><input type="text" name="params[familiya]" size="40" value="<?php echo $this->escape($this->params->get(‘familiya’)); ?>" /></td>
    </tr>
    [/php]

  9. Не получается!

    У меня joomla 1.5.15
    Пробовал:
    $params = &JComponentHelper::getParams(‘com_user’);
    $familiya = $params->get(‘familiya’);

    Надо, что бы при регистрации админу присылались данные из дополнительных форм, при регистрации.
    Правлю файл: \www\components\com_user\controller.php

    Сразу после строк:
    $usersConfig = &JComponentHelper::getParams( ‘com_users’ );
    $sitename = $mainframe->getCfg( ‘sitename’ );
    $useractivation = $usersConfig->get( ‘useractivation’ );
    $mailfrom = $mainframe->getCfg( ‘mailfrom’ );
    $fromname = $mainframe->getCfg( ‘fromname’ );
    $siteURL = JURI::base();
    // вставляю:
    $params = &JComponentHelper::getParams(‘com_user’);
    $familiya = $params->get(‘familiya’);

    Строку с сообщением правлю так:
    $message2 = sprintf ( JText::_( ‘SEND_MSG_ADMIN’ ), $row->name, $sitename, $name, $email, $username, $familiya);

    Сообщение меняю в файле: \www\language\uk-UA\uk-UA.com_user.ini
    так:
    SEND_MSG_ADMIN=Привіт, Адміністратор сайту %s!\nНовий користувач зареєструвався на Вашому сайті — %s.\n\nЦей лист містить дані про користувача:\n\nДійсне ім’я — %s\ne-mail — %s\nЛогін — %s\nПрізвище — %s\n\n

    Результат в сообщении пишет: Прізвище —
    и пустота. Тоесть переменная %s пустая.
    В чем дело?
    Помогите пожалуйста!!!

  10. Тушов Леонид

    а после строки $familiya = $params->get(’familiya’);
    переменная $familiya — не пустая ли? (echo $familiya)

  11. При заполнении регистрационной формы, все поля сохраняются (в том числе и фамилия), а вот по emal админу не знаю как настроить.

  12. Тушов Леонид

    «При заполнении регистрационной формы, все поля сохраняются (в том числе и фамилия), а вот по emal админу не знаю как настроить.» — я не об этом… то что поля сохраняются и то что Вы хотите сделать я понял. Просто вам необходимо протестировать написанный вами php-код. Потому я предложил вам комментарием выше, проверить заполнено ли значение переменной $familiya = $params->get(’familiya’);
    вставте следующий код exit($familiya); после строчки $familiya = $params->get(’familiya’); зарегистрируйте нового пользователя, и после обновления страницы, выполнение скрипта остановится, а на странице должно быть выведено значение заполненного вами поля $familiya. Если данное значение будет выведено верно, Вам необходимо будет проверить работоспособность уже строки перевода… Вообщем надо искать ошибку. Если значение поля пишется в базу данных, выводится в настройках пользователя в админке, то искать надо именно в выше перечисленных мною местах.

  13. Хорошо проверю. Дам знать позже, что выходит…

    Еще по ходу, хочу спросить, если это не по теме, тогда думаю стоит открыть целую статью на тему защиты форм коптчей. Я пользуюсь Jooma Captcha http://code.google.com/p/joomla15captcha/

    Проблема в том, что при использовании данной копчи, и неверного ввода кода коптчи, все данные формы и новых полей которые мы добавили способом выше, сбрасываются, и приходится заполнять всю форму заново — очень неудобно, особенно если форма большая вот как на сайте который делаю: http://www.moya-rodyna.org.ua/restraczya.html

    Я тут нашел способ это исправить, но не получается это применить к полям с именами

    params[nameform];

    и также с radio box, checkbox, и .

    Вот что удалось найти по этой теме:

    Чтобы данные в форме сохранялись в default.php пишем:
    [php]
    $document =&amp; JFactory::getDocument();
    $document-&gt;addScriptDeclaration($script);
    $name = JRequest::getVar( ‘name’,»,’post’ );
    $email = JRequest::getVar( ’email’,»,’post’ );
    $subject = JRequest::getVar( ‘subject’,$default,’post’ );
    $body = JRequest::getVar( ‘text’,»,’post’ );
    [/php]

    Дальше в input’ах в параметр value подставляем эти переменные, например так:
    [php]<input type="text" name="name" id="contact_name" size="30" class="inputbox" value="" />[/php]

    но это только работает с именами без скобок, то есть email, name, а как это сделать с params[familiya];
    я пробовал по разному, и пока не нашел выхода и также понятия не имею как это применить к radio box, checkbox, и ?

    Помогите пожалуйста. Думаю это очень актуальная тема, и в сети очень мало информации на эту тему.

    Спасибо.

  14. Тушов Леонид

    я так полагаю вы прописали по вашему примеру строку:
    $params = JRequest::getVar(‘params’, », ‘post’, ‘array’ );

  15. Cпасибо! То , что давно нужно было, но не было желания разбираться!
    Подскажите пожалуйста.
    Все выполнил по инструкции — на локали работает без проблем, на одном сервере ( php 5, mysql 5) тоже проблем нет, а другом ( php 4, mysql 4) — все плохо. Регистрация (и с фронта, и с админки) проходит нормально, а после при просмотре данных пользователя — поля (новые) пустые, а вместо названий полей- ????????. При регистрации через админку — все тоже самое!
    После этого ввожу в поля данные, сохраняю и только после этого они отображаются! Но называния все равно корявые.
    В базе все отражается нормально!
    Что делать?? Как лечить??

  16. Тушов Леонид

    Первое что приходить на ум по вашей проблеме…, обратите внимание на кодировку файлов \administrator\components\com_users\models\user.xml и \administrator\components\com_users\models\registered.xml — они должны быть в UTF-8
    кодировка БД соотвественно тоже должна быть utf-8

  17. Спасибо, уже решил — использовал языковые файлы — отразилось все нормально. Кодировку проверял до этого — все в utf-8.
    Еще один вопрос. Как сделать поля обязательными? Через libraries\joomla\database\table\user.php ?? И что писать?
    Заранее спасибо.

  18. Для Grinia: !
    Столкнулся с той же проблемой при отправке на e-mail админа. Тоже j 1.5.15.
    Вот решение:
    Вместо строк
    $params = &JComponentHelper::getParams(’com_user’);
    $familiya = $params->get(’familiya’);

    вставить

    $params = new JParameter($user->params);
    $familiya = $params->get(‘familiya’);
    и главное в get(‘familiya’); название параметра точно так же как оно в базе (включая регистр букв)

  19. Тушов Леонид

    «Еще один вопрос. Как сделать поля обязательными? Через libraries\joomla\database\table\user.php ?? И что писать?» — можно и там впринципе… но я бы порекомендовал сделать стандартную проверку на обязательность полей в самой форме регистрации на основе JavaScript (все равно как правило он у всех включен!) да и тогда все же отпадет проблема со сбросом заполненых полей в форме регистрации как у Grinia.
    В Joomle уже есть встроенная валидация , обратите внимание на формат полей в форме регистрации (файл \components\com_user\views\register\tmpl\default.php):
    пример:
    [php]<input type="text" id="username" name="username" size="40" value="<?php echo $this->escape($this->user->get( ‘username’ ));?>" class="inputbox required validate-username" maxlength="25" /> *[/php]

    по наимнованию класса т.е. class=»inputbox required validate-username» идет привязка к валидации определенного поля (слово required — как раз и означает в этом случае обязательное поле!). Единственная проблема в том, что стандартная JS-обратка формы регистрации в Joomle просто подсвечивает поля неправильно заполненные или вообще не заполненные! Хотя впрочем этот момент тоже можно ручками поправить до нужного эффекта! На тему валидации форм в Joomle советую почитать тут http://docs.joomla.org/Form_validation

    Если же делать еще дополнительную проверку на стороне сервера на предмет обязательных полей (а ее всеже стоит делать в целях безопасности) , то лучше конечно отредактировать метод в моем плагине, нежели что-то менять в самой Joomle. В файле плагина \plugins\user\extusdata.php в методе onAfterStoreUser перед строкой $registry->loadArray($_POST[‘params’]); вписать код проверяющий наличие заполненных обязательных полей, к примеру: if (trim($_POST[‘params’][‘familiya’]) == ») { Редирект обратно на форму… }

  20. sh

    Мамбот не хочет устанавливаться )= пишет, что неверная сумма )=

  21. Тушов Леонид

    кто вам сказал что это мамбот?
    Extension User Data — плагин для Joomla 1.5.x не совместимый с CMS Mambo и Joomla версии 1.x

  22. sh

    Дада, я уже понял. спасибо большое.
    а вы за оплату можете расширить форму регистрации для 1.5.13

  23. Тушов Леонид

    «а вы за оплату можете расширить форму регистрации для 1.5.13» — это в каком смысле?
    данный плагин одинаково работает на всех версиях Joomla 1.5.х — вплоть до последней существующей версии.

  24. xandr

    Я новичек в сайтостроении — пытаюсь разобраться. Подскажите плз.
    Сделал так, как у Вас написано — в форме регистрации появилось поле «Phone» (правда только англ. буквами, вместо русских — выдавало квадратики) … но вот в админ.панели «Пользователи» — нового поля с телефоном НЕ добавилось

    user.xml и registered.xml — исправил оба … в БД не знаю как посомтреть добавилось что-то или нет

    Подскажите, как вывести поле «телефон» в админ.панель?

  25. xandr

    залез в БД … в таблеце users всетаки есть опле telephone … НО в него ничего на записывается … зарегистрировал несколько пробных пользователей — имейл, имя, пассворд и др. данные заносятся в БД … а телефон — никак …

    а он очень нужен для обратной связи с клиентами … помогите пожалуйста

  26. Тушов Леонид

    Вот Вы пишите:

    Сделал так, как у Вас написано – в форме регистрации появилось поле «Phone»

    и потом сразу же:

    в таблеце users всетаки есть опле telephone

    так хочется все-таки знать у вас поле в форме регистрации и поле в файлах xml я надеюсь имеет одно и тоже название?
    Итак, давай те еще раз раберемся:
    а) плагин Extension User Data у вас установлен, и самое главное Включен!
    б) вы добавили своё поле в файлы \administrator\components\com_users\models\user.xml и \administrator\components\com_users\models\registered.xm
    например допустим ваше поле все же называется phone, тогда вот пример:
    [php]<param name="phone" type="text" label="Телефон" size="60" />[/php]
    в) вы добавили своё поле в форму регистрации:
    [php]Телефон: <input type="text" name="params[phone]" />[/php]
    если все так как я описал, все должно работать! Если все же не работает, процитируйте здесь свои действия еще раз и привидите примеры кода который вы вставляете!

  27. xandr

    с БД и графой «TELEphone» — разобрался … туплю … это я пробовал делать запрос в БД, как описывалось в другой статье. Но сути дела это особо не меняет … описываю то, что делал:.

    1. скачал, установил, включил ваш плагин
    2. видоизменил \administrator\components\com_users\models\user.xml вот так:
    —————

    —————

    3. видоизменил файл \administrator\components\com_users\models\registered.xml вот так:

    —————

    Registered User Type

    ———————-

    4. в папке \templates\ваш_шаблон … создал папку «html», т.к. ее там не было и вложенные в нее подпапки + скопировал туда, default.php … в результате получилось так …. \templates\ваш_шаблон\html\com_user\register\default.php

    5. Открыл \templates\ваш_шаблон\html\com_user\register\default.php …. и тут самое интересное … в моем случае в тексте данного файла нет даже приблизительно такой строки … ….есть блоки, описывающие «email», «name» и т.д. (графы формы, как я понял) … в результате решил добавить еще такой же блок для Phone

    ——————————————

    :

    <input type="text" id="email" name="email" size="40" value="escape($this->user->get( ’email’ ));?>» class=»inputbox required validate-email» maxlength=»100″ /> *

    :

    <input type="text" id="phone" name="params[phone]" size="40" value="escape($this->user->get( ‘phone’ ));?>» class=»inputbox required validate-phone» maxlength=»100″ /> *

    ————————————————

    … скорее всего я где-то напартачил … вот только — где? …

  28. xandr

    с БД и графой «TELEphone» — разобрался … туплю … это я пробовал делать запрос в БД, как описывалось в другой статье. Но сути дела это особо не меняет … описываю то, что делал:.

    1. скачал, установил, включил ваш плагин
    2. видоизменил \administrator\components\com_users\models\user.xml вот так:
    —————
    [php]
    <?xml version="1.0" encoding="utf-8"?>
    <form>
    <params>
    <param name="admin_language" type="languages" client="administrator" default="" label="Back-end Language" description="paramAdminLanguage" />
    <param name="language" type="languages" client="site" default="" label="Front-end Language" description="paramLanguage" />
    <param name="editor" type="editors" default="" label="User Editor" description="WYSIWYG Editor for this User" />
    <param name="helpsite" type="helpsites" default="" label="Help Site" description="Help Site for this User" />
    <param name="timezone" type="timezones" default="" label="Time Zone" description="Time Zone for this User" />
    <param name="phone" type="text" label="Телефон" size="60" />
    </params>
    </form>
    [/php]
    —————

    3. видоизменил файл \administrator\components\com_users\models\registered.xml вот так:

    —————
    [php]
    <?xml version="1.0" encoding="utf-8"?>
    <form>
    <name>Registered User Type</name>
    <params>
    <param name="language" type="languages" client="site" default="" label="Front-end Language" description="paramLanguage" />
    <param name="timezone" type="timezones" default="" label="Time Zone" description="Time Zone for this User" />
    <param name="phone" type="text" label="Телефон" size="60" />
    </params>
    </form>
    [/php]
    ———————-

    4. в папке \templates\ваш_шаблон … создал папку «html», т.к. ее там не было и вложенные в нее подпапки + скопировал туда, default.php … в результате получилось так …. \templates\ваш_шаблон\html\com_user\register\default.php

    5. Открыл \templates\ваш_шаблон\html\com_user\register\default.php …. и тут самое интересное … в моем случае в тексте данного файла нет даже приблизительно такой строки … ….есть блоки, описывающие «email», «name» и т.д. (графы формы, как я понял) … в результате решил добавить еще такой же блок для Phone

    ——————————————
    [php]
    <tr>
    <td height="40">
    <label id="emailmsg" for="email">
    <?php echo JText::_( ‘Email’ ); ?>:
    </label>
    </td>
    <td>
    <input type="text" id="email" name="email" size="40" value="<?php echo $this->escape($this->user->get( ’email’ ));?>" class="inputbox required validate-email" maxlength="100" /> *
    </td>
    </tr>
    <tr>
    <td height="40">
    <label id="phonemsg" for="phone">
    <?php echo JText::_( ‘Phone’ ); ?>:
    </label>
    </td>
    <td>
    <input type="text" id="phone" name="params[phone]" size="40" value="<?php echo $this->escape($this->user->get( ‘phone’ ));?>" class="inputbox required validate-phone" maxlength="100" /> *
    </td>
    </tr>
    [/php]
    ————————————————

    … скорее всего я где-то напартачил … вот только — где? …

  29. Тушов Леонид

    и тут самое интересное … в моем случае в тексте данного файла нет даже приблизительно такой строки … ….есть блоки, описывающие «email», «name» и т.д. (графы формы, как я понял) … в результате решил добавить еще такой же блок для Phone

    — все правильно поля phone там и не будет! вы его сами должны добавить… и в принципе вы это правильно сделали… ошибок я не вижу…
    итак, после всего того что вы сделали — я так понимаю результата нет? поле phone появляется же на форме регистрации? вы его заполняете каким-либо значением? жмете зарегистрироваться — но значение поля не записывается в базу так?
    странно по тому алгоритму который вы описали все должно работать правильно…
    Для началу желательно найти где у нас ошибка, для этого откройте файл плагина:
    перед строкой 17 добавте строку кода как в примере:
    [php] function onAfterStoreUser($user, $isnew, $success, $msg)
    {
    if ($isnew) {
    print_r($_POST[‘params’]); exit();
    $db =& JFactory::getDBO();[/php]
    после этого попробуй зарегистрироватся на сайте заполнив поле phone вы увидите белую страницу на которую будет выведен массив дополнительных полей, в нем должно быть поле phone имеющее значение введенное вами при регистрации. Если значения нет (оно пусто) — стало быть проблема все-таки в форме регистрации… если же значение есть идет дальше:
    после строки 21 вставте код:
    [php]$db->setQuery("UPDATE #__users SET params = ‘" . $db->getEscaped($params) . "’ WHERE id = " . $user[‘id’]);
    echo $db->getQuery(); exit();[/php]
    этот SQL код должен быть правильным без ошибок, проверить можно попробовав исполнить команду в phpMyAdmin’е или же напишите его мне тут…

  30. xandr

    Леонид, а где в БД посмотреть — записывается ли информация о телефоне?
    Я удалил полностью джумлу и поставил ее заново … скачал Ваш плагин, сделал изменения в файлах (все, чо описано в статье) … в результате поле Phone появилось в форме … заполняю его, регистрируюсь все ок … но в панели администратора нет данных о записанном телефоне .. кроме того, при просмотре информации о заригестрированном пользователе — выдается ошибка:
    XML Parsing Error at 7:61. Error 9: Invalid character

    в БД я не нашел никаких новых записей … возможно не там смотрел …

    .. если не сложно — расскажите плз куда записыватся информация в БД, ккак ее посмотреть? .. и почему начала выдаваться ошибка при просмотре учетных записей пользователей ?

    ЗЫ

    То что вы советовали сделать в последнем Ваше сообщении опка не делал … не знаю, где находится файл плагина, в котором нужно менять код

  31. xandr

    только что удалил добавленную строку в 2 файлах:

    \administrator\components\com_users\models\user.xml и \administrator\components\com_users\models\registered.xml

    … ошибка XML Parsing Error at 7:61. Error 9: Invalid character пропала … просматривать информацию о пользователях можно нормально .. правда поля Телефон как не было, тиак и нет )

    … у меня joomla 1.5.14 … может просто версия не совместима с Вашим плагином? … ули руки мне ровнять надо )

  32. Тушов Леонид

    XML Parsing Error at 7:61. Error 9: Invalid character

    и

    и почему начала выдаваться ошибка при просмотре учетных записей пользователей ?

    — это все из-за ошибки в вашем XML файле, который вы отредактировали. Ищите ошибку — неверный символ ну или что-то подобное… Xml файл обязательно должен быть сохранен в кодировке UTF-8
    Что касается БД, то нужно смотреть таблицу jos_users — найти строку соответствующую зарегистрированному пользователю, в поле params должна быть запись вида phone=значение

    … у меня joomla 1.5.14 … может просто версия не совместима с Вашим плагином? …

    нет мой плагин работает на всей линейке 1.5.X — так что и вашем случае должен работать без проблем!

  33. xandr

    Леонид, не знаю — так задумывалось Вами или нет … но … из файла
    \administrator\components\com_users\models\registered.xml
    … я вообще убрал всяческие добавления — оставил его в исходном виде … далее … файл
    \administrator\components\com_users\models\user.xml
    … в него я внес те изменения, которые Вы описывали в статье … в результате — пропала ошибка в админском меню при просмотре информации о пользовател (XML Parsing Error at 7:61. Error 9: Invalid character ) … в форму регистрации пользователя — добавилось нужное поле … а в БД (там где Вы описали) — все есть и вносится, при регистрации нового пользователя …

    … единственное — так и не появилась информация (телефон) в данных пользователя, которые видны через админское меню ….
    … слегка неудобно, т.к. для контакта с пользователем — приходится открывать БД и искать его там …

    НО

    ОГРОМНОЕ ВАМ ЧЕЛОВЕЧЕСКОЕ СПАСИБО за Ваши труды, терпение и старание!!!! … если сможете обьяснить — как внести доп. поле (телефон) в данные пользователя при просмотре их через админку — буду вообще в восторге … ну а нет — и на том еще раз благодарю Вас! :)

  34. Тушов Леонид

    Радует что у вас данные пишутся в БД )
    По поводу \administrator\components\com_users\models\registered.xml и \administrator\components\com_users\models\user.xml
    первый отвечает именно за запись доп. полей в БД в поле params для юзера, второй нужен как раз для отображения значений этих доп. полей
    Вы смотрите значение поля телефон в админке, в режиме редактирования юзера — так ведь?
    у вас там отображены поля: Язык административной панели, Язык сайта, Редактор пользователя, Сайт помощи, Временная зона
    Если вы откроете файл \administrator\components\com_users\models\user.xml и посмотрите на его содержимое:
    [php]<?xml version="1.0" encoding="utf-8"?>
    <form>
    <params>
    <param name="admin_language" type="languages" client="administrator" default="" label="Back-end Language" description="paramAdminLanguage" />
    <param name="language" type="languages" client="site" default="" label="Front-end Language" description="paramLanguage" />
    <param name="editor" type="editors" default="" label="User Editor" description="WYSIWYG Editor for this User" />
    <param name="helpsite" type="helpsites" default="" label="Help Site" description="Help Site for this User" />
    <param name="timezone" type="timezones" default="" label="Time Zone" description="Time Zone for this User" />
    </params>
    </form>[/php]
    вы поймете что это именно те поля которые отображаются у вас в админке для определенного пользователя, если же глянете на содержимое файла \administrator\components\com_users\models\registered.xml:
    [php]<?xml version="1.0" encoding="utf-8"?>
    <form>
    <name>Registered User Type</name>
    <params>
    <param name="language" type="languages" client="site" default="" label="Front-end Language" description="paramLanguage" />
    <param name="timezone" type="timezones" default="" label="Time Zone" description="Time Zone for this User" />
    </params>
    </form>[/php]
    то не увидите этих полей.
    По хорошему дополнительные поля должны быть внесены в оба файла, если у вас при открытии страницы вылетает ошибка парсинга XML — ищите ошибку в этом файле. Как я уже сказал скорее всего проблема где-то в неверном символе или же кодировке .. или же еще раз напишите мне тут в комментариях содержимое вашего файла после добавление доп. поля который вызывает ошибку я попробую посмотреть найти ошибку.

  35. xandr

    Леонид, очевидно вся загвоздка была в русских буквах в файлах registered и user
    … сегодня сидел ковырялся и вот к чему пришел …
    фал \administrator\components\com_users\models\user.xml у меня имеет тако

  36. xandr

    такой вид:
    [php]<?xml version="1.0" encoding="utf-8"?>
    <form>
    <params>
    <param name="admin_language" type="languages" client="administrator" default="" label="Back-end Language" description="paramAdminLanguage" />
    <param name="language" type="languages" client="site" default="" label="Front-end Language" description="paramLanguage" />
    <param name="editor" type="editors" default="" label="User Editor" description="WYSIWYG Editor for this User" />
    <param name="helpsite" type="helpsites" default="" label="Help Site" description="Help Site for this User" />
    <param name="timezone" type="timezones" default="" label="Time Zone" description="Time Zone for this User" />
    <param name="phone" type="text" default="" label="Phone" description="Phone" />
    </params>
    </form>[/php]

    … файл \administrator\components\com_users\models\registered.xml — такой вид:

    [php]<?xml version="1.0" encoding="utf-8"?>
    <form>
    <name>Registered User Type</name>
    <params>
    <param name="language" type="languages" client="site" default="" label="Front-end Language" description="paramLanguage" />
    <param name="timezone" type="timezones" default="" label="Time Zone" description="Time Zone for this User" />
    <param name="phone" type="text" default="" label="Phone" description="Phone" />
    </params>
    </form>[/php]
    … а в файл \templates\ваш_шаблон\html\com_user\register\default.php я внес такое дополнение:
    [php]<tr>
    <td height="40">
    <label id="emailmsg" for="email">
    <?php echo JText::_( ‘Email’ ); ?>:
    </label>
    </td>
    <td>
    <input type="text" id="email" name="email" size="40" value="<?php echo $this->escape($this->user->get( ’email’ ));?>" class="inputbox required validate-email" maxlength="100" /> *
    </td>
    </tr>
    <strong><tr>
    <td height="40">
    <label id="phonemsg" for="phone">
    <?php echo JText::_( ‘Mobile Phone’ ); ?>:
    </label>
    </td>
    <td>
    <input type="text" id="phone" name="params[phone]" size="40" value="<?php echo $this->escape($this->user->get( ‘phone’ ));?>" class="inputbox required validate-phone" maxlength="100" /> *
    </td>
    </tr></strong>
    <tr>
    <td height="40">
    <label id="pwmsg" for="password">
    <?php echo JText::_( ‘Password’ ); ?>:
    </label>
    </td>
    <td>
    <input class="inputbox required validate-password" type="password" id="password" name="password" size="40" value="" /> *
    </td>
    </tr>[/php]

    … в таком случае, в форме регистрации нового пользователя на сайте появляется поле «Mobile Phone» … регистрация проходит нормально … в БД записываются данные phone=»значение» … а в адвинском меню сайта в режиме регистрации пользователя — появляется окно «Phone» …

    …. если же вносить русские буквы или ту строку, которая есть у Вас в примере — то почему-то выдаются ошибки, когда заходишь в режиме редактирования зарегестрированного пользователя (заходишь через админку сайта) … но при этом в БД все пишется нормально ….

    … и еще одно НО … при просмотре информации о пользователях в БД … для пользователя Администратор, вместо телефона появляются такие значения …

    admin__language=
    language=
    editor=
    helpsite=
    timezone=
    phone=5555555 (это номер телефона админа)

    … не знаю почему так, но в остальном вроде бы все ок …

  37. Тушов Леонид

    …. если же вносить русские буквы или ту строку, которая есть у Вас в примере – то почему-то выдаются ошибки, когда заходишь в режиме редактирования зарегестрированного пользователя (заходишь через админку сайта) … но при этом в БД все пишется нормально ….

    — все же еще раз посоветую обратить внимание на кодировку в котором вы сохраняете файл! Она должна быть UTF-8 не все редакторы умеют корректно сохраняться файлы в этой кодировке. К примеру Notepad++ вставляет при наличии кириллице в содержимом спец. символы в начале файла — из-за этого могут сыпатся ошибки при парсинге XML Jooml’ой!

    … и еще одно НО … при просмотре информации о пользователях в БД … для пользователя Администратор, вместо телефона появляются такие значения …

    admin__language=
    language=
    editor=
    helpsite=
    timezone=
    phone=5555555 (это номер телефона админа)

    — а что в админке у пользователя Администратор отображается в поле phone? Более того вы же пользователя не регистрировали этого — он был создан автоматически при установке Joomla. Значение дополнительного поля было сохранено или из формы обновления профиля во Front-End’е сайта или же из админке при редактировании его же.

  38. xandr

    возможно, Вы правы, на счет «особенностей некоторых редакторов» … сохранял Notepad++ … правда кодировку ставил именно UTF-8 … в результате при наличии кирилицы — выдаются квадратики в созданном поле формы … но это не столь важно — поля озаглавил английскими

    … а на счет «а что в админке у пользователя Администратор отображается в поле phone?» … там все корректно и выдаются только цифры № телефона, т.е. 5555555

    … последнее я спросил лишь из-за того, что есть разница в формате записи в БД у админа и других пользователей … но Вы полностью обьяснили возможную причину этого …

    … спасибо Вам огромнео, Леонид … благодаря таким терпеливым разьяснениям — неопытные пользователи (вроде меня) — приобретают опыт

  39. Тушов Леонид

    пожалуйста! все мы когда-то были «неопытными» :)

  40. А как обозначить в XML файле что поле обязательное для заполнения?

  41. Тушов Леонид

    А как обозначить в XML файле что поле обязательное для заполнения?

    в XML файле никак…
    проверка на заполняемость (валидацию) полей обеспечивает сам разработчик
    Вы можете организовать проверку на обязательное заполнение полей двумя методами:
    1) на стороне клиента — с помощью JavaScript
    2) на стороне сервера — к примеру дописать соответствующий функционал проверки значений полей в плагине или где вам угодно.

  42. Я для этого делал плагин, как написано тут http://phpblog.com.ua/2010/09/joomla-user-additional-fields/ , решение помогло сделать отдельный функционал по работе с пользователями, не знаю велосипед или нет…как считаете..

  43. Тушов Леонид

    а какая разница велосипед или нет? =) , вы пишите что:

    решение помогло сделать отдельный функционал по работе с пользователями,

    помогло же =) решило вашу задачу :) это самое главное )

  44. Тушов Леонид

    автор «про дополнительные поля пользователя при регистрации» пишет:

    «Все данные содержатся в таблице #__users, одним из полей является текстовое хранилице параметров – params , где удобно хранить настройки пользователя (в виде ключ – значение). Но для более сложных случаев такого функционала не хватает.»

    и тут конечно интересно что он имеет ввиду, что именно не хватает? какого функционала?
    я конечно не берусь никак оценивать его решение, я решил задачу по своему, если загляните в код моего плагина, то увидите там всего лишь:

    [php]class plgUserExtUsData extends JPlugin {

    function onAfterStoreUser($user, $isnew, $success, $msg)
    {
    if ($isnew) {
    $db =& JFactory::getDBO();
    $registry = new JRegistry();
    $registry->loadArray($_POST[‘params’]);
    $params = $registry->toString();
    $db->setQuery("UPDATE #__users SET params = ‘" . $db->getEscaped($params) . "’ WHERE id = " . $user[‘id’]);
    $db->query();
    }
    }
    }[/php]
    это все что мне понадобилось, я не использовал все внутренности API Jooml’ы, я просто вытащил из массива $_POST[‘params’] значения полей и сохранил их в поле params таблицы #__users. Вот и все собственно =)

  45. заказчик захотел таблицу с сортировками поиском и тд…если все хранить в параметрах то не очень ясно как это сделать)

  46. Тушов Леонид

    передавайте плагину как массив — а в плагине проверяйте если пришел массив вложенный то просто сериализуйте его через serialize(), перед использованием делайте обратное преобразование и все…
    параметр с выходным значением serialize() вполне успешно хранится в таблице.

  47. он вполне успешно хранится, но тогда нельзя делать сортирповки, выборки т.д. параметры то есть, но толку от них никакого . как например не дать пользователю вбить уникальный параметр напрмиер номер кошелька, как отсортировать по определенному параметру и тд

  48. Тушов Леонид

    напишите мини-класс со своим удобным для вас форматом хранения… напишите шаблоны SQL-запросов с подстановкой и поиском в таблице среди параметров и я думаю задача вполне решится )

  49. скажите честно вы серьезно бы так делали??? вместо того чтобы создать паралельную таблцу в базе и пользоваться всеми благами реляционной бд , вы бы пошли на такое ?? или смайлик в конце означает что это шутка?

  50. Тушов Леонид

    ну конечно же это велосипед да и еще какой )) я бы не стал такой огород городить, XML-параметры API Joomla не настолько привлекательны чтобы так мудрствовать )

  51. Владимир

    первые два пункта понятно но вот как редактировать default.php не совсем вот например поле для ввода имени при регистрации:

    :

    <input type="text" id="username" name="username" size="40" value="escape($this->user->get( ‘username’ ));?>» class=»inputbox required validate-username» maxlength=»25″ /> *

    опишите пожалуйста пример как это будет выглядеть для нового поля фамилия. заранее благодарен

  52. Тушов Леонид

    первые два пункта понятно но вот как редактировать default.php не совсем вот например поле для ввода имени при регистрации:

    ну так прочтите же третий пункт в нем как раз содержится ответ на ваш вопрос

  53. Добрый день, Леонид.

    Хочу поблагодарить Вас за помощь – инструкция очень доступно написана. У меня не работает следующий момент, уже описанный вами:

    В менеджере пользователей, в разделе карточки пользователя «Параметры» не выводятся параметры добавленные мной. Данные в поле params, таблицы com_user вносятся удачно. Никаких нареканий.

    Пример внасимых данных:
    fio=Иван Иванович Иванов
    group_user=ВиВ-5-5
    year_user=2010
    tel_user=88888888888
    icq_user=99999999999
    email_user=ttest@gmail.com
    want_user=нет

    Ознакомился с Вашим постом: «для того чтобы значения «расширенных полей» (см. выше в посте) выводились в админке Jooml’ы при просмотре пользователя необходимо отредактировать файл \administrator\components\com_users\models\user.xml (т.е. внести в него дополнительные поля в формате описанном выше…)»

    Не помогает. Формат соблюден (см. ссылку). Файл доступен. Ваш плагин работает – горит зеленый маркер. Никаких видимых ошибок.

    Привожу ссылку на мой файл user.xml (ссылка).

    Леонид, что посоветуйте.

  54. Долго не мог понять почему не выводятся значение параметров в форме юзера, решил проблему так:
    administrator/components/com_users/models/user.xml

    /templates/тема/html/com_user/user/form.php

    $params = $this->user->getParameters(true);
    <input class="inputbox" type="text" id="icq" name="params[icq]" value="escape($params->get(‘icq’));?>» size=»40″ />

  55. Юрий

    Добавляемые поля являться обязательными для заполнения.
    Как сделать чтобы поля были не обязательные?

  56. Тушов Леонид

    Добавляемые поля являться обязательными для заполнения.
    Как сделать чтобы поля были не обязательные?

    с чего Вы это взяли что они являются обязательными для заполнения? где такое тут написано?

  57. Ирина

    Здравствуйте!
    А возможно ли сделать две независимые и различные формы регистрации со своими полями? (например для физических и юридических лиц)

  58. Red@sar

    Полагаю целесообразнее (да и красивше) будет сделать javascriptовые табы из которых можно будет выбрать тип «лица». Форма останется одна и та де, но выглядеть будет как две разные формы.

  59. Тушов Леонид

    А возможно ли сделать две независимые и различные формы регистрации со своими полями? (например для физических и юридических лиц)

    да вам правильно посоветовали, в конце концов и для физиков и для юриков на сайте все равно будут общие поля такие как емайл, пароль и т.д.

  60. Ирина

    Поняла! Спасибо! Как-то сама не догадалась ))

    Тогда еще вопросик: а дополнительное поле для загрузки файлов тут пройдет? Как его описывать? И где именно дописывать обработчик?
    п.с. Остальные поля дописала без проблем, все работает, все красиво ))

  61. Red@sar

    Обработчик советую сделать с применением ajax который при положительной загрузке файла возвращал бы скрытое поле с параметрами этого файла (где, что и как называеется и тд). Хотя если это поле для (допустим) загрузки аватарки целесообразнее было бы сделать данный блок отдельно в каких-либо настройках учетки пользователя на сайте

  62. Ирина

    Нет, это поле для загрузки различных документов… Тут могут быть и всевозможные офисные файлы, и архивы, и т.п. Обработчик нужен для проверки типов и размеров, а также для сохранения файла в соответствующей папке в зависимости от типа

  63. Red@sar

    Я полагаю документы буду загружаться в процессе пользования сайтом? Если да, то все-таки считаю вынести этот загрузчик в отдельный компонент

  64. Ирина

    Большое спасибо! Буду пробовать…

  65. Ирина

    у меня еще вопросик :)

    хочу вівести значение одного параметра в отдельном модуле.
    пишу:

    [php]
    $params =& JComponentHelper::getParams( ‘com_user’ );
    echo $params->get(‘iden’);
    [/php]

    в результате — пусто (
    В базу параметр ТОЧНО заносится, в админке отображается, редактируется.

  66. Ирина

    все, решила проблему :)

  67. Максим

    Леонид, а возможно ли сделать так:
    1. есть определенный список наименований (например: Тест1, Тест2),
    2. при заполнении поля ведется проверка из этого списка и если пользователь вводит, скажем, «Привет122», выходит или ошибка или предупреждение и регистрация не происходит.

  68. Тушов Леонид

    Леонид, а возможно ли сделать так:
    1. есть определенный список наименований (например: Тест1, Тест2),
    2. при заполнении поля ведется проверка из этого списка и если пользователь вводит, скажем, «Привет122″, выходит или ошибка или предупреждение и регистрация не происходит.

    все зависит от того на какой стороне вы ходите производить такую проверку: на стороне клиента (тогда надо писать соотвествующий JS-код проверки) или на стороне сервера (тогда нужно дописать в плагин проверочный код).
    Для кода на стороне сервера это могло бы выглядеть как то так:
    [php]if (!in_array($_REQUEST[‘params’][‘имя_поля’], array(‘Тест1’, ‘Тест2’))) { exit(‘Ошибка заполнения поля!’); }[/php]

  69. Максим

    Спасибо большое. Буду пробовать.

  70. Серый Ц

    Леонид прошу помогите найти файл отвечающий за отправку сообщения администратору о том, что зарегистрировался новый пользователь, а именно хочу добавить в письмо эти самые дополнительные поля, а то приходят только имя, логин и мыло. И еще вопрос не совсем по теме: можно ли сделать чтобы при регистрации администратор выбирал регистрировать ли пользователя или отказать ему, без стороних модулей? заранее благодарен вам.
    з.ы. побольше бы таких полезных сайтов как у вас, очень много ценной информации)

    • Тушов Леонид

      найти файл отвечающий за отправку сообщения администратору о том, что зарегистрировался новый пользователь

      текст самого сообщения описан в LANG-файле \www\language\ru-RU\ru-RU.com_user.ini, в виде:
      [php]SEND_MSG_ADMIN=Здравствуйте, %s!\n\nНовый пользователь зарегистрирован на сайте «%s».\n\nПараметры учетной записи:\n\nИмя — %s\ne-mail — %s\nЛогин — %s\n\nПожалуйста, не отвечайте на это сообщение, оно было сгенерировано автоматически и только для информации.[/php]

      а именно хочу добавить в письмо эти самые дополнительные поля, а то приходят только имя, логин и мыло.

      вот здесь сложнее… все дело в том что в Joomla до этого процесса не добраться из плагинов, потому придется вам править файл Joomla чтобы запихнуть туда эти данные.
      Открываем файл \www\components\com_user\controller.php, ищем внутри файла слово: SEND_MSG_ADMIN, попадаем на 530 строку (у вас может быть другая, в зависимости от версии Joomla), в любом случае, интересующая нас строка будет выглядеть так:
      [php]$message2 = sprintf ( JText::_( ‘SEND_MSG_ADMIN’ ), $row->name, $sitename, $name, $email, $username);[/php]
      Теперь нам нужно добавить в ряд переменных $row->name, $sitename, $name, $email, $username, свои переменные params
      Допустим у нас в форме регистрации есть два доп. параметра param1 и param2
      переписываем нашу строку в виде:
      [php]
      $params = JRequest::getVar(‘params’);
      $message2 = sprintf ( JText::_( ‘SEND_MSG_ADMIN’ ), $row->name, $sitename, $name, $email, $username, $params[‘param1’], $params[‘param2’]);[/php]
      далее правим константу в LANG-файле добавляя туда вывод наших переменных:
      [php]SEND_MSG_ADMIN=Здравствуйте, %s!\n\nНовый пользователь зарегистрирован на сайте «%s».\n\nПараметры учетной записи:\n\nИмя — %s\ne-mail — %s\nЛогин — %s\n\n
      Параметр 1 = %s\n
      Параметр 2 = %s\n
      Пожалуйста, не отвечайте на это сообщение, оно было сгенерировано автоматически и только для информации.[/php]
      тут \n — символ перевода строки — не обязателен я просто так для информативности добавил его.
      %s — заменяются значениями соотв. переменных передаваемых как раз таки последовательно в функции sprintf

      можно ли сделать чтобы при регистрации администратор выбирал регистрировать ли пользователя или отказать ему, без стороних модулей?

      ну вы наверное хотели сказать, без сторонних плагинов? модули тут вообще не причем, они (модули) на процесс регистрации вообще никак не влияют.
      Я бы наоборот в таком случае предложил бы использовать какой-либо плагин, который делал бы всех новых зарегистрированных пользователей неактивными на сайте, а так как уведомления Админу все равно приходили бы о регистрации он бы оперативно мог включать их через раздел Пользователи в панели управления Joomla.

  71. Евгения

    Ирина:
    2011/09/14 в 22:39
    Здравствуйте!
    А возможно ли сделать две независимые и различные формы регистрации со своими полями? (например для физических и юридических лиц)

    Red@sar:
    2011/09/14 в 22:45
    Полагаю целесообразнее (да и красивше) будет сделать javascriptовые табы из которых можно будет выбрать тип «лица». Форма останется одна и та де, но выглядеть будет как две разные формы.

    Здравствуйте!
    Леонид, подскажите, пжл, где пописывать javascript-код — в Вашем плагине либо подключать как-то отдельно?

    • Тушов Леонид

      Здравствуйте!
      Леонид, подскажите, пжл, где пописывать javascript-код — в Вашем плагине либо подключать как-то отдельно?

      ну в плагин не надо, оно там ни к чему вообщем-то.
      Этот JS-код больше относится к оформлению, т.е. лучше его писать прямо в шаблон регистрации — т.е. в файле где у нас код формы регистрации.

  72. Евгения

    ну в плагин не надо, оно там ни к чему вообщем-то.
    Этот JS-код больше относится к оформлению, т.е. лучше его писать прямо в шаблон регистрации — т.е. в файле где у нас код формы регистрации.

    Спасибо!

  73. Степан

    Что-то туплю, подскажите, пожалуйста.
    Плагин установил.
    Поля в админские xml добавил. При попытке просмотра данных пользователя через админку получаем:
    XML Parsing Error at 9:41. Error 9: Invalid character

    Так и должно быть, потому, что я не еще не добавил поля в форму регистрации? Не совсем понял куда там что вставлять…И как это — «отредактируйте файл», «не советую редактировать файл»…что делать-то? :)

    • Тушов Леонид

      И как это — «отредактируйте файл», «не советую редактировать файл»…

      это про разные файлы я писал.
      я советовал не редактировать исходный файл формы регистрации Joomla, потому что когда вы будете обновлять Joomla есть вероятность того, что ваши изменения будут утеряны (за счет обновления файлов). Потому я рекомендовал редактировать одноименный файл находящийся в папке активной (текущей) темы Joomla.

  74. Степан

    Так, с неправильными знаками разобрался — это у меня кодировка не понимала русские буквы в xml. Но теперь другая ошибка: XML Parsing Error at 10:42. Error 65: Space required…

    • Тушов Леонид

      Так, с неправильными знаками разобрался — это у меня кодировка не понимала русские буквы в xml. Но теперь другая ошибка: XML Parsing Error at 10:42. Error 65: Space required…

      начнем с главного, какая версия Joomla у вас?

  75. Александр

    Леонид, огромное спасибо за помощь.
    Я прям намучался с этой формой регистрации, но всетаки домучал ее!И все получилось, добавил неообходимые поля и они работают))
    Только вот теперь такой вопрос, а для joomla 2.5 ваш плагин будет работать?

    • Тушов Леонид

      Только вот теперь такой вопрос, а для joomla 2.5 ваш плагин будет работать?

      скорее всего нет — в Joomla 2.5 многое по другому…

  76. Алексей

    Подскажите пожалуйста если добавить поля в регистрации по вашему методу например номер телефона, в форуме Kunena 1.7 они тоже будут заполнены в профиле?
    И как прописать поля такие как;
    1- телефон
    2 — icq
    3 — город
    Будут ли они обязательными для заполнения

  77. Тушов Леонид

    Подскажите пожалуйста если добавить поля в регистрации по вашему методу например номер телефона

    если тут имеется ввиду простое текстовое поле — то все по моему примеру. Надеюсь вы понимаете что данный пример справедлив только для Joomla версии 1.5.х

    в форуме Kunena 1.7 они тоже будут заполнены в профиле?

    думаю нет — где тут связь между доп. полями и форумом Kunena

    И как прописать поля такие как;
    1- телефон
    2 — icq
    3 — город
    Будут ли они обязательными для заполнения

    если под этими полями вы понимаете простые текстовые поля то так и прописывайте:
    в xml-файле:
    [php]<param name="phone" type="text" label="Телефон" size="60" />
    <param name="icq" type="text" label="ICQ" size="60" />
    <param name="city" type="text" label="Город" size="60" />[/php]
    в шаблоне регистрации:
    [php]<input type="text" name="params[phone]" />
    <input type="text" name="params[icq]" />
    <input type="text" name="params[city]" />[/php]

  78. Кирилл

    Здравствуйте, Леонид!
    Несколько раз пробовал скачать плагин «Extension User Data» — установить не получается. Архиватор пишет, что архив повреждён. Пожалуйста, перезалейте его и дайте знать, чтоб я смог скачать. Очень нужно!

Leave a Reply

Theme by Anders Norén