Ответы:
Для Drupal 6,
Это должен быть 3-й параметр
drupal_goto($path = '', $query = NULL, $fragment = NULL, $http_response_code = 302)
drupal_goto("products", NULL, $node->nid);
Для Drupal 7
drupal_goto($path = '', array $options = array(), $http_response_code = 302)
drupal_goto("products", array('fragment' => $node->nid));
В Drupal 6 drupal_goto использует третий параметр для фрагментации. Если вы хотите сделать url-подобный продукт # 345, вы должны передать его фрагмент в качестве третьего аргумента в функции drupal_goto.
drupal_goto("products", NULL, $node->nid); // where $node->nid is the fragment.
В Drupal 7 вы должны передать фрагмент как пару ключ-значение массива по второму параметру функции drupal_goto.
drupal_goto('products', array('fragment' => $node->nid)) ; // where $node->nid is the fragment.
Оба из приведенных выше приведут к URL-продуктам # 123, где 123 - значение переменной $ node-> nid.
drupal_goto теряет #zzz, если существует? destination = foobar # zzz, так как он никогда не возвращается $ _SERVER, удалите эту строку, так как ничего не делайте, кроме разбивки:
//$options['fragment'] = $destination['fragment']; // removed
is the same as
$options['fragment']='';