2012-09-13 8 views
5

Sto tentando di aggiungere alcune funzionalità di completamento automatico personalizzato a un paio di campi di testo sulla mia pagina di registrazione utente, sulla falsariga di questo tutorial; http://drupal.org/node/854216.Errore FAPI Drupal; Impossibile creare riferimenti a/da offset di stringa né oggetti sovraccaricati

Sono riuscito a farlo con successo, ma ora ogni volta che invio il modulo di registrazione ottengo una pagina vuota e questo errore si presenta nel registro;

PHP Fatal error: Cannot create references to/from string offsets nor overloaded objects in /var/www/html/drupal/includes/common.inc on line 6448, referer: http://[...]/drupal/?q=user/register

non riesco a trovare l'argomento ora, ma quando mi è stato inizialmente googling questo problema che ho letto da qualche parte che la questione è in genere che il simbolo '#' è stato aggiunto o persa da una chiave di proprietà. Perché senza un simbolo # considera il valore di quella proprietà come un bambino, e quindi una matrice. O qualcosa del genere, ma dopo il doppio controllo sembra che tutte le proprietà che sto usando debbano essere come le ho messe io.

Ecco il codice, qualcuno sa cosa sto facendo male?

function gtx_alterations_menu() { 
    $items = array(); 
    $items['city/autocomplete'] = array(
    'page callback' => 'city_autocomplete', 
    'access callback' => TRUE, 
    'type' => MENU_CALLBACK 
); 
    return $items; 
} 

function gtx_alterations_form_alter(&$form, &$form_state, $form_id) { 
    if ($form_id == 'user_register_form') { 
    $form['field_city_of_residence']['#type'] = 'textfield'; 
    $form['field_city_of_residence']['#title'] = t('City of Residence'); 
    $form['field_city_of_residence']['#autocomplete_path'] = 'city/autocomplete'; 
    $form['field_headquarters_location']['#type'] = 'textfield'; 
    $form['field_headquarters_location']['#title'] = t('Headquarters Location'); 
    $form['field_headquarters_location']['#autocomplete_path'] = 'city/autocomplete'; 
    } 
} 

function city_autocomplete($string = '') { 
    $cities = array(); 
    $locations = array(); 
    $results = file_get_contents('http://graph.facebook.com/search?q='.urlencode($string).'&type=adcity'); 

    $results = preg_replace('/\\\\u0*([0-9a-fA-F]{1,5})/', '&#x\1;', $results); 

    preg_match_all('/"name":"[^,]+/', $results, $cities); 
    preg_match_all('/"subtext":".+?,[^"]+/', $results, $locations); 

    $final = array(); 

    foreach ($cities[0] as $key => $value) { 
    $value = substr($value, 8); 
    $subtext = substr($locations[0][$key], 11); 
    $result = $value . ', ' . $subtext; 

    $final[$result] = $result; 
    } 

    drupal_json_output($final); 
} 

Alcune cose che ho provato

Quando si cerca di circoscrivere il problema ho deciso che commentare queste due linee;

$form['field_city_of_residence']['#autocomplete_path'] = 'city/autocomplete'; 
$form['field_headquarters_location']['#autocomplete_path'] = 'city/autocomplete'; 

rimuove l'errore, tuttavia ciò significa che anche il completamento automatico è disabilitato.


Inoltre sostituendo il contenuto del city_autocomplete ($ string) con

drupal_json_output(array('test' => 'test')); 

non risolve l'errore, il che significa che il problema non è qualcosa in quella funzione.


Rimozione del simbolo # da queste due linee

$form['field_city_of_residence']['#autocomplete_path'] = 'city/autocomplete'; 
$form['field_headquarters_location']['#autocomplete_path'] = 'city/autocomplete'; 

causa l'errore precedente da sostituire con questo,

Unsupported operand types in /var/www/html/drupal/includes/form.inc on line 1755 

risposta

5

forme di campo sono po 'di confusione in Drupal 7, hanno un'occhiata a Why is hook_form_alter so messy in d7? per un po 'di guasti.

Basti dire che gli elementi HTML effettivi (quelli per cui si desidera modificare i valori per) si trovano più in profondità nell'array, ad es.

$form['field_city_of_residence'][LANGUAGE_NONE][0]['value']['#type'] = 'textfield'; 
$form['field_city_of_residence'][LANGUAGE_NONE][0]['value']['#title'] = t('City of Residence'); 
$form['field_city_of_residence'][LANGUAGE_NONE][0]['value']['#autocomplete_path'] = 'city/autocomplete'; 
+0

Questa configurazione è piuttosto problematica, soprattutto considerando che altrimenti funzionerebbe. Grazie mille però. :) – Ardnived

Problemi correlati