Example #1
0
 /**
  * Email instructor course digest
  *
  * @param   object   $job  \Components\Cron\Models\Job
  * @return  boolean
  */
 public function emailInstructorDigest(\Components\Cron\Models\Job $job)
 {
     $database = \App::get('db');
     $cconfig = Component::params('com_courses');
     Lang::load('com_courses') || Lang::load('com_courses', PATH_CORE . DS . 'components' . DS . 'com_courses' . DS . 'site');
     $from = array('name' => Config::get('sitename') . ' ' . Lang::txt('COM_COURSES'), 'email' => Config::get('mailfrom'));
     $subject = Lang::txt('COM_COURSES') . ': ' . Lang::txt('COM_COURSES_SUBJECT_EMAIL_DIGEST');
     require_once PATH_CORE . DS . 'components' . DS . 'com_courses' . DS . 'models' . DS . 'courses.php';
     $course_id = 0;
     $params = $job->get('params');
     if (isset($params) && is_object($params)) {
         $course_id = $params->get('course');
     }
     $coursesObj = new \Components\Courses\Models\Courses();
     if ($course_id) {
         $courses = array($coursesObj->course($course_id));
     } else {
         $courses = $coursesObj->courses();
     }
     if (isset($courses) && count($courses) > 0) {
         foreach ($courses as $course) {
             if (!$course->isAvailable()) {
                 continue;
             }
             $mailed = array();
             $managers = $course->managers();
             $enrollments = $course->students(array('count' => true));
             $offerings = $course->offerings();
             if (isset($offerings) && count($offerings) > 0) {
                 foreach ($offerings as $offering) {
                     if (!$offering->isAvailable()) {
                         continue;
                     }
                     $offering->gradebook()->refresh();
                     $passing = $offering->gradebook()->countPassing(false);
                     $failing = $offering->gradebook()->countFailing(false);
                     if (isset($managers) && count($managers) > 0) {
                         foreach ($managers as $manager) {
                             // Get the user's account
                             $user = User::getInstance($manager->get('user_id'));
                             if (!$user->get('id')) {
                                 continue;
                             }
                             // Try to ensure no duplicates
                             if (in_array($user->get('username'), $mailed)) {
                                 continue;
                             }
                             // Only mail instructors (i.e. not managers)
                             if ($manager->get('role_alias') != 'instructor') {
                                 continue;
                             }
                             // Get discussion stats and posts
                             require_once PATH_CORE . DS . 'components' . DS . 'com_forum' . DS . 'tables' . DS . 'post.php';
                             $postsTbl = new \Components\Forum\Tables\Post($database);
                             $filters = array('scope' => 'course', 'scope_id' => $offering->get('id'), 'state' => 1, 'sort' => 'created', 'sort_Dir' => 'DESC', 'limit' => 100);
                             $posts = $postsTbl->find($filters);
                             $posts_cnt = count($posts);
                             $latest = array();
                             $latest_cnt = 0;
                             if (isset($posts) && $posts_cnt > 0) {
                                 foreach ($posts as $post) {
                                     if (strtotime($post->created) > strtotime('-1 day')) {
                                         $latest[] = $post;
                                     } else {
                                         break;
                                     }
                                 }
                                 $latest_cnt = count($latest);
                             }
                             $eview = new \Hubzero\Component\View(array('base_path' => PATH_CORE . DS . 'components' . DS . 'com_courses' . DS . 'site', 'name' => 'emails', 'layout' => 'digest_plain'));
                             $eview->option = 'com_courses';
                             $eview->controller = 'courses';
                             $eview->delimiter = '~!~!~!~!~!~!~!~!~!~!';
                             $eview->course = $course;
                             $eview->enrollments = $enrollments;
                             $eview->passing = $passing;
                             $eview->failing = $failing;
                             $eview->offering = $offering;
                             $eview->posts_cnt = $posts_cnt;
                             $eview->latest = $latest;
                             $eview->latest_cnt = $latest_cnt;
                             $plain = $eview->loadTemplate();
                             $plain = str_replace("\n", "\r\n", $plain);
                             // HTML
                             $eview->setLayout('digest_html');
                             $html = $eview->loadTemplate();
                             $html = str_replace("\n", "\r\n", $html);
                             // Build message
                             $message = new \Hubzero\Mail\Message();
                             $message->setSubject($subject)->addFrom($from['email'], $from['name'])->addTo($user->get('email'), $user->get('name'))->addHeader('X-Component', 'com_courses')->addHeader('X-Component-Object', 'courses_instructor_digest');
                             $message->addPart($plain, 'text/plain');
                             $message->addPart($html, 'text/html');
                             // Send mail
                             if (!$message->send()) {
                                 $this->setError('Failed to mail %s', $user->get('email'));
                             }
                             $mailed[] = $user->get('username');
                         }
                     }
                 }
             }
         }
     }
     return true;
 }
