/** * 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; }
/** * 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'); }
/** * 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 ›'; $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 ›'; $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", "​.org", $campaignParsed); // $campaignParsed = str_replace(".com", "​.com", $campaignParsed); // $campaignParsed = str_replace(".net", "​.net", $campaignParsed); // $campaignParsed = str_replace(".edu", "​.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; }
/** * 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(); }
/** * 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')); } } }
/** * 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; }
/** * 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')); } } }