includere script in blocco

12 contenuti / 0 new
Ultimo contenuto
includere script in blocco

Ciao Ragazzi.

Avrei bisogno di capire come integrare una piccola funzione che ho realizzato in php allinterno di un blocco drupal.

Mi spiego: Ho creato, seguendo passo passo questa guida, quindi anche con gli stessi file, una select dinamica che mi prende i valori dal db di drupal.

Ora vorrei inserire questo script in drupal ma come faccio? se metto il codice del file select.php (vedi codice dal link) non mi fà l'include del file select.class.php e mi genera una wsod.
Se metto il codice della classe nel blocco funziona ma poi non mi richiama i valori alla select dinamica, e comunque non funziona correttamente perchè non capisco da dove prende alcuni valori.

In pratica che devo fare? Pensavo di creare un modulo che crei un blocco con quello script ma come si crea? dove metto le classi e le funzioni?

Datemi una mano almeno a capire da dove posso partire.

Ciao caro,
vedi con Drupal si programma in "drupalese", guarda qui e te ne renderai conto: http://mavimo.org/drupal/ahah_form

L'articolo che indichi è molto ben fatto ma il titolo dice "select con php e jquery" mentre con drupal si fanno le select con php e ajax.

Se non ti basta la pagina di mavimo ti dò altra documentazione. C i a o

Grazie Danzisi

ho visto quello che mi hai linkato. sembra proprio quello che voglio riuscire a fare io ma presenta qualche complicazione che per un non programmatore potrebbe essere fatale!

Innanzitutto mi pare che quello che genera quel modulo sia una pagina e non un blocco, poi mi sembra che la prima select (quella contenente Option A, B e C) sia stata impostata a mano e non richiami un db.

Io domani ci provo... anche se credo di riuscire a far poco, in ogni caso spero mi riuscirai a supportare ancora!

Grazie;)

Fra!

Si ti supporto volentieri, figurati. Ma non avevo capito che non sai il php... Comunque drupal viene in aiuto ai non-programmatori con moduli apposta del tipo:

http://drupal.org/project/hierarchical_select

io non l'ho mail provato, dovresti quindi leggerti il readme.
Ci aggiorniamo
Ciao

Grazie ancora Danzisi!

Si diciamo che col php sto iniziando a studiare qualcosa... Sto iniziando a capire la logica, ma poi come ogni cosa è solo con la pratica che si diventa bravi.

Comunque col link di mavimo e leggendo qua e la (anche tuoi post) sono riuscito ad ottenere un form che faccia praticamente quello che fa quello in php+jquery che ho postato all'inizio.

Il codice attualmente non ce l'ho su questo pc, ma domani lo posto.

Ora però come puoi vedere nel tutorial di mavimo il form viene generato in una pagina attraverso la funzione

function _menu()

Io invece vorrei che il modulo generasse un blocco col form così da poterlo gestire nelle varie regioni.

Immagino non sia difficile. Mi potresti suggerire altre fonti? Intanto grazie ancora e domani posto il codice.

Ciao fra_ore_90 ,

sei molto gentile ed è un piacere postare con te.
Dunque per avere "qualcosa" in un blocco c'è l' hook_block() di drupal, ipotizzando che implementi il modulo di nome fightfi, un codice del tipo:

<?php
/**
* Implementation of hook_block().
*/
function fightfi_block($op = 'list', $delta = 0) {
 
$block = array();
  switch (
$op) {
    case
'list':
     
$block[0]['info'] = t('Sidebar Links');
     
$block[1]['info'] = t('Footer Links');
      return
$block;
    case
'view':
      switch (
$delta) {
    case
0:
     
$block['subject'] = t('Sidebar Links');
     
$block['content'] = fightfi_main();
      break;
    case
1:
     
$block['subject'] = t('Footer Links');
     
$block['content'] = $block_content;
      break;
      }
      return
$block;
  }
}
// end function fightfi_block
/**
* Implementation of hook_main().
*/
function fightfi_main() {
   ......
  return
$output;
}
// end
?>

Il concetto è che il contenuto di un blocco può essere una variabile ($block_content che nell'esempio sopra è vuota) oppure una funzione (che sopra è da implementare).

Oppure, per fare un blocco, il codice php può essere inserito da admin/build/block/add senza dimenticare i tag del php come c'è scritto.

Ciao
Fammi sapere il risultato!

Allora Vediamo.

Io non voglio aggiungere un blocco attraverso admin/build/block/add visto che ormai mi sono imbarcato nella costruzione del mio primo modulo!!!

Mettiamo che il risultato ottenuto è identico a quello del post di mavimo dove aggiungo la funzione hook_block alla fine dello script? ovvero dopo

// Renderizza e restituisce il field modificato
  return drupal_render($new_form);
}

oppure in un file a parte?

