Как я могу запустить код PHP без написания модуля?

15

Мне нужно прикрепить поле к некоторым связкам. Фрагмент PHP сделает всю работу за меня, поэтому мне не нужен модуль. Ниже приведен фрагмент кода:

$field_name = 'field_custom_image';
// Create the field.
$field = array(
  'field_name' => $field_name,
  'type' => 'image',
);
field_create_field($field);

а затем фрагмент, чтобы добавить это поле в комплект:

// Create the instance.
$instance = array(
  'field_name' => $field_name,
  'entity_type' => 'node',
  'bundle' => 'article',
  'label' => 'Image',
  'description' => 'An image for the article.',
  'required' => TRUE,
);
field_create_instance($instance);

Есть ли способ запустить PHP-код непосредственно в Drupal, без необходимости писать модуль, устанавливать его, запускать и удалять его?

Алиреза Табатабаян
источник
Спасибо всем за рабочие ответы и хорошие публикации на мой вопрос. Я проголосовал за все ответы как за решение моей проблемы, и сейчас мне трудно выбрать один из этих ответов, так как лучшее решение - все работает.
Алиреза Табатабаян
1
Если бы вы показали код, который вам нужно запустить, ответы были бы более полными.
kiamlaluno
@kiamlaluno Спасибо за совет, я прикреплю фрагмент PHP к своему вопросу.
Алиреза Табатабаян
1
Тесно связанные вопросы и ответы: как выполнить php-скрипт, используя drush ?
Танус

Ответы:

6

Если вы говорите «мне нужно запустить PHP» и «мне не нужен модуль» в одной и той же мысли, я бы посоветовал вам пойти по неверному пути, либо в подходе к этой конкретной проблеме Или подход к созданию сайта в целом.

drush scrпоможет вам, если вы действительно хотите идти в этом направлении, или вы можете написать автономный скрипт PHP (в основном просто скопировать / вставить все через drupal_bootstrap()вызов из index.php и добавить свой собственный код после), но есть пара других вещи, на которые вы могли бы смотреть:

  • Экспортируйте свой тип контента (а также его базы и экземпляры) с помощью модуля «Функции». ИМО, ты должен делать это в любом случае.
  • Создайте простой модуль «модификации сайта» и включите подобные вещи в хуки обновлений. Обратите внимание, что если вы хотите сделать это, вы должны создать пустой модуль (без хуков обновления), включить его на своем сайте, а затем добавить хук обновления, чтобы Drupal увидел обновление.

Многие сайты, над которыми я работал, имели комбинацию обоих этих решений. Config должен в основном идти в экспортированные модули Feature, и все, что не может (вы действительно уверены, что не можете?), Может попасть в ловушку обновления.

cweagans
источник
Спасибо за советы, специально для информирования об использовании хуков обновления. очень полезно
Алиреза Табатабаян
Не могли бы вы упомянуть некоторые проблемы, которые могут быть вызваны использованием PHP-кодов при таком подходе? Я имею в виду присоединение полей к некоторым типам контента просто с помощью PHP-скриптов?
Алиреза Табатабаян
18

Да, есть, но, учитывая ваше описание, мне интересно, поможет ли оно вам:

  1. Установить модуль Devel
  2. Зайдите на http: // yoursite / devel / php
  3. Введите свой код и выполните его.
Милош Крулик
источник
1
Модуль Devel также поставляется с блоком «Execute PHP», который вы можете разместить в регионе.
Нет Sssweat
12

Если вам нужно запустить код только один раз, вы можете сделать это без установки какого-либо модуля, включая модуль Devel.

Напишите файл PHP (например, tasks.php ), поместите его туда, где находится файл cron.php, поставляемый с Drupal, и добавьте следующий код.

/**
 * Root directory of Drupal installation.
 */
define('DRUPAL_ROOT', getcwd());

include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
drupal_set_time_limit(240);

// Your code here.

Если вы уже используете Drush для поддержки / развертывания своего сайта, то вы можете создать сценарий Drush . Таким образом, он может быть выполнен CLI и может принимать любые аргументы, что делает его многократно используемым во многих случаях.

#!/usr/bin/env drush

// Your code here.
// Access the options with drush_get_option(), or any argument with drush_shift().

