Great module. I love the workflow and the avoidance of a modal solution.
I would like to pass query params to the node add page of my referenced node. Here is my use case:
Organization - node type, using organic groups this is a group type
Contact - node type, using organic groups this is a group post.
If I want to create a contact and auto-populate the group, I need to pass the group id on the command line:
http://example.com/node/add/contact?og_group_ref=1234
OG7 2.x uses entityreference_prepopulate (http://drupal.org/project/entityreference_prepopulate) to fill in the field value from the query param.
In Organization, I have a node reference field called Primary Contact which is a single value field referencing Contact nodes.
I would like to use nodeconnect to add contacts to Primary Contact from the Organization node edit form. This means passing query params to the node add page.
To do this, I added my own custom submit handler to the add button generated by nodeconnect:
function mymodule_form_organization_node_form_alter(&$form, &$form_state) {
// Only add group gid to edit forms (add forms have no nid/gid)
if (isset($form['nid']['#value'])) {
$org_gid = $form['nid']['#value'];
$form['field_primary_contact'][LANGUAGE_NONE][0]['add_nodeconnect__field_cis_org_channel_1_0']['#submit'][] = 'mymodule_add_group_flag_submit';
}
}
Then, in this function, I updated $form_state['redirect'] with my query value:
function mymodule_add_group_flag_submit(&$form, &$form_state) {
$url = $form_state['redirect'];
$form_state['redirect'] = array(
$url,
array(
'query' => array(
'og_group_ref' => $form['nid']['#value'],
)
),
);
}
This is almost working, but not quite. Because there is a 2nd drupal_goto() in the mix.
What I did here successfully adds the query string to the call made to admin/nodeconnect/add/%. So the page request is:
http://example.com/admin/connect/add/nodeconnect_cache_id?og_group_ref=1234
Unfortunately, there is another drupal_goto() in the callback, nodeconnect_add():
function nodeconnect_add($cache_id) {
$content = array();
$cache = cache_get($cache_id);
$field = field_info_field($cache->data['field']);
$acceptable_types = $field['settings']['referenceable_types'];
foreach (system_admin_menu_block(menu_get_item("node/add")) as $key => $item) {
$type = str_replace("-", '_', str_replace("node/add/", "", $item['path']));
if (isset($acceptable_types[$type]) && $acceptable_types[$type]) {
$item['href'] = $item['href'] . "/$cache_id";
$content[$key] = $item;
}
}
if (sizeof($content) == 1) {
$item = array_pop($content);
drupal_goto($item['href']);
}
$output = theme('node_add_list', array('content' => $content));
$output .= l(t('Cancel'), "admin/nodeconnect/return/$cache_id");
return $output;
}
Because of the way this drupal_goto() is called in this module, I can't think of a way to get the query string back in.
So I think I need to patch nodeconnect to get this to work. I think the way to do this would be to change nodeconnect_add() so that if there were any query params passed to that page request, they will be preserved and repassed to drupal_goto(). I don't know if this would screw up interactions with passed destination params though.
Would you accept such a patch? Is there a better way to go with this or am I missing anything?
| Comment | File | Size | Author |
|---|---|---|---|
| #1 | nodeconnect_add_preserve_query-1529056-1.patch | 693 bytes | dtarc |
Comments
Comment #1
dtarc commentedHere's the patch.
This patch will only preserve the query params if the noderef field only references a single node type. If more than one node type can be referenced then the node add page will show, and I'm not sure how to push the query setting into there (nor is it a use case I need to support).
I am using drupal_get_query_parameters() to get the query string. This allows the exclusion of any query params, so if this will cause any problems by preserving the destination param, it could easily be removed.