Blog

J'ai eu besoin d'altérer les meta data d'un post avant qu'il soient effectivement chargés. C'est très utile car de nombreux plugins ou thèmes les utilisent pour stocker des informations supplémentaires sur les posts.

function [your theme]_post_metadata($metadata, $object_id, $meta_key, $single) {
if ($meta_key == '[your meta key]') {
$meta_type = 'post';
$meta_cache = wp_cache_get($object_id, $meta_type . '_meta');
if ( !$meta_cache ) {
$meta_cache = update_meta_cache( $meta_type, array( $object_id ) );
$meta_cache = $meta_cache[$object_id];
}
if ( !$meta_key )
$metadata = $meta_cache;
if ( isset($meta_cache[$meta_key]) ) {
if ( $single )
$metadata = maybe_unserialize( $meta_cache[$meta_key][0] );
else
$metadata = array_map('maybe_unserialize', $meta_cache[$meta_key]);
}
// Do whatever you want with $metadata. You may need to unserialize it.
return metadata;
}
}
add_filter('get_post_metadata', '[your theme]_post_metadata', true, 4);

Je suis tombé sur cet article de Michael Barrett http://abouthalf.com/development/poor-mans-nth-child-selector-for-ie-7-a..., qui explique comment utiliser les sélecteurs adjacents pour simuler les pseudo sélecteurs nth-child.

Je me suis demandé si on pouvait utiliser cette astuce pour faire de même avec odd / even.

La réponse est "Oui, en quelques sortes". Cela fonctionne si vous avez un nombre limité de nodes enfants :

table tr {
background: red; // odd
}
table tr:first-child + tr,
table tr:first-child + tr + tr + tr,
table tr:first-child + tr + tr + tr + tr + tr,
table tr:first-child + tr + tr + tr + tr + tr + tr + tr
//...and so on {
background: blue; // even
}

Si vous aussi vous êtes assez fous pour faire des applications Qt en Ruby, et que vous voulez utiliser l'API Windows pour afficher des miniatures de fenêtres, voici comment faire :

$DwmUpdateThumbnailProperties = Win32API.new "Dwmapi.dll","DwmUpdateThumbnailProperties", 'LP'
DWM_TNP_VISIBLE = 0x00000008
DWM_TNP_RECTDESTINATION = 0x00000001
DWM_TNP_SOURCECLIENTAREAONLY = 0x00000010
# Here you should call DwmRegisterThumbnail and set x, y, width and height.
dskThumbProps = [
DWM_TNP_VISIBLE | DWM_TNP_RECTDESTINATION | DWM_TNP_SOURCECLIENTAREAONLY,
[x, y, x + width, y + height].pack('l4'),
'',
255,
1,
1
].pack("La16a16III")
$DwmUpdateThumbnailProperties.call(thumbId, dskThumbProps)

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".

Syndiquer le contenu