Example #2
0
 /**
  * Handles the actual sending of emails (or queuing them to be sent)
  *
  * @param  int    $user     the user id to send to
  * @param  array  $posts    the posts to include in the email
  * @param  string $interval the distribution interval
  * @return bool
  **/
 private function sendEmail($user, $posts, $interval = 'daily')
 {
     $eview = new \Hubzero\Component\View(array('base_path' => PATH_CORE . DS . 'components' . DS . 'com_forum' . DS . 'site', 'name' => 'emails', 'layout' => 'digest_plain'));
     $eview->option = 'com_forum';
     $eview->delimiter = '~!~!~!~!~!~!~!~!~!~!';
     $eview->posts = $posts;
     $eview->interval = $interval;
     $plain = $eview->loadTemplate();
     $plain = str_replace("\n", "\r\n", $plain);
     // HTML
     $eview->setLayout('digest_html');
     $html = $eview->loadTemplate();
     $html = str_replace("\n", "\r\n", $html);
     $user = User::getInstance($user);
     // Build message
     $message = App::get('mailer');
     $message->setSubject(Lang::txt('PLG_GROUPS_FORUM') . ': ' . Lang::txt('PLG_GROUPS_FORUM_SUBJECT_EMAIL_DIGEST'))->addFrom(Config::get('mailfrom'), Config::get('sitename'))->addTo($user->get('email'), $user->get('name'))->addHeader('X-Component', 'com_forum')->addHeader('X-Component-Object', 'groups_forum_email_digest');
     $message->addPart($plain, 'text/plain');
     $message->addPart($html, 'text/html');
     // Send mail
     if (!$message->send($this->params->get('email_transport_mechanism'))) {
         $this->setError('Failed to mail %s', $user->get('email'));
     }
     $mailed[] = $user->get('username');
 }
