在管理页面上验证小部件的配置数据

时间:2013-04-22 作者:tuliomir

我有一个简单的小部件,需要用户设置其宽度和高度,以便在博客上正确显示。

问题是:在Administrator/Appearance/Widgets 页面中,如果管理员用户在宽度上放置类似“400px”的内容,则效果很好。但是如果用户输入“xxxx”怎么办?

当用户按下“Save”(保存)按钮时,有没有办法激发一些javascript,以便to inform the user that the data is invalid? 我到处寻找save按钮上的钩子,或者拦截提交的方法,但什么也没找到。

我是否从错误的角度看待这个问题?有没有更好的方法?

提前谢谢。

3 个回复
最合适的回答,由SO网友:vancoder 整理而成

@我想tf就快到了。您可以在小部件的管理表单上使用JS,就像我之前所做的那样(虽然不是为了验证)。

在小部件的构造函数中,添加一个操作:

add_action( "admin_print_scripts-widgets.php", array( __CLASS__, \'register_my_validation_script\' ) );
然后在小部件的类中创建相应的函数:

function register_my_validation_script() {
    wp_enqueue_script( \'my-script-handle\', plugins_url( \'/my-validation-script.js\', __FILE__ ), array( \'jquery\' ), \'1.0\' );
}
这假设您的JS是一个脚本(my-validation-script.js) 在插件目录中。

在这个JS脚本中是执行验证的jQuery。这就是伪代码的开始。。。

jQuery(document).ready(function($) {
    $(\'.widget-control-save\').on(\'click\', function() {
// check this is the right widget - probably using something like $(this).closest(\'form\').width-field...
// validate stuff
    });
});

SO网友:Ralf912

从表单中获取ID有点棘手,因为它是动态创建的。通常,当按下保存按钮时,我会使用此JS触发一个事件:

jQuery(document).ready(
    function($) {
        $( \'.widget-control-save\' ).on( \'click\',
            function() {
                // grab the ID of the save button
                var saveID   = $( this ).attr( \'id\' );

                // grab the \'global\' ID
                var ID       = saveID.replace( /-savewidget/, \'\' );

            }
        );
    }
);
你是个好人,所以你用get_field_id()get_field_name() 在你的小部件代码中,嗯!?

printf(
  \'<input type="text" id="%s" name="%s" value="%d" />\',
  $this->get_field_id( \'width\' ),
  $this->get_field_name( \'width\' ),
  (int) $instance[\'width\']
);
输入字段的ID类似于your-widget-name-[number]-width. 问题是数字,每次在侧边栏中添加或删除小部件时,数字都会有所不同。在上面的JS中,变量ID 现在得到了值your-widget-name-[number] (例如。your-widget-name[2]). 所以你只需添加-widthID 并且可以获取输入字段的值

var width = $( \'#\' + ID + \'-width\' ). val();
// validate the value of the input field with parseInt() or something else
但是如果我期望一个数字,那么我不会让用户输入字符。阻止用户键入字符不是问题。

add_filter( \'widget_form_callback\', \'prevent_char_input\', 1, 2 );

function prevent_char_input( $instance, $object ) {

// assuming your widgets id is \'foo_widget\'
if ( \'foo_widget\' !== $object->id_base || ! is_integer( $object->number ) )
    return $instance;

echo "
<script>
  jQuery(document).ready( function($) {

    var input = $( \'#widget-{$object->id}-width\' );

    input.keydown(function(event) {
        // Allow: backspace, delete, tab, escape, and enter
        if ( event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
             // Allow: Ctrl+A
            (event.keyCode == 65 && event.ctrlKey === true) ||
             // Allow: home, end, left, right
            (event.keyCode >= 35 && event.keyCode <= 39)) {
                 // let it happen, don\'t do anything
                 return;
        }
        else {
            // Ensure that it is a number and stop the keypress
            if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105 )) {
                event.preventDefault();
            }
        }
    });

  } );</script>";

    return $instance;
}
所以我们在这里要做的是,打印一些内联脚本。每当打印小部件内的html表单时,PHP函数都会检查小部件名称是否匹配以及小部件编号是否为整数。我们使用对象属性id_baseid. 这个id_base 是注册小部件时使用的id。这个id 是小部件id加上侧栏中的数字(例如。foo_widget-2).

最佳做法是避免使用内联脚本。您可以创建jQuery扩展并将其排入页脚。这将内联脚本减少到$( \'#widget-{$object->id}-width\' ).numbersOnly(); 在javascript中,类似于:

(function( $ ){

  $.fn.numbersOnly = function() {

    this.keydown(function() {
      [... code here ...]
    });

  };
})( jQuery );
我希望这能帮助您找到最佳解决方案。

SO网友:tfrommen

这不是特定于WP的。

您的小部件很可能已经有了一个表单。该表单有一个名称/ID(如果没有,请提供一个)。

你要做的是检查onsubmit 特定条件下的形式。

假设这是您的表单:

<form name="myWidgetForm" ... >
    <input type="number" name="width" />
    <input type="number" name="height" />
    ...
    <input type="submit" value="Save" />
</form>
因此,首先将表格更改如下:

<form name="myWidgetForm" ... onsubmit="return validateMyWidgetForm()">
然后提供以下JavaScript函数(在必须排队的单独JS文件中,或硬编码):

Plain JavaScript

function validateMyWidgetForm() {
    var msg = "";

    if (document.forms["myWidgetForm"]["width"].value < 400)
        msg = msg + "The value of \'width\' has to be greater than 400.\\n";

    if (document.forms["myWidgetForm"]["height"].value < 600)
        msg = msg + "The value of \'height\' has to be greater than 600.\\n";

    ...

    if ("" != msg) {
        alert(msg);
        return false;
    }
    return true;
}
Note: 上述功能不可复制和粘贴,但仅供演示使用。

备选方案jQuery 版本

function validateMyWidgetForm() {
    var msg = "";

    if (jQuery(\'#myWidgetForm #width\').val() < 400)
        msg = msg + "The value of \'width\' has to be greater than 400.\\n";

    if (jQuery(\'#myWidgetForm #height\').val() < 600)
        msg = msg + "The value of \'height\' has to be greater than 600.\\n";

    ...

    if ("" != msg) {
        alert(msg);
        return false;
    }
    return true;
}

结束

相关推荐

仅在wp-admin中显示死亡白屏

我可以登录该网站,但登录后,我在wp admin中看到一个白色屏幕。我仍然可以访问该网站,它显示我已使用每个页面顶部的工具栏登录,但每当我进入wp admin时,都会遇到一个白色屏幕。我尝试过重命名themes和plugins文件夹,甚至删除了这两个文件夹。我尝试将php内存限制提高到128M,但仍然没有成功。有什么建议吗?如果我必须重新安装Wordpress,我如何才能不丢失已经存在的一切?编辑:我也打开了调试,但仍然没有收到任何错误、警告或通知。