Comment puis-je exécuter du code PHP sans écrire de module?


15

J'ai besoin d'attacher un champ à certains bundles. Un extrait PHP fera le travail pour moi, donc je n'ai pas besoin d'un module.L'extrait ci-dessous est ce qui doit être exécuté:

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

puis l'extrait pour ajouter ce champ à l'ensemble:

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

Existe-t-il un moyen d'exécuter du code PHP directement dans Drupal, sans avoir besoin d'écrire un module, de l'installer, de le faire fonctionner et de le désinstaller?


Merci à tous pour les réponses utiles et les bonnes éditions apportées à ma question. J'ai voté toutes les réponses comme solutions à mon problème, maintenant il est difficile pour moi de sélectionner l'une de ces réponses comme la meilleure solution car tout fonctionne.
Alireza Tabatabaeian

1
Si vous montriez le code que vous devez exécuter, les réponses seraient plus complètes.
kiamlaluno

@kiamlaluno Merci pour vos conseils, je vais joindre l'extrait PHP à ma question.
Alireza Tabatabaeian

1
Questions et réponses étroitement liées: Comment exécuter un script php à l'aide de drush ?
tanius

Réponses:


6

Si vous dites "J'ai besoin d'exécuter du PHP" et "Je n'ai pas besoin d'un module" dans la même pensée, je vous suggère de suivre le mauvais chemin, soit dans l'approche de ce problème spécifique. , ou l'approche de la construction du site en général.

drush scrvous aidera si c'est dans cette direction que vous voulez vraiment aller, ou vous pouvez écrire un script PHP autonome (simplement copier / coller tout via l' drupal_bootstrap()appel depuis index.php, et ajouter votre code personnalisé après) mais il y en a quelques autres choses que vous pourriez regarder:

  • Exportez votre type de contenu (et ses bases et instances de champ) avec le module Fonctionnalités. OMI, vous devriez quand même le faire.
  • Créez un simple module "modifications de site" et incluez des éléments comme celui-ci dans les hooks de mise à jour. Notez que si vous voulez faire cela, vous devez créer un module vide (sans hook de mise à jour), l'activer sur votre site, puis ajouter votre hook de mise à jour pour que Drupal puisse voir la mise à jour.

De nombreux sites sur lesquels j'ai travaillé ont eu une combinaison de ces deux solutions. La configuration devrait principalement aller dans les modules de fonctionnalités exportés, et tout ce qui ne peut pas (êtes-vous vraiment sûr que cela ne peut pas?) Peut entrer dans un crochet de mise à jour.


Merci pour les conseils, spécialement pour avoir informé de l'utilisation des hooks de mise à jour. très utile
Alireza Tabatabaeian

Pourriez-vous s'il vous plaît mentionner quelques problèmes qui peuvent être causés par l'exécution de codes PHP cette approche? Je veux dire attacher des champs à certains types de contenu simplement en exécutant des scripts PHP?
Alireza Tabatabaeian


12

Si vous devez exécuter du code une seule fois, vous pouvez le faire sans installer de module, y compris le module Devel.

Écrivez un fichier PHP (par exemple tasks.php ), placez-le à l'emplacement du fichier cron.php fourni avec Drupal et ajoutez le code suivant.

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

Si vous utilisez déjà Drush pour maintenir / déployer votre site, vous pouvez créer un script Drush . De cette façon, il pourrait être exécuté par CLI, et il pourrait recevoir tous les arguments, le rendant réutilisable à de nombreuses reprises.

#!/usr/bin/env drush

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

Vous pouvez également exécuter un script PHP avec drush php-eval(ou tout simplement drush ev), par exemple:

drush php-eval 'print time();'

Je créerais un script Drush, mais si vous ne pouvez pas installer Drush, ou si vous devez exécuter du code PHP à partir du navigateur, la première méthode fonctionne très bien.


10

Ajoutez votre extrait de code à un fichier et enregistrez le fichier comme file_name.phpdans votre dossier racine du site Drupal. Exécutez ensuite la commande suivante dans un terminal, à partir du dossier racine du site Drupal en tant que répertoire de travail:

drush scr file_name.php

Cette commande exécutera votre fichier PHP. (Pour avoir une idée de l'exécution, vous pouvez inclure des instructions d'impression dans votre fichier, qui afficheront le texte, les valeurs des variables, etc. sur le terminal où vous exécutez la commande drush.)

Remarque: Comme condition préalable, vous devez avoir drushinstallé sur votre système.


3

Vous pouvez utiliser Phple module en ligne de Devel, mais vous permet d'obtenir l'une de mes astuces dans Drupal pour exécuter mon code personnalisé sans aucun module.

créer d'abord un menu itemdanshook_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
}

puis videz le cache (car les éléments de menu sont mis en cache dans drupal), et mettez tout ce que vous voulez my_functionet tapez simplementyoursite.com/ytest

J'espère que cela vous aidera dans les projets "dada";)


@AlirezaTabatabaeian vous êtes les bienvenus "dada", je serai ravi de voir le Drupaliste iranien ici,;)
Yusef

2

L'objectif des modules Drupal est de fournir une logique distincte à certains composants, afin qu'ils puissent être désactivés en cas de problème.

hook_install/hook_update

Dans votre cas qui crée un nouveau champ sur une base unique, le scénario idéal est d'utiliser soit hook_installou hook_update.

Si vous n'avez pas de module personnalisé (btw. Vous pouvez également utiliser un module de fonction exporté pour cela), créez-en un nouveau uniquement pour les mises à jour (par exemple site_updates). Dans Drupal 7, tout ce que vous avez besoin est de créer un dossier avec 3 fichiers: .info, .moduleet .installet définir l' installation ou d'un crochet de mise à jour dans votre .install. L'utilisation du hook d'installation / mise à jour est pratique afin d'avoir des environnements cohérents, en particulier lorsque vous avez plusieurs serveurs Drupal (tels que dev, test et prod), de sorte que la modification peut être invoquée lors du prochain déploiement.

Si vous ne voulez toujours pas créer de module, voici d'autres méthodes.

Exécution unique

Si vous n'avez besoin d'exécuter certains codes PHP qu'une seule fois, vous pouvez:

  • Activez le module Devel et collez le code sur /devel/php,
  • Utilisez CLI (et sa commande / ) pour exécuter du code PHP, par exempledrush evalev

    drush ev 'field_create_field(["field_name"=>"foo", "type"=>"image"]);'
    drush ev 'print_r(field_info_field("foo"));'
  • Utilisez drush scrpour exécuter le script PHP:

    drush scr my_file.php

    my_file.phpest votre script PHP simple avec votre code à exécuter.

Exécution de page spécifique

Pour exécuter du code personnalisé sur certaines pages ou composants:

Exécution de toutes les pages

Pour ajouter et exécuter du code PHP sur chaque page sans écrire de module, vous pouvez:

  • Utilisez un settings.phpfichier pour cela. Il n'est recommandé que pour le code simple tel que la substitution de configuration. Sinon, vous devez l'utiliser hook_initpour cela dans le cadre de votre module personnalisé.
  • Activez le filtre de texte PHP , puis créez un bloc contenant du code PHP personnalisé et placez le bloc dans la zone de pied de page.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.