Вы также можете выполнить скрипт PHP с drush php-eval(или просто drush ev), например:

drush php-eval 'print time();'

Я хотел бы создать сценарий Drush, но если вы не можете установить Drush или вам нужно выполнить код PHP из браузера, первый метод работает нормально.

киамлалуно
источник
10

Добавьте фрагмент кода в файл и сохраните файл как file_name.phpв корневой папке вашего сайта Drupal. Затем выполните следующую команду в терминале из корневой папки сайта Drupal в качестве рабочего каталога:

drush scr file_name.php

Эта команда выполнит ваш файл PHP. (Чтобы получить представление о выполнении, вы можете включить в свой файл некоторые операторы печати, которые будут выводить текст, значения переменных и т. Д. В терминал, где вы выполняете команду drush.)

Примечание. В качестве предварительного условия необходимо drushустановить его в своей системе.

Суреш Р
источник
3

Вы можете использовать Phpвстроенный модуль Devel, но в Drupal вы можете использовать один из моих трюков для запуска моего пользовательского кода без какого-либо модуля.

сначала создать menu itemвhook_menu

function yourmdoule_menu()
{

    $items['ytest'] = array(
        'title' => 'my debug and devel test tool ',
        'description' => 'create for debug and faster develop',
        'page callback' => 'my_function',
        'type' => MENU_CALLBACK,
        'access callback' => true,
    );
    return $items;
}

function my_function{

/// run every want you want
}

затем очистите кеш (потому что пункты меню кэшируются в drupal), и поместите все, что вы хотите, my_functionи просто введитеyoursite.com/ytest

Надеюсь, это поможет вам в проектах "дада";)

Юсеф
источник
@AlirezaTabatabaeian, пожалуйста, «дада», я буду рад, когда увижу иранского Drupalist здесь;)
Юсеф
2

Цель модулей Drupal - предоставить отдельную логику для определенных компонентов, чтобы их можно было отключить, если что-то пойдет не так.

hook_install/hook_update

В вашем случае , который создает новое поле на разовой основе, идеальный сценарий для использования либо hook_installили hook_update.

Если у вас нет пользовательского модуля (кстати, вы также можете использовать для этого экспортированный функциональный модуль), создайте новый только для обновлений (например site_updates). В Drupal 7, все , что вам нужно , чтобы создать папку с 3 -х файлов: .info, .moduleа .installи определить установки или обновления крюк в вашем .install. Использование ловушки установки / обновления удобно для обеспечения согласованной среды, особенно когда у вас несколько серверов Drupal (таких как dev, test и prod), поэтому изменение может быть вызвано во время следующего развертывания.

Если вы все еще не хотите создавать модуль, вот другие методы.

Разовое исполнение

Если вам нужно выполнить определенный код PHP только один раз, вы можете:

  • Активируйте модуль Devel и вставьте код в /devel/php,
  • Используйте CLI (и его / команду) для выполнения кода PHP, напримерdrush evalev

    drush ev 'field_create_field(["field_name"=>"foo", "type"=>"image"]);'
    drush ev 'print_r(field_info_field("foo"));'
  • Используйте drush scrдля выполнения скрипта PHP:

    drush scr my_file.php

    где my_file.phpваш простой PHP-скрипт с вашим кодом для выполнения.

Конкретное исполнение страницы

Чтобы выполнить пользовательский код на определенных страницах или компонентах:

  • Воспользоваться template.phpфайл в вашей пользовательской темы (например template_preprocess_node, template_preprocess_block, template_preprocess_page).
  • Вы можете использовать модуль PHP, который обеспечивает фильтр , так что вы можете писать код PHP внутри узлов, блоков, представлений и т. Д.

Все страницы исполнения

Чтобы добавить и запустить код PHP на каждой странице без написания модуля, вы можете:

  • Используйте settings.phpфайл для этого. Рекомендуется только для простого кода, такого как переопределение конфигурации. В противном случае вы должны использовать hook_initэто как часть вашего пользовательского модуля.
  • Активируйте текстовый фильтр PHP , затем создайте блок с пользовательским кодом PHP в нем и поместите блок в область нижнего колонтитула.
kenorb
источник