Example #3
0
 /**
  * Build Newsletter Content
  *
  * @param   object   $campaign              Campaign Object
  * @param   boolean  $stripHtmlAndBodyTags  Strip out <html> & <body> tags?
  * @return  string   Campaign HTML
  */
 public function buildNewsletter($campaign, $stripHtmlAndBodyTags = false)
 {
     //are we overriding content with template vs using stories?
     if ($campaign->template == '-1') {
         $campaignTemplate = $campaign->html_content;
         $campaignPrimaryStories = '';
         $campaignSecondaryStories = '';
     } else {
         //instantiate objects
         $newsletterTemplate = new Template($this->_db);
         $newsletterPrimaryStory = new PrimaryStory($this->_db);
         $newsletterSecondaryStory = new SecondaryStory($this->_db);
         //get the campaign template
         $newsletterTemplate->load($campaign->template);
         $campaignTemplate = $newsletterTemplate->template;
         //get primary & secondary colors
         $primaryTitleColor = $newsletterTemplate->primary_title_color ? $newsletterTemplate->primary_title_color : '#000000';
         if (strlen($primaryTitleColor) <= 7 && !strstr($primaryTitleColor, ';')) {
             $primaryTitleColor = 'font-size:20px;font-weight:bold;color:' . $primaryTitleColor . ';font-family:arial;line-height:100%;margin-bottom:10px;';
         }
         $primaryTextColor = $newsletterTemplate->primary_text_color ? $newsletterTemplate->primary_text_color : '#444444';
         if (strlen($primaryTextColor) <= 7 && !strstr($primaryTextColor, ';')) {
             $primaryTextColor = 'font-size:14px;font-weight:normal;color:' . $primaryTextColor . ';font-family:arial;margin-bottom:50px;';
         }
         $secondaryTitleColor = $newsletterTemplate->secondary_title_color ? $newsletterTemplate->secondary_title_color : '#666666';
         if (strlen($secondaryTitleColor) <= 7 && !strstr($secondaryTitleColor, ';')) {
             $secondaryTitleColor = 'font-size:15px;font-weight:bold;color:' . $secondaryTitleColor . ';font-family:arial;line-height:150%;';
         }
         $secondaryTextColor = $newsletterTemplate->secondary_text_color ? $newsletterTemplate->secondary_text_color : '#999999';
         if (strlen($secondaryTextColor) <= 7 && !strstr($secondaryTextColor, ';')) {
             $secondaryTextColor = 'font-size:12px;color:' . $secondaryTextColor . ';font-family:arial;';
         }
         //get and format primary stories
         $campaignPrimaryStories = '';
         $primaryStories = $newsletterPrimaryStory->getStories($campaign->id);
         foreach ($primaryStories as $pStory) {
             $campaignPrimaryStories .= '<span style="display:block;page-break-inside:avoid;' . $primaryTitleColor . '">';
             $campaignPrimaryStories .= $pStory->title;
             $campaignPrimaryStories .= '</span>';
             $campaignPrimaryStories .= '<span style="display:block;page-break-inside:avoid;' . $primaryTextColor . '">';
             $campaignPrimaryStories .= $pStory->story;
             //do we have a readmore link
             if ($pStory->readmore_link) {
                 $readmore_title = $pStory->readmore_title ? $pStory->readmore_title : 'Read More &rsaquo;';
                 $campaignPrimaryStories .= "<br /><br /><a href=\"{$pStory->readmore_link}\" target=\"\">{$readmore_title}</a>";
             }
             $campaignPrimaryStories .= '</span>';
         }
         //get secondary stories
         $campaignSecondaryStories = '<br /><br />';
         $secondaryStories = $newsletterSecondaryStory->getStories($campaign->id);
         foreach ($secondaryStories as $sStory) {
             $campaignSecondaryStories .= '<span style="display:block;page-break-inside:avoid;' . $secondaryTitleColor . '">';
             $campaignSecondaryStories .= $sStory->title;
             $campaignSecondaryStories .= '</span>';
             $campaignSecondaryStories .= '<span style="display:block;page-break-inside:avoid;' . $secondaryTextColor . '">';
             $campaignSecondaryStories .= $sStory->story;
             //do we have a readmore link
             if ($sStory->readmore_link) {
                 $readmore_title = $sStory->readmore_title ? $sStory->readmore_title : 'Read More &rsaquo;';
                 $campaignSecondaryStories .= "<br /><br /><a href=\"{$sStory->readmore_link}\" target=\"\">{$readmore_title}</a>";
             }
             $campaignSecondaryStories .= '</span>';
             $campaignSecondaryStories .= '<br /><br />';
         }
     }
     //get the hub
     $hub = $_SERVER['SERVER_NAME'];
     //build link to newsletters for email
     $link = 'https://' . $hub . '/newsletter/' . $campaign->alias;
     //replace placeholders in template
     $campaignParsed = str_replace("{{LINK}}", $link, $campaignTemplate);
     $campaignParsed = str_replace("{{ALIAS}}", $campaign->alias, $campaignParsed);
     $campaignParsed = str_replace("{{TITLE}}", $campaign->name, $campaignParsed);
     $campaignParsed = str_replace("{{ISSUE}}", $campaign->issue, $campaignParsed);
     // Handle the AUTOGEN sections
     if (preg_match_all("(\\{.*?\\}\\})", $campaignPrimaryStories, $matches) !== FALSE) {
         foreach ($matches[0] as &$match) {
             // A field to hold HTML content for the section
             $html = '';
             // Hold onto the original token
             $originMatch = $match;
             // Perform some cleanup, stripping
             $match = ltrim($match, "{{");
             $match = rtrim($match, "}}");
             // Explode on the delimiter
             $parts = explode("_", $match);
             // Make sure we're doing "it" on the right token
             if ($parts[0] == "AUTOGEN") {
                 // Get the content
                 $enabledPlugins = Event::trigger('newsletter.onGetEnabledDigests');
                 // Ascertain the key, based on plugin ordering
                 $key = array_keys($enabledPlugins, strtolower($parts[1]))[0];
                 // Get the content for the desired plugin
                 $content = Event::trigger('newsletter.onGetLatest', array($parts[2]))[$key];
                 // Apply the view template
                 $view = new \Hubzero\Component\View(array());
                 // Written emphatically, set the paths and whatnot
                 $view->setName('storytemplates');
                 $view->setLayout(strtolower($parts[3]));
                 $view->setBasePath(PATH_CORE . DS . 'components' . DS . 'com_newsletter' . DS . 'admin');
                 // Pass the object through to the view
                 $view->object = $content;
                 $view->addTemplatePath(PATH_CORE . DS . 'components' . DS . 'com_newsletter' . DS . 'admin' . DS . 'views' . DS . 'storytemplates' . DS . 'tmpl');
                 // Oh, what's this a buffer hijack?
                 ob_start();
                 // Render the view within the buffer.
                 $view->display();
                 // Grab the buffer's content
                 $html = ob_get_contents();
                 // Clear and close the buffer
                 ob_end_clean();
                 // Do some string replacement on the original token.
                 $campaignPrimaryStories = str_replace($originMatch, $html, $campaignPrimaryStories);
             }
         }
     }
     $campaignParsed = str_replace("{{PRIMARY_STORIES}}", $campaignPrimaryStories, $campaignParsed);
     $campaignParsed = str_replace("{{SECONDARY_STORIES}}", $campaignSecondaryStories, $campaignParsed);
     $campaignParsed = str_replace("{{COPYRIGHT}}", date("Y"), $campaignParsed);
     $campaignParsed = str_replace('src="/site', 'src="' . substr(PATH_APP, strlen(PATH_ROOT)) . '/site', $campaignParsed);
     //replace .org, .com., .net, .edu 's
     // if ($campaign->type == 'html')
     // {
     // 	$campaignParsed = str_replace(".org", "&#8203;.org", $campaignParsed);
     // 	$campaignParsed = str_replace(".com", "&#8203;.com", $campaignParsed);
     // 	$campaignParsed = str_replace(".net", "&#8203;.net", $campaignParsed);
     // 	$campaignParsed = str_replace(".edu", "&#8203;.edu", $campaignParsed);
     // }
     //do we want to strip <html> & <body> tags
     if ($stripHtmlAndBodyTags) {
         $campaignParsed = preg_replace('/<html[^>]*>/', '', $campaignParsed);
         $campaignParsed = preg_replace('/<body[^>]*>/', '', $campaignParsed);
         $campaignParsed = str_replace('</body>', '', $campaignParsed);
         $campaignParsed = str_replace('</html>', '', $campaignParsed);
     }
     return $campaignParsed;
 }
