Wie kann ich PHP-Code ausführen, ohne ein Modul zu schreiben?


15

Ich muss ein Feld an einige Bündel anhängen. Ein PHP-Snippet erledigt die Aufgabe für mich, sodass ich kein Modul benötige. Das folgende Snippet ist das, was ausgeführt werden muss:

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

und dann das Snippet, um dieses Feld zu bündeln:

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

Gibt es eine Möglichkeit, PHP-Code direkt in Drupal auszuführen, ohne ein Modul schreiben, installieren, ausführen und deinstallieren zu müssen?


Vielen Dank an alle für die funktionierenden Antworten und die guten Ausgaben, die auf meine Frage gemacht wurden. Ich habe alle Antworten als Lösung für mein Problem gewählt. Jetzt fällt mir die Entscheidung schwer, eine dieser Antworten als beste Lösung auszuwählen, da alle Lösungen funktionieren.
Alireza Tabatabaeian

1
Wenn Sie den Code anzeigen würden, den Sie ausführen müssen, wären die Antworten vollständiger.
kiamlaluno

@kiamlaluno Danke für den Rat, ich werde das PHP-Snippet an meine Frage anhängen.
Alireza Tabatabaeian

1
Eng verwandte Fragen & Antworten: Wie führe ich PHP-Skripte mit drush aus ?
Tanius

Antworten:


6

Wenn Sie sagen "Ich muss PHP ausführen" und "Ich brauche kein Modul" in dem gleichen Gedanken, würde ich vorschlagen, dass Sie den falschen Weg einschlagen, entweder in der Herangehensweise an dieses spezifische Problem oder die Herangehensweise an den Bau der Website im Allgemeinen.

drush scrwird Ihnen helfen, wenn dies die Richtung ist, in die Sie wirklich wollen, oder Sie könnten ein eigenständiges PHP-Skript schreiben (im Grunde kopieren Sie einfach alles durch den drupal_bootstrap()Aufruf von index.php und fügen Sie Ihren benutzerdefinierten Code danach hinzu), aber es gibt noch ein paar andere Dinge, die Sie anschauen könnten:

  • Exportieren Sie Ihren Inhaltstyp (und seine Felddatenbanken und Instanzen) mit dem Modul Features. IMO, du solltest das trotzdem tun.
  • Erstellen Sie ein einfaches Modul "Site-Änderungen" und fügen Sie solche Dinge in Update-Hooks ein. Beachten Sie, dass Sie dazu ein leeres Modul (ohne Update-Hooks) erstellen, es auf Ihrer Site aktivieren und dann Ihren Update-Hook hinzufügen sollten, damit Drupal das Update sieht.

Viele Websites, an denen ich gearbeitet habe, hatten eine Kombination dieser beiden Lösungen. Config sollte hauptsächlich in exportierte Features-Module gehen, und alles, was nicht kann (sind Sie wirklich sicher , dass es nicht kann?), Kann in einen Update-Hook gehen.


Vielen Dank für Ratschläge, insbesondere für Informationen zur Verwendung von Update-Hooks. sehr nützlich
Alireza Tabatabaeian

Könnten Sie bitte einige Probleme erwähnen, die durch das Ausführen von PHP-Codes auf diese Weise verursacht werden können? Ich meine das Anhängen von Feldern an einige Inhaltstypen nur durch Ausführen von PHP-Skripten?
Alireza Tabatabaeian


12

Wenn Sie Code nur einmal ausführen müssen, können Sie dies tun, ohne ein Modul, einschließlich des Devel-Moduls, zu installieren.

Schreiben Sie eine PHP-Datei (zB tasks.php ), platzieren Sie sie an der mit Drupal gelieferten Stelle der cron.php-Datei und fügen Sie den folgenden Code hinzu.

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

Wenn Sie Drush bereits zum Verwalten / Bereitstellen Ihrer Site verwenden, können Sie ein Drush-Skript erstellen . Auf diese Weise kann es von CLI ausgeführt werden und es können beliebige Argumente empfangen werden, sodass es für viele Gelegenheiten wiederverwendbar ist.

#!/usr/bin/env drush

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

Sie können auch ein PHP-Skript mit drush php-eval(oder nur drush ev) ausführen , zum Beispiel:

