Вопрос по YII2 и MVC
Вопрос по YII2 и MVC
Добрый день.
Я понимаю что это вопрос уровня новичка, но ни как не могу понять как делать правильно.
В модели генерирую из ответа запроса к базе многомерный массив. И в виде мне надо его вывести рекурсивно, при том количество уровней не известно. По идее надо реализовать функцию или метод, который будет возвращать html блок. Но ни как не соображу куда размещать функцию или метод, в модель или в виде.
Я понимаю что это вопрос уровня новичка, но ни как не могу понять как делать правильно.
В модели генерирую из ответа запроса к базе многомерный массив. И в виде мне надо его вывести рекурсивно, при том количество уровней не известно. По идее надо реализовать функцию или метод, который будет возвращать html блок. Но ни как не соображу куда размещать функцию или метод, в модель или в виде.
-
- Сообщения: 680
- Зарегистрирован: 2017.06.21, 13:50
Re: Вопрос по YII2 и MVC
В модели получите данные которые нужны
В контроллере обработайте их и передайте в представление.
В виде отобразите так как нужно.
В контроллере обработайте их и передайте в представление.
В виде отобразите так как нужно.
Re: Вопрос по YII2 и MVC
А функция в виде не будет нарушать философию MVC?
-
- Сообщения: 680
- Зарегистрирован: 2017.06.21, 13:50
Re: Вопрос по YII2 и MVC
функция или метод например будет выглядеть так
HTML кода конечно больше, это так для примера.
и получается если все это реализовать в методе Модели (только тогда собирать строку из html), то можно тогда в виде написать
но тогда в модели появляется html и наоборот в виде появляются функции. А контроллер как по мне это управляющий - где и что высчитывать и где показывать. Разве он должен что-то делать?
Код: Выделить всё
function htmlBlock($data){
return "<h1>".$data."</h1>";
}
function recurView($ar){
foreach ($ar as $k => $v){
echo htmlBlock($v);
if(array_key_exists('child', $v)){
recurView($v);
}
}
}
и получается если все это реализовать в методе Модели (только тогда собирать строку из html), то можно тогда в виде написать
Код: Выделить всё
<?= Model::recurView($ar); ?>
-
- Сообщения: 680
- Зарегистрирован: 2017.06.21, 13:50
Re: Вопрос по YII2 и MVC
В контроллере
В представление
Код: Выделить всё
return $this->render('index', ['data' => $data, 'ar' => $ar]);
Код: Выделить всё
<h1> <?php echo $data; ?></h1>
<?php
foreach ($ar as $k => $v){
echo htmlBlock($v);
if(array_key_exists('child', $v)){
recurView($v);
}
}
?>
Re: Вопрос по YII2 и MVC
не совсем понял, а где здесь рекурсия?
Re: Вопрос по YII2 и MVC
Подробней расписал
Код: Выделить всё
function htmlBlock($data){
return "<h1>".$data['title']."</h1><p>".$data['text']."</p>";
}
function recurView($ar){
foreach ($ar as $k => $v){
echo "<li>";
echo htmlBlock($v);
if(array_key_exists('child', $v)){
echo "<ul>";
recurView($v);
echo "</ul>";
}
echo "</li>";
}
}
<ul>
<?= recurView($ar); ?>
</ul>
Re: Вопрос по YII2 и MVC
Сделал так, не знаю правильно или нет
в Модели
в Виде
в Модели
Код: Выделить всё
public static function generateHTML($template, $data, $tagMain, $tag){
self::$html .= '<'.$tagMain.'>';
foreach ($data as $value){
self::$html .= '<'.$tag.'>';
$tmp = str_replace("{img}", $value['img'], $template);
$tmp = str_replace("{date}", $value['date'], $tmp);
$tmp = str_replace("{name}", $value['name'], $tmp);
$tmp = str_replace("{idReviews}", $value['idReviews'], $tmp);
$tmp = str_replace("{text}", $value['text'], $tmp);
self::$html .= $tmp;
if(isset($value['children'])){
self::generateHTML($template, $value['children'], $tagMain, $tag);
}
self::$html .= '</'.$tag.'>';
}
self::$html .= '</'.$tagMain.'>';
}
Код: Выделить всё
$template = '<img src="{img}" class="avatar img-rounded" alt="">
<div class="post-comments">
<p class="meta">{date} <a href="#">{name}</a> says : <i class="pull-right"><span class="reply" data-id="{idReviews}"><small>Reply</small></span></i></p>
<p>{text}</p>
</div>';
Reviews::generateHTML($template, $reviews, 'ul', 'li');
echo Reviews::$html;
Re: Вопрос по YII2 и MVC
а) модель не должна генерить html и вообще знать о том, как ее будут выводить
б) эта функция относится только к тому, как некие данные будут представлены в виде. так почему бы ее в виде и не разместить?
я бы чтобы не городить лишнего прямо в начале вьюшки бы написал:
в) так компактнее
б) эта функция относится только к тому, как некие данные будут представлены в виде. так почему бы ее в виде и не разместить?
я бы чтобы не городить лишнего прямо в начале вьюшки бы написал:
Код: Выделить всё
$generateReviewHtml = function(...) {...};
...
$generateReviewHtml($template, $reviews, 'ul', 'li');
Код: Выделить всё
$tmp = strtr($template, [
'{img}' => $value['img'],
'{date}', $value['date'],
//....
]);
Re: Вопрос по YII2 и MVC
а рекурсию делать через глобальную переменную?
будет ли это правильно?
будет ли это правильно?
Re: Вопрос по YII2 и MVC
главная цель это реализовать рекурсию на неизвестную глубину
Получается я делаю вот так?
Получается я делаю вот так?
Код: Выделить всё
$template = '<img src="{img}" class="avatar img-rounded" alt="">
<div class="review">
<p class="meta">{date} <a href="#">{name}</a> {says} : <i class="pull-right"><span class="reply" data-id="{idReviews}"><small>{reply}</small></span></i></p>
<p>{text}</p>
</div>';
$html = '';
function generateHTML($template, $data, $tagMain, $tag, $level){
global $html;
$html .= '<'.$tagMain.' style="margin-left: '.(20*$level).'px;">';
foreach ($data as $value){
$html .= '<'.$tag.' class="clearfix">';
$html .= strtr($template, [
'{img}' => $value['img'],
'{date}' => $value['date'],
'{name}' => $value['name'],
'{says}' => Yii::t('reviews', 'says'),
'{idReviews}' => $value['idReviews'],
'{reply}' => Yii::t('reviews', 'Reply'),
'{text}' => $value['text']
]);
if(isset($value['children'])){
generateHTML($template, $value['children'], $tagMain, $tag, $value['level']++);
}
$html .= '</'.$tag.'>';
}
$html .= '</'.$tagMain.'>';
}
echo $html;
Re: Вопрос по YII2 и MVC
ну вы саму функцию не вызываете
Re: Вопрос по YII2 и MVC
точно, забыл)))
но $html тогда получается глобальной или локальной?
Код: Выделить всё
generateHTML($template, $reviews, 'ul', 'li', 1);
echo $html;
Re: Вопрос по YII2 и MVC
локальной.
Re: Вопрос по YII2 и MVC
тогда почему в функции я вынужден обращаться к ней как к глобальной?
что-то я упустил в матчасти((((
что-то я упустил в матчасти((((
Re: Вопрос по YII2 и MVC
а, там глобальная да. ну вы ее передавайте в параметрах функции.
Re: Вопрос по YII2 и MVC
Спасибо большое