Yii проверить, зарегистрировались ли в Facebook на каждой странице

РЕШЕННЫЙ ОТВЕТ НА КОДЕКС НА НОМЕРЕ

Я, наконец, получил эту работу, но, честно говоря, я думаю, что я делаю это совершенно неправильно.

Что я хочу:

Я хочу получить чек на моем сайте, если пользователь зашел на сайт через 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">
        Facebook logo
        

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, чтобы использовать его позже в приложении.

Когда все это будет сделано, мы закроем окно. И пользователь вошел в систему.

0
nl ja de

1 ответы

Очевидно, у вас есть идеи о том, что вы делаете. поэтому позвольте мне указать несколько советов.

Прежде всего, если вы переопределяете init в своем SiteController, вам придется делать это в каждом новом контроллере, поэтому лучше перезаписать init() в Controller, классе/защищенном/компоненте, который каждый контроллер расширяет с default, таким образом это действительно будет на КАЖДОЙ странице.

Second note, globals are a bad idea. They might seem usefull, but they are a pain to debug. In my opinion, globals should be removed from the next version of PHP. So the correct way here would be to use CWebuser->setState(), this way you can just check if the user is logged in or not. This gives you another usefull advantage. On first FB login you create a user with his data in your own users table, and for the UserIdentity you just use the FB check, and load the record where the FBid == your record with that FBid set.

Короче говоря,

  • when people authorize, create a record for them in your users table
  • use the native user check, to check if logged in with the native cookie
  • if not logged in compare FacebookId against your own records
  • if no records, try to authorize them with Facebook popup
  • to have the Facebook data everywhere, use CWebuser->setState(), in your UserIdentity, dont use globals
1
добавлено
Вы много помогли, я отправил окончательный код в свой основной пост.
добавлено автор Augus, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

Yii Framework
Yii Framework
1 076 участник(ов)

Russian and english speaker comunity

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp

Yii - вакансии, работа, фриланс
Yii - вакансии, работа, фриланс
264 участник(ов)

Пишите тут свои вакансии, заказы. Просим сразу озвучивать зарплату или бюджет за проект.