/** * executeRegister * * @access public * @return void */ public function executeRegister(sfWebRequest $request) { $this->form = new sfGuardFormRegister(); if ($request->isMethod(sfRequest::POST)) { $this->form->bind($request->getParameter($this->form->getName())); if ($this->form->isValid()) { $values = $this->form->getValues(); $sfGuardUser = new sfGuardUser(); $sfGuardUser->fromArray($values, BasePeer::TYPE_FIELDNAME); if (isset($values['email'])) { $sfGuardUser->setEmail($values['email']); } $sfGuardUser->setIsActive(false); $sfGuardUser->save(); $messageParams = array('sfGuardUser' => $sfGuardUser, 'password' => $values['password']); $body = $this->getComponent($this->getModuleName(), 'send_request_confirm', $messageParams); $from = sfConfig::get('app_sf_guard_extra_plugin_mail_from', '*****@*****.**'); $fromName = sfConfig::get('app_sf_guard_extra_plugin_name_from', 'noreply'); $to = $sfGuardUser->getEmail(); $toName = $sfGuardUser->getUsername(); $subject = sfConfig::get('app_sf_guard_extra_plugin_subject_confirm', 'Confirm Registration'); $mailer = $this->getMailer(); $message = $mailer->compose(array($from => $fromName), array($to => $toName), $subject, $body); $mailer->send($message); $this->getUser()->setFlash('values', $values); $this->getUser()->setFlash('sfGuardUser', $sfGuardUser); return $this->redirect('@sf_guard_do_register'); } } }
/** * Личные данные */ public function executeSignup() { $loginzaData = $this->getUser()->getAttribute('loginza.identity', false, 'loginza'); $this->forward404Unless($loginzaData); $user = new sfGuardUser(); $user->fromArray($loginzaData); $this->form = new sfGuardUserForm($user); }
/** * This is only example of what you can do. * * You should write your own method to handle the business logic required * for your app and specify it in the sfCacophonyFilter in the filters.yml * * @param sfRequest $request */ public function executeRegister(sfRequest $request) { $provider = $request->getParameter('provider'); // You might want to get user info from the provider like this $result = sfCacophonyOAuth::getMe($provider, $this->getUser()->getAttribute('accessToken', null, sprintf('sfCacophonyPlugin/%s', $provider))); // You might want to check if user exists like this: if ($this->getUser()->isAuthenticated()) { $sf_guard_user = $this->getUser()->getGuardUser(); } else { $sf_guard_user = sfGuardUserTable::getInstance()->createQuery('u')->innerJoin('u.Tokens t')->where('t.providers_user_id = ? AND provider = ?', array($result['normalized']['providers_user_id'], $provider))->fetchOne(); } if (!$sf_guard_user) { // If user doesn't exist, you might want to add them, like this: $token = new Token(); $token->fromArray($result['normalized']); $accessToken = $this->getUser()->getAttribute('accessToken', null, sprintf('sfCacophonyPlugin/%s', $provider)); $token->setContent($accessToken); if (isset($accessToken['expires_at'])) { $token->setExpiresAt($accessToken['expires_at']); } $token->setProvider($provider); $sf_guard_user = new sfGuardUser(); $sf_guard_user->fromArray($result['normalized']); $sf_guard_user['Tokens']->add($token); $sf_guard_user->save(); $this->postCreateHook($sf_guard_user, $token); } else { $hasToken = false; // Or if the user exists, update it's tokens foreach ($sf_guard_user['Tokens'] as $token) { if ($token['provider'] == $provider) { $accessToken = $this->getUser()->getAttribute('accessToken', null, sprintf('sfCacophonyPlugin/%s', $provider)); $token->setContent($accessToken); if (isset($accessToken['expires_at'])) { $token->setExpiresAt($accessToken['expires_at']); } $token->save(); $hasToken = true; break; } } // If it's a new token - add it if (!$hasToken) { $token = new Token(); $token->fromArray($result['normalized']); $accessToken = $this->getUser()->getAttribute('accessToken', null, sprintf('sfCacophonyPlugin/%s', $provider)); $token->setContent($accessToken); if (isset($accessToken['expires_at'])) { $token->setExpiresAt($accessToken['expires_at']); } $token->setProvider($provider); $sf_guard_user['Tokens']->add($token); $sf_guard_user->save(); $this->postUpdateHook($sf_guard_user, $token); } } // At the end, you might want to log in user like this: $this->getUser()->signin($sf_guard_user); // and redirect to homepage, or wherever you want $this->redirect('@homepage'); }
public static function filterForEngine($options) { // This method filters the virtual pages, tags and categories associated with a particular engine based on // specified criteria such as tag, category, publication date, etc. // Strategy: do Lucene queries and direct SQL queries that will get us all the info about relevant categories, // tags and virtual pages. Then turn that into a select distinct query for each of those things. The resulting // information is sufficient to populate the filters sidebar with options that are still relevant given the // other criteria in effect, and also to fetch the result pages (you'll want to do that with a LIMIT and an IN // query looking at the first n IDs returned by this method). // The options array looks like this. Note that all of these are optional and if each is unspecified or empty // no restriction is made on that particular basis. 'categoryIds' is used to limit to the categories associated // with the engine page, while 'categorySlug' is used to limit to a category specified by the user as a // filter. The 'q' option is Lucene search. // array( // 'q' => 'gromit', // 'author' => 'username', // 'categoryIds' => array(1, 3, 5), // 'categorySlug' => 'cheese', // 'tag' => 'wensleydale', // 'slugStem' => '@a_event_search_redirect', // 'year' => 2010, # Optional, if present only 2010 is shown // 'month' => 12, # Optional, if present only Dec. 2010 is shown // 'day' => 15, # Optional, if present only Dec. 15th 2010 is shown // 'byEventDateRange' => true, # For events only, joins with a_blog_item to get the range // 'byPublishedAt' => true, # For blog posts or pages // The returned value looks like this: // array( // 'categoriesInfo' => array('slug' => 'cheese', 'name' => 'Cheese'), // 'tagNames' => array('wensleydale'), // 'pageIds' => array(10, 15, 20, 25), // 'authors' => array('jsmith', 'bdoyle') $alphaSort = isset($options['alphaSort']) && $options['alphaSort']; if (isset($options['q']) && strlen($options['q'])) { $q = $options['q']; $key = strtolower(trim($q)); $key = preg_replace('/\\s+/', ' ', $key); $replacements = sfConfig::get('app_a_search_refinements', array()); if (isset($replacements[$key])) { $q = $replacements[$key]; } if (isset($options['slugStem'])) { $q = "({$q}) AND slug:" . $options['slugStem']; } try { $values = aZendSearch::searchLuceneWithValues(Doctrine::getTable('aPage'), $q, aTools::getUserCulture()); } catch (Exception $e) { // Lucene search error. TODO: display it nicely if they are always safe things to display. For now: just don't crash $values = array(); } $now = date('YmdHis'); $pageIds = array(); foreach ($values as $value) { // Regardless of the above if it ain't published yet we can't see it. // We filter on that in the Doctrine query too but take advantage of // this chance to preempt a little work if ($value->published_at > $now) { continue; } // 1.5: the names under which we store columns in Zend Lucene have changed to // avoid conflict with also indexing them $info = unserialize($value->info_stored); if (!aPageTable::checkPrivilege('view', $info)) { continue; } $pageIds[] = $info['id']; } } $mysql = new aMysql(); if (isset($options['slugStem'])) { $params['slug_pattern'] = $options['slugStem'] . '%'; } // Select the relevant virtual pages for this engine $q = 'from a_page p '; // If alpha sort is present we need title slots if ($alphaSort) { if (!isset($options['culture'])) { $options['culture'] = aTools::getUserCulture(); } $culture = $options['culture']; $q .= "\n LEFT JOIN a_area a ON a.page_id = p.id AND a.name = 'title' AND a.culture = :culture\n LEFT JOIN a_area_version v ON v.area_id = a.id AND a.latest_version = v.version \n LEFT JOIN a_area_version_slot avs ON avs.area_version_id = v.id\n LEFT JOIN a_slot s ON s.id = avs.slot_id "; $params['culture'] = $culture; } // Merge in categories. A left join unless we are firmly restricted to a list of categories // (engine page), in which case it never makes sense to list others. Don't do that // for hasCategorySlug, which just means a filter is active (this is a fix) $hasCategoryIds = isset($options['categoryIds']) && count($options['categoryIds']); $hasCategorySlug = isset($options['categorySlug']) && strlen($options['categorySlug']); // We handle a category slug separately as a WHERE condition for the queries on // things other than categories, at the end $restrictedByCategory = $hasCategoryIds; if ($restrictedByCategory) { $cjoin = 'inner join'; } else { $cjoin = 'left join'; } $q .= $cjoin . ' a_page_to_category ptc on ptc.page_id = p.id ' . $cjoin . ' a_category c on ptc.category_id = c.id '; // The engine page is firmly locked down to these categories. If none are specified it is not // locked down by category, if we're filtering by a category at the moment we'll handle that // with a where condition at the end but still list other categories as filter choices if ($hasCategoryIds) { $q .= "and c.id in :category_ids "; $params['category_ids'] = $options['categoryIds']; } // Bring in tags... $hasTag = isset($options['tag']) && strlen($options['tag']); // Fix: don't ever do an inner join here, that prevents us from getting a full // list of tags meeting the other criteria, we use a where condition at the end // in the queries for things other than tags $q .= 'left join tagging ti on ti.taggable_id = p.id and ti.taggable_model = "aPage" left join tag t on ti.tag_id = t.id '; // Get ready to filter posts or events chronologically $year = sprintf("%04d", isset($options['year']) ? $options['year'] : 0); $month = sprintf("%02d", isset($options['month']) ? $options['month'] : 0); $day = sprintf("%02d", isset($options['day']) ? $options['day'] : 0); $startYear = $year; $endYear = $year; if ($year > 0) { if ($month == 0) { // Do not mess up the two digit strings please $startMonth = '01'; $startDay = '01'; $endMonth = '12'; $endDay = '31'; } else { $startMonth = $month; $endMonth = $month; if ($day == 0) { // Do not mess up the two digit strings please $startDay = '01'; $endDay = '31'; } else { $startDay = $day; $endDay = $day; } } } else { // For posts "today and forward" is not a relevant concept (and a separate clause // already makes sure we don't see unpublished stuff). For events we'll override // the start date below // For compatibility with the blog importer make sure we accept 0000-00-00 as a // publication date $startYear = '0000'; $startMonth = '00'; $startDay = '00'; $endYear = '9999'; $endMonth = '12'; $endDay = '31'; } $events = isset($options['byEventDateRange']) && $options['byEventDateRange']; if ($events && $startYear === '0000') { list($startYear, $startMonth, $startDay) = preg_split('/-/', date('Y-m-d')); } if ($events) { // The event's start and end dates are part of the blog item table $q .= ' inner join a_blog_item bi on bi.page_id = p.id '; $q .= "and bi.start_date <= :end_date "; $params['end_date'] = "{$endYear}-{$endMonth}-{$endDay}"; $q .= "and bi.end_date >= :start_date "; $params['start_date'] = "{$startYear}-{$startMonth}-{$startDay}"; } $hasAuthor = isset($options['author']) && strlen($options['author']); // If we're filtering events by date range then the join with the blog item has // already been added and we don't have to do it again to get author information if (!$events) { $q .= 'left join a_blog_item bi on bi.page_id = p.id '; } // Now join with sf_guard_user so we can get usernames & full names and also // limit to a specific username where desired (we do that with a where clause // at the end so we can exempt the query for authors from it easily) $q .= 'left join sf_guard_user au on bi.author_id = au.id '; // Criteria for the pages themselves (only pages for the right engine) $q .= 'where p.slug like :slug_pattern '; // We often filter posts (not events) by a range of publication dates if (isset($options['byPublishedAt']) && $options['byPublishedAt']) { // Include time portion - published_at is a full timestamp $q .= "and p.published_at <= :p_end_date "; $params['p_end_date'] = "{$endYear}-{$endMonth}-{$endDay} 23:59:59"; $q .= "and p.published_at >= :p_start_date "; $params['p_start_date'] = "{$startYear}-{$startMonth}-{$startDay} 00:00:00"; } // In no case do we show unpublished material $q .= 'and p.published_at <= NOW() and (p.archived IS NULL or p.archived IS FALSE) '; // ... But only those matching the Lucene search that already gave us specific IDs. // NOTE: if pageIds is not null and is empty, NOTHING should be returned // (someone searched for something that doesn't appear in the system) if (isset($pageIds)) { if (count($pageIds)) { $q .= 'and p.id in :pageIds '; $params['pageIds'] = $pageIds; } else { $q .= 'and 0 <> 0 '; } } if ($alphaSort) { $pagesOrderBy = 's.value asc'; } elseif ($events) { $pagesOrderBy = 'bi.start_date asc, bi.start_time asc'; } else { // Oops: blog presentation is typically descending, not ascending $pagesOrderBy = 'p.published_at desc'; } // Separate queries, but quite fast because we're not bogged down in Doctrineland $c_q = $q; $t_q = $q; $p_q = $q; $a_q = $q; // We are filtering by this specific category if ($hasCategorySlug) { // Limit tags and pages by this specific category, but don't limit // categories by it, otherwise we can't present a choice of categories // meeting the other criteria $p_q .= "and c.slug = :category_slug "; $t_q .= "and c.slug = :category_slug "; $a_q .= "and c.slug = :category_slug "; $params['category_slug'] = $options['categorySlug']; } if ($hasTag) { // Limit pages and categories by this specific tag, but don't limit // tags by it, otherwise we can't present a choice of tags // meeting the other criteria $p_q .= 'and t.name = :tag_name '; $c_q .= 'and t.name = :tag_name '; $a_q .= 'and t.name = :tag_name '; $params['tag_name'] = $options['tag']; } if ($hasAuthor) { $p_q .= 'and au.username = :username '; $c_q .= 'and au.username = :username '; $t_q .= 'and au.username = :username '; $params['username'] = $options['author']; } // In the cases where we are looking for categories or tags, be sure to // discard the null rows from the LEFT JOINs. This is simpler than // determining when to switch them to INNER JOINs // Hydrate real Doctrine objects for authors. It ensures we can stringify them consistently, // and the number of authors tends to have reasonable constraints $authorsInfo = $mysql->query('select distinct au.username, au.id, au.first_name, au.last_name ' . $a_q . ' and au.id is not null order by au.last_name asc, au.first_name asc', $params); $authors = array(); foreach ($authorsInfo as $authorInfo) { $author = new sfGuardUser(); $author->fromArray($authorInfo); $authors[] = $author; } $result = array('categoriesInfo' => $mysql->query('select distinct c.slug, c.name ' . $c_q . 'and c.slug is not null order by c.name', $params), 'tagsByName' => $mysql->query('select t.name, count(distinct p.id) as t_count ' . $t_q . 'and t.name is not null group by t.name order by t.name', $params), 'tagsByPopularity' => $mysql->query('select t.name, count(distinct p.id) as t_count ' . $t_q . 'and t.name is not null group by t.name order by t_count desc limit 10', $params), 'pageIds' => $mysql->queryScalar('select distinct p.id ' . $p_q . ' order by ' . $pagesOrderBy, $params), 'authors' => $authors); return $result; }