Вызов функции внутри foreach? - PullRequest
0 голосов
/ 27 ноября 2010

Последние несколько дней я работал над проектом WordPress и застрял на том, как правильно настроить динамическую страницу параметров с помощью ООП (я в первую очередь разработчик тем, а не сценарист PHP).

    <?php
    $footerpage = new optionpage;
    $footerpage->title = 'Footer';
    $footerpage->titleprint = ' Footer Options';
    $footerpage->slug = 'footer';
    $footerpage->html = array(
 '1' => array(
 'type' => 'textarea',
 'class' => 'large-text',
 'name' => 'html',
 'title' => 'HTML',
 'description' => 'Type in whatever HTML you\'d like to see in the footer here:',
 ),
 '2' => array(
 'type' => 'input',
 'class' => 'large-text',
 'name' => 'background-color',
 'title' => 'Background Color',
 'description' =>  ' Choose a Background Color:'
 ),

);

    class optionpage {

 public $title;
 public $titleprint;
 public $slug;
 public $html = array();

 ......
 ......
 ......

 public function ab_settings() {

 register_setting( $this->slug, 'ab_options');
 add_settings_section('ab_section', '', array(&$this, 'ab_do_titleprint'),  'ab_' . $this->slug . '_options', 'ab_options' );

 foreach ($this->html as $key => $html) {
 add_settings_field( $key, $html['title'], array(&$this, 'ab_do_htmlprint' ), 'ab_' . $this->slug . '_options', 'ab_section');
 }

 }


 public function ab_do_htmlprint() {
 $html = $this->html[$key];
 ?>

 <p><?php echo $html['description'] ?></p>
 <<?php echo $html['type'] ?> 
 id="<?php echo $html['id'] ?>"
 class="<?php echo $html['class'] ?>"
 name="<?php echo $html['name'] ?>">
 <?php get_option ($html['name'])?>
 </<?php echo $html['type'] ?>> 
 <?php
 }

 ......
 ......
 ?>

В этом примере кода я пытаюсь получить функцию ab_do_htmlprint для распознавания выражений foreach, где она была вызвана, потому что функция будет вызываться столько раз, сколько необходимо в foreach.loop.

Я пробовал несколько вещей, например добавление переменной к имени функции, но для этого потребовалось бы несколько функций одного и того же кода, только с другим именем.Я также пытался передать различные переменные по ссылке и тому подобное, однако они тоже не работали, и я, возможно, не делал это правильно, даже если они были необходимы.

В любом случае, чтобы добиться этого эффективно?

Ответы [ 3 ]

1 голос
/ 27 ноября 2010

Если я правильно понимаю, у вас есть массив значений, которые вы хотите отобразить в группе на экране администратора в качестве параметров.

Возможно, самый короткий пример - вот что я написал здесь: http://swiftthemes.com/forums/showthread.php?383-SWIFT-on-a-WordPRess-MU-install/page2

p.s. опубликовать вопросы WordPress на http://wordpress.stackexchange.com: больше экспертов WordPress!

0 голосов
/ 27 ноября 2010

Если я правильно понимаю, вам нужно передать аргумент в ab_do_htmlprint. add_settings_field имеет параметр для этого, выполните:

  add_settings_field( $key, $html['title'], array(&$this, 'ab_do_htmlprint' ), 'ab_' . $this->slug . '_options', 'ab_section', array($key));

затем:

  public function ab_do_htmlprint($key) {
    $html = $this->html[$key];

и т. Д.

0 голосов
/ 27 ноября 2010

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

1) ab_settings() где-то вызывается?
2) Есть ли у вас проблемы с разделом?

 foreach ($this->html as $key => $html) {
   add_settings_field( $key, $html['title'], array(&$this, 'ab_do_htmlprint' ), 
   'ab_' . $this->slug . '_options', 'ab_section');
 }

3) $key магически доступен или вам нужно предоставить его в качестве аргумента?

 public function ab_do_htmlprint() {
    $html = $this->html[$key];`

Кроме того, формат вашей функции ab_do_htmlprint очень трудно читать и может быть источником ошибки. Попробуйте использовать HEREDOC нотацию или чисто PHP-строки

ex) Вместо

 public function ab_do_htmlprint() {
 $html = $this->html[$key];
 ?>

 <p><?php echo $html['description'] ?></p>
 <<?php echo $html['type'] ?> 
 id="<?php echo $html['id'] ?>"
 class="<?php echo $html['class'] ?>"
 name="<?php echo $html['name'] ?>">
 <?php get_option($html['name'])?>
 </<?php echo $html['type'] ?>> 
 <?php
 }

в

 public function ab_do_htmlprint() {
   $html = $this->html[$key];
   $output = "<p>{$html['description']}</p>";
   $output .= "<{$html['type']} id=\"{$html['id']}\"";
   $output .= " class=\"{$html['class']}\"";
   $output .= " name=\"{$html['name']}\">";
   get_option( $html['name'] );
   $output .= "</{$html['type']}>"; 
   echo $output;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...