Example #4
0
 /**
  * Display Group Page
  *
  * @param    Object    $group    \Hubzero\User\Group Object
  * @param    Object    $page     \Components\Groups\Models\Page Object
  * @return   String
  */
 public static function displayPage($group, $page, $markHit = true)
 {
     // create view object
     $view = new \Hubzero\Component\View(array('name' => 'pages', 'layout' => '_view'));
     // if super group add super group folder
     // to available paths
     if ($group->isSuperGroup()) {
         $base = $group->getBasePath();
         $view->addTemplatePath(PATH_APP . $base . DS . 'template' . DS . 'pages');
     }
     // get needed vars
     $database = \App::get('db');
     $authorized = \Components\Groups\Helpers\View::authorize($group);
     $version = $page ? $page->approvedVersion() : null;
     // stops from displaying pages that dont exist
     if ($page === null) {
         App::abort(404, Lang::txt('Group Page Not Found'));
         return;
     }
     // stops from displaying unpublished pages
     // make sure we have approved version to display
     if ($page->get('state') == $page::APP_STATE_UNPUBLISHED || $version === null) {
         // determine which layout to use
         $layout = $version === null ? '_view_notapproved' : '_view_unpublished';
         // show unpublished or no version layout
         if ($authorized == 'manager' || \Hubzero\User\Profile::userHasPermissionForGroupAction($group, 'group.pages')) {
             $view->setLayout($layout);
             $view->group = $group;
             $view->page = $page;
             $view->version = $version;
             return $view->loadTemplate();
         }
         // show 404
         App::abort(404, Lang::txt('Group Page Not Found'));
         return;
     }
     // build page hit object
     // mark page hit
     if ($markHit) {
         $groupsTablePageHit = new PageHit($database);
         $pageHit = new stdClass();
         $pageHit->gidNumber = $group->get('gidNumber');
         $pageHit->pageid = $page->get('id');
         $pageHit->userid = User::get('id');
         $pageHit->date = date('Y-m-d H:i:s');
         $pageHit->ip = $_SERVER['REMOTE_ADDR'];
         $groupsTablePageHit->save($pageHit);
     }
     // parse old wiki content
     //$content = self::parseWiki($group, $version->get('content'), $fullparse = true);
     $content = $version->get('content');
     // parse php tags and modules
     $content = self::parse($group, $page, $content);
     // set content
     $version->set('content', trim($content));
     // set vars to view
     $view->user = User::getRoot();
     $view->group = $group;
     $view->page = $page;
     $view->version = $version;
     $view->authorized = $authorized;
     $view->config = Component::params('com_groups');
     // return rendered template
     return $view->loadTemplate();
 }
