2014-11-06 4 views
1

Я пытаюсь показать ссылку на альбом через изображение, принадлежащее этому альбому. У меня есть модель «Альбом», и там у меня есть отношение к моей модели «Фото», которая представляет собой таблицу, в которой фотографии сохраняются (или для более точных изображений, изображения сохраняются в папке «uploads»):Yii: Ссылка на изображение в CHtml - как добраться до изображения в одном столе через отношение в другой таблице?

public function relations() 
{ 
     return array(
        'photos' => array(self::HAS_MANY, 'Photo', 'album_id'), 
    ); 
} 

Теперь я отображая альбом/индекс вид, где я анализирую объект $ DataProvider, который содержит все мои альбомы. Теперь, когда $ DataProvider разбирается в _view зрения, и там я пытаюсь получить доступ к фотографии (на самом деле мне просто нужно одно изображение в альбоме), которое принадлежит к каждому альбому. Это изображение будет представлять ссылку на альбом/вид , где можно увидеть все изображения, принадлежащие этому альбому. чтобы сделать это. Я попытался с:

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), 

(как ссылка я отображаюсь эскизом образа, то почему у меня есть «/ загрузки/пальцы /» . «имя» является столбец в таблице, которая представляет собой имя файла изображения)

Редактировать 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 

Edit 2

Это действительно сводит меня с ума ...В одной и той же модели альбома, у меня есть другие отношения с другой таблицей «пользователь»:

public function relations() 
    { 
     return array(
      'owner' => array(self::BELONGS_TO, 'User', 'owner_id'), 
      ... 
     ); 
    } 

И у меня нет никаких проблем с доступом атрибутов в модели пользователя в режим просмотра альбома, проверил var_dump ($ данных-> владелец) :

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 ($ данных-> lastPhoto) (только с его собственными атрибутами), но когда я пытаюсь с $ данных-> lastPhoto-> имя это Попытка получить имущество не-объекта, тогда как имя пользователя $ data-> owner-> работает только хорошо

Редактировать 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, 
     )); 
    } 

И просмотр файлов альбома/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> 
+0

'photos '=> массив (self :: HAS_MANY,' Photo ', 'album_id'), 'подразумевает, что ваша модель имеет много фотографий, поэтому, на ваш взгляд,' $ data-> photos ', вероятно, будет массивом фотомоделей, а не самой модели? – Stu

+0

Ну да, это имеет смысл (я новичок в Yii, поэтому я не очень много). Теперь вопрос заключается в том, как получить первый элемент массива фотографий, принадлежащих этому альбому, и перейти к атрибуту «имя» через отношение «фотографии» на мой взгляд –

ответ

0

Чтобы получить первый элемент в 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) 
); 
+0

Я пробовал это уже, но я получил ошибку: ** Неопределенное смещение: 0 ** –

+0

Что делает 'var_dump ($ data-> photos),' output? – Stu

+0

Редактировать: попробовал это и снова ошибку: ** Попытка получить свойство не-объекта ** и вот вывод var_dump ($ data-> lastPhoto): http://pokit.org/get /?44503ed3e989f7a03185fda19dc88525.jpg –