当回调作为数组的一部分传递时,不会在addsetingsfield()中调用,但会识别出它就在那里。它使用OOP将类传递到类

时间:2020-11-25 作者:Mähnenwolf

我正在构建一个插件,我创建了一个新的管理页面和子页面,在这个子页面中,我想添加一些设置。这就是我使用设置API构建它们的原因
我正在使用Composer和面向对象编程。我有一个名为SettingsAPI的文件夹,名称空间如下namespace Blocks\\Pages\\SettingsAPI;
在该文件夹中,我有三个文件:AddSettings.php, Settings.phpSettingsLayout.php. 它们三个都正确连接。这些文件具有区分大小写的类名称。Settings.php 有一个名为Settings, 等等

SettingsAPI Folder Structure

Content

  • 我的结构的一些上下文
  • 我已经尝试了什么
  • 该怎么办

我的结构内部的一些上下文Settings.php 我有一个保存各种数组的函数,这些数组中有我想用于设置API的值。这意味着我有用于register_setting(), add_settings_section()add_settings_field().
内部AddSettings.php 我有刚才提到的三个功能。二者都register_settings()add_settings_field() 工作很好。我对add_settings_field().
内部SettingsLayout.php 我有一个非常简单的表单打印位置布局,也显示在子页面上。只是缺少输入。

在…内AddSettings.php 我用了一个foreach() 如果需要的话,在阵列上循环。用于两者register_setting()add_settings_field(), 这是因为这两个数组中都有数组。我将显示一些用于register_setting() 以及foreach().

设置。php

$configs = [
      [ // Icon
        "option_group"    =>    "iw_" . $n,
        "option_name"     =>    "iw_icon_" . $n,
        "args"            =>    $iconConfigs
      ],
      [ // Titel
        "option_group"    =>    "iw_" . $n,
        "option_name"     =>    "iw_title_" . $n,
        "args"            =>    $titleConfigs
      ],
      [ // Beschreibung
        "option_group"    =>    "iw_" . $n,
        "option_name"     =>    "iw_description_" . $n,
        "args"            =>    $descriptionConfigs
      ],
      [ // Farbauswahl
        "option_group"    =>    "iw_" . $n,
        "option_name"     =>    "iw_colour_" . $n,
        "args"            =>    $colourConfigs
      ]
    ];
上面的数组与其他数组一起传递给AddSettings 类和将处理它们的下一个函数。

$this->add_settings->setForm( $configs, $segments, $inputs )->register();
setForm() 对参数执行以下操作。

添加设置。php

public  function  setForm(  array  $configs,  array  $segments,  array  $inputs )  {
    $this->settings =  $configs;
    $this->sections =  $segments;
    $this->fields =  $inputs;
    return  $this;
}
变量$settings, $sections$fields 已在类的开头创建为公共数组和空数组。

public $settings = array();
public $sections = array();
public $fields = array();
然后使用以下函数注册:

SettingsAPI Folder Structure

三八 保存WP中的所有设置API函数,以下是register_setting().

foreach( $this->settings as $setting ) {
      register_setting( $setting["option_group"], $setting["option_name"], isset( $setting["args"] ) ? $setting["args"] : "" );
    }
这部分效果很好。它还适用于add_settings_section(). 输入不起作用。我现在也将介绍:

设置。这个类中的php是函数/方法setForm( $n = NULL ), 这就是所有数组的位置,就像我上面展示的那个。马上$n 没有意义,但它将是一个数字,所以我可以在这些数组和设置上循环以创建更多表单。我是否保持在NULL 或者我把它改成1, 对最终结果没有影响,同样的事情
这是字段的数组。