Come faccio a fargli stampare dentro il form se questo viene creato a sua volta da altre funzioni?! So che sono un po' troppe richieste ma magari mi serviranno pure per apprendere un po' meglio i meccanismi di php!

Grazie ancora!

Fra :)

Ciao,
si la funzione hook_block() va aggiunta nel file su cui stai lavorando, dove vuoi, l'importante che la sintassi sia corretta. Avrai notato che nello script di mavimo ci sono 2 hook: hook_menu() e hook_form() poi in drupal si possono aggiungere tutte le funzioni che vuoi stando attenti al fatto che non esista già. (Infatti c'è la funzione function testhaha_js() {...)
Ecco perchè function testhaha_form() { fa parte del modulo testhaha e sicuramente in un sito drupal è l'unico nome.

Detto questo, sempre prendendo spunto dal codice di mavimo tu creerai nel tuo file:

function testhaha_block($op = 'list', $delta = 0) {
  if ($op == 'list') {
    $blocks[0]['info'] = t('Titolo');
    return $blocks;
  } else if ($op == 'view') {
    $block['subject'] = t('Titolo');
    //questo che segue dovrebbe essere esatto perchè viene già chiamato
   //'page callback'    => 'drupal_get_form', nell' hook_menu di mavimo
   //altrimenti:
   //$block['content'] = drupal_get_form('testhaha_form');
    $block['content'] = testhaha_form();
    return $block;
  }
}

Avrai così il tuo blocco con il codice ahah di esempio di mavimo.
Un'atra dritta ti voglio dare: nell'esempio di mavimo nell'hook_menu viene usato il codice:

$items['testhaha/js'] = array(
'title' => t('JSON'),
'description' => t('Get data for haha'),
'page callback' => 'testhaha_js',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);

Questo comporta che nei permessi dovrai impostare il permesso appunto agli 'access content' mentre io preferiso far utilizzare il json a tutti (altrimenti ti restituisce errore HTTP 0) utilizzando questo codice:

$items['testhaha/js'] = array(
'page callback' => 'testhaha_js',
'access callback' => TRUE,
'access arguments' => TRUE,
'type'=> MENU_CALLBACK,
);

Per oggi è tutto!

Danzisi ci siamo quasi!
Bel lavoretto!

Ti posto il codice che fin ora ho prodotto e poi ti dico quello su cui mi sono fermato.

Ti faccio subito notare che ho tolto alcune funzionalità dal modulo di partenza di mavimo, forse proprio quelle relative al' AHAH eppure sembra che funzioni lo stesso. Ci sto lavorando in locale e praticamente quando seleziono una marca i modelli vengono richiamati dal db lo stesso. io non capisco perchè però va. Magari se ti va di spiegarmi i punti più difficili te ne sarei infinitamente grato (anche se comunque già te ne sono!)

<?php // $Id$
/**
* Genera FORM per ricerca Veicoli d'occasione.
*/
function ricercaveicoli_vo_form() {
$sql = "SELECT marca, vo FROM marchestockvo"; // Il campo vo contiene un contatore dei record
$result = db_query($sql);
$optionsmarche = array();
$optionsmarche[''] = "Scegli una marca"; // Inserisce una prima option vuota in cima alla lista delle marche.
// Aggiunge i valori di ogni record trovato nella tabella del db nell'array $optionsmarche.
while ($row = db_fetch_array($result)) {
        $optionsmarche[$row['marca']] = $row['marca'] . " (" . $row['vo'] . ")";
    };
$form['#method'] = GET;
$form['#action'] = url('http://www.miodominio.it/ricercaUsato');
$form['#id'] = 'formUsato';
  $form['vo_marca'] = array(
'#type'          => 'select',
'#id'         => 'vo_marca',
    '#options'       => $optionsmarche,
  );
$form['vo_modello'] = array(
'#type'          => 'select',
'#id'         => 'vo_modello',
'#options'       => array('' => 'Scegli un modello'),
);
$form['vo_sede'] = array(
'#type'          => 'select',
'#id'         => 'vo_sede',
'#options'       => array('All' => 'Scegli una sede' , 'MILANO' => 'Milano' , 'FIRENZE' => 'Firenze' ),
);
$path = base_path();  // Eredita la path base del sito per evitare url assoluti.
$form['submit'] = array(
'#type' => 'image_button',
'#value' => t('Cerca'),
'#attributes' => array(
'src' => $path . 'sites/all/themes/zensub/images/bottoni/cerca.png',
),
);
return $form;
}
/**
* AJAX Callback function for modelli VO.
*/
function ricercaveicoli_js() {
$id = $_POST['vo_marca'];
$sql = "SELECT modello, vo FROM modellistockvo WHERE marca='$id'";
$result = db_query($sql);
$optionsmodelli = array();
while ($row = db_fetch_array($result)) {
$optionsmodelli[$row['modello']] = $row['modello'] . " (" . $row['vo'] . ")";
}
$form = array(
'#type'          => 'select',
'#options'       => $optionsmodelli,
);
$output = ahah_field_render($form, 'vo_modello');
print drupal_to_js(array('data' => $output, 'status' => true));
exit();
}
/**
* Genera FORM per Veicoli Nuovi.
*/
function ricercaveicoli_vn_form() {
$form['#method'] = GET;
$form['#action'] = url('http://www.miodominio.it/ricercaNuovo.php');
$form['#id'] = 'formNuovo';
  $form['marca'] = array(
'#type'          => 'select',
'#id'         => 'vn_marca',
      '#options' => array('fiat' => 'Fiat', 'citroen' => 'Citroen'),
  );
$form['modello'] = array(
'#type'          => 'select',
'#id'         => 'vn_modello',
'#options' => $optionsmodellivn,
);
$path = base_path();  // Eredita la path base del sito per evitare url assoluti.
$form['submit'] = array(
'#type' => 'image_button',
'#value' => t('Cerca'),
'#attributes' => array(
'src' => $path . 'sites/all/themes/zensub/images/bottoni/cerca.png',
),
);
return $form;
}
/**
* Rimuove i campi nascosti form_token, form_build_id, form_id generati di Default da Drupal
* altrimenti vengono passati nell'url attraverso la funzione GET e sballano i risultati della ricerca.
*
* Vedi: http://stackoverflow.com/questions/1497298/preventing-form-token-from-re... *
*/
function ricercaveicoli_form_alter(&$form, $form_state, $form_id) {
if (($form_id == 'ricercaveicoli_vo_form') || ($form_id == 'ricercaveicoli_vn_form')) {
// Unset the hidden token field and form_build_id field.
unset($form['form_token'], $form['form_build_id'], $form['form_id']);
}
}
/**
* Crea un blocco contentente il motore di ricerca.
*/
function ricercaveicoli_block($op = 'list', $delta = 0) {
$block = array();
switch ($op) {
// Genera il blocco nella lista dei blocchi.
case 'list':
$block[0]['info'] = t('Ricerca Veicolo');
return $block;
// Genera il blocco quando è impostato in una regione del sito.
case 'view':
$block['subject'] = t('Ricerca Veicolo');
$block['content'] = drupal_get_form('ricercaveicoli_vn_form');
return $block;
}
}
// Tutto questo che segue può essere omesso... PERCHE'????
/**
* Cambia il form in cache al volo
*/
function ahah_field_render($fields, $name) {
  // Cambia lo status del form
  $form_state = array('submitted' => FALSE);
  // Recupera l'id del form
  $form_build_id = $_POST['form_build_id'];
  // Recupera il form dalla cache
  $form = form_get_cache($form_build_id, $form_state);
  // Sostituisce il field
  $form[$name] = $fields;
  // Mette il form modificato in cache
  form_set_cache($form_build_id, $form, $form_state);
  $form += array(
    '#post' => $_POST,
    '#programmed' => FALSE,
  );
  // Rigenera il form
  $form = form_builder($_POST['form_id'], $form, $form_state);
  // Estrae il field modificato
  $new_form = $form[$name];
  // Renderizza e restituisce il field modificato
  return drupal_render($new_form);
}

Ora il problema è che io non riesco a far stampare i due form nel blocco. Vorrei ottenere qualcosa tipo http://d2o0t5hpnwv4c1.cloudfront.net/001_Tabbed/site/jQuery.html in cui i tabs sarebbero Ricerca usato e ricerca nuovo.

Come posso fare? come posso stampare nello stesso contenuto del blocco i due form con il resto del codice html che mi genera il div a tab?

Spero che ancora mi riuscirai ad aiutare!

Buona Giornata

Fra

Scrivimi
http://www.drupalitalia.org/user/6507
questo post è veramente lungo....

Danzisi io ti ho scritto ma penso di non poter ricevere perchè se vado su

http://www.drupalitalia.org/user/2728/contact

mi dice accesso negato...

Allora ho quasi finito il modulo (considerate che tutto quello che ho scritto 2 post sopra è assolutamente errato)
ho seguito quasi alla lettera il primo, famoso, post di mavimo.

Tutto funziona bene. Drupal attiva ajax e ripopola la seconda select. Ora ho un problemino...

Preaticamente dopo che la seconda select si è correttamente popolata praticamente mi va in tilt view_nivo_slider... Mi sballa tutte le immagini da visualizzare.

Io credo che possa dipendere dalla chiamata print drupal_to_js(array('data' => $output, 'status' => true)); e forse dalla variabile data che da quello che ho visto è usata anche nel js del modulo view nivo slider..

Qualcuno mi può dare una dritta? Mi potreste dire come posso popolare la select senza usare ('data' => $output

Grazie a chi mi aiuterà!

Per Danzi. Grazie mille ancora. Ho trovato altre cose utili tra i tuoi post!