1

我需要在结帐页面上为动态创建的字段创建验证。

class Myclass () 
{

    private $_active_fields;

    public function generate_fields () {
        /** 
        /* Some previous logic to create an $items array based on products in the cart. 
        */

        $items = array(
            "question-7" => array(
                "option 1-1",
                "option 1-2",
            ),
            "question-4" => array(
                "option 2-1",
                "option 2-2",
            ),          
        );

        foreach( $items as $key => $val ) {
            woocommerce_form_field('box_field-'.$key, array(
                'type' => 'radio',
                'options' => $val,
                 ....
                ),
            $checkout->get_value( 'box_field-'.$key ));
            $this->_active_fields[] = 'box_field-'.$key;
        }
        var_dump($this->_active_fields) // lists correctly all added items
    }

    public function add_fields () {
        add_action( 'woocommerce_after_order_notes', array( $this, 'generate_fields' ) );
    }

    public function generate_validation () {
        $fields = $this->_active_fields; 
        var_dump($fields); // Empty array 
    
        foreach ( $fields as $key => $val ) {
            if ( ! $_POST[$val] {
                wc_add_notice( 'Please fill field'.$val, 'error' );
            }
        }

    }

    public function add_validation() {
        add_action( 'woocommerce_checkout_process', array( $this, 'generate_validation' ) );
    }
        
}

所以我运行以下代码

$form = new Myclass();
$form->add_fields();
$form->add_validation();

当我尝试访问方法中的$_active_fields属性时generate_valiadation(),它是空的。但是,如果我var_dump($this->_active_fields)在方法结束时调用generate_fields(),它会正确列出所有生成的字段键。

所以我想我做错了什么。关于如何设置$_active_fields内部generate_fields()并获取其值的任何想法generate_valiadation()

4

1 回答 1

0

您可能想查看使用会话变量。您正在尝试在不同时间运行的 2 个不同的钩子之间传递变量。

为了简单起见,我创建了一个示例,然后您可以将其开发为更 OOP 的方法。这将允许您在第一个挂钩回调中设置一个会话变量,然后将其从内存中传递给您的第二个。

函数 1 在调用钩子时设置会话变量。函数 2 使用内存中的会话变量,并在完成后将其终止。

您可以轻松地调整它并将会话变量传递给新类。您甚至可以将其设置在父类中,然后将其用作子类中的属性。

/**
 * In your main plugin file
 **/
add_action( 'woocommerce_after_order_notes', 'callback_function_1' );
add_action( 'woocommerce_checkout_process', 'callback_function_2' ) );

/**
 * This function is called first 
 */
function callback_function_1(){

   /**
    * Start a php session
    */
   session_start();

   /**
    * Do what you need to do and set your session var (return value) here
    */  
   $_SESSION['foo'] = 'bar';

}

/**
 * This function is called second 
 */
function callback_function_2 () {

   /**
    * Check to see if the var is set then use it
    */
   if (isset($_SESSION['foo'])) {
    
       print_r($_SESSION['foo']);
       //prints bar

   }  

   session_destroy();
    
}
于 2021-05-22T13:58:33.337 回答