Форум русской поддержки Joomla!® CMS
04.12.2016, 07:59:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Плагин Регистрация user, подписка на комментарии jcomments при создании материала

 (Прочитано 551 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sergeyy
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Пол: Мужской
Сообщений: 121


« : 02.11.2015, 23:42:15 »

Здравствуйте !
Написал плагин который при создании материала(в моем случае отзыва)
регистрирует пользователя (отправляет логин, пароль и ссылку активации на email)
Подписывает автора на комментарии jcomments к материалу

т.к. это первый опыт в создании плагина прошу помощи в проверке

файл плагина:
Код
// No direct access.
defined('_JEXEC') or die;
 
class plgContentSubUser extends JPlugin
{
//Конструктор класса
public function __construct(& $subject, $config)
{
parent::__construct($subject, $config);
$this->loadLanguage();
}
//До загрузки в базу
function onContentBeforeSave($context, $article, $isNew)
{
//Проверяем что статья новая
if ($isNew){
 
//проверяем, что форма наша
if ($context == 'com_reskat.form'){
 
//проверяем, наличие email в базе #__users если нет то регистрируем пользователя
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select($db->quoteName('id'));
$query->from($db->quoteName('#__users'));
$query->where($db->quoteName('email'). ' = ' . $db->quote($article->email_to));
$db->setQuery($query);
$xid = ($db->loadResult());
 
//проверяем, стоит ли галочка "подписаться и зарегистрироваться"
if ($article->sortname1 == 1){
if (!$xid){
 
//регистрируем Пользователя
$user = new JUser;
jimport('joomla.user.helper');
$userData = array(
'name' => $article->con_position,
'username' => $article->email_to,
'password' => JUserHelper::genRandomPassword(6),
'activation' => JApplication::getHash(JUserHelper::genRandomPassword() ),
'email' => $article->email_to,
'sendEmail' => 1,
'requireReset' => 0,
'groups' => array( 2 ),
'block' => 1,);
 
$user->bind( $userData );
 
if ( $user->save() ) {
//Если пользователь зарегистрирован формируем ссылку активации и отправляем письмо
$config = JFactory::getConfig();
$uri = JURI::getInstance();
$base = $uri->toString(array('scheme', 'user', 'pass', 'host', 'port'));
$activate = $base.JRoute::_('index.php?option=com_users&task=registration.activate&token='.$userData['activation'], false);
 
//Переменные для формирования письма
$fromname = $config->get('fromname');
$mailfrom = $config->get('mailfrom');
$sitename = $config->get('sitename');
$siteurl = JUri::base();
 
$emailSubject = JText::sprintf(
'PLG_CONTENT_SUBUSER_EMAIL_ACCOUNT_DETAILS',
$userData['name'],
$sitename
);
 
$emailBody = JText::sprintf(
'PLG_CONTENT_SUBUSER_EMAIL_REGISTERED_WITH_ACTIVATION_BODY',
$userData['name'],
$sitename,
$activate,
$siteurl,
$userData['username'],
$user->password_clear
);
 
//Отправка письма
$mail = JFactory::getMailer();
$mail->addRecipient($userData['email']);
$mail->addReplyTo(array($userData['email'], $userData['username']));
$mail->setSender(array( $mailfrom, $fromname ));
$mail->setSubject($emailSubject);
$mail->setBody($emailBody);
$mail->Send();
 
// Сообщение о успешной регистрации
$application = JFactory::getApplication();
if ($user->save()) { // Если пользователь зарегистрирован
JFactory::getApplication()->enqueueMessage(JText::_('PLG_CONTENT_SUBUSER_USERS_REGISTRATION_COMPLETE_ACTIVATE'));
}
}
// Получаем ID зарегестрированного пользователя
$db = JFactory::getDbo();
$query = $db->getQuery( true )
->select('MAX(id)')
->from( '#__users' );
$userid = $db->setQuery( $query )->loadResult();
 
//Заполняем поле user_id таблицы компонента com_reskat
$article->user_id = $userid;
}
}
//Если емаил зарегистрирован то заполняем ID этого пользователя
if ($xid)
{
$article->user_id = $xid;
}
}
}
}
//После загрузки в базу
function onContentAfterSave($context, $article, $isNew)
{
//проверяем, стоит ли галочка "подписаться и зарегистрироваться"
if ($article->sortname1 == 1){
// Check this is a new article.
if ($isNew) {
//проверяем, что форма наша
if ($context == 'com_reskat.form')
{
//вносим данные в таблицу #__jcomments_subscriptions
$lang='ru-RU';
$obj=JRequest::getCmd('option');      
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->insert($db->quoteName('#__jcomments_subscriptions'));
$query->columns(array($db->quoteName('object_id'),
     $db->quoteName('object_group'),
     $db->quoteName('lang'),
     $db->quoteName('userid'),
     $db->quoteName('email'),
     $db->quoteName('name'),
     $db->quoteName('hash'),
     $db->quoteName('published')));
$query->values($db->quote($article->id)
. ', ' . $db->quote($obj)
. ', ' . $db->quote($lang)
. ', ' . $db->quote($article->user_id)
. ', ' . $db->quote($article->email_to)
. ', ' . $db->quote($article->con_position)
. ', ' . $db->quote(md5($article->id . $obj . $userid . $article->email_to . $lang))
. ', ' . $db->quote(1));
$db->setQuery($query);
$db->query();
if ($query) { // Сообщение
JFactory::getApplication()->enqueueMessage(JText::_('PLG_CONTENT_SUBUSER_SUBSCRIBE'));}
}
 }
  }
   }
    }
 
« Последнее редактирование: 03.11.2015, 13:01:46 от Sergeyy » Записан
robert
Профи
********

Репутация: +343/-11
Offline Offline

Пол: Мужской
Сообщений: 3568


« Ответ #1 : 03.11.2015, 00:04:17 »

1.
Код
if ( $user->save() ) {
  ...
  if ($user->save()) {
     ...
  }
}
 
Вторая вложенная инструкция if бесмысленна. Я часто пишу так
Код
if(!$user->save()){
Выдаем сообщение об ошибке;
return false;// или redirect();
}
Все хорошо, дальше идем;
 
2. А здесь:
Код
select('MAX(id)')
 
вы уверены, что это тот id? Используйте inserid();
3.
//проверяем, стоит ли галочка "подписаться и зарегистрироваться"
нужно в первую очередь, чтобы не делать лишних действий
Код
if($isNew && $context=='com_reskat.form' && $article->sortname1==1){}
4. Зачем объявить лишнюю переменную?
Код:
$application = JFactory::getApplication();
if ($user->save()) { // Если пользователь зарегистрирован
JFactory::getApplication()->enqueueMessage(JText::_('PLG_CONTENT_SUBUSER_USERS_REGISTRATION_COMPLETE_ACTIVATE'));
« Последнее редактирование: 03.11.2015, 00:23:08 от robert » Записан
Sergeyy
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Пол: Мужской
Сообщений: 121


« Ответ #2 : 03.11.2015, 21:50:59 »

robert Спасибо!
select('MAX(id)')  заполняется верно
Навёл "порядок" получился такой код:
Код
<?php
/**
* SubUser
* @version        1.0      
* @copyright      © 2015. All rights reserved.
* @license        GNU/GPL
*/

// No direct access.
defined('_JEXEC') or die;
 
class plgContentSubUser extends JPlugin
{
//Конструктор класса
public function __construct(& $subject, $config)
{
parent::__construct($subject, $config);
$this->loadLanguage();
}
//До загрузки в базу
function onContentBeforeSave($context, $article, $isNew)
{
//Проверяем что статья новая и что форма наша
if ($isNew && $context == 'com_reskat.form'){
 
//проверяем, наличие email в базе #__users если нет то регистрируем пользователя
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select($db->quoteName('id'));
$query->from($db->quoteName('#__users'));
$query->where($db->quoteName('email'). ' = ' . $db->quote($article->email_to));
$db->setQuery($query);
$xid = ($db->loadResult());
 
//проверяем, стоит ли галочка "подписаться и зарегистрироваться" проверяем !$xid
if ($article->sortname1 == 1 && !$xid){
 
//регистрируем Пользователя
$user = new JUser;
jimport('joomla.user.helper');
$userData = array(
'name' => $article->con_position,
'username' => $article->email_to,
'password' => JUserHelper::genRandomPassword(6),
'activation' => JApplication::getHash(JUserHelper::genRandomPassword() ),
'email' => $article->email_to,
'sendEmail' => 1,
'requireReset' => 0,
'groups' => array( 2 ),
'block' => 1,);
 
$user->bind( $userData );
 
if ($user->save()) {
//Если пользователь зарегистрирован формируем ссылку активации и отправляем письмо
$config = JFactory::getConfig();
$uri = JURI::getInstance();
$base = $uri->toString(array('scheme', 'user', 'pass', 'host', 'port'));
$activate = $base.JRoute::_('index.php?option=com_users&task=registration.activate&token='.$userData['activation'], false);
 
//Переменные для формирования письма
$fromname = $config->get('fromname');
$mailfrom = $config->get('mailfrom');
$sitename = $config->get('sitename');
$siteurl = JUri::base();
$emailSubject = JText::sprintf(
'PLG_CONTENT_SUBUSER_EMAIL_ACCOUNT_DETAILS',
$userData['name'],
$sitename
);
$emailBody = JText::sprintf(
'PLG_CONTENT_SUBUSER_EMAIL_REGISTERED_WITH_ACTIVATION_BODY',
$userData['name'],
$sitename,
$activate,
$siteurl,
$userData['username'],
$user->password_clear
);
//Отправка письма
$mail = JFactory::getMailer();
$mail->addRecipient($userData['email']);
$mail->addReplyTo(array($userData['email'], $userData['username']));
$mail->setSender(array( $mailfrom, $fromname ));
$mail->setSubject($emailSubject);
$mail->setBody($emailBody);
$mail->Send();
// Сообщение о успешной регистрации
JFactory::getApplication()->enqueueMessage(JText::_('PLG_CONTENT_SUBUSER_USERS_REGISTRATION_COMPLETE_ACTIVATE'));
}
// Получаем ID зарегестрированного пользователя
$db = JFactory::getDbo();
$query = $db->getQuery( true )
->select('MAX(id)')
->from( '#__users' );
$userid = $db->setQuery( $query )->loadResult();
 
//Заполняем поле user_id таблицы компонента com_reskat
$article->user_id = $userid;
}
//Если емаил зарегистрирован то заполняем ID этого пользователя
if ($xid)
{
$article->user_id = $xid;
}
}
 }
//После загрузки в базу
function onContentAfterSave($context, $article, $isNew)
{
//проверяем, стоит ли галочка "подписаться и зарегистрироваться" //Check this is a new article //проверяем, что форма наша
if ($isNew && $context == 'com_reskat.form' && $article->sortname1 == 1){
 
//вносим данные в таблицу #__jcomments_subscriptions
$lang='ru-RU';
$obj=JRequest::getCmd('option');      
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->insert($db->quoteName('#__jcomments_subscriptions'));
$query->columns(array($db->quoteName('object_id'),
     $db->quoteName('object_group'),
     $db->quoteName('lang'),
     $db->quoteName('userid'),
     $db->quoteName('email'),
     $db->quoteName('name'),
     $db->quoteName('hash'),
     $db->quoteName('published')));
$query->values($db->quote($article->id)
. ', ' . $db->quote($obj)
. ', ' . $db->quote($lang)
. ', ' . $db->quote($article->user_id)
. ', ' . $db->quote($article->email_to)
. ', ' . $db->quote($article->con_position)
. ', ' . $db->quote(md5($article->id . $obj . $userid . $article->email_to . $lang))
. ', ' . $db->quote(1));
$db->setQuery($query);
$db->query();
if ($query) { // Сообщение
JFactory::getApplication()->enqueueMessage(JText::_('PLG_CONTENT_SUBUSER_SUBSCRIBE'));}
  }
   }
    }
?>
 
Записан
robert
Профи
********

Репутация: +343/-11
Offline Offline

Пол: Мужской
Сообщений: 3568


« Ответ #3 : 03.11.2015, 23:27:18 »

select('MAX(id)')  заполняется верно
Вы меня не поняли: вы получаете последний ID, но откуда вы знаете, что это именно ID вашего пользователя? Может быть, за это время 10 человек уже успели зарегистрироваться.
Записан
Sergeyy
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Пол: Мужской
Сообщений: 121


« Ответ #4 : 04.11.2015, 00:31:23 »

Возможно...
Хмм. А как? Я ведь не использую в плагине INSERT
Записан
robert
Профи
********

Репутация: +343/-11
Offline Offline

Пол: Мужской
Сообщений: 3568


« Ответ #5 : 04.11.2015, 01:00:46 »

Возможно...
Хмм. А как? Я ведь не использую в плагине INSERT
Я бы на вашем месте сделал следующее:
1. Смотрим JUser::save():
Код
$result = $table->store();
2. OK, смотрим JTable::store():
Код
$result = $this->_db->insertObject($this->_tbl, $this, $this->_tbl_keys[0]);
3. Ладно, смотрим JDatabaseDriver::insertObject($table, &$object, $key = null):
Код
$id = $this->insertid();
...
$object->$key = $id;
 
Из всего этого попробуйте вынуть $id. Если не получится, то придется написать свой запрос.
Записан
Sergeyy
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Пол: Мужской
Сообщений: 121


« Ответ #6 : 10.11.2015, 21:06:34 »

Из всего этого попробуйте вынуть $id. Если не получится, то придется написать свой запрос.
Доброго времени суток!
Не получилось, Знаний пока не хватает.
Вставил тот-же запрос ( получение id пользователя по его email) только после сохранения в _users
Код
	$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select($db->quoteName('id'));
$query->from($db->quoteName('#__users'));
$query->where($db->quoteName('email'). ' = ' . $db->quote($article->email_to));
$db->setQuery($query);
$xid = ($db->loadResult());
 

Robert Большое человеческое спасибо++
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet