Вы здесь

Как можно сделать отдельную страницу полностью на HTML и вставлять туда блоки из Drupal-а?

0

Добрый день, задача такая, что допустим обычный друпал, чистый новый, нужно создать отдельную страницу допустим www.mysitedrupal.ru/page01 которая из себя представляла HTML страницу полностью, как например такую http://pixfort.com/landing/flatpack/17_creative/17_creative.html
Т.е. это тупо HTML, со своими CSS и JS, нужно поместить её в Drupal и вместо тех мест где на HTML DIV-ы с текстом - вставить БЛОКИ Drupal-а.

Каким будет dru-way?

Версия Drupal: 
7.x
Категория: 
Theming
Вопрос задан 12.12.2015 - 16:13

страницы надо создавать из админки или в файловой системе?

Комментарий оставлен 12.12.2015 - 17:29

Файловой системы, т.е. в идеале - программа минимум, я куда нибудь в папке сайта кидаю папку page01 с HTML и всеми JS,CSS и изображениями идущими с ними
В друпале как то делаю связку что допустим mydrupalsite.ru/page01 - это index.html из папки page01, хотя можно даже тупо без связки, так и открывать mydrupalsite.ru/page01/index.html (не симпатично конечно, но сойдёт)

и когда открываю этот путь, открывается так, как будто я просто локально на диске открыл эту HTML, но код который в HTML, а именно эти места блоков выполняют некий PHP код который тянет содержимое из базы Drupal-a

Этакий Drupal сайт получается с набором этаких лендингов да промо страниц - контент которыx тянется из базы, и разрешение на редактирования блоков основано на Drupal permission

Комментарий оставлен 12.12.2015 - 17:59

а ещё лучше когда ссылка будет такая =)
page01.mydrupalsite.ru

Комментарий оставлен 12.12.2015 - 18:05

Ответы

3
function modulename_menu() {
  return array(
    'static/%' => array(
      'page callback' => 'modulename_static',
      'page arguments' => array(1),
      'access callback' => TRUE,
    ),
  );
}

function modulename_static($filename) {
  $content = file_get_contents('static-files/' . $filename);
  $content = preg_replace_callback('/\[block:(.*?):(.*?)\]/', function ($matches) {
    $block = module_invoke($matches[1], 'block_view', $matches[2]);
    return $block['content'];
  }, $content);
  echo $content;
}

файлы ложить в static-files, блоки прописывать в формате -

[block:имя_модуля:название_блока]
Ответ дан 12.12.2015 - 18:41
Аватар пользователя xandeadx
xandeadx
1542

Спасибо, ваш код - это его как модуль делать?
** [block:имямодуля:названиеблока]** - это как токен получается?

не совсем до конца понимаю, как этим воспользоваться, расскажите пожалуйста чуть подробнее

Комментарий оставлен 12.12.2015 - 19:00

Делать как модуль. Создать подпапку static-files. В подпапке создать html файлы с токенами.

Комментарий оставлен 12.12.2015 - 19:14

где должна лежать папка static-files, здесь? - sites/default/static-files/index.html
и какой путь будет в Drupal-е до этой страницы, такой? - mydrupalsite.ru/static/static-files/index.html

Комментарий оставлен 12.12.2015 - 19:29

в папке модуля.
путь будет static/index.html

Комментарий оставлен 12.12.2015 - 20:06

А можно ли выводить не блоки, а регионы с блоками? Чтобы в админке накидать в нужный регион блоков, а потом вывести сразу всё (одним токеном)?

Комментарий оставлен 13.12.2015 - 14:13

у меня тоже заморочки были с примером, у xandeadx спрашивал в итоге всё получилось
убрал только

 $content = preg_replace_callback('/\[block:(.*?):(.*?)\]/', function ($matches) {
    $block = module_invoke($matches[1], 'block_view', $matches[2]);
    return $block['content'];
  }, $content);

видать что то не так в коде, не стал вникать, т.к. не критично пока.

Но однако когда открываю страницу HTML, она грузится, но без CSS,JS, и т.п. - т.е. получается чисто текст оформленный тегами типа ,

<

h1> ...

в журнале пишет что нет доступа к папка в которых все эти css,js лежат, почему то Drupal туда не пускает.
не понятно для меня почему

Комментарий оставлен 13.12.2015 - 15:28

сделай так

 $content = file_get_contents('sites/all/modules/static_landing/static-files/' . $filename);
Комментарий оставлен 13.12.2015 - 15:31

Чего-то я не догоняю.. сделал как в примере, создал модуль static_landing.module:

<?php

