2012-09-13 19 views
5

Estoy intentando agregar algunas funcionalidades de autocompletar personalizadas a un par de campos de texto en la página de registro de mi usuario, siguiendo las líneas de este tutorial; http://drupal.org/node/854216.Error Drupal FAPI; No se pueden crear referencias hacia/desde desplazamientos de cadena ni objetos sobrecargados

He podido lograrlo con éxito, pero ahora, cada vez que envío el formulario de registro, aparece una página en blanco, y este error aparece en el 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

No puedo encontrar el tema ahora, pero cuando yo estaba buscando en Google inicialmente este problema he leído por ahí que este tema es por lo general que el símbolo '#' se ha añadido o perdido de una clave de propiedad. Porque sin un símbolo # trata el valor de esa propiedad como un niño, y por lo tanto una matriz. O algo por el estilo, pero después de revisarlo dos veces parece que todas las propiedades que estoy usando deberían ser como las he puesto.

Aquí está el código, ¿alguien sabe lo que estoy haciendo mal?

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); 
} 

Algunas cosas que me trataron

Al tratar de reducir el problema determiné que comentando estas dos líneas;

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

elimina el error, sin embargo, que, naturalmente, significa que el autocompletar también se desactiva.


reemplazando Además el contenido de city_autocomplete ($ cadena) con

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

no resuelve el error, lo que significa que el problema no es algo en el que la función.


Extracción del símbolo # de estas dos líneas

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

provoca el error anterior que se sustituye con éste,

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

Respuesta

5

formas de campo son poco confuso en Drupal 7, tiene un vistazo a Why is hook_form_alter so messy in d7? para un poco de un desglose.

Basta con decir que los elementos HTML reales (aquellos para los que desea cambiar los valores) se encuentran más profundamente en la matriz, p.

$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

Esa configuración es bastante problemática, especialmente teniendo en cuenta que de lo contrario estaba funcionando. Muchas gracias sin embargo. :) – Ardnived

Cuestiones relacionadas