在Yii视图中定义函数的位置?

时间:2017-07-21 12:00:08

标签: php yii yii2

我正在使用Yii2开发一个Web应用程序。

我将一个数组从我的控制器传递到我的视图以显示为表格。数组中的每个元素都是一个表示表行的子数组。然而,每个元素表示表格单元的子阵列可以由字符串和“子子阵列”组成。在字符串的情况下,字符串将仅在表格单元格中输出。在子子阵列的情况下,我想“展开”数组以进行显示。同样,这些子子阵列可以由字符串或“子子子阵列”构成。等等。

接近这个的最佳方法是什么?我在想我应该编写一个递归函数来展开视图中的数组。如果是字符串,则输出,否则如果是数组,则展开数组。

编写函数本身对我来说似乎很简单,但我在哪里实际定义它?它是否属于我的控制器类?别的地方?我想我会从我的角度来称呼它。在Yii结构中,如何调用它以使其在范围内(如果我使用正确的术语)并被正确调用?

所以在我的控制器中,我会有类似的东西:

return $this->render('//messages', [
    'table' => $array_to_unwind
]);

在我的messages.php视图文件中,我会有类似下面的内容,其中unwind()函数输出一个字符串(如果它是一个字符串),或者解开一个数组(如果它是一个数组):

<table>
  <?php
  foreach ($table as $row) {
    echo '<tr>';
    foreach ($row as $cell) {
      echo '<td>';
      unwind($cell);
      echo '</td>';
    }
    echo '</tr>';
  }
  ?>
</table>

3 个答案:

答案 0 :(得分:3)

您应该创建自己的Helper(例如在path-to-project/components/ - 基本模板中)类来执行此类操作,并在内部创建静态函数。

<?php

namespace app\components;

class MyHelper
{
     public static function unwind($param) {
            // here body of your function
     }
}

然后在视图中调用它:

foreach ($row as $cell) {
  echo '<td>';
  echo \app\components\MyHelper::unwind($cell);  //or without echo if your function is doing it, but it will be better if function will return value instead of echoing it
  echo '</td>';
}

答案 1 :(得分:1)

您可以通过使用Yii组件来实现此目的。 组件通常放在path/to/your/project/components目录中。定义自己的组件并在组件类中放置 static 函数。

示例:

namespace app\components;

Class MyComponent extends Component {
    public static function unwind(){
       // your code here..

      return $array;
    }

}

然后在你看来:

use app\components\Mycomponent;

....
....
echo MyComponent::unwind();

答案 2 :(得分:-1)

if i have get your question right, and if you are looking for recursive function than this can be helpful.  

    // add foreach in html
    foreach ($table as $row) {
        if (is_array($row)) {
          unwind($row);
        }else{
            <html you want to print if its string>
        }
    }

    //create a function in same view file

    function unwind($data)
    {
        foreach ($data as $key => $value){
          <html you want to print if its an array>
        }   
    }