2010-11-26 17 views
0

Ich habe in den letzten Tagen an einem Wordpress-Theme-Projekt gearbeitet, und mir ist aufgefallen, wie man eine dynamische Optionsseite mit OOP richtig laufen lässt (ich bin hauptsächlich ein Theme-Entwickler, kein PHP-Scripter).Eine Funktion in foreach aufrufen?

<?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 
} 

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

In diesem Codebeispiel, ich versuche die Funktion ab_do_htmlprint zu bekommen die foreach Ausdrücke zu erkennen, wo es genannt worden, weil die Funktion in der foreach-Schleife nach Bedarf beliebig oft aufgerufen werden soll.

Ich habe mehrere Dinge ausprobiert, wie zum Beispiel eine Variable an den Funktionsnamen anhängen, aber das würde mehrere Funktionen des gleichen Codes erfordern, nur mit einem anderen Namen. Ich habe auch versucht, verschiedene Variablen durch Verweis und so weiterzugeben, aber sie funktionierten auch nicht, und ich habe das vielleicht nicht richtig gemacht, wenn sie überhaupt benötigt werden.

Wie auch immer, um dies effizient zu erreichen?

+0

ich nicht folgen. Wie muss das Verhalten von ab_do_htmlprint davon abhängen, woher es aufgerufen wird? Meine Ahnung ist ein einfaches Argument, aber ich verstehe nicht wirklich die Einzelheiten –

+0

Was ich will, ist die Funktion ab_do_htmlprint die HTML jeder Option, die ich innerhalb der mehrdimensionalen Array platzieren.Jedes Mal, wenn ab_do_htmlprint innerhalb der foreach-Schleife aufgerufen wird, wird jede Option auf der von mir erstellten Optionsseite angezeigt. Ist das sinnvoll? – James

Antwort

0

Wenn ich richtig verstehe, was Sie brauchen ein Argument zu übergeben ab_do_htmlprint. add_settings_field hat Parameter für das, tun:

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

dann:

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

usw.

+0

Ich habe versucht, den Code zu den oben genannten zu ändern, aber dies gibt mir eine "Warnung: call_user_func (Array) [function.call-user-func]: Das erste Argument wird voraussichtlich ein gültiger Rückruf sein" -Fehler. – James

+0

Ich habe es funktioniert, ich musste nur den Array-Code am Ende entfernen, da WP erkannte, dass das letzte Argument in add_settings_field bereits in einem Array war. Das war sehr knapp, danke. – James

0

Ich bin nicht vertraut mit der Wordpress API, also überprüfen Sie bitte ein paar Annahmen, die ich habe. (Ich weiß, das ist keine Antwort, aber ich möchte nicht als Kommentar für die Lesbarkeit setzen)

1) ab_settings() heißt irgendwo?
2) Ist der Abschnitt, mit dem Sie Probleme haben?

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 ist magisch verfügbar oder brauchen Sie es als ein Argument zu liefern?

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

Auch das Format Ihrer ab_do_htmlprint Funktion ist sehr schwer zu lesen und eine Fehlerquelle sein könnte. Versuchen Sie HEREDOC Notation oder rein PHP Strings

ex) Statt

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 
} 

als

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; 
} 
+0

1) Ja, es tut mir leid, ich habe das ganze Skript nicht gepostet. Es wird über eine add_action-Funktion aufgerufen. – James

+0

2) Es könnte der Abschnitt sein, ich bin mir nicht sicher, ich habe mehrere Dinge ausprobiert, einschließlich der Änderung einiger Elemente dort. – James

+0

3) Der Code in ab_do_htmlprint funktioniert gut, als ich versuchte, die $ -Taste an das Ende innerhalb von foreach anzuhängen, und ich konnte jede einzelne Funktion in Ordnung bringen: ab_do_html1(); – James

1

Wenn ich richtig verstehe Sie haben eine Reihe von Werten, die Sie auf die in einer Gruppe zeigen wollen Admin-Bildschirm als Optionen.

Vielleicht ist das kürzeste Beispiel ist das, was ich hier geschrieben: http://swiftthemes.com/forums/showthread.php?383-SWIFT-on-a-WordPRess-MU-install/page2

P. S. Post-WordPress-Fragen auf http://wordpress.stackexchange.com: mehr WordPress-Experten!

+0

Im Wesentlichen ist es das, aber ich benutze die Einstellungs-API und versuche dies aus einer objektorientierten Perspektive zu erreichen, also muss ich den add_settings_field-Code nicht jedes Mal neu kopieren und einfügen, wenn ich eine neue Option hinzufügen möchte. – James

Verwandte Themen