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

  • 6 Ответов
  • 751 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

Оффлайн Sergeyy

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

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

файл плагина:
Код: (php) [Выделить]
// 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, 14:01:46 от Sergeyy »
joomla 2.5

*

Оффлайн robert

1.
Код: (php-brief) [Выделить]
if ( $user->save() ) {
   ...
   if ($user->save()) {
      ...
   }
}
Вторая вложенная инструкция if бесмысленна. Я часто пишу так
Код: (php-brief) [Выделить]
if(!$user->save()){
Выдаем сообщение об ошибке;
return false;// или redirect();
}
Все хорошо, дальше идем;
2. А здесь:
Код: (php-brief) [Выделить]
select('MAX(id)')
вы уверены, что это тот id? Используйте inserid();
3.
//проверяем, стоит ли галочка "подписаться и зарегистрироваться"
нужно в первую очередь, чтобы не делать лишних действий
Код: (php-brief) [Выделить]
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, 01:23:08 от robert »
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Оффлайн Sergeyy

robert Спасибо!
select('MAX(id)')  заполняется верно
Навёл "порядок" получился такой код:
Код: (php) [Выделить]
<?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 == && !$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( ),
'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->getQuerytrue )
->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'));}
   }
    }
     }
?>

joomla 2.5

*

Оффлайн robert

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

*

Оффлайн Sergeyy

Возможно...
Хмм. А как? Я ведь не использую в плагине INSERT
joomla 2.5

*

Оффлайн robert

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

*

Оффлайн Sergeyy

Из всего этого попробуйте вынуть $id. Если не получится, то придется написать свой запрос.
Доброго времени суток!
Не получилось, Знаний пока не хватает.
Вставил тот-же запрос ( получение id пользователя по его email) только после сохранения в _users
Код: (php) [Выделить]
$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 Большое человеческое спасибо++
joomla 2.5