Подкючить php-скрипт, не имея на это прав

Главные вкладки

Аватар пользователя simen simen 25 ноября 2011 в 22:18

Здравствуйте!
Подскажите, как верстальщику, у которого в целях безопасности отключен php и доступен только Full HTML, подкючать файл с php-скриптом?

Пробовал так:
1. Скрипт в виде:
<?php
тело скрипта
?>
сохранял в файл script.html

2.Пробовал его подключить в ноде:

Что-то не заработало ((
Как быть?

Для ясности: я админ, верстальщику php давать не хочу, но на некооторые страницы он должен как-то подключать готовые скрипты.
Есть решение?
Спасибо!

Комментарии

Аватар пользователя bsyomov bsyomov 25 ноября 2011 в 23:03

PHP из тела ноды, запускается с помощью eval, пока не включён php фильтр, не выполнится никакой код.
SSI с помощью которого вы хотите вставить скрипт, должен обрабатывать веб сервер, и обработка происходит уже после формирования страницы, непосредственно перед отдачей клиенту. Если у вас будет-таки настроен SSI, то клиенту придёт не результат работы скрипта, а его содержимое. Smile

Проще всего конечно дать права.
Но лучше, сделать так, чтобы ему не надо было бы вообще делать какие-то php вставки.
Если делать правильно, всё прекрасно решается модулями, если что-то не решается, надо написать соответствующий модуль.
А разные куски php распиханные по материалам это практически гарантировано лишние дыры, и жутко неуправляемая/не поддерживаемая система.

Имею как раз сейчас печальный опыт борьбы с сайтом, в котором масса php в контенте нодов, в content_templates, views и.т.п. Вместо пары модулей и нескольких preprocess функций в теме. И это АД. Smile Что-то найти и изменить часы вместо минут.

Аватар пользователя simen simen 26 ноября 2011 в 0:29

В Друпале я новичок, и у меня как раз куча нод с запихнутым внутрь php.
Было ощущение, что что-то не так. Но как исправить, не понял пока.

У меня на сайте сотня статей и 3 вида калькуляторов (как раз на php), один из которых нужно вставлять в зависимости от содержимого статьи.
Как решить эту задачу красиво с помощью модулей? И чтобы безопасно доверить это постороннему верстальщику.

Я думал сделать это с помощью блоков, но возникли проблемы:
1. Если я вставляю блок с калькулятором после содержимого, то он отображается после комментариев, а нужно ДО комментариев, сразу после текста.
2. В настройках блока нужно перечислять все страницы, где этот блок включен. И если вдруг нерадивый верстальщик ошибется, то разом может снести блок со всех страниц.

Куда копать, подскажите.

Аватар пользователя bsyomov bsyomov 26 ноября 2011 в 13:52

Создать типы материалов по количеству разных калькуляторов.
В самом простом случае создать отдельные шаблоны для этих типов материалов, и выводить счётчик там в нужном месте.
Более правильно, использовать preprocess_node, добавлять код в контент по условию == тип материала.
Ещё более правильно, сделать модуль, который будет это делать, т.е. смотреть тип материала и добавлять в контент тот или иной калькулятор.

Аватар пользователя simen simen 26 ноября 2011 в 18:00

Взялся за preprocess_node.

Вот так работает:

<?phpfunction THEMENAME_preprocess_node(&$vars) {
  if ($vars['page']) {
    $vars['content']['mycontent'] = array(
      '#markup' => 'My node content', 
      '#weight' => 10, 
    );
  }?>

А вот так нет:

<?php
  
if ($vars['page']) {
    
$vars['content']['mycontent'] = array(
      
'#markup' => '<?php  echo"!";  ?>'
      
'#weight' => 10
    );
  }
?>

1. Как же мне все-таки вставить php-код?
2. И как определить тип материала?

Аватар пользователя bsyomov bsyomov 26 ноября 2011 в 20:48
function mytheme_preprocess_node(&$vars) {
  $node = $vars['node'];
  if($node->type=='mytype') {
    // тут делаем нужное
    // чтобы понять, что делать например можно воспользоваться функцией модуля devel и посмотреть, что есть в $vars:
    dpm($vars);
    // Можно добавить свою переменную для вывода в шаблоне
    $vars['myvar']='Мы можем получить это значение в шаблоне и вывести его например print $myvar;';
    $vars['my2ndvar'] = date("d.m.Y"); // вот ваш воображаемый php код.
  }

Так понятнее?
Вам не код надо вставить на страницу, а тут его выполнить и вставить результат.

Аватар пользователя simen simen 27 ноября 2011 в 12:03

Да, так понятнее, спасибо

Но проблема в том, что мой php-код - это вывод формы через API форм,
т.е. состоит из функций:
function myform($form_state, &$form_state)
function myform_validate($form, &$form_state)

и генерации формы:
print drupal_render(drupal_get_form('myform'));

Поэтому я не могу запихать рузультаты работы этого кода в одну переменную, чтобы потом ее вывести.
Более того, если помещаю свою функцию (например, function myform) в template.php, то сайт прекращает работать.

Как быть?