2016-06-05 2 views
5

Я создал собственный модуль Drupal 8, который работает как с пользовательской формой блока и блока, чтобы собрать некоторую информацию.Drupal 8 custom module add php classes

Это все хорошо.

У меня также есть шаблон ветки, который я хочу сделать твиттер-канал, используя класс php feed, который я купил. Я просто не знаю, как он интегрирует это в модуль.

Это установка для класса: http://austinbrunkhorst.com/demos/twitter-class/#setup

Он содержит два файла:

ultimate.twitter.feed.php

и

tmhOAuth.php

который в настоящее время в главе require_once 'tmhOAuth.php';ultimate.twitter.feed.php

Согласно инструкции я должен создать файл PHP, который имеет это:

$options = array(
    'screen_name' => 'FeedTestUser', 
    'consumer_key' => '...', 
    'consumer_secret' => '...', 
    'user_token' => '...', 
    'user_secret' => '...', 
); 

$twitter = new Twitter($options); 

$twitter->PrintFeed(); 

Что я предполагаю, что также является препятствием, как прут файлы не PHP

Любой помощь с этим очень ценится.

C

+1

А что именно этот вопрос? Как сделать вывод «$ twitter-> PrintFeed();»? –

+1

Как добавить класс в мой модуль (как я не могу использовать php include), и как я могу сделать вывод с помощью 'twitter-> PrintFeed()' – Cybercampbell

ответ

2

Я хотел бы настроить класс как сервис в модуле. Затем ваш блок реализует эту службу и выполняет обработку. Вы действительно не хотите использовать require_once(), если вы можете избежать этого, скорее используйте конструкторы Drupal (частично, чтобы, если вы реорганизовываете вещи позже, Drupal поможет найти файлы в новом местоположении).

Поместите класс в каталог src вашего модуля и добавьте пространство имен в начало файла (если его там уже нет). Затем в файле класса вашего блока вы можете добавить оператор использования, который ссылается на это пространство имен (даже лучше было бы использовать инъекцию зависимостей, но подробности об этом могут быть на вашем пути здесь).

В методе build() класса блоков вы создаете экземпляр класса, как описано в вашем вопросе, но вместо того, чтобы просто позволить модулю печатать HTML, вы можете захотеть захватить этот HTML-код и поместить его в свой блок в качестве разметки. Если класс позволяет сделать это без использования буфера, вы должны (но я не видел ничего в документах для его поддержки), а затем попытаюсь разделить структурированные данные. Если нет, то вы можете использовать PHP's output buffering, чтобы захватить его попытку печати:

ob_start(); 
$twitter->PrintFeed(); 
$content= ob_get_contents(); 
ob_end_clean(); 

Затем поместите генерируемый разметки в визуализации массива:

return [ 
    'my_twitter_block' => [ 
    '#markup' => $content, 
    ], 
]; 
+1

Спасибо @acrosman - Не решил проблему, но привел меня в правильном направлении. – Cybercampbell

+1

Рад, что он достал вас туда, куда вам нужно было идти. – acrosman

1

Создайте пользовательский блок и добавить результат PrintFeed() для визуализации массива. Как и любой обычный пользовательский блок. В массиве рендеринга вы можете указать шаблон, который должен использоваться (при необходимости). Если вы хотите вывести чистый html без какого-либо шаблона, вы можете использовать ключ «#markup».

Небольшой пример:

Ваш блок визуализации массива:

return array(
    '#theme' => 'name_of_your_theme', 
    '#some_twig_variable' => $twitter->PrintFeed(); 
); 

ваш your_module.module файл (в корневой папке модуля):

function your_module_theme() { 
    return array(
    'name_of_your_theme' => array(
     'variables' => array(
     'some_twig_variable' => some-default-value, 
    ), 
    ), 
); 
} 

Ваше имя -of-your-theme.html.twig шаблон (должен быть под вашим шаблоном/шаблонами):

{{ some_twig_variable }} 

Что касается использования класса: я не вижу проблемы с использованием require_once (в вашем блочном файле php). Конечно, всегда лучше/лучше, если вы можете потребовать библиотеку/пакет через файл make или композитор, а затем использовать автозагрузчик, но если это невозможно, просто введите его, например. в вашем корневом каталоге drupal под/libraries/twitter или так, а затем потребовать его. Если вы это сделаете, вы должны проверить эту библиотеку в своем репозитории git.

+0

Теперь давайте это сделаем. – Cybercampbell

+0

Спасибо @Frank Я сделал все, как вы описали, но я получаю эту ошибку: 'Ошибка: класс 'Drupal \ my_module \ Plugin \ Block \ Twitter' не найден в Drupal \ my_module \ Plugin \ Block \ TwitterBlock-> build() (строка 64 из /Users/username/Sites/devdesktop/devsite/modules/custom/my_module/src/Plugin/Block/TwitterBlock.php). Ошибка запускается этой строкой '$ twitter = new Twitter ($ options);' Любые, хотя? – Cybercampbell

0

вы используете ultimate.twitter.feed.php в своем блоге TwitterBlock.Файл

Если же не пытаться добавлять эту строку перед блоком-класса beginns PHP:

require_once 'path/to/twitter_class/ultimate.twitter.feed.php'; 
+0

Спасибо @Monal - я пробовал обе эти вещи, но ошибка такая же. Кажется, что требование работает нормально, но сайт переходит в автономный режим, и ошибка в комментарии выше отображается в журналах. Любые идеи, что я делаю неправильно? – Cybercampbell