我实现了一个简单的类,如:
class my_form {
private $error_message;
function __construct()
{
add_shortcode(\'my_form_custom\', array($this, \'show_custom_form\'));
}
function registration_template_form() {
?>
<div class="popup_canvas_container">
<form id="my_form" class="my_form" method="post" action="<?php echo esc_url($_SERVER[\'REQUEST_URI\']); ?>">
<p><label for="first_field">Field1:</label> <input type="text" name="first_field" id="first_field" value="<?php echo(isset($_POST[\'first_field\']) ? $_POST[\'first_field\'] : null); ?>" required /></p>
[...]
<div class="confirmation_box">
<p><button name="post_form" id="post_form" type="submit"><?php _e(\'Submit\', \'my_form_textdomain\'); ?></button></p>
</div>
</form>
<div id="messages_box" class="messages_box">
<p><div id="message_label"></div></p>
</div>
</div>
<?
}
function form_validation() {
if ( strlen($this->first_field) < 4 ) {
$error_message = \'Too short!\';
return false;
}
}
function save_to_db() {
if ( !$this->form_validation() ) {
?>
<script language="javascript">$("#message_label").text("<?php echo $error_message; ?>"); $(\'#messages_box\').dialog();</script>
<?php
} else {
}
}
function show_custom_form() {
ob_start():
if (isset($_POST[\'post_form\'])) {
$this->save_to_db();
}
$this->show_template_form();
return ob_get_clean();
}
}
而且,就像我在Google上几乎到处都能找到的一样,用jquery将内容的变量传递给消息框div,我只是做了一个回显,然后我应该显示错误消息,显示一个对话框消息。但我一直在控制台日志中记录此错误:
<script language="javascript">$("#message_label").text("<br />
<b>Notice</b>: Undefined variable: error_message in <b>..../my_form.php</b> on line <b>108</b><br />
"); $(\'#messages_box\').dialog();</script>
此时,将变量的内容传递给div的正确方法是什么?提前感谢!干杯,路易吉
编辑:如果我使用传递函数值实现,如下所示:
class my_form {
private $first_field;
public $error_message;
function __construct()
{
add_shortcode(\'my_form_custom\', array($this, \'show_custom_form\'));
}
function registration_template_form() {
?>
<div class="popup_canvas_container">
<form id="my_form" class="my_form" method="post" action="<?php echo esc_url($_SERVER[\'REQUEST_URI\']); ?>">
<p><label for="first_field">Field1:</label> <input type="text" name="first_field" id="first_field" value="<?php echo(isset($_POST[\'first_field\']) ? $_POST[\'first_field\'] : null); ?>" required /></p>
[...]
<div class="confirmation_box">
<p><button name="post_form" id="post_form" type="submit"><?php _e(\'Submit\', \'my_form_textdomain\'); ?></button></p>
</div>
</form>
<div id="messages_box" class="messages_box">
<p><div id="message_label"></div></p>
</div>
</div>
<?
}
function form_validation() {
if ( strlen($this->first_field) < 4 ) {
//$error_message = \'Too short!\';
//return false;
return WP_Error(\'first_field_length\', \'Too short. At least 4 characters is required.\' );
}
}
function save_to_db() {
if ( !$this->form_validation() ) {
?>
<script language="javascript">$("#message_label").text("<?php echo $this->form_validation()->get_error_message(); ?>"); $(\'#messages_box\').dialog();</script>
<?php
} else {
}
}
function show_custom_form() {
ob_start():
if (isset($_POST[\'post_form\'])) {
$this->save_to_db();
}
$this->show_template_form();
return ob_get_clean();
}
}
然后它会传递消息,但要看到对话框出现,它会在entry\\u content的layout div之后的版面上显示消息,此时它应该传递到dialog的div template消息框中。。。。这就是为什么我尝试传递一个变量。。。
SO网友:Tom J Nowell
问题是代码忽略了范围,这是一个基本的编程概念。
此范围:
function form_validation() {
...
$error_message = \'Too short!\';
...
}
此范围:
function save_to_db() {
...
... echo $error_message;...
}
都不一样。期望它移交是不合理和不合逻辑的。分配时
$error_message
a值
form_validation
变量仅存在于内部的函数
form_validation()
. 一旦该函数完成执行,就不再引用该变量,可以对其进行垃圾收集。
什么时候save_to_db
碰巧它在不同的范围内,所以即使error_message
从…起form_validation
仍然存在,它将不一样$error_message
变量
这就是为什么我们有global
关键字,但重要的是,对象可以保存状态,即类成员变量。这是类首先存在的主要原因之一,并且由于某些原因它没有被使用。类本身不是;“更好”,它们是一种工具,如果您只需要一个可以在任何地方访问的全局变量,那么您应该使用函数,或者返回值。
讽刺的是,您已经使用了该解决方案,并且使用的方式会产生完全相同的警告:
if ( strlen($this->first_field) < 4 ) {
代码中没有给出
first_field
一个值,或以任何方式定义它。在使用它之前,您必须通过定义它或给它一个值来声明它存在。你不能凭空捏造。
进一步阅读:
https://www.php.net/manual/en/language.oop5.properties.php