Example #5
0
 /**
  * Save profile
  *
  * @return  void
  */
 private function _saveEntryData()
 {
     $isNew = !$this->_profile->get('uidNumber');
     if (!isset($this->raw->password)) {
         $this->raw->password = null;
     }
     if ($isNew) {
         if (!$this->_profile->get('username')) {
             $valid = false;
             // Try to create from name
             $username = preg_replace('/[^a-z9-0_]/i', '', strtolower($this->_profile->get('name')));
             if (\Hubzero\Utility\Validate::username($username)) {
                 if (!$this->_usernameExists($username)) {
                     $valid = true;
                 }
             }
             // Try to create from portion preceeding @ in email address
             if (!$valid) {
                 $username = strstr($this->_profile->get('email'), '@', true);
                 if (\Hubzero\Utility\Validate::username($username)) {
                     if ($this->_usernameExists($username)) {
                         $valid = true;
                     }
                 }
             }
             // Try to create from whole email address
             if (!$valid) {
                 for ($i = 0; $i <= 99; $i++) {
                     $username = preg_replace('/[^a-z9-0_]/i', '', strtolower($this->_profile->get('name'))) . $i;
                     if (\Hubzero\Utility\Validate::username($username)) {
                         if ($this->_usernameExists($username)) {
                             $valid = true;
                             break;
                         }
                     }
                 }
             }
             if ($valid) {
                 $this->_profile->set('username', $username);
             }
         }
         if (!$this->raw->password) {
             //\Hubzero\User\Helper::random_password();
             $this->raw->password = $this->_profile->get('username');
         }
         $usersConfig = Component::params('com_users');
         $newUsertype = $usersConfig->get('new_usertype');
         if (!$newUsertype) {
             $db = \App::get('db');
             $query = $db->getQuery(true)->select('id')->from('#__usergroups')->where('title = "Registered"');
             $db->setQuery($query);
             $newUsertype = $db->loadResult();
         }
         $user = User::getRoot();
         $user->set('username', $this->_profile->get('username'));
         $user->set('name', $this->_profile->get('name'));
         $user->set('email', $this->_profile->get('email'));
         $user->set('id', 0);
         $user->set('groups', array($newUsertype));
         $user->set('registerDate', Date::of('now')->toSql());
         $user->set('password', $this->raw->password);
         $user->set('password_clear', $this->raw->password);
         $user->save();
         $user->set('password_clear', '');
         // Attempt to get the new user
         $profile = \Hubzero\User\Profile::getInstance($user->get('id'));
         $result = is_object($profile);
         // Did we successfully create an account?
         if ($result) {
             if (!$this->record->entry->get('emailConfirmed', null)) {
                 $this->_profile->set('emailConfirmed', -rand(1, pow(2, 31) - 1));
             }
             $this->_profile->set('uidNumber', $user->get('id'));
             $this->_profile->set('gidNumber', $profile->get('gidNumber'));
             if (!$this->_profile->get('homeDirectory')) {
                 $this->_profile->set('homeDirectory', $profile->get('homeDirectory'));
             }
             if (!$this->_profile->get('loginShell')) {
                 $this->_profile->set('loginShell', $profile->get('loginShell'));
             }
             if (!$this->_profile->get('ftpShell')) {
                 $this->_profile->set('ftpShell', $profile->get('ftpShell'));
             }
             if (!$this->_profile->get('jobsAllowed')) {
                 $this->_profile->set('jobsAllowed', $profile->get('jobsAllowed'));
             }
         }
     }
     if (!$this->_profile->store()) {
         throw new Exception(Lang::txt('Unable to save the entry data.'));
     }
     if ($password = $this->raw->password) {
         /*if ($isNew)
         		{
         			// We need to bypass any hashing
         			$this->raw->password = '******';
         			\Hubzero\User\Password::changePasshash($this->_profile->get('uidNumber'), $password);
         		}
         		else
         		{*/
         \Hubzero\User\Password::changePassword($this->_profile->get('uidNumber'), $password);
         //}
     }
     \Hubzero\User\Password::expirePassword($this->_profile->get('uidNumber'));
     if ($isNew && $this->_options['emailnew'] == 1) {
         $eview = new \Hubzero\Component\View(array('base_path' => PATH_CORE . DS . 'components' . DS . 'com_members' . DS . 'site', 'name' => 'emails', 'layout' => 'confirm'));
         $eview->option = 'com_members';
         $eview->controller = 'register';
         $eview->sitename = Config::get('sitename');
         $eview->login = $this->_profile->get('username');
         $eview->name = $this->_profile->get('name');
         $eview->registerDate = $this->_profile->get('registerDate');
         $eview->confirm = $this->_profile->get('emailConfirmed');
         $eview->baseURL = Request::base();
         $msg = new \Hubzero\Mail\Message();
         $msg->setSubject(Config::get('sitename') . ' ' . Lang::txt('COM_MEMBERS_REGISTER_EMAIL_CONFIRMATION'))->addTo($this->_profile->get('email'))->addFrom(Config::get('mailfrom'), Config::get('sitename') . ' Administrator')->addHeader('X-Component', 'com_members');
         $message = $eview->loadTemplate();
         $message = str_replace("\n", "\r\n", $message);
         $msg->addPart($message, 'text/plain');
         $eview->setLayout('confirm_html');
         $message = $eview->loadTemplate();
         $message = str_replace("\n", "\r\n", $message);
         $msg->addPart($message, 'text/html');
         if (!$msg->send()) {
             array_push($this->record->errors, Lang::txt('COM_MEMBERS_REGISTER_ERROR_EMAILING_CONFIRMATION'));
         }
     }
 }