$inputs =  [
    [
        "id"  =>  "iw_icon_"  .  $n,
        "title"  =>  "Icon Auswahl",
        "callback"  =>  function()  use($n)  {  return  $this->iconInput(  $n );  },
        "page"  =>  "info_kreis_bearbeiten",
        "section"  =>  "iw_item_"  .  $n,
        "args"  =>  [  "label_for"  =>  "iw_icon_"  .  $n ]
    ],
    [
        "id"  =>  "iw_title_"  .  $n,
        "title"  =>  "Titel",
        "callback"  =>  function()  use($n)  {  return  $this->titleInput(  $n );  },
        "page"  =>  "info_kreis_bearbeiten",
        "section"  =>  "iw_item_"  .  $n,
        "args"  =>  [  "label_for"  =>  "iw_title_"  .  $n ]
    ],
    [
        "id"  =>  "iw_description_"  .  $n,
        "title"  =>  "Kurz Beschreibung",
        "callback"  =>  function()  use($n)  {  return  $this->descriptionInput(  $n );  },
        "page"  =>  "info_kreis_bearbeiten",
        "section"  =>  "iw_item_"  .  $n,
        "args"  =>  [  "label_for"  =>  "iw_description_"  .  $n
    ],
    [
        "id"  =>  "iw_colour_"  .  $n,
        "title"  =>  "Farbe auswählen",
        "callback"  =>  function()  use($n)  {  return  $this->colourInput(  $n );  },
        "page"  =>  "info_kreis_bearbeiten",
        "section"  =>  "iw_item_"  .  $n,
        "args"  =>  [ "label_for"  =>  "iw_colour_"  .  $n ]
    ]
];
这是一个包含三个数组的数组。这个数组有回调,而回调根本不起作用。无论我把它们放在哪里或如何写,它们都不会被回音。在底部,我会列出我尝试过的所有东西
与设置数组一样,它们的处理方式如下:

$this->add_settings->setForm( $configs, $segments, $inputs )->register();

添加设置。php,然后

public  function  setForm(  array  $configs,  array  $segments,  array  $inputs )  {
    $this->settings =  $configs;
    $this->sections =  $segments;
    $this->fields =  $inputs;
    return  $this;
}

public  function  functionToAdd()  {
return  $this->registerForm(  $this->settings,  $this->sections,  $this->fields );
}
然后传递给registerForm() 具有以下功能:

foreach(  $this->fields as  $field)  {
    add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"] : "", $field["page"], $field["section"] = \'default\', $field["args"] = array() );
}
然后什么都没有。我的子页面上没有输入。所有的一切都在回声中。Form on Subpage
如您所见,该部分使用的回调有效,并向我显示标题和描述。但缺少输入。为了展示如何调用节回调的上下文,下面是一行,其中包含节数组中的回调Settings.php:

"callback"  =>  function()  use($n)  {  echo  "<p>Bearbeite hier die Info Nummer "  .  $n .  "</p>";  }
以及功能add_settings_section() 在…内AddSettings.php, 不foreach() 用于此项:

add_settings_section(  $sections["id"],  $sections["title"], isset(  $sections["callback"]  )  ?  $sections["callback"]  :  "",  $sections["page"]  );
它的命名方式与fields相同。但这些领域仍然没有任何回应。在任何人说我在匿名回调函数中回音,而不是返回另一个函数之前:

我已经尝试了一些事情。我首先尝试的事情之一是编辑回调的编写方式。因此,我写了一些简单的东西来代替返回另一个函数的函数。

"callback"  =>  function()  {  echo "Echo this please."; },
不起作用。

"callback"  =>  array( $this, "iconInput" ),
也不起作用我也试过了

"callback"  =>  $this->iconInput( $n ),
然后调用函数并回显输入,但不在正确的位置。他们在页面的最顶端。如果我循环所有内容,所有输入都将位于顶部,下面的部分按正确的打印顺序。所以这也不是解决方案
我还尝试将回调移动到AddSettings.php 这样称呼它。

add_settings_field(  $field["id"],  $field["title"],  function()  { return $this->iconInput();  },  $field["page"],  $field["section"]  =  \'default\',  $field["args"]  = array()  );
也没用。当我试图直接在那里写函数时,就像这样

add_settings_field(  $field["id"],  $field["title"],  function()  { echo "Please echo this";  },  $field["page"],  $field["section"]  =  \'default\',  $field["args"]  = array()  );
也没用。我也总是die; 最后,只是想看看它是否被调用,但它没有被调用。这就像函数不存在一样
我还尝试通过添加() 收件人:

add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"]() : "", $field["page"], $field["section"] = \'default\', $field["args"] = array() );
与之前的结果相同。它回显输入,但不在正确的位置。

我试着寻找一个答案,但实际上找不到一个与我相似的答案。我找到了这些问题和解决方案,尝试了一下,但也没有成功:How to pass arguments from add_settings_field() to the callback function?Add_settings_field() parameterizing callback?

为了澄清,我的SettingsLayout.php 是这样构建的:

<form  method="post"  action="options.php"  id="iw_form_<?php  echo  $i?>">
    <?php
        settings_fields(  "iw_"  .  $i  );
        do_settings_sections(  "info_kreis_bearbeiten"  );
        submit_button(  $text  =  NULL,  $type  =  "primary",  $name  =  "submit_"  .  $i  );
    ?>
</form>
$i 与相同$n.

怎么办

我已经没有办法尝试了。至少我知道的几种选择。如果有人有任何解决办法,我很乐意听到他们的意见。我也尽可能地解释了自己。

在我的foreach() 我也回应了field["id"] 看看这是否有效,它确实回显了正确的ID。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

从我所看到的情况来看,问题不在于字段回调,而在于将其设置为default — 看见$field["section"] = \'default\' 以下内容:

// In the foreach in AddSettings.php
add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"] : "", $field["page"], $field["section"] = \'default\', $field["args"] = array() );
所以你只需要纠正一下(拼写错误?)字段将按预期显示,或者字段回调将正常运行。您还应该更正$field["args"] = array()..

相关推荐