Как правильно вывести массив значений

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

Как правильно вывести массив значений

Сообщение Егор »

У меня такой вопрос по поводу правильного вывода в шаблон информации полученной с БД запросом подобие
это дело в контроллере Control

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

$arrGeneralArmy = Army::model()->findAllBySql('SELECT * FROM army
                                                      JOIN warrior USING(warrior_id) WHERE general_id = 26'); 
Но это я работаю отдельном контроллере,который должен отвечать за управление некоторыми действиями.
Соль вот в чем.Когда мы генерируем через gii модель и crud ... у нас уже есть готовые _view(все атрибуты модели), index.php в которых прописан вывод через виджет

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

<?php  $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_view',
)); ?>
А если у меня получается массив собранный из разных таблиц,то как мне его былоб правильней вывести?

Могу ли я использовать во _view с модели данные для атрибутов,которые мне нужны,а сами данные с массива?
Подобие такого?

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

/* @var $this ControlController */
/* @var $data Army */
/* @var $arrGeneralArmy ControlController */

?>

<div class="view">

    <b><?php echo CHtml::encode($data->getAttributeLabel('army_id')); ?>:</b>
    <?php echo CHtml::link(CHtml::encode($arrGeneralArmy['army_id']), array('view', 'id'=>$arrGeneralArmy['army_id'])); ?>
    <br />

    <b><?php echo CHtml::encode($data->getAttributeLabel('warrior_id')); ?>:</b>
    <?php echo CHtml::encode($arrGeneralArmy['warrior_id']); ?>
    <br /></div>
или же просто передать массив в шаблон и в цикле вывести инфу?


Спасибо заранее!

Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Как правильно вывести массив значений

Сообщение PendalF »

Если вы хотите использовать именно sql-запрос то тогда я бы поступил так же как вы сейчас (просто передать массив с данными и с ним работать).
Если же вы можете использовать ActiveRecord, то тогда можете прописать связи в моделях и во вьюхе у вас будет возможность использовать что-то наподобие такого: $data->warrior->name; Где warrior - это имя связи между моделями, а name - это какой-либо атрибут модели, которая приджойнилась к основной.

Егор
Сообщения: 27
Зарегистрирован: 2014.04.25, 10:23

Re: Как правильно вывести массив значений

Сообщение Егор »

PendalF писал(а):Если вы хотите использовать именно sql-запрос то тогда я бы поступил так же как вы сейчас (просто передать массив с данными и с ним работать).
Если же вы можете использовать ActiveRecord, то тогда можете прописать связи в моделях и во вьюхе у вас будет возможность использовать что-то наподобие такого: $data->warrior->name; Где warrior - это имя связи между моделями, а name - это какой-либо атрибут модели, которая приджойнилась к основной.
Ок,спасибо за ваш ответ!
Буду пробовать ;)

Егор
Сообщения: 27
Зарегистрирован: 2014.04.25, 10:23

Re: Как правильно вывести массив значений

Сообщение Егор »

Егор писал(а):
PendalF писал(а):Если вы хотите использовать именно sql-запрос то тогда я бы поступил так же как вы сейчас (просто передать массив с данными и с ним работать).
Если же вы можете использовать ActiveRecord, то тогда можете прописать связи в моделях и во вьюхе у вас будет возможность использовать что-то наподобие такого: $data->warrior->name; Где warrior - это имя связи между моделями, а name - это какой-либо атрибут модели, которая приджойнилась к основной.


Вывод сделал подобным образом,без запроса SQL

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

$criteria = new CDbCriteria();
        $criteria -> addCondition('general_id ='.$generalId);
        $dataProvider = new CActiveDataProvider('Army');
        $dataProvider -> setCriteria($criteria);
        $this->render('show',array(
            'dataProvider'=>$dataProvider,
        ));
 
и во _view поправил

Вопрос такого рода,это ведь правильно задавать параметры вывода?
Почему задаю вопрос,так как мне подсказали,что Контр. не должен знать ничего о БД(понимаю это)
пример:

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