Example #6
0
 /**
  *  Save group settings
  *
  * @return 		void
  */
 public function saveTask()
 {
     // Check if they're logged in
     if (User::isGuest()) {
         $this->loginTask(Lang::txt('COM_GROUPS_CREATE_MUST_BE_LOGGED_IN'));
         return;
     }
     Request::checkToken();
     // Incoming
     $g_gidNumber = Request::getInt('gidNumber', 0, 'post');
     $c_gidNumber = Request::getVar('gidNumber', 0, 'post');
     if ((string) $g_gidNumber !== (string) $c_gidNumber) {
         App::abort(404, Lang::txt('COM_GROUPS_ERROR_NO_ID'));
     }
     if (!$g_gidNumber && !User::authorise('core.create', $this->_option) || $g_gidNumber && !User::authorise('core.edit', $this->_option)) {
         return App::redirect(Route::url('index.php?option=' . $this->_option), Lang::txt('COM_GROUPS_ERROR_NOT_AUTH'), 'warning');
     }
     $g_cn = trim(Request::getVar('cn', '', 'post'));
     $g_description = preg_replace('/\\s+/', ' ', trim(Request::getVar('description', Lang::txt('NONE'), 'post')));
     $g_discoverability = Request::getInt('discoverability', 0, 'post');
     $g_public_desc = Sanitize::stripScripts(trim(Request::getVar('public_desc', '', 'post', 'none', 2)));
     $g_private_desc = Sanitize::stripScripts(trim(Request::getVar('private_desc', '', 'post', 'none', 2)));
     $g_restrict_msg = Sanitize::stripScripts(trim(Request::getVar('restrict_msg', '', 'post', 'none', 2)));
     $g_join_policy = Request::getInt('join_policy', 0, 'post');
     $tags = trim(Request::getVar('tags', ''));
     $lid = Request::getInt('lid', 0, 'post');
     $customization = Request::getVar('group', '', 'POST', 'none', 2);
     $plugins = Request::getVar('group_plugin', '', 'POST');
     $params = Request::getVar('params', array(), 'POST');
     $g_discussion_email_autosubscribe = Request::getInt('discussion_email_autosubscribe', 0, 'post');
     //Check authorization
     if ($this->_authorize() != 'manager' && $g_gidNumber != 0 && !$this->_authorizedForTask('group.edit')) {
         $this->_errorHandler(403, Lang::txt('COM_GROUPS_ERROR_NOT_AUTH'));
     }
     //are we editing or creating
     if ($g_gidNumber) {
         $group = Group::getInstance($g_gidNumber);
         $this->_task = 'edit';
         $before = Group::getInstance($g_gidNumber);
     } else {
         $this->_task = 'new';
         $group = new Group();
         $before = new Group();
     }
     // Check for any missing info
     if (!$g_cn) {
         $this->setNotification(Lang::txt('COM_GROUPS_SAVE_ERROR_MISSING_INFORMATION') . ': ' . Lang::txt('COM_GROUPS_DETAILS_FIELD_CN'), 'error');
     }
     if (!$g_description) {
         $this->setNotification(Lang::txt('COM_GROUPS_SAVE_ERROR_MISSING_INFORMATION') . ': ' . Lang::txt('COM_GROUPS_DETAILS_FIELD_DESCRIPTION'), 'error');
     }
     // Ensure the data passed is valid
     if ($g_cn == 'new' || $g_cn == 'browse') {
         $this->setNotification(Lang::txt('COM_GROUPS_SAVE_ERROR_INVALID_ID'), 'error');
     }
     if (!$this->_validCn($g_cn)) {
         $this->setNotification(Lang::txt('COM_GROUPS_SAVE_ERROR_INVALID_ID'), 'error');
     }
     if ($this->_task == 'new' && Group::exists($g_cn, true)) {
         $this->setNotification(Lang::txt('COM_GROUPS_SAVE_ERROR_ID_TAKEN'), 'error');
     }
     // Get the logo
     $logo = '';
     if (isset($customization['logo'])) {
         $logo_parts = explode("/", $customization['logo']);
         $logo = array_pop($logo_parts);
     }
     // Plugin settings
     $plugin_access = '';
     foreach ($plugins as $plugin) {
         $plugin_access .= $plugin['name'] . '=' . $plugin['access'] . ',' . "\n";
     }
     // Run content through validation and spam filters
     if (trim($g_public_desc)) {
         $results = Event::trigger('content.onContentBeforeSave', array('com_groups.group.public_desc', &$g_public_desc, $this->_task == 'new'));
         foreach ($results as $result) {
             if ($result === false) {
                 $this->setNotification(Lang::txt('COM_GROUPS_SAVE_ERROR_FAILED_VALIDATION'), 'error');
                 break;
             }
         }
     }
     // Push back into edit mode if any errors
     if ($this->getNotifications()) {
         $group->set('cn', $g_cn);
         $group->set('description', $g_description);
         $group->set('public_desc', $g_public_desc);
         $group->set('private_desc', $g_private_desc);
         $group->set('join_policy', $g_join_policy);
         $group->set('restrict_msg', $g_restrict_msg);
         $group->set('discoverability', $g_discoverability);
         $group->set('discussion_email_autosubscribe', $g_discussion_email_autosubscribe);
         $group->set('logo', $logo);
         $group->set('plugins', $plugin_access);
         $this->lid = $lid;
         $this->group = $group;
         $this->tags = $tags;
         $this->editTask();
         return;
     }
     // Build the e-mail message
     if ($this->_task == 'new') {
         $subject = Lang::txt('COM_GROUPS_SAVE_EMAIL_REQUESTED_SUBJECT', $g_cn);
         $type = 'groups_created';
     } else {
         $subject = Lang::txt('COM_GROUPS_SAVE_EMAIL_UPDATED_SUBJECT', $g_cn);
         $type = 'groups_changed';
     }
     if ($this->_task == 'new') {
         $group->set('cn', $g_cn);
         $group->set('type', 1);
         $group->set('published', 1);
         $group->set('approved', $this->config->get('auto_approve', 1));
         $group->set('created', Date::toSql());
         $group->set('created_by', User::get('id'));
         $group->add('managers', array(User::get('id')));
         $group->add('members', array(User::get('id')));
         $group->create();
     }
     // merge incoming settings with existing params
     $params = new Registry($params);
     $gParams = new Registry($group->get('params'));
     $gParams->merge($params);
     //set group vars & Save group
     $group->set('description', $g_description);
     $group->set('public_desc', $g_public_desc);
     $group->set('private_desc', $g_private_desc);
     $group->set('join_policy', $g_join_policy);
     $group->set('restrict_msg', $g_restrict_msg);
     $group->set('discoverability', $g_discoverability);
     $group->set('logo', $logo);
     $group->set('plugins', $plugin_access);
     $group->set('discussion_email_autosubscribe', $g_discussion_email_autosubscribe);
     $group->set('params', $gParams->toString());
     $group->update();
     // Process tags
     $gt = new Tags($group->get('gidNumber'));
     $gt->setTags($tags, User::get('id'));
     // Rename the temporary upload directory if it exist
     $log_comments = '';
     Event::trigger('groups.onGroupAfterSave', array($before, $group));
     if ($this->_task == 'new') {
         if ($lid != $group->get('gidNumber')) {
             $config = $this->config;
             $bp = PATH_APP . DS . trim($this->config->get('uploadpath', '/site/groups'), DS);
             if (is_dir($bp . DS . $lid)) {
                 rename($bp . DS . $lid, $bp . DS . $group->get('gidNumber'));
             }
         }
         $log_action = 'group_created';
         // Trigger the functions that delete associated content
         // Should return logs of what was deleted
         $logs = Event::trigger('groups.onGroupNew', array($group));
         if (count($logs) > 0) {
             $log_comments .= implode('', $logs);
         }
     } else {
         $log_action = 'group_edited';
     }
     // log invites
     Log::log(array('gidNumber' => $group->get('gidNumber'), 'action' => $log_action, 'comments' => $log_comments));
     // Build the e-mail message
     // Note: this is done *before* pushing the changes to the group so we can show, in the message, what was changed
     $eview = new \Hubzero\Component\View(array('name' => 'emails', 'layout' => 'saved'));
     $eview->option = $this->_option;
     $eview->user = User::getRoot();
     $eview->group = $group;
     $message['plaintext'] = $eview->loadTemplate();
     $message['plaintext'] = str_replace("\n", "\r\n", $message['plaintext']);
     $eview->setLayout('saved');
     $message['multipart'] = $eview->loadTemplate();
     $message['multipart'] = str_replace("\n", "\r\n", $message['multipart']);
     // Get the administrator e-mail
     $emailadmin = Config::get('mailfrom');
     // Get the "from" info
     $from = array('name' => Config::get('sitename') . ' ' . Lang::txt(strtoupper($this->_name)), 'email' => Config::get('mailfrom'));
     //only email managers if updating group
     if ($type == 'groups_changed') {
         // build array of managers
         $managers = $group->get('managers');
         // create new message
         Plugin::import('xmessage');
         if (!Event::trigger('onSendMessage', array($type, $subject, $message, $from, $managers, $this->_option))) {
             $this->setNotification(Lang::txt('GROUPS_ERROR_EMAIL_MANAGERS_FAILED'), 'error');
         }
     }
     //only inform site admin if the group wasn't auto-approved
     if (!$this->config->get('auto_approve', 1) && $group->get('approved') == 0) {
         // create approval subject
         $subject = Lang::txt('COM_GROUPS_SAVE_WAITING_APPROVAL', Config::get('sitename'));
         // build approval message
         $link = 'https://' . trim($_SERVER['HTTP_HOST'], DS) . DS . 'groups' . DS . $group->get('cn');
         $link2 = 'https://' . trim($_SERVER['HTTP_HOST'], DS) . DS . 'administrator';
         $html = Lang::txt('COM_GROUPS_SAVE_WAITING_APPROVAL_DESC', $group->get('description'), $link, $link2);
         $plain = Lang::txt('COM_GROUPS_SAVE_WAITING_APPROVAL_DESC', $group->get('description'), $link, $link2);
         // create new message
         $message = new \Hubzero\Mail\Message();
         // build message object and send
         $message->setSubject($subject)->addFrom($from['email'], $from['name'])->setTo($emailadmin)->addHeader('X-Mailer', 'PHP/' . phpversion())->addHeader('X-Component', 'com_groups')->addHeader('X-Component-Object', 'group_pending_approval')->addHeader('X-Component-ObjectId', $group->get('gidNumber'))->addPart($plain, 'text/plain')->addPart($html, 'text/html')->send();
     }
     // create home page
     if ($this->_task == 'new') {
         // create page
         $page = new Page(array('gidNumber' => $group->get('gidNumber'), 'parent' => 0, 'lft' => 1, 'rgt' => 2, 'depth' => 0, 'alias' => 'overview', 'title' => 'Overview', 'state' => 1, 'privacy' => 'default', 'home' => 1));
         $page->store(false);
         // create page version
         $version = new Page\Version(array('pageid' => $page->get('id'), 'version' => 1, 'content' => "<!-- {FORMAT:HTML} -->\n<p>[[Group.DefaultHomePage()]]</p>", 'created' => Date::toSql(), 'created_by' => User::get('id'), 'approved' => 1));
         $version->store(false);
     }
     // Show success message to user
     if ($this->_task == 'new') {
         $this->setNotification(Lang::txt('COM_GROUPS_CREATED_SUCCESS', $group->get('description')), 'passed');
     } else {
         $this->setNotification(Lang::txt('COM_GROUPS_UPDATED_SUCCESS', $group->get('description')), 'passed');
     }
     // Redirect back to the group page
     App::redirect(Route::url('index.php?option=' . $this->_option . '&cn=' . $group->get('cn')));
     return;
 }
