Drupal

Après des heures à tenter de comprendre comment monter une box Vagrant avec LAMP, j'ai fini par avoir une box fonctionnelle.

Comme je suis sympa, je vous explique comment faire.

Nous utiliserons cette box : https://github.com/TomJaeger/vagrant-puppet-lamp, qui contient Apache, PHP et MySQL.

  1. Vous aurez évidemment besoin de Vagrant et VirtualBox. Installez les deux.
  2. Clonez le repo : git clone https://github.com/TomJaeger/vagrant-puppet-lamp.git
  3. Allez dans le dossier: cd vagrant-puppet-lamp
  4. Lancez la VM: vagrant up
  5. Connectez-vous à la VM via SSH: vagrant ssh
  6. La partie "tricky": Lancez postinstall.sh comme sudoer: sudo ./postinstall.sh
  7. Ca fonctionne ! Visitez http://localhost:8080. Vous pouvez accéder à MySQL sur localhost:8889 avec l'utilisateur "root" et le mot de passe "root".

On trouve très souvent ceci dans les templates de Wordpress / Drupal / N'importe :

<ol class="commentlist">
...
</ol><!-- .commentlist -->

Ne le faites pas ! Voici pourquoi :

  • Personne n'aura jamais besoin de ces indications sauf un hypothétique développeur qui reprendrait votre code. Et pourtant, vous le servez à la terre entière.
  • Cela rend le fichier HTML plus lourd, car le navigateur télécharge ces commentaires. Utilisez au moins des commentaires PHP.
  • Avec une indentation correcte, le code est tout à fait lisible. En fait cela rend le code plus difficile à lire au final.

Pour afficher le formulaire du module profile2 directement sur le formulaire du compte utilisateur :

Nous assumerons ici que le type de profil est nommé "profile".

Premièrement, il faut cacher l'onglet sur la page du compte utilisateur :

/**
* Implements hook_menu_alter().
*/
function MY_MODULE_menu_alter(&$items) {
$items['user/%user_category/edit/profile']['access callback'] = FALSE;
}

Ensuite, il faut fusionner les 2 formulaires :

/**
* Implements hook_form_FORM_ID_alter() for the user edit form.
*/
function MY_MODULE_form_user_profile_form_alter(&$form, &$form_state) {
if (($type = profile2_get_types('profile')) && $type->userCategory) {
if (empty($form_state['profiles'])) {
$profile = profile2_load_by_user($form['#user'], 'profile');
if (empty($profile)) {
$profile = profile_create(array('type' => 'profile', 'uid' => $form['#user']->uid));
}
$form_state['profiles'][$profile->type] = $profile;
}
profile2_attach_form($form, $form_state);
}
}

Drupal utilise un thème jQuery UI par défaut. Voici comment utiliser votre propre thème crée en utilisant jQuery ThemeRoller.

Placez le thème jQuery UI généré dans votre thème, dans un sous-dossier appelé "jquery-ui".

Ensuite, dans le fichier template.php de votre thème :

/**
* Implements hook_library_alter().
*/
function YOUR_THEME_library_alter(&$libraries, $module) {
$libraries['ui']['css'] = array();
$libraries['ui.accordion']['css'] = array();
$libraries['ui.autocomplete']['css'] = array();
$libraries['ui.button']['css'] = array();
$libraries['ui.datepicker']['css'] = array();
$libraries['ui.dialog']['css'] = array();
$libraries['ui.draggable']['css'] = array();
$libraries['ui.droppable']['css'] = array();
$libraries['ui.mouse']['css'] = array();
$libraries['ui.position']['css'] = array();
$libraries['ui.progressbar']['css'] = array();
$libraries['ui.resizable']['css'] = array();
$libraries['ui.selectable']['css'] = array();
$libraries['ui.slider']['css'] = array();
$libraries['ui.sortable']['css'] = array();
$libraries['ui.tabs']['css'] = array();
$libraries['ui']['css'][drupal_get_path('theme', 'YOUR_THEME') . '/jquery-ui/jquery-ui.css'] = array();
}

Pour un projet récent, j'ai dû migrer des données d'un Drupal 5 vers un Drupal 7. Voici comment j'ai procédé pour que ce soit le plus facile possible. L'essentiel est de :

  • Exporter les données en CSV depuis l'instance originale à l'aide de Views et d'un plugin de sortie en CSV.
  • Les réimporter dans l'instance en 7.x en utilisant Feeds.

