2017-08-07 17 views
0

Theresのこのワードプレス、http://developer.ninjaforms.com/codex/merge-tags/foreachループPHPの内部で関数を作成するにはどうすればよいですか?呼ばれる忍者フォームプラグイン

 /* Individual tag registration. */ 
     $this->merge_tags = array(

      'foo' => array(
       'id' => 'foo', 
       'tag' => '{my:foo}', // The tag to be used. 
       'label' => __('Foo', 'my_plugin'), // Translatable label for tag selection. 
       'callback' => 'foo' // Class method for processing the tag. See below. 
     ), 
     ); 

     /* 
     * Use the `init` and `admin_init` hooks for any necessary data setup that relies on WordPress. 
     * See: https://codex.wordpress.org/Plugin_API/Action_Reference 
     */ 
     add_action('init', array($this, 'init')); 
     add_action('admin_init', array($this, 'admin_init')); 
     } 

     public function init(){ /* This section intentionally left blank. */ } 
     public function admin_init(){ /* This section intentionally left blank. */ } 

     /** 
     * The callback method for the {my:foo} merge tag. 
     * @return string 
     */ 
     public function foo() 
     { 
     // Do stuff here. 
     return 'bar'; 

}}

'コールバック' の値は、関数、パブリック関数(FOO)として使用されます。

[foo] => Array 
    (
     [id] => foo 
     [tag] => {my:foo} 
     [label] => Foo 
     [callback] => foo 
    ) 

[surveyid] => Array 
    (
     [id] => surveyid 
     [tag] => {my:surveyid} 
     [label] => Surveyid 
     [callback] => surveyid 
    ) 

[membername] => Array 
    (
     [id] => membername 
     [tag] => {my:membername} 
     [label] => Membername 
     [callback] => membername 
    ) 

IVEがこの配列に同じ形式で複数のアレイを追加し、IDは、彼らが持っているようにパブリック関数にそれらの「コールバック」の値をしたい:

Iは、配列にこれを追加しました。

/** 
    * The callback method for the {my:foo} merge tag. 
    * @return string 
    */ 
    public function foo() 
    { 
    // Do stuff here. 
    return 'bar'; 
    } 

私はこれを何度もやり直す予定ですが、今後はさらに配列を追加することがあります。だから私は動的に各配列のコールバック値のpublic関数を割り当てようとしています。

これは私が持っているものです。

 $data = array(

     '@attributes' => array(
      'surveyid' => 'V54236', 
      'membername' => 'John Smith', 

      )); 

    $realThing = array(); 
    foreach($data['@attributes'] as $key => $value) {  
     $realThing[$key] = array(
      'id' => $key, 
      'tag' => '{my:'.$key.'}', 
      'label' => __(ucfirst($key), 'my_plugin'), 
      'callback' => $key 

    ); 
} 

    $this->merge_tags = $realThing; 

     add_action('init', array($this, 'init')); 
     add_action('admin_init', array($this, 'admin_init')); 
     } 

     public function init(){ /* This section intentionally left blank. */ } 
     public function admin_init(){ /* This section intentionally left blank. */ } 

    } 

コールバック値ごとに機能を割り当てようとしました。

 foreach($realThing as $key => $value){ 
      public function $key['callback'](){ 
       return $data['@attributes'][$key]; 
      } 
     }; 

所望の出力:すべてのヘルプは感謝

public function foo() 
    { 
    // Do stuff here. 
    return 'bar'; 
    } 

    public function surveyid() 
    { 
    // Do stuff here. 
    return 'V54236'; 

    public function membername() 
    { 
    // Do stuff here. 
    return 'John Smith'; 

も取得:

+0

理論的には、ループを通過するときに無名関数を作成することができます。より大きな疑問はなぜあなたがそれをしたいのですか?この種のスマート・アレック・コーディングは、維持不能な混乱を本当に速くもたらすことがあります。 – GordonM

答えて

0

の構文エラー、予期しない「foreachの」(T_FOREACH)、期待機能(T_FUNCTION)あなたは、データを扱う上で、いくつかのミスを持っていて、一度だけ、各関数を宣言する必要があります

foreach($realThing as $key => $value){ 
     if(!function_exists($value['callback'])){ 
      public function $value['callback'](){ 
       return $data['@attributes'][$key]; 
      } 
      } 
}; 

しかし、関数宣言で変数が許可されていないため、このコードは機能しません。次のコードは動作するはずですが、それは、配列に格納されているあなたは、異なるコールバックを呼び出す必要があります:あなたは他の方法でやりたいことができても

$callbacks = array(); 
foreach($realThing as $key => $value){ 
     if(!isset($callbacks[$value['callback']])){ 
      $callbacks[$value['callback']] = function() use ($data, $key){ 
       return $data['@attributes'][$key]; 
      }; 
      } 
}; 
unset($key); 

echo $callbacks["surveyid"](); 

は、私はかなり確信しています。

+0

予期しない '$ key'(T_VARIABLE)は最後の行にあります: 'function $ key ['callback'](){' – user3147682

+0

私の解決策を更新しました。 – Adder

+0

予期しない '$ callbacks'(T_VARIABLE)、関数(T_FUNCTION)を期待していますが、関数の期待時にクラスの内部で関数を宣言しなければなりません。 /** * {my:foo}マージタグのコールバックメソッド。 * @戻り文字列 */ $ callbacks = array(); ($ real = $ key => $ value){ if(!($ data、$ key){ return $ data ['@ attributes'] {$ value ['callback']]関数を呼び出すと、 ] [$ key]; }; } – user3147682

関連する問題