Страница 1 из 1
Как правильно вывести массив значений
Добавлено: 2014.05.16, 12:07
Егор
У меня такой вопрос по поводу правильного вывода в шаблон информации полученной с БД запросом подобие
это дело в контроллере 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>
или же просто передать массив в шаблон и в цикле вывести инфу?
Спасибо заранее!
Re: Как правильно вывести массив значений
Добавлено: 2014.05.16, 12:46
PendalF
Если вы хотите использовать именно sql-запрос то тогда я бы поступил так же как вы сейчас (просто передать массив с данными и с ним работать).
Если же вы можете использовать ActiveRecord, то тогда можете прописать связи в моделях и во вьюхе у вас будет возможность использовать что-то наподобие такого: $data->warrior->name; Где warrior - это имя связи между моделями, а name - это какой-либо атрибут модели, которая приджойнилась к основной.
Re: Как правильно вывести массив значений
Добавлено: 2014.05.16, 13:29
Егор
PendalF писал(а):Если вы хотите использовать именно sql-запрос то тогда я бы поступил так же как вы сейчас (просто передать массив с данными и с ним работать).
Если же вы можете использовать ActiveRecord, то тогда можете прописать связи в моделях и во вьюхе у вас будет возможность использовать что-то наподобие такого: $data->warrior->name; Где warrior - это имя связи между моделями, а name - это какой-либо атрибут модели, которая приджойнилась к основной.
Ок,спасибо за ваш ответ!
Буду пробовать
Re: Как правильно вывести массив значений
Добавлено: 2014.05.16, 15:07
Егор
Егор писал(а):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)
это ведь правильный подход?
Re: Как правильно вывести массив значений
Добавлено: 2014.05.16, 15:37
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,
));
}
Re: Как правильно вывести массив значений
Добавлено: 2014.05.16, 15:39
Егор
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,
));
}
Спасибо,понял!
Re: Как правильно вывести массив значений
Добавлено: 2014.05.16, 15:41
PendalF
Егор писал(а):Спасибо,понял!
Да не за что, обращайтесь
Re: Как правильно вывести массив значений
Добавлено: 2014.05.16, 17:45
Егор
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?
Re: Как правильно вывести массив значений
Добавлено: 2014.05.16, 17:48
lancedevnull
ты юзер, я юзер, он тоже юзер, все мы юзеры и даже гости - данного ресурся
Re: Как правильно вывести массив значений
Добавлено: 2014.05.17, 08:24
PendalF
Как правильно заметил lancedevnull, юзер в данном случае это любой пользователь/посетитель сайта. У него в сессии сохраняется сообщение и пока он его не увидит, оно будет висеть там.
Re: Как правильно вывести массив значений
Добавлено: 2014.05.23, 17:09
Егор
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
но потом не удобно работать..с этим всем..