Добрый день
возник такой вот вопрос:
есть сайт и установленный в корневой папке друпал-7. на друпале реализовано "отображение" динамических блоков для примера возьмем блок облако тегов. Его код вызова в самом друпале
<?php if ($page['tags_content']): ?>
<div id="tags_content">
<?php print render($page['tags_content']); ?>
</div>
<?php endif; ?>
и собственно подходим к главному. я хочу создать на сайте обычную страницу html и вызвать в нее отображение динамического блока "облако тегов". вопрос: как это можно сделать?
Комментарии
Подтяни ядро друпала и потом программно выводи блок.
Твой код из page.tpl.php выводит содержимое региона tags_content,а не блока.
Попробовал вставил на страницу html (в htaccess задал выполнение кода для html cnhfybw) такой php код
<?php
//подключаем ядро
define('DRUPAL_ROOT', getcwd()."/"); //правильно укажите путь
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$block = block_load('tagclouds', 1); //номер блока
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
$_SESSION['custom']=3523;
drupal_session_commit();
?>
номер и имя блока взял из адресной строки админки admin/structure/block/manage/tagclouds/1/configure
в итоге выдает следующее
Parse error: syntax error, unexpected T_CLASS in /includes/bootstrap.inc on line 302
в этой строке написано: abstract class DrupalCacheArray implements ArrayAccess {
так страница html или php
страница html
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php
//подключаем ядро
define('DRUPAL_ROOT', getcwd()."/"); //правильно укажите путь
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
//$block = block_load('tagclouds', 1); //номер блока
//$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
//print $output;
$_SESSION['custom']=3523;
drupal_session_commit();
?>
</body>
</html>
с помощью htaccess я задал, чтобы php код выполнялся на страницах html
то есть если на этой html странице вставить код
<?php
$a=YEEEEP;
echo $a;
?>
то код выполнится.
выводи через module_invoke
echo $block['content'];
нагуглил вот такую конструкцию по module_invoke
<?php
$block = module_invoke($module_name, 'block_view', $block_delta);
echo render($block['content']);
?>
и вопрос откуда возьмутся $module_name и $block_delta? или мне вместо них вставить tagclouds и 1?
попробовал
<?php
//подключаем ядро
define('DRUPAL_ROOT', getcwd()."/"); //правильно укажите путь
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$block = module_invoke('tagclouds', 'block', 'view', 1);
echo $block['content'];
$_SESSION['custom']=3523;
drupal_session_commit();
?>
все равно выдается Parse error: syntax error, unexpected T_CLASS in /includes/bootstrap.inc on line 302
в этой строке написано: abstract class DrupalCacheArray implements ArrayAccess {
define('DRUPAL_ROOT', getcwd()."/"); //правильно укажите путь тут я правильно понимаю надо указать путь к папке в которой установлен друпал?
и еще вопрос у меня "базовые" модули в папке /modules а другие (скаченные) в том числе и tagclouds в папке /sites/all/modules этот момент как-то надо учитывать или друпал там сам разберется где нужный модуль лежит?
print(getcwd());
и посмотри - там ли у тебя корневая папка с друпалом?
выдает /home/sitename/sitename-www это корень сайта в котором и установлен друпал
попробовал заменить define('DRUPAL_ROOT', getcwd()."/"); на define('DRUPAL_ROOT', getcwd());
и при запуске снова Parse error: syntax error, unexpected T_CLASS in /includes/bootstrap.inc on line 302
для друпал 6
как правильно для семёрки здесь
может кто выложит рабочий код вывода на обычную html или php страницу какого-то стандартного блока (меню например)? а то я как-то не совсем пока въезжаю в эти переменные друпаловские
поменял на этот код. результат тот же.
<?php
//подключаем ядро
define('DRUPAL_ROOT', getcwd().'/'); //правильно укажите путь указанный тут путь это правильный на корень сайта? '/' - это вот вообще что такое?
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$block = module_invoke('tagclouds', 'block', 1); //block - это тип отображения или что-то другое?
//$block = module_invoke('tagclouds', 'block', 'view', 1);
echo $block['content'];
//может сессии выше в коде передвинуть?
$_SESSION['custom']=3523;
drupal_session_commit();
//строки ниже остались просто так
print(getcwd());
$i="YEAAAP";
echo $i;
?>
попробовал вставить просто Поиск выдает ту же ошибку Parse error: syntax error, unexpected T_CLASS in /includes/bootstrap.inc on line 302
<?php
//подключаем ядро
define('DRUPAL_ROOT', getcwd().'/'); //правильно укажите путь
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$block = module_invoke('block', 'block', 2); //admin/structure/block/manage/block/2/configure
echo $block['content'];
$_SESSION['custom']=3523;
drupal_session_commit();
?>
print render($block['content']);
вот тебе рабочий пример вывода меню "Навигация"
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$block1 = module_invoke('system', 'block_view', 'navigation');
print render($block1['content']);
drupal_session_commit();
описание аргументов функции module_invoke
@arg 1 : module name
@arg 2 : hook name like block_view, block_info
@arg 3 : id or delta of the block e.g 30, map-block_1
второй аргумент должен быть в данном случае block_view
так понемногу проясняется. значит если твой рабочий код вставить в html то выходит та же ошибка Parse error: syntax error, unexpected T_CLASS in /includes/bootstrap.inc on line 302
а если твой код сохранить как страницу php то меню выводится
как добавлял возможность выполнение кода в html файле?
добавил строчку
AddHandler application/x-httpd-php .php .html .htm
в .htaccess ?
у меня в html нормально всё выводится без ошибок
твоя ошибка может возникать из-за старой версии php
если тестируешь на хостинге- обратись к хостеру
и в файле .htacess больше ничего не меняли?
с htaccess тут еще тоже интересности. я прописал вот такие две строки
# Выполнение PHP кода на страницах html
AddHandler application/x-httpd-php .php .html .htm
AddType x-httpd-php .html .htm
но если они обе включены, то при набирании site.ru/*.php вместо выполнения скрипта начинается его скачивание (открывается окно для сохранения файла)
если закомментировать AddHandler application/x-httpd-php .php .html .htm тогда страницы php работают а на страницах html наш код не выполняется - выдается та самая ошибка. а простые скрипты типа $i= print $i работают
по phpinfo: PHP Version 5.3.21
кстати в php.ini ничего добавить поменять не надо?
всё работает со строкой
AddHandler application/x-httpd-php .php .html .htm
в моем случае не работает. если эту строку включить - начинается скачивание страницы, как я и писал.
значит дело в хостере? он же мог "запретить" выполнять php код на html страницах? хотя вот с этим AddType x-httpd-php .html .htm же простейшие коды работают
попробовал на другом хостинге. скрипты те же, в htaccess прописал AddHandler application/x-httpd-php .php .html .htm - все работает и в php файле и в html файле.
вы уверены , что на этом хостинге такая версия php установлена?
Просто ошибка Parse error: syntax error, unexpected T_CLASS возникает, если у вас устаревшая вервия PHP в которой нет поддержки абстрактных классов. Решением будет - обновить версию php.
проблема однозначно в хостинге - от такого хостера стоит отказаться
уверен.
а сейчас еще больше будет запутанности )
значит там, где AddHandler application/x-httpd-php .php .html .htm начинает глючить, там php PHP Version 5.3.21 а там где все работает нормально (мастерхост) PHP Version 5.3.18
а в phpinfo() отображается поддерживаются ли абстрактные классы?
а зачем - если ошибка выдаётся ,то и так понятно
ну в смысле этой поддержки вообще в этой версии нет (что маловероятно как мне кажется) либо эту поддержку отключили.
ещё запустите site.ru/admin/reports/status/php и проверьте там версию php
и поскольку я в друпаловской терминологии еще не силен, то вопрос с которого все началось
<?php if ($page['tags_content']): ?>
<?php endif; ?>
что надо делать, чтобы выполнялся этот друпаловский код (как я понял надо вывести регион в котором может быть несколько блоков на стороннюю страницу) на сторонней html странице? )
информация по версиям такая же: 5.3.21 (не работает) и 5.3.18 (работает)
на сегодня все ) завтра, я надеюсь, продолжим ) спасибо за помощь )
вся проблема , что $page доступен только в page.tpl.php
так что в html коде такое не прокатит
тут надо использовать block_get_blocks_by_region
примерно так
print render($html_region);
вроде работает. благодарствую )
заодно разобрались с хостерами: в итоге помогла конструкция AddHandler x-httpd-php5 .php .php3 .php4 .php5 .html .htm
и теперь, наверное самый сложный вопрос.
Для чего нам это было надо. имеется старинный форум YaBB (написанный на Perl плюс текстовые файлы как хранилище информации). Сейчас форум уходит в архив и в качестве темплейта к нему идет html страница в которую я собирался внедрить наши друпаловские регионы. Но фишка в том, что этот шаблон как бы обрабатывается ядром YaBB и он php-вставки не понимает.
Собственно мои мысли по этому поводу: как-то "подключить" интерпретатор php к ядру YaBB.
попытки решить вопрос с помощью htaccess пока ни к чему не привели.
если у кого есть идеи советы, то буду очень рад )
а время участия
3 года 47 недель
и вы у меня спрашиваете?
Это для примера было,не нужно вам это в сессию пихать.
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php
//подключаем ядро
define('DRUPAL_ROOT', getcwd()."/"); //правильно укажите путь
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
Нельзя же так, ядро подтягивай до html разметки.
//подключаем ядро
define('DRUPAL_ROOT', getcwd()."/"); //правильно укажите путь
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
Ядро то вообще получилось подтянуть? Создай в корне копию файла index.php - там 100% ядро подтягивается правильно;) И в него уже пиши свой код.
регистрировался давно ) когда хотел друпалить. потом бросил это дело, практически не начав, а вот сейчас снова надо )
там выше описаны наши действия. вобщем в итоге на одном хостинге не получается (подтягивание ядра друпала стоит после html разметки). на странице php все работает, а на html странице - нет.
а на другом хостинге все то же самое (и подтягивание также после html разметки), но все работает и в html и в php странице. сейчас с хостерами переписываемся по этому поводу.
зы. попробую еще на "нерабочем" хостинге подтянуть ядро до html. может быть в этом причина?
можно
кстати да. практика частично показала, что так можно )
Так то можно,но если в ядре будут слаться хедеры,то при определенной настройке сервера будут сыпаться ошибки,или вообще ничего работать не будет. По правилам хорошего тона - вначале функционал, а потом уже верстка.
учтем )
и еще вопрос
<?php
define('DRUPAL_ROOT', getcwd()."/"); //правильно укажите путь
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
drupal_session_commit();
?>
define('DRUPAL_ROOT', getcwd()."/"); //правильно укажите путь
эта / она указывает на корень сайта?
сейчас поместил страницу в папку второго уровня site.ru/test и скрипт не срабатывает, пишет
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in /home/site/site-www/test/test.html on line 39 это у нас define('DRUPAL_ROOT', getcwd()"/");
define('DRUPAL_ROOT', getcwd()."/test/"); //правильно укажите путь
не работает однако
выдается таже ошибка
Fatal error: Call to undefined function drupal_bootstrap() in /home/site/site-www/test/blockout.php on line 41
это у нас строка - drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
я думал, что define('DRUPAL_ROOT', getcwd()."/test/"); надо указывать путь к папке в которой установлен друпал
насчет перегона контента это как бы мысль, но вот руководство хочет так. то есть мы старый форум помещаем типа в архив. а уже новый форум будет на движке друпала.
Может имеет смысл перегнать контент этого форума в друпальский контент и всё будет ок?
господа, что делать то с путями? не выходит каменный цветок и сторонний скрипт, положенный не в корень (где друпал) работать отказывается с причиной Fatal error: Call to undefined function drupal_bootstrap()
и вопрос для расширения кругозора так сказать:
define - определяет именованную константу.
<?php
define ("CONSTANT", "Hello world.");
echo CONSTANT; // выводит "Hello world."
?>
вопрос: а зачем нам тогда define в нашей конструкции вызова? если он получается просто заменит в следующей строке DRUPAL_ROOT на имя текущего каталога? почему нельзя сразу require_once '/includes/bootstrap.inc'; ?
<?php
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
?>
А вот не надо было его туда засовывать...
Потому что константа DRUPAL_ROOT наверняка используется где-то ещё.
Так че не получается то,ё-моё?
echo DRUPAL_ROOT . '/includes/bootstrap.inc'; - что выводит?
выводит непотребную ересь )
ща полную картину дам:
это сам скрипт
<?php
// www/test
// drupal установлен в папке www
// этот скрипт находится в папке www/test/
define('DRUPAL_ROOT', getcwd()."/"); //правильно укажите путь
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
echo DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$block1 = module_invoke('system', 'block_view', 'navigation');
print render($block1['content']);
$block2 = module_invoke('block', 'block_view', '2');
print render($block2['content']);
$block3 = module_invoke('system', 'block_view', 'user-menu');
print render($block3['content']);
$html_region = block_get_blocks_by_region('main_menu_box'); //$region - имя выводимиго региона (у вас это 'tags_content' )
print render($html_region);
drupal_session_commit();
?>
после запуска получаем вот это
/home/site/site-www/test//includes/bootstrap.inc
Fatal error: Call to undefined function drupal_bootstrap() in /home/site/site-www/test/blockout2.php on line 8
и как бы вроде понятно почему ересь. раз у нас define('DRUPAL_ROOT', getcwd() то в getcwd попадает наша подпапка test? которую он потом подставляет дальше и естественно никаких includes/bootstrap.inc в папке test нет.
я попробовал по другому:
<?php
// www/test
// drupal установлен в папке www
// этот скрипт находится в папке www/test/
define('DRUPAL_ROOT', "/"); //правильно укажите путь
include_once DRUPAL_ROOT . 'includes/bootstrap.inc';
echo DRUPAL_ROOT . 'includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$block1 = module_invoke('system', 'block_view', 'navigation');
print render($block1['content']);
$block2 = module_invoke('block', 'block_view', '2');
print render($block2['content']);
$block3 = module_invoke('system', 'block_view', 'user-menu');
print render($block3['content']);
$html_region = block_get_blocks_by_region('main_menu_box'); //$region - имя выводимиго региона (у вас это 'tags_content' )
print render($html_region);
drupal_session_commit();
?>
в итоге получаем следующее:
/includes/bootstrap.inc
Fatal error: Call to undefined function drupal_bootstrap() in /home/site/site-www/test/blockout3.php on line 8
и вот тут я перестаю соображать от слова "совсем" потому что если мой скрипт лежит в корне (www)
<?php
define('DRUPAL_ROOT', getcwd()."/"); //правильно укажите путь
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
echo DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);?>
то при выполнении я получаю результат
/home/site/site-www//includes/bootstrap.inc
и вывод нужных регионов.
лишний слэш не является проблемой?
отчасти ) потому что если вызвать скрипт из корневой папки то будет те же два слеша но скрипт работает ) сейчас попробую полный путь вписать без одного слеша.
как говорил Ленин - один хген.
<?php
// www/test
// drupal установлен в папке www
// этот скрипт находится в папке www/test/
define('DRUPAL_ROOT', "home/site/site-www/"); //правильно укажите путь
include_once DRUPAL_ROOT . 'includes/bootstrap.inc';
echo DRUPAL_ROOT . 'includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$block1 = module_invoke('system', 'block_view', 'navigation');
print render($block1['content']);
$block2 = module_invoke('block', 'block_view', '2');
print render($block2['content']);
$block3 = module_invoke('system', 'block_view', 'user-menu');
print render($block3['content']);
$html_region = block_get_blocks_by_region('main_menu_box');
print render($html_region);
drupal_session_commit();
?>
после запуска получаем
home/site/site-www/includes/bootstrap.inc (это правильный путь к бутстрапу)
Fatal error: Call to undefined function drupal_bootstrap() in /home/site/site-www/test/blockout3.php on line 8
8 линия это у нас drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
попробовал заменить путь чтоб не от корня а от папки
<?php
// www/test
// drupal установлен в папке www
// этот скрипт находится в папке www/test/
define('DRUPAL_ROOT', "../"); //правильно укажите путь
include_once DRUPAL_ROOT . 'includes/bootstrap.inc';
echo DRUPAL_ROOT . 'includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$block1 = module_invoke('system', 'block_view', 'navigation');
print render($block1['content']);
$block2 = module_invoke('block', 'block_view', '2');
print render($block2['content']);
$block3 = module_invoke('system', 'block_view', 'user-menu');
print render($block3['content']);
$html_region = block_get_blocks_by_region('main_menu_box');
print render($html_region);
drupal_session_commit();
?>
получается вот такая фиговина:
../includes/bootstrap.inc
Fatal error: require() [function.require]: Failed opening required 'sites/all/modules/og/og.field.inc' (include_path='/usr/local/php5/lib/php') in /home/site/site-www/sites/all/modules/og/og.module on line 9
Напиши include_once '../includes/bootstrap.inc';
тоже не вариант ) начинаются ошибки связанные с тем, что друпал_рут не определен )
Notice: Use of undefined constant DRUPAL_ROOT - assumed 'DRUPAL_ROOT' in /home/site/site-www/includes/bootstrap.inc on line 2237
Warning: require_once(DRUPAL_ROOT/includes/errors.inc) [function.require-once]: failed to open stream: No such file or directory in /home/site/site-www/includes/bootstrap.inc on line 2237
Fatal error: require_once() [function.require]: Failed opening required 'DRUPAL_ROOT/includes/errors.inc' (include_path='/usr/local/php5/lib/php') in /home/site/site-www/includes/bootstrap.inc on line 2237