Execute JavaScript on node creation of a specific

2019-08-11 17:09发布

I would like to execute a JavaScript function only on node creation and node edit of one specific content type. It is only one small function call.

Let's call the Drupal 7 content type "tear", and the JavaScript function "doitnow();"

Any ideas how to do this?

Thank you very much.

Nils

1条回答
我欲成王,谁敢阻挡
2楼-- · 2019-08-11 17:43

You have to create your own module and implement hook_node_insert(), hook_node_update() and hook_node_view() and take the appropriate steps. You also have to create some JavaScript codes with Drupal behavior, and you're ready. You have to use a temporary session variable after node creation/update, because this way you can check the existance of this variable in hook_node_view, and add the JS setting which "tells" a new "tear" content has been added.

You can download the whole module here.

You have to put this module to the sites/all/modules/testModule directory.

OK, here's the code of the module:

testModule.info:

name = Test Customization Module
description = Customizing stuffs on the site...
core = 7.x
package = My modules

scripts[] = js/testModule.behaviors.js

testModule.module:

/**
 * Implements hook_node_insert()
 * 
 * @see http://api.drupal.org/api/drupal/modules!node!node.api.php/function/hook_node_insert/7
 * @param object $node 
 */
function testModule_node_insert($node) {    
    switch ($node->type) {
        case 'tear':
            $_SESSION['tear_just_inserted'] = microtime();
            break;
    }
}

/**
 * Implements hook_node_update()
 * 
 * @see http://api.drupal.org/api/drupal/modules!node!node.api.php/function/hook_node_update/7
 * @param object $node 
 */
function testModule_node_update($node) {
    switch ($node->type) {
        case 'tear':
            $_SESSION['tear_just_inserted'] = microtime();
            break;
    }
}

/**
 * Implements hook_node_view().
 */
function testModule_node_view($node, $view_mode, $langcode) {
    switch ($node->type) {
        case 'tear':
            // we call doitnow() if it's needed (if "tear" content was added before)
            if (isset($_SESSION['tear_just_inserted'])) {
                drupal_add_js(array('testModule' => array('tear_just_added' => TRUE)), 'setting');
                unset($_SESSION['tear_just_inserted']);
            }

            break;
    }
}

/**
 * Implements hook_overlay_child_initialize()
 * @see http://api.drupal.org/api/drupal/modules!overlay!overlay.api.php/function/hook_overlay_child_initialize/7
 */
function testModule_overlay_child_initialize() {
    // Add our custom JavaScript: we don't want the node/add/tear to appear on the overlay, because this way the JS setting doesn't get added properly
    drupal_add_js(drupal_get_path('module', 'testModule') . '/js/testModule.overlay.behaviors.js');
}

js/testModule.behaviors.js:

(function ($) {   
    Drupal.behaviors.testModule = {
        doitnow: function(){
            alert("A new \"tear\" content has just been added!");
        },

        attach: function (context, settings) {
            try{
                if(settings.testModule.tear_just_added){
                    this.doitnow();
                }
            } catch(ex){}
        }
    };
})(jQuery);

js/testModule.overlay.behaviors.js:

(function ($) {
    // Disable overlay for creating the "tear" node.
    Drupal.behaviors.testModule = {
        attach: function (context, settings) {
            var $tear_link = $('a[href*="node/add/tear"]'),
            tear_link_href = $tear_link.attr('href');
            if( $tear_link.length > 0 ) {
                // we want to avoid opening the content adding for "tear" content type in the overlay
                // so we open it in the current window
                $tear_link.unbind();
                $tear_link.click(function(e){
                    window.open(tear_link_href,'_self',false);
                    e.stopPropagation();
                })
            }    
        };
    }
})(jQuery);

Ask if something isn't quite clear.

查看更多
登录 后发表回答