$arrGeneralArmy = Army::model()->findAllBySql('SELECT * FROM army
                                                      JOIN warrior USING(warrior_id) WHERE general_id = 26');   
А если задавать параметры через CDbCriteria в КОнтр:

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

$criteria = new CDbCriteria();
        $criteria -> addCondition('general_id ='.$generalId) 
это ведь правильный подход?

Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Как правильно вывести массив значений

Сообщение PendalF »

Почему же контроллер ничего не должен знать о БД? Он ведь на то и контроллер, представьте что это пульт управления. Поэтому вы вполне можете внутри контроллера запрашивать какие-то данные из БД и затем выводить их во вьюху. Например вот так:

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

// Параметр $generalId - это GET-переменная, можно не делать проверку на её существование, т.к. фреймворк выдаст 400 код ошибки если обратиться к действию без $generalId
public function actionView($generalId)
{
        $criteria = new CDbCriteria();
        // Старайтесь не задавать параметры напрямую, делайте это через ":general_id" и описывайте соответствующие параметры в $criteria->params. Таким образом можно защититься от SQL-инъекций и прочих неприятностей
        $criteria -> addCondition('general_id = :general_id');
        $criteria->params = array(':general_id' => $generalId);

        $dataProvider = new CActiveDataProvider('Army');
        $dataProvider -> setCriteria($criteria);

        $this->render('show',array(
            'dataProvider'=>$dataProvider,
        ));
} 

Егор
Сообщения: 27
Зарегистрирован: 2014.04.25, 10:23

Re: Как правильно вывести массив значений

Сообщение Егор »

PendalF писал(а):Почему же контроллер ничего не должен знать о БД? Он ведь на то и контроллер, представьте что это пульт управления. Поэтому вы вполне можете внутри контроллера запрашивать какие-то данные из БД и затем выводить их во вьюху. Например вот так:

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

// Параметр $generalId - это GET-переменная, можно не делать проверку на её существование, т.к. фреймворк выдаст 400 код ошибки если обратиться к действию без $generalId
public function actionView($generalId)
{
        $criteria = new CDbCriteria();
        // Старайтесь не задавать параметры напрямую, делайте это через ":general_id" и описывайте соответствующие параметры в $criteria->params. Таким образом можно защититься от SQL-инъекций и прочих неприятностей
        $criteria -> addCondition('general_id = :general_id');
        $criteria->params = array(':general_id' => $generalId);

        $dataProvider = new CActiveDataProvider('Army');
        $dataProvider -> setCriteria($criteria);

        $this->render('show',array(
            'dataProvider'=>$dataProvider,
        ));
}

Спасибо,понял!

Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Как правильно вывести массив значений

Сообщение PendalF »

Егор писал(а):Спасибо,понял!
Да не за что, обращайтесь ;)

Егор
Сообщения: 27
Зарегистрирован: 2014.04.25, 10:23

Re: Как правильно вывести массив значений

Сообщение Егор »

PendalF писал(а):
Егор писал(а):Спасибо,понял!
Да не за что, обращайтесь ;)

У меня такой вопрос,поясните как использовать setFlash. Разбирал про него пример такой:

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

Yii::app()->user->setFlash('success', "Data saved!"); 
а во вьюхе

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

<?php if(Yii::app()->user->hasFlash('success')):?>
    <div class="info">
        <?php echo Yii::app()->user->getFlash('success'); ?>
    </div>
<?php endif; ?>
Что в данном случае является user?

lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: Как правильно вывести массив значений

Сообщение lancedevnull »

ты юзер, я юзер, он тоже юзер, все мы юзеры и даже гости - данного ресурся

Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Как правильно вывести массив значений

Сообщение PendalF »

Как правильно заметил lancedevnull, юзер в данном случае это любой пользователь/посетитель сайта. У него в сессии сохраняется сообщение и пока он его не увидит, оно будет висеть там.

Егор
Сообщения: 27
Зарегистрирован: 2014.04.25, 10:23

Re: Как правильно вывести массив значений

Сообщение Егор »

PendalF писал(а):Как правильно заметил lancedevnull, юзер в данном случае это любой пользователь/посетитель сайта. У него в сессии сохраняется сообщение и пока он его не увидит, оно будет висеть там.

Вот такой вопрос,интересно ваше мнение.
Я добавляю checkbox чтоб по его значению обрабатывать данные..

Появился вопрос.

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

<?php echo CHtml::checkBox('',false, array (
            'name'=> 'warriorNameCheckB',
            'class' => 'warriorNameCheckB',
            'value'=>$data->army_id)); ?></b>
Можно таким образом все чек боксы вытаскивать по одному name?

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

<input id="" class="warriorNameCheckB" type="checkbox" value="104" name=""> 
задал класс,но в POST его не видно(
id задается...но это же не id= имя.$data->army_id
но потом не удобно работать..с этим всем..

Ответить