Какое место лучше всего поставить функцию просмотра? - PullRequest
3 голосов
/ 20 апреля 2011

У меня есть иерархический массив:

array(
  'id' => 4, //id of current element
  'parent' => 2, //id of parent element
  'value' => '', //some value
  'children' => array() //array of similar arrays
)

Каждый элемент может содержать несколько элементов, которые могут содержать несколько элементов и т. Д. Достаточно сказать, что лучший способ перебрать это - использовать функцию, который будет вызывать себя для обработки потомков:

function print_menu_hierarchy($hierarchy, $depth = 0) {
    foreach ($hierarchy as $item) {
        echo '<tr>';
        echo '    <td>' . $item['id'] . '</td>';
        echo '    <td>' . str_repeat('&nbsp;', $depth * 6) .  $item['value'] . '</td>';
        echo '</tr>';
        if (count($item['children'])) {
            print_menu_hierarchy($item['children'], $depth + 1);
        }
    }
}

Моя проблема: где разместить эту функцию?

Чтобы поддерживать MVC, она должна быть частью представления.Итак, помощник или шаблон.

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

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

У кого-то есть идеи, куда лучше поместитьэто?

(я использую Symfony 1.4)

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

Хотя мне непонятно, какую платформу вы используете, сама функция, как вы сами сказали, не относится к представлению.Эта функция должна быть включена в вспомогательную часть вашего приложения.Единственное изменение, которое вам нужно сделать, это вызвать представление для одного элемента из этой вспомогательной функции, вместо того, чтобы жестко запрограммировать эхо в вашем сканере иерархии.Примерно так:

function print_menu_hierarchy($hierarchy, $depth = 0) {
    foreach ($hierarchy as $item) {
        call_view_function('view_name_for_menu_item', array('item' => $item, 'depth' => $depth));
        if (count($item['children'])) {
            print_menu_hierarchy($item['children'], $depth + 1);
        }
    }
}

И вид будет выглядеть так:

<tr>
  <td><?php echo $params['item']['id']; ?></td>
  <td><?php echo str_repeat('&nbsp;', $params['depth'] * 6) . $params['item']['value']; ?></td>
</tr>
0 голосов
/ 20 апреля 2011

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

Также вам поможет MVC. Это руководство. Не позволяйте этому препятствовать выполнению работы. Каждый момент, когда вы мучаетесь с тем, куда положить вещи, это момент, когда вы на самом деле не решаете проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...