четверг, 21 июля 2011 г.

Загрузка картинки к модели (товары)

В моем каталоге товары имеют: название, описание, рейтинг (пока нигде не используется) и атрибут скрывать или показывать. Кроме того: индекс (уникальный порядковый номер) и поле для хранения принадлежности к категории. Все эти поля хранятся в базе данных, в таблице tbl_assortiment.
Сегодня я добавил еще одно поле: icon – то есть картинку изображения данного товара. К каждому товару можно загрузить одно изображение.
Хранить имя изображения в базе данных я не стал, решил файлы изображений называть $id_assortiment.jpg где $id это уникальный порядковый номер товара. Зная id товара всегда можно однозначно определить его изображение.
В модель добавляю новый атрибут: В файле Z:\home\catalog.loc\www\protected\models\Assortiment.php добавляю в самом верху:

class Assortiment extends CActiveRecord
{
// assortiment_img value
public $icon;
// Delete picture boolean
public $del_img;

Переменная $icon для хранения загружаемой картинки и $del_img для того, чтобы пользователь мог бы удалить уже загруженную картинку. Теперь в модели Assortiment добавились атрибуты icon и del_img. Их надо описать как же, как и атрибуты, значения которых хранятся в базе данных: определить правила валидации rules() и названия полей в понятном для человека виде attributeLabels()
В том же файле Z:\home\catalog.loc\www\protected\models\Assortiment.php

public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('name, description, category_id, rating', 'required'),
array('del_img', 'boolean'),
array('category_id, rating', 'numerical', 'integerOnly'=>true),
array('shown', 'safe'),
array('icon', 'file',
'types'=>'jpg, gif, png',
'maxSize'=>1024 * 1024 * 5, // 5MB
'allowEmpty'=>'true',
'tooLarge'=>'The file was larger than 5MB. Please upload a smaller file.',
            ),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array(
'id, name, description, category_id, rating, shown', 'safe', 'on'=>'search'),
);
}


public function attributeLabels()
{
return array(
'id' => 'Id',
'name' => 'Name',
'description' => 'Description',
'category_id' => 'Category',
'rating' => 'Rating',
'shown' => 'Show in catalog?',
'icon' => 'Image',
'del_img'=>'Delete image?',
);
}
Эти новые атрибуты отличает то, что их значения нигде не хранятся (нужны только чтобы загрузить картинку на сервер или удалить уже загруженную).

Если для товара картинка не загружена, нужно будет вывести картинку с надписью «Изображение отсутствует». Для этого в контроллере Z:\home\catalog.loc\www\protected\controllers\AssortimentController.php создаю действие assortiment_image()

/**
 * @return html image tag for assortiment. No photo if image not exests
 * $id id of the assortiment
 * $name name of assortiment
 * $width width of image
 * $class class of image
 */
public function assortiment_image($id,$name, $width='200', 
$class='assortiment_img')
{
if(file_exists($_SERVER['DOCUMENT_ROOT'].
Yii::app()->urlManager->baseUrl.
'/assortiment_img/'.$id.'_assortiment.jpg'))
return CHtml::image('/assortiment_img/'.$id.'_assortiment.jpg',$name,
array(
'width'=>$width,
'class'=>$class,
));
else
return CHtml::image('/assortiment_img/no_photo.gif','No photo',
array(
'width'=>$width,
'class'=>$class
));
}

Этой функции передаются id товара, имя товара, ширина картинки, css класс картинки. Функция возвращает HTML тег image с нужной картинкой, или с картинкой no_photo.gif. Картинки должны находиться в папке Z:\home\catalog.loc\www\assortiment_img

Теперь в форме Z:\home\catalog.loc\www\protected\views\assortiment\ _form.php добавляю перед выводом кнопки сохранения формы вывод картинки товара, чекбокс на удаление этой картинки и поле выбора новой картинки.


<? echo $this->assortiment_image($model->id, $model->name, '100','my') ?>
// Вывод уже загруженной картинки или изображения No_photo
<?
//Если картинка для данного товара загружена, 
//предложить её удалить отметив чекбокс
if(file_exists($_SERVER['DOCUMENT_ROOT'].
Yii::app()->urlManager->baseUrl.
'/assortiment_img/'.$model->id.'_assortiment.jpg'))
{
echo '<div class="row">';
echo $form->labelEx($model,'del_img'); 
echo $form->checkBox($model,'del_img' );   
echo '</div>';
 }
