РЕШЕННЫЙ ОТВЕТ НА КОДЕКС НА НОМЕРЕ
Я, наконец, получил эту работу, но, честно говоря, я думаю, что я делаю это совершенно неправильно.
Что я хочу:
Я хочу получить чек на моем сайте, если пользователь зашел на сайт через Facebook. Это необходимо сделать на каждой странице, чтобы определенные части сайта нуждались в доступе только в том случае, если вы вошли в систему. Также я хотел бы поместить данные Facebook в мою базу данных.
Что я получил:
На данный момент я могу проверить каждую страницу, если пользователь зарегистрировался через Facebook на моем сайте. Я получил эту работу, изменив функцию init()
в SiteController.php
.
Теперь эта функция выглядит так:
public function init() {
global $facebookID;//Create global Facebook ID
global $loginURL; //Create global URL for login
$currentURL = 'http://dev03.***.nl/app/facebook-popup.php';//facebook popup url
//Get Facebook ID if FacebookID isn't there the result is 0
$facebookID = Yii::app()->facebook->getUser();
if(!$facebookID){
//If there isn't an Facebook ID
$loginURL = Yii::app()->facebook->getLoginUrl(array(
'scope' => 'read_insights, publish_actions, manage_pages',
'display' => 'popup',
'next' => $currentURL . '?loginsucc=1',
'cancel_url' => $currentURL . '?cancel=1'
));
}
}
Проблема:
Самая большая проблема заключается в том, что время загрузки моего сайта расширилось, но я не знаю, как заставить это работать другим способом. Я предполагаю, что смог бы провести этот тест в удобное время загрузки.
Мой вопрос:
Как я смогу уменьшить время загрузки и запрограммировать это правильно. Могу ли я сделать это как функцию, так что если я переключусь на определенные страницы, будет проверяться, зарегистрирован ли пользователь через Facebook и отображает определенные страницы на результат.
Мой второй вопрос:
В настоящий момент я просматриваю свои представления/макеты/main.php, если глобальный facebookID пуст или не показывать изображение профиля Facebook или кнопку входа в систему следующим образом:
<?php if ($GLOBALS['facebookID']) { ?>
<?php } else{ ?>
<div id="login_facebook">
login met Facebook
</div><!-- #login_facebook -->
<?php } ?>
Если у меня есть функция, которая проверяет это для меня, я думаю, что время загрузки также уменьшилось бы, или это единственный способ поставить выражения if в макетах?
Я знаю, что это большой вопрос, но я новичок в Yii, и я надеюсь, что некоторые из вас, ребята, потратят время, чтобы помочь мне в этом.
<Сильный> РЕШЕНИЕ
С большой благодарностью @DarkMukke я смог решить этот вопрос. Я изменил некоторые вещи и, возможно, сделал некоторые вещи, которые не являются идеальным способом. Но теперь это отлично работает.
Для начала я изменил свое мнение об аутентификации пользователей, и я удалил глобальные переменные. В настоящий момент единственная первая проверка, которую выполняет webapp, - это если у нас есть facebookID и пользователь. Это делается для предотвращения доступа, когда пользователь удаляет права в Facebook, но все еще входит в приложение и получает статус пользователя. Это делается с помощью следующего кода:
защищенные/компоненты/Controller.php
public function init() {
$facebookID = Yii::app()->facebook->getUser();
if(!$facebookID && Yii::app()->user->getState('role') == 'user'){
Yii::app()->user->setState('role', 'guest');
}
}
Таким образом, в $ facebookID
мы сохраняем facebookID пользователя, если пользователь отозвал acces, тогда $ facebookID
пуст. Поэтому мы проверяем, получил ли пользователь роль 'user'
, и если идентификатор Facebook пуст. Если это так, пользователям необходимо получить роль 'guest'
.
Затем вопрос входа в систему, вместо того, чтобы использовать главный контроллер для этого, я решил создать новый контроллер. Я поместил это в protected/controllers/FacebookController.php, и он выглядит так:
class FacebookController extends Controller {
public function actionLogin() {
$facebookID = Yii::app()->facebook->getUser();
$accessToken = Yii::app()->facebook->getAccessToken();
$loginUrl = Yii::app()->facebook->getLoginUrl(array('scope' => 'read_insights, publish_actions, manage_pages, email', 'display' => 'popup', 'redirect_uri' => 'http://dev03.****.nl/app/facebook-popup.php'));
if($facebookID == 0) {
echo '<script>
window.location="'.$loginUrl.'"
</script>';
} else {
$record = Users::model()->findByAttributes(array('FB_id'=>$facebookID));
if($record===null) {
$userInfo = Yii::app()->facebook->api('/me');
$user = new Users;
$user->firstname = $userInfo['first_name'];
$user->surname = $userInfo['last_name'];
$user->city = $userInfo['location']['name'];
$user->email = $userInfo['email'];
$user->FB_id = $userInfo['id'];
$user->save();
}
Yii::app()->user->setState('role', 'user');
Yii::app()->user->setState('FBid', $facebookID);
echo "<script>
window.close();
window.opener.location.reload();
</script>";
}
}
}
Обратите внимание: я вызываю эту функцию во всплывающем окне через Javascript
Итак, что это такое:
Сначала получите идентификатор Facebook, получите токен доступа и логин входа.
Затем мы проверяем, есть ли у нас идентификатор Facebook, если вы не измените местоположение всплывающего окна на адрес входа в Facebook. Это открывает диалоговое окно для получения доступа и разрешений, описанных в 'scope'
в функции getLoginUrl()
.
Если у нас есть разрешения, он проверяет, получил ли мы пользователя в базе данных. если не $ record
- null
. Затем мы получаем информацию о пользователе с помощью api ('/ me')
и размещаем его в базе данных. Если это будет сделано, мы продолжим.
Затем мы устанавливаем роль пользователя для пользователя и добавляем состояние FBid с идентификатором Facebook, чтобы использовать его позже в приложении.
Когда все это будет сделано, мы закроем окно. И пользователь вошел в систему.