Вопрос по YII2 и MVC

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
hrupin
Сообщения: 45
Зарегистрирован: 2014.06.30, 10:20

Вопрос по YII2 и MVC

Сообщение hrupin »

Добрый день.
Я понимаю что это вопрос уровня новичка, но ни как не могу понять как делать правильно.
В модели генерирую из ответа запроса к базе многомерный массив. И в виде мне надо его вывести рекурсивно, при том количество уровней не известно. По идее надо реализовать функцию или метод, который будет возвращать html блок. Но ни как не соображу куда размещать функцию или метод, в модель или в виде.
trueorfalse
Сообщения: 680
Зарегистрирован: 2017.06.21, 13:50

Re: Вопрос по YII2 и MVC

Сообщение trueorfalse »

В модели получите данные которые нужны
В контроллере обработайте их и передайте в представление.
В виде отобразите так как нужно.
hrupin
Сообщения: 45
Зарегистрирован: 2014.06.30, 10:20

Re: Вопрос по YII2 и MVC

Сообщение hrupin »

А функция в виде не будет нарушать философию MVC?
trueorfalse
Сообщения: 680
Зарегистрирован: 2017.06.21, 13:50

Re: Вопрос по YII2 и MVC

Сообщение trueorfalse »

hrupin писал(а): 2017.08.24, 15:48 А функция в виде не будет нарушать философию MVC?
А если в контроллере реализуете данную функцию ?
hrupin
Сообщения: 45
Зарегистрирован: 2014.06.30, 10:20

Re: Вопрос по YII2 и MVC

Сообщение hrupin »

функция или метод например будет выглядеть так

Код: Выделить всё

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 кода конечно больше, это так для примера.

и получается если все это реализовать в методе Модели (только тогда собирать строку из html), то можно тогда в виде написать

Код: Выделить всё

<?= Model::recurView($ar); ?>
но тогда в модели появляется html и наоборот в виде появляются функции. А контроллер как по мне это управляющий - где и что высчитывать и где показывать. Разве он должен что-то делать?
trueorfalse
Сообщения: 680
Зарегистрирован: 2017.06.21, 13:50

Re: Вопрос по YII2 и MVC

Сообщение trueorfalse »

В контроллере

Код: Выделить всё

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);
		}
	}
?>
hrupin
Сообщения: 45
Зарегистрирован: 2014.06.30, 10:20

Re: Вопрос по YII2 и MVC

Сообщение hrupin »

не совсем понял, а где здесь рекурсия?
hrupin
Сообщения: 45
Зарегистрирован: 2014.06.30, 10:20

Re: Вопрос по YII2 и MVC

Сообщение hrupin »

Подробней расписал

Код: Выделить всё

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>
hrupin
Сообщения: 45
Зарегистрирован: 2014.06.30, 10:20

Re: Вопрос по YII2 и MVC

Сообщение hrupin »

Сделал так, не знаю правильно или нет

в Модели

Код: Выделить всё

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;

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вопрос по YII2 и MVC

Сообщение zelenin »

а) модель не должна генерить html и вообще знать о том, как ее будут выводить
б) эта функция относится только к тому, как некие данные будут представлены в виде. так почему бы ее в виде и не разместить?
я бы чтобы не городить лишнего прямо в начале вьюшки бы написал:

Код: Выделить всё

$generateReviewHtml = function(...) {...};
...
$generateReviewHtml($template, $reviews, 'ul', 'li');
в) так компактнее

Код: Выделить всё

$tmp = strtr($template, [
                '{img}' => $value['img'],
                '{date}', $value['date'],
                //....
            ]);
hrupin
Сообщения: 45
Зарегистрирован: 2014.06.30, 10:20

Re: Вопрос по YII2 и MVC

Сообщение hrupin »

а рекурсию делать через глобальную переменную?
будет ли это правильно?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вопрос по YII2 и MVC

Сообщение zelenin »

hrupin писал(а): 2017.08.24, 19:21 а рекурсию делать через глобальную переменную?
будет ли это правильно?
это локальная переменная
hrupin
Сообщения: 45
Зарегистрирован: 2014.06.30, 10:20

Re: Вопрос по YII2 и MVC

Сообщение hrupin »

главная цель это реализовать рекурсию на неизвестную глубину
Получается я делаю вот так?

Код: Выделить всё

$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;
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вопрос по YII2 и MVC

Сообщение zelenin »

ну вы саму функцию не вызываете
hrupin
Сообщения: 45
Зарегистрирован: 2014.06.30, 10:20

Re: Вопрос по YII2 и MVC

Сообщение hrupin »

точно, забыл)))

Код: Выделить всё

generateHTML($template, $reviews, 'ul', 'li', 1);
echo $html;
но $html тогда получается глобальной или локальной?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вопрос по YII2 и MVC

Сообщение zelenin »

локальной.
hrupin
Сообщения: 45
Зарегистрирован: 2014.06.30, 10:20

Re: Вопрос по YII2 и MVC

Сообщение hrupin »

тогда почему в функции я вынужден обращаться к ней как к глобальной?
что-то я упустил в матчасти((((
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вопрос по YII2 и MVC

Сообщение zelenin »

а, там глобальная да. ну вы ее передавайте в параметрах функции.
hrupin
Сообщения: 45
Зарегистрирован: 2014.06.30, 10:20

Re: Вопрос по YII2 и MVC

Сообщение hrupin »

Спасибо большое
Ответить