2009-01-22 6 views
2

Sur mon site Web alimenté par Drupal, je veux lister les téléchargements disponibles en haut d'une page de nœud (dans un flottant étroit: <div> à droite), pas en bas où ils apparaissent normalement.Comment puis-je modifier le poids # du contenu généré par le upload.module?

Dans mon thème, j'ai remplacé la fonction theme_upload_attachments() pour générer un <div> de largeur 40%, mais cela apparaît au bas de la page.

Dans le fichier upload.module est le code qui contrôle où les pièces jointes sont répertoriés sur la page:

// function upload_nodeapi(), line #284 of upload.module 
$node->content['files'] = array(
    '#value' => theme('upload_attachments', $node->files), 
    '#weight' => 50, 
); 

Si je pirater manuellement ce #weight à -1, ma liste personnalisée des pièces jointes montre où je veux, flottant du côté droit du haut de la zone de contenu.

Cependant, je ne veux pas pirater manuellement le fichier core upload.module, car mes modifications seront perdues la prochaine fois que j'appliquerai une mise à niveau (par exemple, pour un correctif de sécurité).

Comment/Où puis-je modifier le poids de content['files'] dans mon code de thème?
Ou, est-ce que je vais à ce sujet dans le mauvais sens?

Répondre

5

Vous aurez besoin d'un module pour ce faire, pas seulement un thème. Un module peut implémenter hook_nodeapi(), ce qui lui donnera une chance de changer le contenu de ce tableau $ node-> content avant qu'il ne soit rendu. Si votre module est nommé « upload_tweaker » par exemple, vous utiliseriez la fonction suivante:

function upload_tweaker_nodeapi(&$node, $op) { 
    if ($op == 'view') { 
    $node->content['files']['#weight'] = -1; 
    } 
} 

Chaque module obtient une fissure à changer le nœud lors de cet événement « de nodeapi »; Si vous voulez changer les choses ajoutées par un module, vous devez vous assurer que votre module se charge après lui. Cela peut être fait en le nommant quelque chose comme «zzz», ou en changeant son champ «poids» dans la table système de la base de données de votre site. Les modules peuvent être pondérés comme des éléments de formulaire.

api.drupal.org a plus d'informations.

+0

Merci pour le pointeur - J'ai maintenant implémenté ce petit module et il fonctionne exactement comme je l'ai besoin. À votre santé. – Bevan

0

Pour ceux qui utilise CCK et que vous souhaitez modifier le poids corporel:

module CCK utilise la fonction pre_render

/** 
* Pre-render callback to adjust weights of non-CCK fields. 
*/ 
function content_alter_extra_weights($elements) { 
    if (isset($elements['#content_extra_fields'])) { 
    foreach ($elements['#content_extra_fields'] as $key => $value) { 
     // Some core 'fields' use a different key in node forms and in 'view' 
     // render arrays. Check we're not on a form first. 
     if (!isset($elements['#build_id']) && isset($value['view']) && isset($elements[$value['view']])) { 
     $elements[$value['view']]['#weight'] = $value['weight']; 
     } 
     elseif (isset($elements[$key])) { 
     $elements[$key]['#weight'] = $value['weight']; 
     } 
    } 
    } 
    return $elements; 
} 

Donc, en raison de ce rappel, vous n'êtes pas en mesure de modifier le poids en utilisant un comportement normal.

Vous devriez faire ceci:

function YOUR_MODULE_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { 
    // Only for node pages. 
    if ($op == 'view' && $a4) { 
    $body_weight = 15 // Any weight. 
    $node->content['#content_extra_fields']['body']['weight'] = $body_weight; // This value CCK module will use to alter body weight in the callback from above. 
    } 
} 
Questions connexes