Drupal.settings, drupal_add_js és hook_form_alter

fox mulder képe

Üdv mindenkinek!

D7 modul fejlesztésével most próbálkozom először. A gondom az, hogy a hook_form_alter()-ben elhelyezett drupal_add_js('modulom' => $tomb), 'setting') összeadódva kerül át a javascript oldalra:

modulom.module:

  ...
  function modulom_form_alter(&$form, &$form_state, $form_id) {
    drupal_add_js(drupal_get_path('module', 'modulom') .'/teszt.js');
    $tomb = array('egy', 'kettő', 'három');
    drupal_add_js(array("modulom"=>array("valami"=>$tomb)),'setting');
    drupal_set_message("hook_form_alter");
}
  ...

A teszt.js ():

$().ready(function(){
  ...
  alert(Drupal.settings.modulom.valami);
  ...
});

eredmény:
  • alert ablakban: egy, kettő, három, egy, kettő, három
  • Drupal üzenet:
    • hook_form_alter
    • hook_form_alter

A Drupal üzenet szerint a modulom_form_alter kétszer fut le és a drupal_add_js még egyszer hozzáadja a már létező 'valami' változót. Nem lehet ellenőrizni valahogy a PHP oldalról, hogy létezik-e már egy bizonyos Drupal.settings.modulom.valami a js oldalon?

Köszönet

Drupal verzió: 
snufkin képe

Ellenorizhetsz egy static valtozot, vagy csak adott form id-re futtasd le a kodot.

0
0
fox mulder képe

..."ellenőrizhetsz egy static változót"?

0
0

Fox Mulder

snufkin képe

function modulom_form_alter(&$form, &$form_state, $form_id) {
  static $flag;
  if (!$flag) {
    drupal_add_js(drupal_get_path('module', 'modulom') .'/teszt.js');
    $tomb = array('egy', 'kettő', 'három');
    drupal_add_js(array("modulom"=>array("valami"=>$tomb)),'setting');
    drupal_set_message("hook_form_alter");
    $flag = TRUE;
  }
}
0
0
fox mulder képe

Ám mégsem értem a dolgot. Ha ez van a hook_form_FORM_ID_alter()-ben

drupal_add_js(array("modulom"=>array("valami"=>array(1,2,3))),'setting');

a JS oldalon:
alert(Drupal.settings.modulom.valami.length);

az ablakban ez van: 6

Még ha kétszer fut is le a drupal_add_js(), miért fűzi hozzá, miért nem cseréli (persze ugyanarra, de az is csere).

0
0

Fox Mulder

snufkin képe

Ha megnezed a drupal_add_js kodjat: http://api.drupal.org/api/drupal/includes--common.inc/function/drupal_ad... akkor lathatod, hogy siman csak hozzatolja a settings kodot a tombhoz:

switch ($options['type']) {
      case 'setting':
        // All JavaScript settings are placed in the header of the page with
        // the library weight so that inline scripts appear afterwards.
        $javascript['settings']['data'][] = $data;
        break;
 
      case 'inline':
        $javascript[] = $options;
        break;
 
      default: // 'file' and 'external'
        // Local and external files must keep their name as the associative key
        // so the same JavaScript file is not added twice.
        $javascript[$options['data']] = $options;
    }
0
0
fox mulder képe

A forráskódról megfeledkeztem :(

Köszönöm a segítséget.

0
0

Fox Mulder

aboros képe

értelem szerűen arra is fut a hook_form_alter. ahogy mondja snufkin, használd a hook_form_FORM_ID_alter hurkot.

0
0

-
clear: both;

fox mulder képe

A hook_form_FORM_ID_alter-t használom, csak ügyesen elhallgattam...

0
0

Fox Mulder

Sweetchuck képe

D7 űrlap kezelésében nem mindig fut le a *_form_aler().
Vannak olyan esetek amikor a gyorstárból szedi elő az űrlap definíciót ($form).
Azért inkább a #attached részbe érdemes pakolni a szükséges CSS+JS dolgokat.

PHP tömb/object átalakításnál JS tömbre/object/json, a numerikus kulcsok nem íródnak felül, hanem új tömböt alkotnak.

$settings['mymodule'] = array(0 => 'egy');
drupal_add_js(...);
 
$settings['mymodule'] = array(0 => 'kettő');
drupal_add_js(...);
,
JS megfelelője valójában ez lesz:
Drupal.settings.mymodule = [['egy', 'kettő']];
De ez nem biztos. Ha jól emlékszem D6-ban így volt.
2
0