Warning dopo adozione tabelle ed errore "no Schema type" per campo di tipo data
Ciao,
ho creato alcune tabelle aggiuntive all'interno del database (Mysql) di drupal che ho poi "adottato" da 'Amministrazione -> Struttura -> Data tables'.
Il processo è terminato con i seguenti warning (ripetuti più volte):
* Warning: Invalid argument supplied for foreach() in data_entity_entity_property_info() (linea 17 di /var/www/drupal/sites/all/modules/data/data_entity/data_entity.info.inc).
* Warning: array_keys() expects parameter 1 to be array, null given in data_search_get_fields() (linea 189 di /var/www/drupal/sites/all/modules/data/data_search/data_search.module).
* Warning: Invalid argument supplied for foreach() in data_search_get_fields() (linea 189 di /var/www/drupal/sites/all/modules/data/data_search/data_search.module).
Come mi devo comportare con tali warning?
Inoltre ora mi appare la segnalazione del seguente messaggio di errore (sia in 'Amministrazione -> Struttura -> Schema' che in 'Amministrazione -> Struttura -> Resoconti'):
* Field Tabella.campo_ditipo_Data: no Schema type for mysql type date.
* Tabella.campo_ditipo_Data: no type for Schema type date:normal.
* Field Tabella.campo_ditipo_Data: no Schema type for type date.
Ho caricato sia il modulo "dates" che "date" pensando di poter con essi gestire i campi di tipo data, ma non è sufficiente.
Come posso risolvere?
Grazie
Giovanni
Risposte
Ciao, è probabile che le
Ciao, è probabile che le tabelle adottate contengano colonne in formato datetime che è specifico per MySQL. Drupal utilizza dei timestamp numerici che sono indipendenti dal tipo di db, quindi più generici e portabili. Fai riferimento qui http://drupal.org/node/159605 dovresti utilizzare nello schema della tabella per quello specifico campo l'attributo 'mysql_type' => 'datetime'. Ora, usando Data, non hai un file di installazione dove è dichiarato lo schema delle tabelle necessarie: forse però potresti provare a modificare a runtime lo schema prima che venga utilizzato attraverso la funzione hook_views_data_alter (http://api.drupal.org/api/views/views.api.php/function/hook_views_data_a...).
Spero quetso sia un punto di partenza per trovare una soluzione al tuo problema.
Ciao, e grazie per la tua
Ciao,
e grazie per la tua risposta. Si in una tabella è presente un campo di tipo "date".
Non mi è chiaro dove modificare lo schema della tabella come da te suggerito ('mysql_type' => 'datetime') o come modificare lo schema a runtime.
Ti faccio inoltre un altro paio di domande:
- avendo creato io le tabelle che ho importato potrei anche cambiare il tipo nella tabella (dove avevo impostato oltre al tipo anche il formato di tipo dd/mm/yyyy), ma poi come posso gestire tale campo in fase di valorizzazione e visualizzazione?
- quale modulo dovrei utilizzare per interfacciarmi con tali tabelle ossia che mi permetta di effettuare l'inserimento/modifica/cancellazione dei dati su tali tabelle (ho caricato il modulo database ma non mi permette tutto ciò, al più la visualizzazione del contenuto mediante views).
Grazie.
Giovanni
Ciao, ho trovato un pò di
Ciao, ho trovato un pò di tempo per fare due prove, questo è il codice che ho scritto
(in questo caso ho una tabella "my_table" e il campo datetime "my_field") su un modulo che ho chiamato test.module:
<?php
class views_handler_field_raw_date extends views_handler_field_date {
function options_form(&$form, &$form_state) {
parent::options_form($form, $form_state);
}
function option_definition() {
$this->definition['title'] = 'Raw date';
$options = parent::option_definition();
return $options;
}
function render($values) {
$format = $this->options['date_format'] == 'custom' ? $this->options['custom_date_format'] : 'd/m/Y';
$value = $values->{$this->field_alias};
return date($format, strtotime($value));
}
}
function test_views_data_alter(&$data) {
$table = data_get_table('my_table');
if (!$table) return;
$table_schema = $table->get('table_schema');
if (!$table_schema) return;
$table_schema['fields']['my_field']['type'] = 'date';
$table_schema['fields']['my_field']['mysql_type'] = 'datetime';
$table->update( array('table_schema' => $table_schema) );
$data['my_table']['my_field']['field']['handler'] = 'views_handler_field_raw_date';
}
?>
ho aggiunto un semplice handler per visualizzare correttamente il campo nelle viste; purtroppo anche così il modulo Schema si lamenta lo stesso e non si riesce a far funzionare correttamente la gestione delle entità di Data. Purtroppo anche essendo a mio avviso molto utile credo che Data sia stato abbandonato e la versione disponibile contiene molti bug: non tutto funziona come dovrebbe.
Se vuoi realizzare le funzionalità CRUD su record di tabelle esterne, ti conviene utilizzare le entità di Drupal e programmarti ad hoc un modulo. Il modulo entity (drupal.org/project/entity) ti farà sicuramente risparmiare molto tempo nella scrittura del codice e in http://drupal.org/project/examples trovi un esempio che puoi usare come base di partenza (entity_example).
Spero ti sia utile.