1

我正在开发一个提供 jvectormap 节点类型的 Drupal 模块。除了 drupal 一切正常.load()。我用

jQuery("#content").load(Drupal.settings.jvectormapnode.url+'/'+ code +'?ajax=1');

发生以下情况,我单击地图上的一个国家,这调用 /content/institutes/BE

/content/institutes is an views page with a contextual filter witch grabs the last part of the url and displays some data.

jvectormap 节点通过迷你面板和块包含在同一页面上(视图位于 div #content 中,jvectormap 位于迷你面板块中)

到目前为止一切正常。现在,当我单击第二个区域时,URL 突然切换到/content/undefined.

让我用一个例子来澄清一下:我单击比利时,URL 更改为 /content/institutes/BE,视图选择了它,然后我单击法国,URL 更改为 /content/undefined,但视图仍然正确反应并显示法国信息。现在我按 F5 刷新浏览器,drupal 说 /content/undefined 不存在。如果我在第一次单击(比利时)后按 F5,它会正确重新加载页面。该问题似乎发生在连续的 ajax 请求中。我可以用一个 url 别名来解决这个问题,这样就可以处理 F5 刷新边缘情况,看到其他一切正常,但如果其他人需要多个节点,他们就有一个(小)问题。

我怀疑.load这是发生这种情况的原因。

欢迎任何帮助谢谢。

jvectormapnode.js

(function ($) 
{
  Drupal.behaviors.jvectormapnode = 
  {
    attach: function (context, settings) 
    {
    $('#jvectormapnode').once('jvectormapnode', function() {  //fix duplicating behavior when using ajax

        highlighted=JSON.parse(Drupal.settings.jvectormapnode.coloredregions);
        //console.log(Drupal.settings.jvectormapnode.coloredregions);
        //console.log(highlighted);

            //change color of clicked region ==> todo
            /*
            currentSelected = '';
            defaultColor = '#00FF00';
            selectedColor = '#FF00FF'; 
            maphandle = $('#map-teste'); 

            maphandle.vectorMap({
                map: 'br_en',
                onRegionClick: function(event, code){
                    if(currentSelected !== code) {
                        if(currentSelected !== ''){
                            // Deselect, then select new choice
                            maphandle.vectorMap('set', 'colors', currentSelected, defaultColor);
                            maphandle.vectorMap('set', 'colors', code, selectedColor);
                            currentSelected = code;
                        } else {
                            // Nothing currently selected, go ahead and select
                            maphandle.vectorMap('set', 'colors', code, selectedColor);
                            currentSelected = code;
                        }
                    } else {
                        // Deselect
                        maphandle.vectorMap('set', 'colors', code, defaultColor);
                        currentSelected = '';
                    }
                    alert(code); // return the state
                }
            });*/

          $('#jvectormapnode').vectorMap({
                                        map: 'world_mill_en',
                                        focusOn: {
                                          x: Drupal.settings.jvectormapnode.x,
                                          y: Drupal.settings.jvectormapnode.y,
                                          scale: Drupal.settings.jvectormapnode.scale
                                        },
                                        color: '#aaaaaa',
                                        hoverColor: false,
                                        hoverOpacity: 0.5,
                                        backgroundColor: 'false',
                                        onRegionClick: function (event, code)   {

                                                                                //if(typeof(afunctiontodo!='undefined') afunctiontodo();
                                                                                //else
                                                                                //{
                                                                                    //window.location = Drupal.settings.jvectormapnode.url+'/'+ code;
                                                                                    jQuery("#content").load(Drupal.settings.jvectormapnode.url+'/'+ code +'?ajax=1');
                                                                                    //$('#jvectormapnode').vectorMap('set', 'focus', code);
                                                                                    //showSelectedCountry;
                                                                                //}
                                                                                },  
                                        series: {
                                        regions: [{
                                            values: highlighted ,
                                            attribute: 'fill'
                                        }]
                                    }

                                    });
        });
    }
  };
}(jQuery));

jvectormapnode.module

<?php
/**
 * @file 
 */

/**
 * @defgroup jvectormapnode : Node
 * @ingroup jvectormapnode
 * @{
 * 20130812 pieterm
 * Integrates jvectormapnode into Drupal through the node type system
 */


 /**
 * Implements hook_libraries_info().
 */
function jvectormapnode_libraries_info() {
  $libraries['jvectormap'] = array(
    'name' => 'jVectorMap',
    'vendor url' => 'http://jvectormap.com/',
    'download url' => 'http://jvectormap.com/download/',
    'version arguments' => array(
      'file' => 'jquery.jvectormap.min.js',
      'pattern' => '@jVectorMap version ([0-9\.]+)@',
      'lines' => 2,
      'cols' => 30,
    ),
    'versions' => array(
      '1.2.2' => array(
        'files' => array(
          'js' => array('jquery.jvectormap.min.js'),
          'css' => array('jquery.jvectormap.css'),
        ),
      ),
    ),
  );

  return $libraries;
}

/**
 * Implements hook_view().
 */
function jvectormapnode_view($node, $view_mode) {
      $node->content['jvectormapnodebody'] = array(
    '#markup' => _jvectormapnode_page($node),
    '#weight' => 1,
  );
    return $node;
}


/**
 * Implements hook_theme().
 * Overriding the default node template for jvectormapnode pages
 */
function jvectormapnode_theme($existing, $type, $theme, $path) {
    $items = array(
        'node__jvectormapnode' => array(
            // Don't specify the path in the template name.
            // Unless you have your template inside a directory within this module.
            'template' =>  'templates/node--jvectormapnode',
            'variables' => array('node' => (object)array()),
            // If you want to put the tpl in another location, you can use this key.
            //'theme path' => drupal_get_path('module', 'another_module'),
        ),
    );
    return $items;
}

/**
 * Implements hook_node_info().
 *
 * We use hook_node_info() to define our node content type.
 */
function jvectormapnode_node_info() {
  // We define the node type as an associative array.
  return array(
    'jvectormapnode' => array(
      'name' => t('jvectormapnode'),
      'base' => 'jvectormapnode', //function prefix hooks
      'description' => t('This is the jvectormapnode node type. It can display interactive maps.'),
      'title_label' => t('jvectormapnode page title'),
      'locked' => FALSE, //TODO SET TRUE
    ),
  );
}

/**
 * Implements hook_node_type_insert().
 * lets us know that a new content type has been inserted.
 * this gives us a chance to add the fields we want. (called for all node isnert!==>check type)
 */
function jvectormapnode_node_type_insert($content_type) {
  if ($content_type->type == 'jvectormapnode') {
    // Add default body field
    $body_instance = node_add_body_field($content_type, t('Information you want to show on each page before the content of the jvectormapnode module'));
    $body_instance['display']['example_node_list'] = array(
      'label' => 'hidden',
      'type' => 'text_summary_or_trimmed',
    );
    // Save our changes to the body field instance.
    field_update_instance($body_instance);

    // Create all the fields we are adding to our content type.
    foreach (_jvectormapnode_installed_fields() as $field) {
      field_create_field($field);
    }

    // Create all the instances for our fields.
    foreach (_jvectormapnode_installed_instances() as $instance) {
      $instance['entity_type'] = 'node';
      $instance['bundle'] = 'jvectormapnode';
      field_create_instance($instance);
    }
  }
}

/**
 * Define the fields for our content type.
 *
 * This big array is factored into this function for readability.
 *
 * @return
 *  An associative array specifying the fields we wish to add to our
 *  new node type.
 */
function _jvectormapnode_installed_fields() {
  return array(
      'jvectormapnode_field_color' => array(
      'field_name'  => 'jvectormapnode_field_color',
      'cardinality' => 1,
      'type'        => 'text',
    ),
      'jvectormapnode_field_url' => array(
      'field_name'  => 'jvectormapnode_field_url',
      'cardinality' => 1,
      'type'        => 'text',
    ),
      'jvectormapnode_field_width' => array(
      'field_name'  => 'jvectormapnode_field_width',
      'cardinality' => 1,
      'type'        => 'text',
    ),
      'jvectormapnode_field_height' => array(
      'field_name'  => 'jvectormapnode_field_height',
      'cardinality' => 1,
      'type'        => 'text',
    ),  
      'jvectormapnode_field_regions' => array(
      'field_name'  => 'jvectormapnode_field_regions',
      'cardinality' => 1,
      'type'        => 'text',
    ),  
          'jvectormapnode_field_scale' => array(
      'field_name'  => 'jvectormapnode_field_scale',
      'cardinality' => 1,
      'type'        => 'text',
    ),
          'jvectormapnode_field_x' => array(
      'field_name'  => 'jvectormapnode_field_x',
      'cardinality' => 1,
      'type'        => 'text',
    ),
          'jvectormapnode_field_y' => array(
      'field_name'  => 'jvectormapnode_field_y',
      'cardinality' => 1,
      'type'        => 'text',
    ),
  );
}

/**
 * Define the field instances for our content type.
 *
 * The instance lets Drupal know which widget to use to allow the user to enter
 * data and how to react in different view modes. 
 *
 * This big array is factored into this function for readability.
 *
 * @return
 *  An associative array specifying the instances we wish to add to our new
 *  node type.
 */
function _jvectormapnode_installed_instances() {
  return array(

    'jvectormapnode_field_url' => array(
      'field_name' => 'jvectormapnode_field_url',
      'label'       => t('URL, format http://www.vliz.be/en/...'),
      'widget'      => array(
        'type'    => 'text_textfield',
      ),
      ),
     'jvectormapnode_field_width' => array(
     'field_name' => 'jvectormapnode_field_width',
     'label'       => t('Map width, format px or %'),
     'widget'      => array(
     'type'    => 'text_textfield',
      ),
      ),
        'jvectormapnode_field_height' => array(
     'field_name' => 'jvectormapnode_field_height',
     'label'       => t('Map height, format px or %'),
     'widget'      => array(
     'type'    => 'text_textfield',
      ),
    ),
         'jvectormapnode_field_regions' => array(
     'field_name' => 'jvectormapnode_field_regions',
     'label'       => t('Regions to be highlighted'),
     'widget'      => array(
     'type'    => 'text_textfield',
      ),
      ),

          'jvectormapnode_field_color' => array(
      'field_name' => 'jvectormapnode_field_color',
      'label'       => t('Highlight color, HEX format #ffffff.'),
      'widget'      => array(
        'type'    => 'text_textfield',
      ),
    ),
              'jvectormapnode_field_scale' => array(
      'field_name' => 'jvectormapnode_field_scale',
      'label'       => t('Initial zoom, nummeric format.'),
      'widget'      => array(
        'type'    => 'text_textfield',
      ),
    ),
              'jvectormapnode_field_x' => array(
      'field_name' => 'jvectormapnode_field_x',
      'label'       => t('Initial x-axis focus, nummeric format.'),
      'widget'      => array(
        'type'    => 'text_textfield',
      ),
    ),
              'jvectormapnode_field_y' => array(
      'field_name' => 'jvectormapnode_field_y',
      'label'       => t('Initial y-axis focus, nummeric format.'),
      'widget'      => array(
        'type'    => 'text_textfield',
      ),
    ),
  );
}

/**
 * Implements hook_entity_info_alter().
 *
 * We need to modify the default node entity info by adding a new view mode to
 * be used in functions like node_view() or node_build_content().
 */
function jvectormapnode_entity_info_alter(&$entity_info) {
  // Add our new view mode to the list of view modes...
  $entity_info['node']['view modes']['example_node_list'] = array(
    'label' => t('Example Node List'),
    'custom settings' => TRUE,
  );
}

/**
 * Implement hook_form().
 *
 * Drupal needs for us to provide a form that lets the user
 * add content. This is the form that the user will see if
 * they go to node/add/node-example.
 */
function jvectormapnode_form($node, $form_state) {
  return node_content_form($node, $form_state);
}

/**
 * Implements hook_field_formatter_info().
 */
function jvectormapnode_field_formatter_info() {
  return array(
    'jvectormapnode_field_color' => array(
      'label' => t('jvectormapnode color Handle'),
      'field types' => array('text'),
    ),
    'jvectormapnode_field_url' => array(
      'label' => t('jvectormapnode url Handle'),
      'field types' => array('text'),
    ),
        'jvectormapnode_field_width' => array(
      'label' => t('jvectormapnode width Handle'),
      'field types' => array('text'),
    ),
        'jvectormapnode_field_height' => array(
      'label' => t('jvectormapnode height Handle'),
      'field types' => array('text'),
    ),
        'jvectormapnode_field_regions' => array(
      'label' => t('jvectormapnode regions Handle'),
      'field types' => array('text'),
    ),  
            'jvectormapnode_field_scale' => array(
      'label' => t('jvectormapnode scale Handle'),
      'field types' => array('text'),
    ),          
    'jvectormapnode_field_x' => array(
      'label' => t('jvectormapnode x Handle'),
      'field types' => array('text'),
    ),
        'jvectormapnode_field_y' => array(
      'label' => t('jvectormapnode y Handle'),
      'field types' => array('text'),
    ),      
  );
}

/**
 * Implements hook_help().
 */
function jvectormapnode_help($path, $arg) {
  switch ($path) {
    case 'examples/jvectormapnode':
      return "<p>" . t("The Node Example module provides a custom node type.
        You can create new Example Node nodes using the <a href='!nodeadd'>node add form</a>.",
        array('!nodeadd' => url('node/add/node-example'))) . "</p>";
  }
}

/**
 * Page callback to show jvectormapnode
 */
function _jvectormapnode_page($n) {
    //get params from drupal entity created by user in add content
    $dcolor= field_get_items('node', $n, 'jvectormapnode_field_color');
    $dcolor=render(field_view_value('node', $n, 'jvectormapnode_field_color',$dcolor[0]));

    $durl= field_get_items('node', $n, 'jvectormapnode_field_url');
    $durl=render(field_view_value('node', $n, 'jvectormapnode_field_url',$durl[0]));

    $dwidth= field_get_items('node', $n, 'jvectormapnode_field_width');
    $dwidth=render(field_view_value('node', $n, 'jvectormapnode_field_width',$dwidth[0]));

    $dheight= field_get_items('node', $n, 'jvectormapnode_field_height');
    $dheight=render(field_view_value('node', $n, 'jvectormapnode_field_height',$dheight[0]));   

    $dregions= field_get_items('node', $n, 'jvectormapnode_field_regions');
    $dregions=render(field_view_value('node', $n, 'jvectormapnode_field_regions',$dregions[0]));    

    $dscale= field_get_items('node', $n, 'jvectormapnode_field_scale');
    $dscale=render(field_view_value('node', $n, 'jvectormapnode_field_scale',$dscale[0]));  

        $dx= field_get_items('node', $n, 'jvectormapnode_field_x');
    $dx=render(field_view_value('node', $n, 'jvectormapnode_field_x',$dx[0]));  

        $dy= field_get_items('node', $n, 'jvectormapnode_field_y');
    $dy=render(field_view_value('node', $n, 'jvectormapnode_field_y',$dy[0]));  

    //$coloredregions=array();

    $exploderegions = explode(",", $dregions);

    $coloredregions=array();
    foreach ($exploderegions as $region) 
        {
        $coloredregions[$region] = $dcolor ;
        }

    $coloredregions_object = json_encode($coloredregions);

    $jvectormapnodebody.= '<div style="width: '.$dwidth.'; height: '.$dheight.'" id="jvectormapnode"></div>';


    libraries_load('jvectormap');

    drupal_add_js('/sites/all/modules/vliz/jvectormapnode/js/maps/jquery-jvectormap-world-mill-en.js');

    drupal_add_js(array('jvectormapnode' => array('url' => $durl,'coloredregions'=> $coloredregions_object,'scale' => $dscale,'x' => $dx,'y' => $dy)), 'setting');

    drupal_add_js('/sites/all/modules/vliz/jvectormapnode/js/jvectormapnode.js');

    return $jvectormapnodebody;
}



/**
 * @} End of "defgroup jvectormapnode".
 */
4

2 回答 2

0

code回调中传递的参数似乎onRegionClick是未定义的。

你能做一个console.log()论据来知道确切的价值吗?通常这应该是字符串形式的区域代码。(即:'BE','NL',...)

onRegionClick: function (event, code) {
     console.log(code);
}
于 2013-08-28T22:07:24.367 回答
0

我发现了导致未定义的原因,这是有效的代码

jQuery("#content").load(Drupal.settings.jvectormapnode.url+'/'+ code ,'ajax=1' ,
function() {Drupal.attachBehaviors('#content');});

希望这对其他人有帮助

于 2013-09-02T10:59:09.497 回答