function static_landing_menu() {
  return array(
    'static/%' => array(
      'page callback' => 'static_landing_getpages',
      'page arguments' => array(1),
      'access callback' => TRUE,
    ),
  );
}

function static_landing_getpages($filename) {
  $content = file_get_contents('static-files/' . $filename);

  $content = preg_replace_callback('/\[block:(.*?):(.*?)\]/', function ($matches) {
    $block = module_invoke($matches[1], 'block_view', $matches[2]);
    return $block['content'];
  }, $content);

  echo $content;
}

Закинул в подпапку static-files файл page.html:

<!DOCTYPE html>
<html>
  <head>
    <title>Static</title>
  </head>
  <body>
    <h1>Static</h1>
  </body>
</html>

В результате: перехожу по адресу http://mysite.ru/static/page.html и вижу просто белый экран, никакой файл page.html не «подсосался» из папки static-files.. Что я делаю не так?

ADD:

В журнале вот такая ошибка «Warning: file_get_contents(static-files/page.html) [function.file-get-contents]: failed to open stream: No such file or directory в функции static_landing_getpages() (...).» — ну всё понятно, нельзя так указывать путь до файла. ОК.

Вбиваю прям напрямую http://mysite.ru/path/to/module/dir/static-files/ . $filename и файл «подсасывается». Но, когда в page.html указываю, например, блок входа на сайт (в комплекте с HybridAuth идёт — [block:hybridauth:hybridauth]), то вместо него вижу слово Array. Такое же и с блоками Views.

ADD 2:

<?php

function static_landing_menu() {
  return array(
    'static/%' => array(
      'page callback' => 'static_landing_getpages',
      'page arguments' => array(1),
      'access callback' => TRUE,
    ),
  );
}

function static_landing_getpages($filename) {
  global $base_url; // Добавил полный путь к файлу.
  $content = file_get_contents($base_url . '/' . drupal_get_path('module', 'static_landing') . '/static-files/' . $filename);

  $content = preg_replace_callback('/\[block:(.*?):(.*?)\]/', function ($matches) {
    $block = module_invoke($matches[1], 'block_view', $matches[2]);
    return render($block['content']); // Добавил render();
  }, $content);

  echo $content;
}

Вот так всё заработало.

ADD 3:

Но однако когда открываю страницу HTML, она грузится, но без CSS,JS, и т.п. - т.е. получается чисто текст оформленный тегами типа...

Попробуй так же прописать полный путь до CSS/JS файлов, аля:

<!DOCTYPE html>
<html>
  <head>
    ...
    <link href="/sites/all/modules/MYMODULE/static-files/css/style.css" type="text/css" rel="stylesheet" />
  </head>
...

У меня стоят на папку с CSS/JS права 700, а на файлы в этой папке 600. Короче, стандартные, если на FTP их создаёшь. Всё работает.

Комментарий оставлен 13.12.2015 - 16:05
1

Почитайте тему "темизация друпал"..если вам нужно сменить шаблон главной например страницы, создайте шаблон с именем page--front.tpl.php, и кидайте в него вашу разметку, в файле template.php в hook_preprocess_page() дергайте все блоки, присваивая их какой-то переменной,(опять же почитайте темизацию и программный вывод блоков),ну и наконец полученные переменные, выводите пхп кодом в вашем page--front.tpl.php в тех местах где это необходимо.. и ни в коем случае не делайте как посоветовал вам tlito)))) в шаблоне не должно быть никакой логики, только вывод..вся логика в template.php или своих модулях

Ответ дан 12.12.2015 - 18:36
-3

вам надо написать php-код в этой странице с обращением к бд к таблице blocks в которой можно выбирать нужные блоки

Ответ дан 12.12.2015 - 16:15

Хорошо, получается в мою HTML вместо текста я вставлю кусок кода которую будет генерировать содержимое блока Drupal-а, а как на самом сайте сделать страницу с чисто одной моей HTML-кой, без всякие обёрток самого Drupal-а, т.е. как бы в Drupal-е отображается, но без темы его, но по всей его логике, т.е. я авторизован, вся логика работает, если он на обслуживание значит редиректнет на страницу обслуживания

Комментарий оставлен 12.12.2015 - 16:31

если ваш сайт в режиме обслуживания, то все равно друпал будет отлавливать обращения к нему. вы можете в файле maintenance.tpl.php прописать функцию

header('Location: http://www.example.com/mycreative.html');
Комментарий оставлен 12.12.2015 - 17:09

не не. я не имел ввиду про режим обслуживания, его внешний вид, я имел ввиду то что открывая любую созданную HTML файл/страницу я как бы до сих пор нахожусь в CMS Drupal.

Комментарий оставлен 12.12.2015 - 18:01