?> 
<? echo '<br />' ?>
//Поле загрузки файла
<?php echo CHtml::activeFileField($model, 'icon'); ?>

Обратим внимание: на $form->checkBox($model,'del_img' ); и CHtml::activeFileField($model, 'icon'); Там имена новый атрибутов модели, которые не хранятся в базе данных.

Теперь, чтобы обработать данные формы вернемся в контроллер Z:\home\catalog.loc\www\protected\controllers\AssortimentController.php Изменять надо метод «создать» и «обновить»:

public function actionCreate()
{
$model=new Assortiment;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Assortiment'])){
$model->attributes=$_POST['Assortiment'];
//Полю icon присвоить значения поля формы icon
$model->icon=CUploadedFile::getInstance($model,'icon');

if($model->save()){
//Если поле загрузки файла не было пустым, то            
if ($model->icon){
//сохранить файл на сервере в каталог assortiment_img под именем 
//id_assortiment.jpg
$file = './assortiment_img/'.$model->id.'_assortiment.jpg';
$model->icon->saveAs($file);
}
$this->redirect(array('view','id'=>$model->id)); 
}
}
$this->render('create',array(
'model'=>$model,
));
}

То же самое в действии обновить:

public function actionUpdate($id)
{
$model=$this->loadModel($id);
if(isset($_POST['Assortiment'])){
$model->attributes=$_POST['Assortiment'];
  
$model->icon=CUploadedFile::getInstance($model,'icon');
if($model->save()){
//Если отмечен чекбокс «удалить файл»            
if($model->del_img)
{
if(file_exists($_SERVER['DOCUMENT_ROOT'].
Yii::app()->urlManager->baseUrl.
'/assortiment_img/'.$id.'_assortiment.jpg'))
{
//удаляем файл
unlink('./assortiment_img/'.$id.'_assortiment.jpg');
        }
        }
//Если поле загрузки файла не было пустым, то            
if ($model->icon){
$file = './assortiment_img/'.$model->id.'_assortiment.jpg';
//сохранить файл на сервере в каталог assortiment_img под именем 
//id_assortiment.jpg Если файл с таким именем существует, он будет заменен.
$model->icon->saveAs($file);
}
            $this->redirect(array('view','id'=>$model->id)); 
            }
        }
$this->render('update',array(
'model'=>$model,
));
}

Теперь подправил вывод товаров для пользователя: в файле Z:\home\catalog.loc\www\protected\views\assortiment\view.php

$this->widget('zii.widgets.CDetailView', array(
'data'=>$model,
'attributes'=>array(
'name',
'id',
array(
'label'=>'Category',
'type'=>'raw',
'value'=>$model->category->name,
),
array(
'label'=>'Photo',
'type'=>'raw',
// If image exests- show image, else show no photo image
'value'=> $this->assortiment_image($model->id, $model->name),
),
array(
'label'=>'description',
'type'=>'html',
'value'=>$model->description,
),
),
));  

И в файле Z:\home\catalog.loc\www\protected\views\assortiment\_view.php

<?php echo '<a name="'.$data->id.'"></a>'; ?>
<div class="view">
<b><?php echo CHtml::encode($data->getAttributeLabel('name')); ?>:</b>
<?php echo CHtml::link(CHtml::encode($data->name), array('view', 
'id'=>$data->id)); ?>
<br /> 
<b><?php echo CHtml::encode($data->getAttributeLabel('id')); ?>:</b>
<?php echo CHtml::encode($data->id); ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('category_id')); ?>:</b>
<?php echo CHtml::encode($data->category->name); ?>
<br />
<?php echo $this->assortiment_image($data->id, $data->name) ; ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('description')); ?>:</b>
<?php echo $data->description; ?>
<br />
</div>

С помощью метода assortiment_image() вывожу картинки.
Еще момент: стили css В файле Z:\home\catalog.loc\www\css\ main.css
Добавляю:
.assortiment_img
{
margin: 10px 10px 10px 0;
float:left
}
Чтобы картинку текст обтекал справа, и

div.view
{
padding: 10px;
margin: 10px 0;
border: 1px solid #C9E0ED;
min-height: 250px;
height: auto !important;
height: 250px;
}
Это чтобы не расползался список товаров, каждый товар имеет ячейку не менее 250 пикселей высотой. Нашел отличный кроссбраузерный способ это сделать!

Можно посмотреть, что получилось в реале: http://psyhos.vnet.ee/catalog

Login: admin
Password: admin
Это еще конечно не всё: надо чтобы при загрузке картинки уменьшались, делались бы превьюхи и тип картинки преобразовывался в jpg

Продолжение следует.

60 комментариев:

  1. Такой вариант не плох, но как правило у одного товара картинок бывает не одна а несколько.

    ОтветитьУдалить
  2. Конечно согласен с вами. Можно потом подключить к каждому товару галерею изображений. А пока и так сойдет для начала ;)

    ОтветитьУдалить
  3. всё отлично!!! Спасибо!
    пометьте не забывать писать при вызове формы - 'htmlOptions'=>array('enctype'=>'multipart/form-data'),

    весь день провозился, в итоге нашёл на форуме qiang сказал об этом

    ОтветитьУдалить
  4. Зашел под admin/admin - "Изменить товар 'Строп 2 тонны'", щелкаю по изображению товара - вылетает ошибка
    Fatal error: Uncaught exception 'CHttpException' with message 'Системе не удалось найти запрашиваемое действие "my".' in /www/psyhos.vnet.ee/html/catalog/protected/framework/web/CController.php:477 Stack trace: #0 /www/psyhos.vnet.ee/html/catalog/protected/framework/web/CController.php(262): CController->missingAction('my') #1 /www/psyhos.vnet.ee/html/catalog/protected/framework/web/CWebApplication.php(328): CController->run('my') #2 /www/psyhos.vnet.ee/html/catalog/protected/framework/web/CWebApplication.php(121): CWebApplication->runController('assortiment/my') #3 /www/psyhos.vnet.ee/html/catalog/protected/framework/base/CApplication.php(155): CWebApplication->processRequest() #4 /www/psyhos.vnet.ee/html/catalog/index.php(15): CApplication->run() #5 {main} thrown in /www/psyhos.vnet.ee/html/catalog/protected/framework/web/CController.php on line 477

    ОтветитьУдалить
  5. HI! Подскажите пожалуйста.
    Функция CUploadedFile::getInstance($model,'icon');
    возвращает
    object(CUploadedFile)#45 (7) {
    ["_name":"CUploadedFile":private]=>
    string(14) "Lighthouse.jpg"
    ["_tempName":"CUploadedFile":private]=>
    string(18) "Z:\tmp\php77AE.tmp"
    ["_type":"CUploadedFile":private]=>
    string(10) "image/jpeg"
    ["_size":"CUploadedFile":private]=>
    int(561276)
    ["_error":"CUploadedFile":private]=>
    int(0)
    ["_e":"CComponent":private]=>
    NULL
    ["_m":"CComponent":private]=>
    NULL
    }
    но темповский файл не создается и соотвецтвенно $model->icon->saveAs($file); дает ошибку
    move_uploaded_file(Z:/home/example.com/www/blog3/images/1/2011/12-20-2011.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory

    форма 'htmlOptions'=>array('enctype'=>'multipart/form-data'),
    Что может быть?

    ОтветитьУдалить
  6. Надо проверить еще раз пути сохранения, если работаете в linux то может доступ на запись?

    ОтветитьУдалить
  7. Этот комментарий был удален автором.

    ОтветитьУдалить
  8. Этот комментарий был удален автором.

    ОтветитьУдалить
  9. Разобрался. Про создание каталогов никто не упоминул, а у меня пост и каждому автору свой каталог

    ОтветитьУдалить
  10. Сделал как бы все также но не определяет Property "Data.name" is not defined. я хз..

    ОтветитьУдалить
  11. Z:\home\ad.ru\www\framework\db\ar\CActiveRecord.php(129)

    117 */
    118 public function __get($name)
    119 {
    120 if(isset($this->_attributes[$name]))
    121 return $this->_attributes[$name];
    122 else if(isset($this->getMetaData()->columns[$name]))
    123 return null;
    124 else if(isset($this->_related[$name]))
    125 return $this->_related[$name];
    126 else if(isset($this->getMetaData()->relations[$name]))
    127 return $this->getRelated($name);
    128 else
    129 return parent::__get($name);---------может кто подскажет незнающему!
    130 }

    ОтветитьУдалить
  12. Может быть Data.name стало уже Data.name_ru ?
    Проверьте, какие поля определены в моделе Assortiment

    ОтветитьУдалить
  13. Этот комментарий был удален автором.

    ОтветитьУдалить
  14. Спасибо, все добавляет и записывает в БД, но вью что то туплю no_image высвечивает вместо картинок

    ОтветитьУдалить
  15. Переменную $name чёто не хочет видеть((

    ОтветитьУдалить
    Ответы
    1. $id.'_assortiment.jpg',$name, я же правильно понял имя это имя переменной из базы данных?

      Удалить
  16. $id это уникальный идентификатор товара
    $name это название товара (при генерации картинки используется для поля alt="$name" подпись к картинке)

    $id.'_assortiment.jpg это составное имя файла, например: 12_assortimrnt.jpg Если такого файла нет, то показывает no_image

    ОтветитьУдалить
  17. та просто у меня не $name a $firstname, работает абсолютно все кроме просмотра, ошибки не найду никак

    ОтветитьУдалить
  18. Просто не пойму:
    public function data_image($id, $Firstname, $width='100',
    $class='data_img')

    {
    if(file_exists($_SERVER['DOCUMENT_ROOT'].
    Yii::app()->urlManager->baseUrl.
    '/data_img/'.$id.'_data.jpg'))
    return CHtml::image('/data_img/'.$id.'_data.jpg', $Firstname,
    array(
    'width'=>$width,
    'class'=>$class,
    ));

    else
    return CHtml::image('/data_img/no_photo.gif','No photo',
    array(
    'width'=>$width,
    'class'=>$class
    ));



    Почему еще может не показывать?

    ОтветитьУдалить
  19. Мне кажется, что у вас путь до картинок не срабатывает.

    Когда я проверяю файл на существование, то использую путь относительно корня сервера:

    if (file_exists($_SERVER[DOCUMENT_ROOT].Yii::app()->urlManager->baseUrl."/images/".$id."_assortiment.jpg"))

    А когда показываю картинку, я использую полный путь URL до картинки:
    CHtml::image(Yii::app()->urlManager->baseUrl.'/images/'.$id.'_assortiment.jpg'


    Угадал? :)

    ОтветитьУдалить
  20. проверка пути это же в _form а картинку показывает в Вашей функции assortimen_image?

    ОтветитьУдалить
    Ответы
    1. Вы имеете в виду какую то другую проверку пути.
      В функции assortimen_image проверяется: если картинка есть в папке, то показывается она, а если картинки с таким именем нет, то показывается заранее заготовленная картинка no_photo.jpg

      Удалить
  21. Это как то так?)) public function data_img($id, $Firstname, $width='100',
    $class='data_img')

    {
    if(file_exists($_SERVER['DOCUMENT_ROOT'].
    Yii::app()->urlManager->baseUrl.
    '/data_img/'.$id.'_data.jpg'))
    return CHtml::image(Yii::app()->urlManager->baseUrl.'/data_img/'.$id.'_data.jpg', $Firstname,
    array(
    'width'=>$width,
    'class'=>$class,
    ));

    ОтветитьУдалить
    Ответы
    1. ну да, как то так, а в else можно дописать return CHtml::image(Yii::app()->urlManager->baseUrl.'/data_img/no_photo.jpg',,
      array(
      'width'=>$width,
      'class'=>$class,
      )

      Удалить
  22. Я конечно извиняюсь)))) Просто не могу понять) Если create создает картинку (допустим как у меня) в директории '/data_img/' с названием id.data.jpg... зачем просто name если разница в картинках только id, что то не сростается у меня)))

    ОтветитьУдалить
    Ответы
    1. Name это название товара, этот нейм добавляется при показе карнинки в тег image alt. Когда на картинку наводишь курсор, то всплывает эта надпись, или если картинки в браузере отключены, то отобразится эта надпись.

      Удалить
    2. То есть если я не буду задавать переменную $name однозначно загрузить должно? тогда вообще запутался)

      Удалить
    3. Эта функция же не загружает ничего, она же только отображает.
      Загрузка в save() и update()

      Удалить
  23. А в настройках же нет ничего что нужно было подключать?

    ОтветитьУдалить
    Ответы
    1. Именно для отображения изображений

      Удалить
  24. Этот комментарий был удален автором.

    ОтветитьУдалить
  25. ну вот она и отображает картинку по имени $id.assortiment.jpg из папки, а если там картинки нет, то отображает no_photo.jpg
    блин, я это уже писал :)

    ОтветитьУдалить
  26. Во view.php я же только подключил
    array(
    'label'=>'Photo',
    'type'=>'raw',
    // If image exests- show image, else show no photo image
    'value'=> $this->data_img($model->id),
    ),

    и _view.php


    data_img($data->id); ?>




    Извини еще раз что напрягаю))

    ОтветитьУдалить
  27. Да, я просто этот if вынес в отдельное действие (функцию)ведь не только в этом месте надо картинку выводить!
    и получилось:
    array(
    'label'=>Yii::t('main-ui', 'Image'),
    'type'=>'raw',
    // If image exests- show image, else show no photo image
    'value'=> $this->assortiment_image($model->id, $model->name,)

    Где $this->assortiment_image описано в AssortimentController

    public function assortiment_image($id,$name)
    {
    if (file_exists($_SERVER["DOCUMENT_ROOT"].Yii::app()->urlManager->baseUrl."/images/".$id.$size."_assortiment.jpg"))
    {
    return
    CHtml::image(Yii::app()->urlManager->baseUrl.'/images/".$id.$size."_assortiment.jpg",$name,
    array(
    'class'=>$class,
    ));

    }
    else

    return CHtml::image(Yii::app()->urlManager->baseUrl.'/images/assortiment_img/no_photo'.$size.'.gif','No photo',
    array(
    'class'=>$class
    ));

    ОтветитьУдалить
  28. С виду всё как Вы и написали.. но, я уже хз))

    ОтветитьУдалить
  29. Попробуйте выводить не image а просто все пути как текст

    ОтветитьУдалить
    Ответы
    1. или посмотреть на исходный код HTML какая там картинка получается?

      Удалить
    2. Картинка получается выводится всегда только else то бишь no_photo в любом случае, как я не менял вывод картинки в if

      Удалить
    3. пусть он тогда напечатает, какой именно путь он проверяет на существование

      Удалить
  30. может .$id.'_data.jpg', вместо '_data.jpg' задать что это переменная ? или это тупо?

    ОтветитьУдалить
  31. Надо попробовать взять то что находится в file_exists(......) и вставить в тег echo чтобы он вывел, по какому пути он ищет картинку.

    Чтобы получилось:
    echo $_SERVER['DOCUMENT_ROOT'].
    Yii::app()->urlManager->baseUrl.
    '/data_img/'.$id.'_data.jpg';

    if(file_exists($_SERVER['DOCUMENT_ROOT'].
    Yii::app()->urlManager->baseUrl.
    '/data_img/'.$id.'_data.jpg'))

    ОтветитьУдалить
  32. Как то так Z:/home/ad.ru/www/index.php/data_img/61_data.jpg и потом фотка no_photo)))

    ОтветитьУдалить
    Ответы
    1. ну вот и понятно, что нет по этому адресу картинки -
      надо путь исправлять /index.php тут явно лишний

      Удалить
  33. Ясно))) Это в настройках сервера менять так?

    ОтветитьУдалить
    Ответы
    1. Нет, просто там, где проверяется файл file_exists() удалить Yii::app()->urlManager->baseUrl наверное так..

      Удалить
  34. Этот комментарий был удален автором.

    ОтветитьУдалить
  35. Спасибо огромное за помощь)))!!!!!!!!!!!!!

    ОтветитьУдалить
  36. В действии assortiment_image() контроллера Z:\home\catalog.loc\www\protected\controllers\AssortimentController.php может создать в начале действия две переменные типа:
    $imgPathTrue='/assortiment_img/'.$id.'_assortiment.jpg';
    и
    $imgPathFalse='/assortiment_img/no_photo.gif';
    букав меньше код читаемее...

    ОтветитьУдалить
  37. Подскажите, пожалуйста, где копать если экземпляр модели не сохраняется. А тест указанный выше:

    echo $_SERVER['DOCUMENT_ROOT'].'/event_img/'.$id.'_event.jpg';

    выдает: F:/home/yiiapp/www/event_img/_event.jpg Т.е. без присвоения АйДишника.

    А вот если в папку /event_img/ запихнуть рисунок, например 16_event.jpg, то картинка отобразится в соответствующем экземпляре.


    Вот мой контроллер:
    public function actionCreate()
    {
    $model=new event;
    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);
    if(isset($_POST['event'])){
    $model->attributes=$_POST['event'];
    //Полю icon присвоить значения поля формы icon
    $model->icon=CUploadedFile::getInstance($model,'icon');

    if($model->save()){
    //Если поле загрузки файла не было пустым, то
    if ($model->icon){
    //сохранить файл на сервере в каталог event_img под именем
    //id_event.jpg
    $file = './event_img/'.$model->id.'_event.jpg';
    $model->icon->saveAs($file);
    }
    $this->redirect(array('view','id'=>$model->id));
    }
    }
    $this->render('create',array(
    'model'=>$model,
    ));
    }





    public function actionUpdate($id)
    {
    $model=$this->loadModel($id);
    if(isset($_POST['event'])){
    $model->attributes=$_POST['event'];

    $model->icon=CUploadedFile::getInstance($model,'icon');
    if($model->save()){
    //Если отмечен чекбокс «удалить файл»
    if($model->del_img)
    {
    if(file_exists($_SERVER['DOCUMENT_ROOT'].'/event_img/'.$id.'_event.jpg'))
    {
    //удаляем файл
    unlink('./event_img/'.$id.'_event.jpg');
    }
    }
    //Если поле загрузки файла не было пустым, то
    if ($model->icon){
    $file = './event_img/'.$model->id.'_event.jpg';
    //сохранить файл на сервере в каталог event_img под именем
    //id_event.jpg Если файл с таким именем существует, он будет заменен.
    $model->icon->saveAs($file);
    }
    $this->redirect(array('view','id'=>$model->id));
    }
    }
    $this->render('update',array(
    'model'=>$model,
    ));
    }


    public function event_image($id,$name_event, $width='200',
    $class='event_img')
    {
    if(file_exists($_SERVER['DOCUMENT_ROOT'].'/event_img/'.$id.'_event.jpg'))
    return CHtml::image('/event_img/'.$id.'_event.jpg',$name_event,
    array(
    'width'=>$width,
    'class'=>$class,
    ));
    else
    return CHtml::image('/event_img/no_photo.gif','No photo',
    array(
    'width'=>$width,
    'class'=>$class
    ));
    }
    }





    в accessRules() - 'event_image' добавил
    в _form.php - 'htmlOptions' тоже
    Пробовал по разному все равно не получается. Вообщем помогите! Сдаюсь:)

    ОтветитьУдалить
    Ответы
    1. Этот комментарий был удален автором.

      Удалить
    2. разобрался. Глупая ошибка. имя модели в контроллере писал с маленькой буквы. Спасибо автору за статью, все работает! Кстати мне тоже пришлось Yii::app()->urlManager->baseUrl. удалять

      Удалить
  38. Подскажите пожалуйста у меня при сохранении файла он выставляет права 0600, картинка не показывается, обычно права 0644, тогда все работает. Где устаналиваются права при записи файла?

    ОтветитьУдалить
    Ответы
    1. Можно после сохранения файла воспользоваться функцией php chmod

      Удалить
    2. в итоге так и сделал, спасибо. Пытался понять откуда берутся права, так и не нашел

      Удалить
    3. права веб сервер назначает

      Удалить
  39. Не выводит изображение, отображается "no foto"

    ОтветитьУдалить
  40. Подскажите,пожалуйста, в чем может быть проблемаю

    ОтветитьУдалить
  41. public function object_image($id,$adres, $width='200',
    $class='object_img')
    {

    if(file_exists($_SERVER['DOCUMENT_ROOT'].
    '/object_img/'.$id.'_object.jpg'))
    {
    return CHtml::image('/object_img/'.$id.'_object.jpg',$adres,
    array(
    'width'=>$width,
    'class'=>$class,
    ));
    }
    else{
    return CHtml::image('/object_img/no_photo.gif','No photo',
    array(
    'width'=>$width,
    'class'=>$class
    ));
    }
    }

    ОтветитьУдалить
    Ответы
    1. Сначала надо проверить, чтобы картинка находилась на сервере в нужной папке и под нужным именем:
      ...путь на сервере..../object_img/01_object.jpg

      раз показывает Но фото, значитименно этот if не срабатывает if(file_exists($_SERVER['DOCUMENT_ROOT'].
      '/object_img/'.$id.'_object.jpg'))

      попробуйте вывести echo $_SERVER['DOCUMENT_ROOT'].
      '/object_img/'.$id.'_object.jpg;
      и тогда увидите, где он ищет картинку!

      Удалить