drush php-eval 'print time();'

Ich würde ein Drush-Skript erstellen, aber wenn Sie Drush nicht installieren können oder PHP-Code über den Browser ausführen müssen, funktioniert die erste Methode einwandfrei.


10

Fügen Sie Ihr Code-Snippet zu einer Datei hinzu und speichern Sie die Datei wie file_name.phpin Ihrem Drupal-Site-Stammordner. Führen Sie dann den folgenden Befehl in einem Terminal im Stammverzeichnis der Drupal-Site als Arbeitsverzeichnis aus:

drush scr file_name.php

Dieser Befehl führt Ihre PHP-Datei aus. (Um sich ein Bild von der Ausführung zu machen, können Sie einige print-Anweisungen in Ihre Datei einfügen, die den Text, die Variablenwerte usw. an das Terminal ausgeben, auf dem Sie den Befehl drush ausführen.)

Hinweis: Voraussetzung ist, dass Sie drushauf Ihrem System installiert haben .


3

Sie können das PhpInline- Modul von Devel verwenden, aber Sie können einen meiner Tricks in Drupal anwenden, um meinen benutzerdefinierten Code ohne ein Modul auszuführen.

erst ein menu itemin erstellenhook_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
}

dann löschen Sie den Cache (weil Menüpunkte in Drupal zwischengespeichert), und alles setzen Sie wollen in my_functionund geben Sie einfachyoursite.com/ytest

Ich hoffe es hilft dir bei projekten "dada";)


@ AlirezaTabatabaeian Gern geschehen "dada", ich freue mich, wenn ich iranische Drupalisten hier sehe;)
Yusef

2

Das Ziel von Drupal-Modulen ist es, bestimmte Komponenten mit einer separaten Logik zu versehen, damit sie deaktiviert werden können, wenn etwas schief geht.

hook_install/hook_update

In Ihrem Fall, in dem ein neues Feld einmalig erstellt wird, ist die Verwendung von entweder hook_installoder das ideale Szenario hook_update.

Wenn Sie kein benutzerdefiniertes Modul haben (übrigens können Sie auch das exportierte Feature-Modul verwenden), erstellen Sie ein neues nur für Updates (z site_updates. B. ). In Drupal 7, alles , was Sie brauchen , ist Ordner mit 3 Dateien zu erstellen: .info, .moduleund , .installund definieren installieren oder aktualisieren Haken in Ihrem .install. Die Verwendung von install / update hook ist praktisch, um konsistente Umgebungen zu haben, insbesondere wenn Sie mehrere Drupal-Server (wie dev, test und prod) haben, sodass die Änderung bei der nächsten Bereitstellung aufgerufen werden kann.

Wenn Sie immer noch kein Modul erstellen möchten, finden Sie hier weitere Methoden.

Einmalige Ausführung

Wenn Sie bestimmten PHP-Code nur einmal ausführen müssen, können Sie:

  • Aktivieren Sie das Entwicklungsmodul und fügen Sie den Code unter ein /devel/php.
  • Verwenden Sie CLI (und den Befehl / ), um PHP-Code auszuführen, zdrush evalev

    drush ev 'field_create_field(["field_name"=>"foo", "type"=>"image"]);'
    drush ev 'print_r(field_info_field("foo"));'
  • Verwenden Sie drush scrdiese Option, um ein PHP-Skript auszuführen:

    drush scr my_file.php

    Wo my_file.phpist dein einfaches PHP-Skript mit deinem Code zum Ausführen?

Spezifische Seitenausführung

So führen Sie benutzerdefinierten Code auf bestimmten Seiten oder Komponenten aus:

Alle Seitenausführung

Um PHP-Code auf jeder Seite hinzuzufügen und auszuführen, ohne ein Modul zu schreiben, können Sie:

  • Verwenden Sie dazu eine settings.phpDatei. Es wird nur für einfachen Code empfohlen, z. B. zum Überschreiben der Konfiguration. Andernfalls sollten Sie dies hook_initals Teil Ihres benutzerdefinierten Moduls verwenden.
  • Aktivieren Sie den PHP-Textfilter , erstellen Sie einen Block mit benutzerdefiniertem PHP-Code und platzieren Sie den Block in der Fußzeile.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.