Un ami à moi m'a signalé que mon pseudo était écrit en énorme dans la dernière keynote de Dries Buytaert montrant les contributeurs Drupal :) Dans le slide #10, et aussi dans la vidéo, autour de 1:00. Je suis célèbre !

La magie de l'aléatoire :) Sur cette image là, qui reflète mieux les proportions, je suis en tout petit :) :

/**
* Implements hook_cron_queue_info().
*/
function MYMODULE_cron_queue_info() {
$queues = array();
$queues['MYMODULE_queue_notify'] = array(
'worker callback' => 'MYMODULE_queue_notify_worker',
'time' => 15,
);
return $queues;
}
 
/**
* Queue worker for sending notification mails.
*/
function MYMODULE_queue_notify_worker($params) {
drupal_mail('MYMODULE', 'notify', $params['to'], language_default(), $params, $params['from']);
}
 
/**
* Implements hook_mail().
*/
function MYMODULE_mail($key, &$message, $params) {
$language = $message['language'];
$message['subject'] = $params['subject'];
$message['body'][] = $params['message'];
}
 
/**
* Implements hook_rules_action_info().
*/
function MYMODULE_rules_action_info() {
return array(
'MYMODULE_rules_action_mail' => array(
'label' => t('Send mail'),
'group' => 'MYMODULE',
'parameter' => array(
'to' => array(
'type' => 'text',
'label' => t('To'),
'description' => t('The e-mail address or addresses where the message will be sent to. The formatting of this string must comply with RFC 2822.'),
),
'subject' => array(
'type' => 'text',
'label' => t('Subject'),
'description' => t("The mail's subject."),
),
'message' => array(
'type' => 'text',
'label' => t('Message'),
'description' => t("The mail's message body."),
),
'from' => array(
'type' => 'text',
'label' => t('From'),
'description' => t("The mail's from address. Leave it empty to use the site-wide configured address."),
'optional' => TRUE,
),
),
),
);
}
 
/**
* Action: Add notification mails to the queue.
*/
function MYMODULE_rules_action_mail($to, $subject, $message, $from = NULL, $settings, RulesState $state, RulesPlugin $element) {
// Gather params.
$params = array(
'to' => str_replace(array("\r", "\n"), '', $to),
'from' => !empty($from) ? str_replace(array("\r", "\n"), '', $from) : NULL,
'subject' => $subject,
'message' => $message,
);
// Add to the queue.
$queue = DrupalQueue::get('MYMODULE_queue_notify');
$queue->createItem($params);
}

Lorsqu'une vue utilise des filtres exposés, par défaut Views rend la vue avec tous les résultats. Pour que la vue soit rendue vide :

  • Ajouter un argument "Global: Null"
  • Action to take if argument is not present: Provide default argument
  • Default argument type: Fixed entry
  • Default argument: let it blank
  • Validator: PHP code
  • PHP validate code:
    if (!empty($view->exposed_input) && count($view->exposed_input) == 1 && isset($view->exposed_input['destination'])) {
    return FALSE;
    }
    return (!empty($view->exposed_input));
  • Action to take if argument does not validate: Display empty text (if you want the view to be rendered)

Et voilà !

Pour créer des patchs GIT en utilisant les branches (nécessaire pour des patchs compatibles avec drush make) :
git clone --branch 7.x-1.x http://git.drupal.org/project/session_api
cd session_api
git checkout -b cron
[edit code...]
git commit -a -m "Use an expiration logic when clearing sessions on cron"
git checkout 7.x-1.x
git diff --no-prefix 7.x-1.x cron > session_api_cron.patch

Il est possible d'utiliser la branche "master" plutôt que "7.x-1.x".

Voici un exemple simple de l'utilisation de la database API :

$results = db_select('authmap', 'am') // 'authmap' is the table name, 'am' the alias
->fields('am', array('uid')) // The alias and the field we want to fetch
->distinct() // Add distinct
->condition('module', 'MYMODULE') // A condition on the 'module' field, 'MYMODULE' value
->condition('authname', $ids, 'IN') // A condition on the 'authname' field, value is in $ids array
->execute() // Execute the query
->fetchCol(); // Fetch column

Syndiquer le contenu