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

Sergeyy

  • Захожу иногда
  • 154
  • 3 / 0
Здравствуйте !
Написал плагин который при создании материала(в моем случае отзыва)
регистрирует пользователя (отправляет логин, пароль и ссылку активации на 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, 12:01:46 от Sergeyy »
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
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'));
« Последнее редактирование: 02.11.2015, 23:23:08 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Sergeyy

  • Захожу иногда
  • 154
  • 3 / 0
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 == 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

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

Sergeyy

  • Захожу иногда
  • 154
  • 3 / 0
Возможно...
Хмм. А как? Я ведь не использую в плагине INSERT
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Возможно...
Хмм. А как? Я ведь не использую в плагине 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. Если не получится, то придется написать свой запрос.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Sergeyy

  • Захожу иногда
  • 154
  • 3 / 0
Из всего этого попробуйте вынуть $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 Большое человеческое спасибо++
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вышла новая версия JComments Fork 4.0.16

Автор ProtectYourSite

Ответов: 79
Просмотров: 9653
Последний ответ 05.02.2024, 23:50:16
от ProtectYourSite
У Jcomments есть аналоги?

Автор ruslan13

Ответов: 10
Просмотров: 2191
Последний ответ 07.12.2023, 20:08:31
от Missile
JComments 3.0.7 в Joomla 3.10.12

Автор rezchik

Ответов: 2
Просмотров: 729
Последний ответ 05.10.2023, 21:44:08
от rezchik
JComments 3.0.7 в Joomla 3.10.12

Автор rezchik

Ответов: 1
Просмотров: 615
Последний ответ 02.10.2023, 22:24:45
от sivers
Модуль JComments Latest

Автор smart

Ответов: 574
Просмотров: 332817
Последний ответ 05.07.2023, 16:42:32
от sertlan