Example #7
0
 /**
  * Save profile
  *
  * @return  void
  */
 private function _saveEntryData()
 {
     $isNew = !$this->record->entry->get('id');
     if (!isset($this->raw->password)) {
         $this->raw->password = null;
     }
     if ($isNew) {
         if (!$this->record->entry->get('username')) {
             $valid = false;
             // Try to create from name
             $username = preg_replace('/[^a-z9-0_]/i', '', strtolower($this->record->entry->get('name')));
             if (Validate::username($username)) {
                 if (!$this->_usernameExists($username)) {
                     $valid = true;
                 }
             }
             // Try to create from portion preceeding @ in email address
             if (!$valid) {
                 $username = strstr($this->record->entry->get('email'), '@', true);
                 if (Validate::username($username)) {
                     if ($this->_usernameExists($username)) {
                         $valid = true;
                     }
                 }
             }
             // Try to create from whole email address
             if (!$valid) {
                 for ($i = 0; $i <= 99; $i++) {
                     $username = preg_replace('/[^a-z9-0_]/i', '', strtolower($this->record->entry->get('name'))) . $i;
                     if (Validate::username($username)) {
                         if ($this->_usernameExists($username)) {
                             $valid = true;
                             break;
                         }
                     }
                 }
             }
             if ($valid) {
                 $this->record->entry->set('username', $username);
             }
         }
         if (!$this->raw->password) {
             $this->raw->password = $this->record->entry->get('username');
         }
         $newUsertype = null;
         if (isset($this->raw->usertype)) {
             if (is_numeric($this->raw->usertype)) {
                 $newUsertype = (int) $this->raw->usertype;
             } else {
                 $db = \App::get('db');
                 $query = $db->getQuery(true)->select('id')->from('#__usergroups')->where('title=' . $db->quote($this->raw->usertype));
                 $db->setQuery($query);
                 $newUsertype = (int) $db->loadResult();
             }
         }
         if (!$newUsertype) {
             $usersConfig = Component::params('com_users');
             $newUsertype = $usersConfig->get('new_usertype');
             if (!$newUsertype) {
                 $db = \App::get('db');
                 $query = $db->getQuery(true)->select('id')->from('#__usergroups')->where('title = "Registered"');
                 $db->setQuery($query);
                 $newUsertype = $db->loadResult();
             }
         }
         $d = Date::of('now');
         if ($this->raw->registerDate) {
             try {
                 $d = Date::of($this->raw->registerDate);
             } catch (Exception $e) {
                 array_push($this->record->errors, $e->getMessage());
             }
         }
         $this->record->entry->set('id', 0);
         $this->record->entry->set('accessgroups', array($newUsertype));
         $this->record->entry->set('registerDate', $d->toSql());
         $this->record->entry->set('password', $this->raw->password);
         if (!$this->record->entry->get('activation', null)) {
             $this->record->entry->set('activation', -rand(1, pow(2, 31) - 1));
         }
     }
     if (!$this->record->entry->save()) {
         throw new Exception(Lang::txt('Unable to save the entry data.'));
     }
     if (!empty($this->_profile)) {
         if (!$this->record->entry->saveProfile($this->_profile)) {
             throw new Exception($this->record->entry->getError());
         }
     }
     if ($this->raw->password) {
         \Hubzero\User\Password::changePassword($this->record->entry->get('id'), $this->raw->password);
         \Hubzero\User\Password::expirePassword($this->record->entry->get('id'));
     }
     if ($isNew && $this->_options['emailnew'] == 1) {
         $eview = new \Hubzero\Component\View(array('base_path' => PATH_CORE . DS . 'components' . DS . 'com_members' . DS . 'site', 'name' => 'emails', 'layout' => 'confirm'));
         $eview->option = 'com_members';
         $eview->controller = 'register';
         $eview->sitename = Config::get('sitename');
         $eview->login = $this->record->entry->get('username');
         $eview->name = $this->record->entry->get('name');
         $eview->registerDate = $this->record->entry->get('registerDate');
         $eview->confirm = $this->record->entry->get('activation');
         $eview->baseURL = Request::base();
         $msg = new \Hubzero\Mail\Message();
         $msg->setSubject(Config::get('sitename') . ' ' . Lang::txt('COM_MEMBERS_REGISTER_EMAIL_CONFIRMATION'))->addTo($this->record->entry->get('email'))->addFrom(Config::get('mailfrom'), Config::get('sitename') . ' Administrator')->addHeader('X-Component', 'com_members');
         $message = $eview->loadTemplate();
         $message = str_replace("\n", "\r\n", $message);
         $msg->addPart($message, 'text/plain');
         $eview->setLayout('confirm_html');
         $message = $eview->loadTemplate();
         $message = str_replace("\n", "\r\n", $message);
         $msg->addPart($message, 'text/html');
         if (!$msg->send()) {
             array_push($this->record->errors, Lang::txt('COM_MEMBERS_REGISTER_ERROR_EMAILING_CONFIRMATION'));
         }
     }
 }