如何在不编写模块的情况下运行PHP代码?


15

我需要将字段附加到某些捆绑包中。一个PHP代码段将为我完成工作,因此我不需要模块。下面的代码段必须执行:

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

然后是将该字段添加到bundle的代码段:

// 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);

有没有一种方法可以直接在Drupal中运行PHP代码,而无需编写模块,安装它,使其运行并卸载它?


感谢大家为我的问题提供的有效答案和出色版本。我将所有答案都投票选出作为解决问题的方法,现在对我来说,选择这些答案之一是一个艰难的决定,因为这是所有工作的最佳解决方案。
Alireza Tabatabaeian 2015年

1
如果要显示您需要运行的代码,答案将更加完整。
kiamlaluno

@kiamlaluno感谢您的建议,我将在您的问题中附加PHP代码段。
Alireza Tabatabaeian

1
密切相关的问题和答案:如何使用drush执行php脚本
tanius

Answers:


6

如果您出于相同的想法说“我需要运行一些PHP”和“我不需要模块”,则建议您采用错误的方法,或者针对该特定问题进行处理,或一般而言构建网站的方法。

drush scr如果这是您真正想要的方向,将为您提供帮助,或者您可以编写一个独立的PHP脚本(基本上只是通过drupal_bootstrap()index.php 的调用复制/粘贴所有内容,然后在其中添加您的自定义代码),但还有另外两个您可以看的东西:

  • 使用“功能”模块导出您的内容类型(及其字段基础和实例)。IMO,无论如何,您都应该这样做。
  • 创建一个简单的“站点修改”模块,并将类似这样的内容包含在更新挂钩中。请注意,如果要执行此操作,则应创建一个空模块(不包含更新挂钩),在您的站点上启用它,然后添加更新挂钩以使Drupal可以查看更新。

我工作过的许多站点都结合了这两种解决方案。Config应该主要放在导出的功能模块中,而所有不能(您确实确定不能做到)都可以进入更新挂钩。


感谢您的建议,特别是告知更新挂钩的使用。非常有用
Alireza Tabatabaeian 2015年

您能否提及通过运行此方法的PHP代码可能引起的一些问题?我的意思是仅通过运行PHP脚本将字段附加到某些内容类型?
Alireza Tabatabaeian


12

如果您只需要运行一次代码,则无需安装任何模块(包括Devel模块)就可以做到。

编写一个PHP文件(例如task.php),将其放在Drupal随附的cron.php文件所在的位置,然后添加以下代码。

/**
 * 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().

您还可以使用drush php-eval(或仅使用drush ev)执行PHP脚本,例如:

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 itemhook_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

我希望它能对“ dada”项目有所帮助;)


@AlirezaTabatabaeian,您好,“ dada”,当我在这里见到伊朗Drupalist时,我会很高兴;)
Yusef

2

Drupal模块的目标是为某些组件提供单独的逻辑,以便在出现问题时可以禁用它们。

hook_install/hook_update

在您要一次性创建新字段的情况下,理想的情况是使用hook_installhook_update

如果您没有自定义模块(顺便说一句,您也可以使用导出的功能模块),则创建一个仅用于更新的模块(例如site_updates)。在Drupal 7,你需要的是创建文件夹3个文件:.info.module.install和定义您的安装或更新挂钩.install。为了具有一致的环境,使用install / update钩子非常方便,尤其是在拥有多个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脚本以及要执行的代码在哪里?

特定页面执行

要在某些页面或组件上执行自定义代码:

所有页面执行

要在每个页面上添加并运行PHP代码而不编写模块,您可以:

  • settings.php为此使用文件。仅建议使用简单代码(例如配置覆盖)。否则,您应该将hook_init其用作自定义模块的一部分。
  • 激活PHP文本过滤器,然后创建一个包含自定义PHP代码的块,并将该块放入页脚区域。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.