Composer в Drupal 8. Вывод последних твитов из Twitter.
Для установки модулей и библиотек лучше всего использовать composer. Composer - это менеджер библиотек, он позволяет управлять зависимостями одних библиотек, модулей, от других библиотек, модулей. Если у модуля есть зависимость от библиотеки, то composer автоматически скачать эту библиотеку при установке модулей. С одной стороны composer усложняет установку модулей, но с другой нам становится проще в плане установки библиотек, потому что теперь они будут скачивать и подключаться сами.
Для того чтобы скачать и установать composer перейдите на официальный сайт:
https://getcomposer.org/download/
Кстати, Drush теперь тоже ставится через Composer, если вы устанавливали Drush, то composer у вас уже есть. Проверить что у вас установлен composer можно коммандой:
composer --version
В результате должна появиться версия composer:
Теперь заходим в папку нашего сайта через консоль и можем работать с Composer.
Вывод последних твитов Twitter в Drupal 8
Для начала вы должны создать application в Twitter и получить пару токенов, которые будут использоваться дальше. Вы можете создать application здесь:
Версия 1.0 скоро перестанет работать и неавторизованные запросы будут отклоняться. Так что используйте версию 1.1 или более позднюю версию Twitter API.
1. Создание аккаунта разработчика. Настройте свой аккаунт разработчика на Twitter.
Заполняем форму регистрации. Это бесплатно и это необходимый шаг, чтобы выполняться запросы к API Twitter версии 1.1. Заходите теперь на страницу My Apps https://apps.twitter.com/ и нажимайте Create New App:
2. Создание Twitter application. Заполняйте форму создания application с указанием домена вашего сайта.
Если вас перенаправлило на страницу application, значит application создался. Теперь нам потребуются следующие данные:
- Consumer key
- Consumer secret
- Access token
- Access token secret
В документации Twitter API есть описание для чего нужен токен и как его использовать https://dev.twitter.com/oauth/overview/single-user..
3. Создание Access token. OAuth требует несколько токенов. Так что вам нужно их сгенерировать.
Это создаст Access Token, Access Token Secret, которые мы будем дальше использовать.
Теперь мы можем получать наши твиты через Twitter API. Мы можем использовать напрямую Twitter API и через drupal_http_request получать ответы от серверов Twitter. Но лучше и проще использовать библиотеку для работы с Twitter. Если Twitter API измениться, то нам не нужно будет разбираться в тонкостях нового v1.2 API, мы просто обновим библиотеку, а поддержку совместимости оставим разработчикам библиотеки.
В данной статье мы будем использовать эту библиотеку
https://packagist.org/packages/j7mbo/twitter-api-php
Для того чтобы установить эту библиотеку в Drupal, нам нужно только написать в composer команду:
composer require j7mbo/twitter-api-php
Composer сам найдет библиотеку и установит ее зависимости, если они есть. И мы сразу сможем использовать эту библиотеку у себя в коде.
Ниже код модуля для вывода последнего твита в блоке. Настройки ключей и токенов, я вынес в отдельную конфигурационную форму:
/admin/structure/twitter-block/settings
Код модуля можно скачать в прикрепленных файлах статьи или с Github репозитория учебного сайта по верстке Drupal 8 темы на основе Bootstrap:
https://github.com/Drupalbook/bootstrap
Файлы модуля:
/modules/twitter_block/twitter_block.info.yml - Основной файл модуля
name: Twitter Block description: Display Last tweets. type: module core: 8.x package: Custom
/modules/twitter_block/src/Plugin/Block/TwitterBlock.php - Плагин блока
<?php namespace Drupal\twitter_block\Plugin\Block; use Drupal\Core\Block\BlockBase; /** * Provides a Last tweet block. * * @Block( * id = "twitter_block", * admin_label = @Translation("Twitter block"), * ) */ class TwitterBlock extends BlockBase { /** * {@inheritdoc} */ public function build() { $content = ''; $config = \Drupal::config('twitter_block.settings'); $settings = array( 'consumer_key' => $config->get('consumer_key'), 'consumer_secret' => $config->get('consumer_secret'), 'oauth_access_token' => $config->get('access_token'), 'oauth_access_token_secret' => $config->get('access_token_secret'), ); // Set here the Twitter account from where getting latest tweets $screen_name = 'netglooweb'; // Get timeline using TwitterAPIExchange $url = 'https://api.twitter.com/1.1/statuses/user_timeline.json'; $getfield = "?count=1"; $requestMethod = 'GET'; $twitter = new \TwitterAPIExchange($settings); $user_timeline = $twitter ->setGetfield($getfield) ->buildOauth($url, $requestMethod) ->performRequest(); $messages = json_decode($user_timeline); if (!empty($messages)) { foreach ($messages as $message) { $content .= '<div class="twitter-message">' . $message->text . '</div>'; } } return array( '#markup' => $content, ); } }
/modules/twitter_block/src/Form/TwitterBlockSettingsForm.php - Конфигурационная форма
<?php namespace Drupal\twitter_block\Form; use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Form\FormStateInterface; /** * Configure example settings for this site. */ class TwitterBlockSettingsForm extends ConfigFormBase { /** * {@inheritdoc} */ public function getFormId() { return 'twitter_block_admin_settings'; } /** * {@inheritdoc} */ protected function getEditableConfigNames() { return [ 'twitter_block.settings', ]; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { $config = $this->config('twitter_block.settings'); $form['consumer_key'] = array( '#type' => 'textfield', '#title' => $this->t('Consumer key'), '#default_value' => $config->get('consumer_key'), ); $form['consumer_secret'] = array( '#type' => 'textfield', '#title' => $this->t('Consumer secret'), '#default_value' => $config->get('consumer_secret'), ); $form['access_token'] = array( '#type' => 'textfield', '#title' => $this->t('Access token'), '#default_value' => $config->get('access_token'), ); $form['access_token_secret'] = array( '#type' => 'textfield', '#title' => $this->t('Access token secret'), '#default_value' => $config->get('access_token_secret'), ); return parent::buildForm($form, $form_state); } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $this->config('twitter_block.settings') ->set('consumer_key', $form_state->getValue('consumer_key')) ->set('consumer_secret', $form_state->getValue('consumer_secret')) ->set('access_token', $form_state->getValue('access_token')) ->set('access_token_secret', $form_state->getValue('access_token_secret')) ->save(); parent::submitForm($form, $form_state); } }
/modules/twitter_block/twitter_block.routing.yml - создаем путь для нашей страницы конфигурационной формы.
twitter_block.settings: path: '/admin/structure/twitter-block/settings' defaults: _form: '\Drupal\twitter_block\Form\TwitterBlockSettingsForm' _title: 'Twitter API Settings' requirements: _permission: 'administer site configuration'
/modules/twitter_block/composer.json - файл в котором мы прописываем зависимость нашего модуля от библиотеки j7mbo/twitter-api-php
{ "name": "drupal/twitter_block", "type": "drupal-module", "description": "Displays Last tweets.", "homepage": "https://drupalbook.org/ru/drupal/composer-v-drupal-8-vyvod-poslednih-tvitov-iz-twitter", "license": "GPL-2.0+", "require": { "j7mbo/twitter-api-php": "dev-master" }, "minimum-stability": "dev" }
Код модуля на Github: