Я пытаюсь отобразить ссылку на альбом / просмотр через изображение, которое принадлежит этому альбому. У меня есть моя модель «Альбом», и там у меня есть связь с моей моделью «Фото», которая представляет собой таблицу, в которой сохраняются изображения (или, если быть более точным, названия изображений, изображения сохраняются в папке «Загрузка»):
public function relations()
{
return array(
'photos' => array(self::HAS_MANY, 'Photo', 'album_id'),
);
}
Сейчас я показываю Альбом / индекс посмотреть, где я анализирую объект $ dataProvider, который содержит все мои альбомы. Теперь, когда $ dataProvider анализируется _Посмотреть просмотреть и там я пытаюсь получить доступ к изображениям (на самом деле мне просто нужно одно изображение на альбом), которое принадлежит каждому отображаемому альбому. Эта картинка будет представлять ссылку на альбом / просмотр посмотреть, где можно увидеть все фотографии, принадлежащие этому альбому. Я понятия не имею, как это сделать. Я пробовал с:
CHtml::link(
CHtml::image(Yii::app()->request->baseUrl."/uploads/thumbs/".$data->photos->name),
array('view', 'id'=>$data->id));
и я получил ошибку: Попытка получить свойство необъекта
PS: у меня нет проблем с отображением всех фотографий в одном альбоме в альбом / просмотр вид (но эти кросс-контроллеры, кросс-таблицы, что бы ни доставляли мне неприятности). Там я вложил фото / индекс вид, и картинки отображаются так:
echo CHtml::link(
CHtml::image(Yii::app()->request->baseUrl."/uploads/thumbs/".$data->name),
Yii::app()->request->baseUrl."/uploads/".$data->name ),
(в качестве ссылки я отображаю эскиз изображения, поэтому у меня есть «/ uploads / thumbs /». «name» — это столбец в таблице, который представляет имя файла изображения)
Редактировать 1
@Stu
в моем альбоме, где у меня есть три фотографии это:
array (size=3)
0 =>
object(Photo)[84]
private '_uploads' => null
private '_new' (CActiveRecord) => boolean false
private '_attributes' (CActiveRecord) =>
array (size=6)
'id' => string '1' (length=1)
'album_id' => string '1' (length=1)
'name' => string 'WP_20140907_18_34_12_Pro.jpg' (length=28)
'caption' => string 'Balerina' (length=8)
'date_created' => string '2014-10-27 19:56:13' (length=19)
'date_updated' => null
private '_related' (CActiveRecord) =>
array (size=0)
empty
private '_c' (CActiveRecord) => null
private '_pk' (CActiveRecord) => string '1' (length=1)
private '_alias' (CActiveRecord) => string 't' (length=1)
private '_errors' (CModel) =>
array (size=0)
empty
private '_validators' (CModel) => null
private '_scenario' (CModel) => string 'update' (length=6)
private '_e' (CComponent) => null
private '_m' (CComponent) => null
1 =>
object(Photo)[85]
private '_uploads' => null
private '_new' (CActiveRecord) => boolean false
private '_attributes' (CActiveRecord) =>
array (size=6)
'id' => string '2' (length=1)
'album_id' => string '1' (length=1)
'name' => string 'WP_20140907_18_49_33_Pro.jpg' (length=28)
'caption' => string '' (length=0)
'date_created' => string '2014-10-27 19:56:45' (length=19)
'date_updated' => null
private '_related' (CActiveRecord) =>
array (size=0)
empty
private '_c' (CActiveRecord) => null
private '_pk' (CActiveRecord) => string '2' (length=1)
private '_alias' (CActiveRecord) => string 't' (length=1)
private '_errors' (CModel) =>
array (size=0)
empty
private '_validators' (CModel) => null
private '_scenario' (CModel) => string 'update' (length=6)
private '_e' (CComponent) => null
private '_m' (CComponent) => null
2 =>
object(Photo)[86]
private '_uploads' => null
private '_new' (CActiveRecord) => boolean false
private '_attributes' (CActiveRecord) =>
array (size=6)
'id' => string '3' (length=1)
'album_id' => string '1' (length=1)
'name' => string 'WP_20140907_18_49_38_Pro.jpg' (length=28)
'caption' => string '' (length=0)
'date_created' => string '2014-10-27 20:00:41' (length=19)
'date_updated' => null
private '_related' (CActiveRecord) =>
array (size=0)
empty
private '_c' (CActiveRecord) => null
private '_pk' (CActiveRecord) => string '3' (length=1)
private '_alias' (CActiveRecord) => string 't' (length=1)
private '_errors' (CModel) =>
array (size=0)
empty
private '_validators' (CModel) => null
private '_scenario' (CModel) => string 'update' (length=6)
private '_e' (CComponent) => null
private '_m' (CComponent) => null
Редактировать 2
Это действительно сводит меня с ума … В той же модели Альбома у меня есть другая связь с другой таблицей «пользователь»:
public function relations()
{
return array(
'owner' => array(self::BELONGS_TO, 'User', 'owner_id'),
...
);
}
И у меня нет проблем с доступом к атрибутам в модели User в представлении альбома, проверил var_dump ($ data-> owner):
object(User)[83]
public 'passSave' => null
public 'passRepeat' => null
private '_new' (CActiveRecord) => boolean false
private '_attributes' (CActiveRecord) =>
array (size=7)
'id' => string '1' (length=1)
'email' => string '[email protected]' (length=25)
'username' => string 'admin' (length=5)
'firstname' => string 'Emina' (length=5)
'lastname' => string 'Hasanović' (length=10)
'pass' => string 'sa1aY64JOY94w' (length=13)
'date_created' => string '2014-10-27 11:20:55' (length=19)
private '_related' (CActiveRecord) =>
array (size=0)
empty
private '_c' (CActiveRecord) => null
private '_pk' (CActiveRecord) => string '1' (length=1)
private '_alias' (CActiveRecord) => string 't' (length=1)
private '_errors' (CModel) =>
array (size=0)
empty
private '_validators' (CModel) => null
private '_scenario' (CModel) => string 'update' (length=6)
private '_e' (CComponent) => null
private '_m' (CComponent) => null
Это тот же вывод, что и для var_dump ($ data-> lastPhoto) (только с собственными атрибутами), но когда я пытаюсь использовать $ data-> lastPhoto-> name, это Попытка получить свойство необъекта, в то время как $ data-> owner-> username работает просто хорошо
Редактировать 3
Вот моя модель альбома:
<?php
/**
* This is the model class for table "album".
*
* The followings are the available columns in table 'album':
* @property string $id
* @property string $name
* @property string $owner_id
* @property integer $shareable
* @property string $date_created
*
* The followings are the available model relations:
* @property User $owner
* @property Photo[] $photos
*/
class Album extends CActiveRecord
{
public function tableName()
{
return 'album';
}public function rules()
{
return array(
array('name', 'required'),
array('shareable', 'numerical', 'integerOnly'=>true),
array('name', 'length', 'max'=>100),
array('owner_id', 'length', 'max'=>10),
array('name', 'safe', 'on'=>'search'),
);
}
protected Function beforeSave() {
if(parent::beforeSave()) {
if($this->isNewRecord) {
$this->owner_id=Yii::app()->user->getId();
}
return true;
}
else
return false;
}public function relations()
{
return array(
'owner' => array(self::BELONGS_TO, 'User', 'owner_id'),
'photos' => array(self::HAS_MANY, 'Photo', 'album_id'),
'lastPhoto' => array(self::HAS_ONE, 'Photo', 'album_id', 'order'=>'lastPhoto.id DESC'),
);
}
public function scopes()
{
return array(
'mine'=>array(
'order'=>'date_created DESC',
'condition'=>'owner_id=:owner',
'params'=>array(
'owner'=>Yii::app()->user->getId(),
)
)
);
}
public function attributeLabels()
{
return array(
'id' => 'ID',
'name' => 'Name',
'owner_id' => 'Owner',
'shareable' => 'Shareable',
'date_created' => 'Date Created',
);
}public function search()
{
$criteria=new CDbCriteria;
$criteria->compare('name',$this->name,true);
$criteria->compare('shareable',$this->shareable);
$criteria->scopes='mine';
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
public static function model($className=__CLASS__)
{
return parent::model($className);
}
}
Действие контроллера (из AlbumController):
public function actionIndex()
{
$dataProvider=new CActiveDataProvider('Album', array(
'criteria'=>array(
'condition'=>'shareable=1',
'order'=>'date_created DESC'
)
)
);
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
И файлы для просмотра — album / index.php:
<h1>Albums</h1>
<?php $this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_view',
)); ?>
_view.php:
<div class="view">
<h><?php // echo CHtml::encode($data->name); ?></h1>
<h1>
echo CHtml::link(
CHtml::image(Yii::app()->request->baseUrl."/uploads/thumbs".$data->lastPhoto->name),
array('view', 'id'=>$data->id));
?>
</h1>
<br />
<br /><b><?php echo CHtml::encode($data->getAttributeLabel('shareable')); ?>:</b>
<?php echo CHtml::encode($data->shareable)? 'Public' : 'No'; ?>
<br />
<b><?php echo 'Created by'; ?>:</b>
<?php echo CHtml::encode($data->owner->fullName()); ?><b><?php echo 'on Date'; ?>:</b>
<?php echo CHtml::encode($data->date_created); ?>
<br />
</div>
Чтобы получить первый элемент в photos
В связи с этим вы можете просто вызвать первое значение массива, хотя вам может потребоваться добавить некоторые дополнительные условия на тот случай, если это пустой массив и значения вообще нет.
CHtml::link(
CHtml::image(Yii::app()->request->baseUrl."/uploads/thumbs/".$data->photos[0]->name),
array('view', 'id'=>$data->id)
);
редактировать
Другой вариант — ограничить отношение только одной строкой, а не всеми отношениями и использовать только первую:
public function relations()
{
return array(
...
'lastPhoto' => array(self::HAS_ONE, 'Photo', 'album_id', 'order'=>'lastPhoto.id DESC'),
...
);
}
И назови так:
CHtml::link(
CHtml::image(Yii::app()->request->baseUrl."/uploads/thumbs/".$data->lastPhoto->name),
array('view', 'id'=>$data->id)
);
Других решений пока нет …