user
  • 0
Гуру

Использование call_user_func() в add_settings_section() в классе

  • 0

Я пытаюсь add_settings_section() предоставить обратный вызов с параметром следующим образом:

class warpress_progression_plugin {
  function warpress_progression_plugin() {
    $this->__construct();
  }
  function __construct() {
    add_action('admin_init', array(&$this, 'plugin_admin_init'));
  }
  function plugin_admin_init() {
    $rows = $this->get_options_structure();
    for ($i = 0; $i < count($rows); $i++) {
      add_settings_section('expansion_'.$row->expansion_id,'',call_user_func(array(&$this, 'display_expansion'), $row->expansion),'warpress_progression'); // PROBLEM SEEMS TO BE HERE
    }
  }
  function display_expansion($expansion_name) {
    echo "<h3>" . $expansion_name . "</h3>";
  }
}

Однако я получаю следующую ошибку:

Предупреждение: call_user_func() [function.call-user-func]: ожидается, что первый аргумент будет допустимым обратным вызовом

Тем не менее, эхо

"<h3>" . $expansion_name . "</h3>"

происходит так, как я и ожидал. Что я здесь делаю неправильно?

Share
  1. Привет @Лони Хафф:

    Ваш код, переформатированный:

    Похоже, вы пытаетесь вызвать свой обратный вызов call_user_func() вместо того, чтобы просто передать его. Переформатировав код, вот что у вас есть:

    add_settings_section(
      'expansion_' . $row->expansion_id, 
      '', 
      call_user_func(array(&$this, 'display_expansion'), $row->expansion),
      'warpress_progression'
    ); // PROBLEM SEEMS TO BE HERE
    

    Эквивалент вашего кода:

    Что в основном то же самое, что и это:

    add_settings_section(
      'expansion_' . $row->expansion_id, 
      '', 
      $this->display_expansion($row->expansion),
      'warpress_progression'
    ); 
    

    Явно не то, что add_settings_section() ожидается.

    Что, я думаю, вы хотите:

    Я думаю, что вы хотите (без проверки) просто это (и я отредактировал первый параметр, чтобы использовать стиль кодирования, который я предпочитаю):

    add_settings_section(
      "expansion_{$row->expansion_id}", 
      '', 
      array(&$this, 'display_expansion'),
      'warpress_progression'
    ); 
    

    Дайте мне знать, если это работает для вас.

    • 0
    • Спасибо за ответ, Майк. Этот код не выдает никаких ошибок, но он также не передает значение $row->expansion в метод display_expansion. Может быть, это просто невозможно? Должен ли я вместо этого попытаться «вытолкнуть» эти данные за пределы функции plugin_admin_init, чтобы они были доступны для использования функцией display_expansion?

      • 0
    • Я считаю, что неправильно понял, как работает admin_init, и реструктурирую свой плагин, чтобы в нем больше не было необходимости. Еще раз спасибо за ответ!

      • 0

Оставить ответ

You must login to add an answer.