cms/drupal/misc/machine-name.js
changeset 541 e756a8c72c3d
equal deleted inserted replaced
540:07239de796bb 541:e756a8c72c3d
       
     1 (function ($) {
       
     2 
       
     3 /**
       
     4  * Attach the machine-readable name form element behavior.
       
     5  */
       
     6 Drupal.behaviors.machineName = {
       
     7   /**
       
     8    * Attaches the behavior.
       
     9    *
       
    10    * @param settings.machineName
       
    11    *   A list of elements to process, keyed by the HTML ID of the form element
       
    12    *   containing the human-readable value. Each element is an object defining
       
    13    *   the following properties:
       
    14    *   - target: The HTML ID of the machine name form element.
       
    15    *   - suffix: The HTML ID of a container to show the machine name preview in
       
    16    *     (usually a field suffix after the human-readable name form element).
       
    17    *   - label: The label to show for the machine name preview.
       
    18    *   - replace_pattern: A regular expression (without modifiers) matching
       
    19    *     disallowed characters in the machine name; e.g., '[^a-z0-9]+'.
       
    20    *   - replace: A character to replace disallowed characters with; e.g., '_'
       
    21    *     or '-'.
       
    22    *   - standalone: Whether the preview should stay in its own element rather
       
    23    *     than the suffix of the source element.
       
    24    *   - field_prefix: The #field_prefix of the form element.
       
    25    *   - field_suffix: The #field_suffix of the form element.
       
    26    */
       
    27   attach: function (context, settings) {
       
    28     var self = this;
       
    29     $.each(settings.machineName, function (source_id, options) {
       
    30       var $source = $(source_id, context).addClass('machine-name-source');
       
    31       var $target = $(options.target, context).addClass('machine-name-target');
       
    32       var $suffix = $(options.suffix, context);
       
    33       var $wrapper = $target.closest('.form-item');
       
    34       // All elements have to exist.
       
    35       if (!$source.length || !$target.length || !$suffix.length || !$wrapper.length) {
       
    36         return;
       
    37       }
       
    38       // Skip processing upon a form validation error on the machine name.
       
    39       if ($target.hasClass('error')) {
       
    40         return;
       
    41       }
       
    42       // Figure out the maximum length for the machine name.
       
    43       options.maxlength = $target.attr('maxlength');
       
    44       // Hide the form item container of the machine name form element.
       
    45       $wrapper.hide();
       
    46       // Determine the initial machine name value. Unless the machine name form
       
    47       // element is disabled or not empty, the initial default value is based on
       
    48       // the human-readable form element value.
       
    49       if ($target.is(':disabled') || $target.val() != '') {
       
    50         var machine = $target.val();
       
    51       }
       
    52       else {
       
    53         var machine = self.transliterate($source.val(), options);
       
    54       }
       
    55       // Append the machine name preview to the source field.
       
    56       var $preview = $('<span class="machine-name-value">' + options.field_prefix + Drupal.checkPlain(machine) + options.field_suffix + '</span>');
       
    57       $suffix.empty();
       
    58       if (options.label) {
       
    59         $suffix.append(' ').append('<span class="machine-name-label">' + options.label + ':</span>');
       
    60       }
       
    61       $suffix.append(' ').append($preview);
       
    62 
       
    63       // If the machine name cannot be edited, stop further processing.
       
    64       if ($target.is(':disabled')) {
       
    65         return;
       
    66       }
       
    67 
       
    68       // If it is editable, append an edit link.
       
    69       var $link = $('<span class="admin-link"><a href="#">' + Drupal.t('Edit') + '</a></span>')
       
    70         .click(function () {
       
    71           $wrapper.show();
       
    72           $target.focus();
       
    73           $suffix.hide();
       
    74           $source.unbind('.machineName');
       
    75           return false;
       
    76         });
       
    77       $suffix.append(' ').append($link);
       
    78 
       
    79       // Preview the machine name in realtime when the human-readable name
       
    80       // changes, but only if there is no machine name yet; i.e., only upon
       
    81       // initial creation, not when editing.
       
    82       if ($target.val() == '') {
       
    83         $source.bind('keyup.machineName change.machineName input.machineName', function () {
       
    84           machine = self.transliterate($(this).val(), options);
       
    85           // Set the machine name to the transliterated value.
       
    86           if (machine != '') {
       
    87             if (machine != options.replace) {
       
    88               $target.val(machine);
       
    89               $preview.html(options.field_prefix + Drupal.checkPlain(machine) + options.field_suffix);
       
    90             }
       
    91             $suffix.show();
       
    92           }
       
    93           else {
       
    94             $suffix.hide();
       
    95             $target.val(machine);
       
    96             $preview.empty();
       
    97           }
       
    98         });
       
    99         // Initialize machine name preview.
       
   100         $source.keyup();
       
   101       }
       
   102     });
       
   103   },
       
   104 
       
   105   /**
       
   106    * Transliterate a human-readable name to a machine name.
       
   107    *
       
   108    * @param source
       
   109    *   A string to transliterate.
       
   110    * @param settings
       
   111    *   The machine name settings for the corresponding field, containing:
       
   112    *   - replace_pattern: A regular expression (without modifiers) matching
       
   113    *     disallowed characters in the machine name; e.g., '[^a-z0-9]+'.
       
   114    *   - replace: A character to replace disallowed characters with; e.g., '_'
       
   115    *     or '-'.
       
   116    *   - maxlength: The maximum length of the machine name.
       
   117    *
       
   118    * @return
       
   119    *   The transliterated source string.
       
   120    */
       
   121   transliterate: function (source, settings) {
       
   122     var rx = new RegExp(settings.replace_pattern, 'g');
       
   123     return source.toLowerCase().replace(rx, settings.replace).substr(0, settings.maxlength);
       
   124   }
       
   125 };
       
   126 
       
   127 })(jQuery);