【问题标题】:php loop and arrayphp循环和数组
【发布时间】:2013-02-14 10:04:56
【问题描述】:

我目前正在研究一个 PHP 类,它允许人们在 CMS 中创建新的内容块,我想要做的是让用户能够向类发送输入名称,值,以及更多选项(认为已选择,以及复选框和单选按钮的选项)

我的第一个问题是我无法将这些数据发送到我的班级,目前我正在这样做,

homepageSlider->add_meta_box(
    'Book Info',
    array(
        'Year' => array(
            'type' => 'checkbox',
            array(
                'options' => 'Year 1',
                'Year 2',
                'Year 3'
            )
        ),
        'Genre' => 'text'
    )
);

您可以在上面看到我正在创建一个名为 book info 的内容块,该内容类型有 2 个表单字段,Year(有 3 个复选框)和 Genre,它将是一个文本字段。

我的问题是这种方法似乎不起作用。我不知道如何循环遍历上述数组的每个部分以吐出我需要的所有信息?任何人都可以对此有所了解吗?

我是否正确地形成了多维数组?这是我认为需要的,还是我的班级有问题?

function() use( $box_id, $box_title, $post_type_name, $box_context, $box_priority, $fields )
{
    add_meta_box(
        $box_id,
        $box_title,
        function( $post, $data )
        {
            global $post;

            // Nonce field for some validation
            wp_nonce_field( plugin_basename( __FILE__ ), 'custom_post_type' );

            // Get all inputs from $data
            $custom_fields = $data['args'][0];

            // Get the saved values
            $meta = get_post_custom( $post->ID );

            //die(print_r($custom_fields));
            // Check the array and loop through it
            if( ! empty( $custom_fields ) )
            {

                /* Loop through $custom_fields */
                foreach( $custom_fields as $label => $type )
                {
                    $field_id_name  = strtolower( str_replace( ' ', '_', $data['id'] ) ) . '_' . strtolower( str_replace( ' ', '_', $label ) );
                    echo '<label for="' . $field_id_name . '">' . $label . '</label>';
                    //self::getFormField($type, $field_id_name);
                    //<input type="'. self:getFormField($type) . '" name="custom_meta[' . $field_id_name . ']" id="' . $field_id_name . '" value="' . $meta[$field_id_name][0] . '" />';
                }
            }

        },
        $post_type_name,
        $box_context,
        $box_priority,
        array( $fields )
    );
}

【问题讨论】:

  • 您的意思是“选项”是一个数组吗?你说的班级在哪里?我只看到一些闭包和函数。
  • 好吧,并不是要劝阻你,但这是一个很大的程序混乱。它做得太多了。一个类应该有一个单一的职责。而你的班级只是尖叫着要在多个较小的班级中重构。
  • 你是什么意思?该类处理创建并且仅创建帖子类型?
  • 如果它是一个工厂(处理创建)那为什么它没有 create() 方法?我看到 getFoo、registerThis、registerThat、addBar 和 save。都是公开的。对我来说,这听起来不像是工厂。另外,里面的方法太长了。他们做很多事情。尝试让一个函数只做一件事。

标签: php arrays wordpress


【解决方案1】:

我认为你形成的数组是错误的。

homepageSlider->add_meta_box(   
    'Book Info',
    array(  
        'Year' => array('type' => 'checkbox' , 'options' => array('Year 1', 'Year 2', 'Year 3')),  
        'Genre' => array('type' => 'text'),
    )  
);

但它看起来很乱。我相信用这样的数组来做这不是一种直观的方式。您是否考虑过将其抽象为类?我认为这样的东西会更干净:

class metaBox {
     private $inputFields = array();
     public function addField($inputFieldObject) {
       $this->inputFields[] = $inputFieldObject;
     }
}

class inputField {
     public $type = "";  // which tags
     public $attributes; // which attributes
}

【讨论】:

  • 我将如何使用这些类?
  • 为什么&$inputFieldObject是通过引用传递的?
  • 不是全部,我对 OOP 的工作方式还很陌生。我不明白如何将这些类和方法与我的原始类相匹配?
  • 这样您就可以在添加后继续使用它,并将更改反映在商店中。
  • 你不需要参考。对象总是通过引用传递。
猜你喜欢
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多