0

I have a content type called Project. I am linking users to this content type through several user reference fields.

I am also creating related Events (another content type) related to the Project content type pages through the Node Reference URL Widget.

So far so good, but...

In the Event content type I would like to add Attendees, through another user reference field, and limit the list of users to only those referenced in the original Project page. First I tried using a view, but I couldn't find the proper arguments / filters / relationships. Now I am trying through a custom module with hook_form_alter.

Could I get some advice on an efficient way to do this? Any ideas would be greatly appreciated.

EDIT: I have been working on this, and it seems I am almost there, but not quite. Bare with me as this is my first custom module and my php skills are quite basic. My structure (content type > fields) is as follows:

Project:

  • field_users (entity reference)

Event

  • field_project (entity reference, prepopulated from Project on event creation)
  • field_attendees (entity reference)

Then, in a custom module, I added the following code to modify the Event content type form:

<?php
function mymodule_form_alter(&$form, $form_state, $form_id) {
  if ($form_id == 'project_event_node_form') {
    $id_project=var_export( $form['field_project']['und']['#default_value'][0], TRUE );
    $project = node_load($id_project);
    $user_ref = array();
    foreach($project->field_users as $u){
      $user_ref[] = $u;
    }
    $form['field_attendees']['#options'] = $user_ref;
  }
}

But I still see all users, not just those referenced in the Project. Strangely enough, if I do: dpm($user_ref); I get this array, which contains the ids of the users I want to be able to choose from:

array (
  0 => 
  array (
    0 => 
    array (
      'target_id' => '7',
    ),
    1 => 
    array (
      'target_id' => '8',
    ),
    2 => 
    array (
      'target_id' => '9',
    ),
    3 => 
    array (
      'target_id' => '10',
    ),
  ),
)

But somehow I fail to pass that as the options for field_attendees. Any ideas?

  • I think I have narrowed down the problem. The array above that I am trying to pass as options in the form does not seem to have the same structure. The options in the form are like this: #options (Array, 12 elements) 0 (String, 9 characters ) Anonymous $...['field_attendees']['und']['#options'][0] 2 (String, 10 characters ) drecloshah $...['field_attendees']['und']['#options'][2] 3 (String, 10 characters ) prispehush $...['field_attendees']['und']['#options'][3] – castaway Nov 10 '12 at 20:23
0

I finally managed to get it working:

<?php

function my_module_form_alter(&$form, $form_state, $form_id) {
 if ($form_id == 'project_event_node_form') {
  $node = $form_state['node'];
   if (!isset($node->nid) || isset($node->is_new)) {
    /** This is a new node */
    $id_project=var_export($form['field_project']['und']['#default_value'][0], TRUE);
   }
   else {
    /** This is not a new node */
    $id_project=var_export($form['field_project']['und']['#default_value'][0], TRUE);
    /** horrible hack, but I can't get the nid to behave as an integer no matter what */
    $id_project = substr($id_project, 1, -1);
    /** no need to change the referenced project, hiding the field  */
    $form['field_projet'] = array('#type' => 'hidden');
   }
   /** common code */
   $project = node_load($id_project);
   $user_ref = array();
   foreach(field_get_items('node', $project, 'field_users') as $u){
   $usr_obj=user_load($u['target_id']);
   /** this makes the checkbox form render in a useable way */
   $user_ref[$usr_obj->uid]=$usr_obj->name;
   }
  $form['field_attendees']['und']['#options'] = $user_ref;
 }
}

Any suggestions or improvements are welcome, particularly with the dirty hack whith the nid behaving as a string in the node edit.

Although this is a rather simple module it is my first one, so I'd like to thank the patience and support of all those who helped with this, particularly Peyman and Josh at robustLINKS, bnjmnm and Michael.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.