Kohana Загрузка фоток в товаре

ws17

Новичок
Здравствуйте уважаемые пользователи форума.
Делаю небольшую доработку сайта, в кохане новичек.

У товара есть загрузка фото, загрузка фото и добавление товара происходит админом, только в админке.

Хочу добавить дополнительную загрузку фото к товару, где будет ткань в отдельном блоке на фронтенте.

Что я сделал и что уже работает.

/application/classes/controller/admin

products.php

Методом дубликата я сделал дополнительный код, добавил для теста в акшион edit, акшион при редактировании твара.

Ниже в коде, два когда работы над фотками, смотрим первый, тот что я продублировал и сделал загрузку ткани для товара.

Код:
// Работа с фото для товара, ткань
if (!empty($_FILES['imgcloth']['name'][0]))
{                  
foreach ($_FILES['imgcloth']['tmp_name'] as $i => $image)
{
$filename = $this->_upl_img($image);
if($filename)
{
// Запись в БД
$im_db = ORM::factory('imgcloth');
$im_db->product_id = $products->pk();
$im_db->image = $filename;
$im_db->save();
}
}
            
$this->request->redirect('admin/products/edit/'.$id);
}
          
// Работа с фото для товара
if (!empty($_FILES['images']['name'][0]))
{
foreach ($_FILES['images']['tmp_name'] as $image)
{
$filename = $this->_upload_img($image);

// Запись в БД
$im_db = ORM::factory('image');
$im_db->product_id = $products->pk();
$im_db->image = $filename;
$im_db->save();
}
}
            
$this->request->redirect('admin/products/edit/'.$id);
}
Далее, ниже я подключил свой загрузчик фото, резак, поставил свой путь для фоток для ткани

Код:
// Загрузка фото для ткани
public function _upl_img($file, $ext = NULL, $directory = NULL){

if($directory == NULL)
{
$directory = 'media/uploads/cloth/';
$smalldirectory = 'media/uploads/cloth/small/';
}

if($ext== NULL)
{
$ext= 'jpg';
}

// Генерируем случайное название
$symbols = '0123456789abcdefghijklmnopqrstuvwxyz';

$filename = '';
for($i = 0; $i < 10; $i++)
{
$filename .= rand(1, strlen($symbols));
}
      
//проверяет что бы одна из сторон не была меньше
$im = Image::factory($file);
if($im->width < 350 OR $im->height < 350)
{
return false;
}
else
{
//изменяет размеры большой фотки
$im->resize(1000, 800);      
$im->save("$directory/$filename.$ext");

//делает маленькую фотку
$im->resize(350, 197, Image::INVERSE);

//режет маленькую фотку до
$im->crop(350, 197);  
$im->save("$smalldirectory/small_$filename.$ext");

return "$filename.$ext";
}
}
Далее, добавил в бд таблицу: - дублировал таблицу images, та что работает и была.

назвал таблицу
imgcloth
в нее добавил три параметра: id, product_id, image

Далее я добавил модель в файле /application/classes/model
назвал я ее
imgcloth.php

в этом файле
Код:
<?php defined('SYSPATH') or die('No direct script access.');

class Model_Imgcloth extends ORM {
    protected $_table_name = 'imgcloth';
}
а в стандартном файле image
Код:
<?php defined('SYSPATH') or die('No direct script access.');

class Model_Image extends ORM {

    protected $_belongs_to = array(
        'product' => array(
            'model' => 'product',
            'foreign_key' => 'product_id',
        ),
    );

    public function rules()
    {
        return array(
            'image' => array(
                array('not_empty'),
            ),
        );
    }
}
я пробовал добавить со стандартного файла и изменить, но у меня не вышло, не записывало в бд то что я добавил картинку и вылезали ошибки.

Щас фаил сохраняться в ту папку что я указал загрузчику
/media/uploads/cloth

В бд сохраняться, когда я загружаю фото.

ВСЕ ЛИ Я ПРАВИЛЬНО СДЕЛАЛ? РАЗ ВСЕ РАБОТАЕТ.

Проблема с выводом, не могу доделать.
Что я сделал на фронте для вывода фоток.
/application/views/index/main

два кода, один рабочий, который выводит фото, а другой, тот что первый это вывод ткани фото. тот что я сделал и пытаюсь вывести фото.
Код:
<?php if($imgcloth->image):?>
<a href="/media/uploads/cloth/<?=$imgcloth->image?>" rel="lightbox[roadtrip]" title="<?php echo $product->prname?>">
<img src="/media/uploads/cloth/<?=$imgcloth->image?>" alt="<?php echo $product->prname?>" title="<?php echo $product->prname?>"/>
</a>
<?php else:?>
<img src="/media/uploads/noimage.jpg" alt="нет фото" title="нет фото"/>
<?php endif; ?>

<br/><br/><br/><br/>

<?php if($image->image):?>
<a href="/media/uploads/<?=$image->image?>" rel="lightbox[roadtrip]" title="<?php echo $product->prname?>">
<img src="/media/uploads/<?=$image->image?>" alt="<?php echo $product->prname?>" title="<?php echo $product->prname?>"/>
</a>
<?php else:?>
<img src="/media/uploads/noimage.jpg" alt="нет фото" title="нет фото"/>
<?php endif; ?>
не выводит фото ткани, что не так сделал?
полез я сюда /application/classes/controller/index
открыл фаил который отвечает за вывод полной информации о товаре
product.php

в него я добавил
$imgcloth = ORM::factory('image')->where('id','=',$product->image_id)->find();
и ниже
->bind('imgcloth',$image)

так же я открыл /application/classes/controller/index
и в добавил public function action_product()

$imgcloth = ORM::factory('imgcloth')->where('id','=',$product->image_id)->find();
$imgcloth = ORM::factory('image')->where('product_id','=',$product->id)->find_all();
и
->bind('image',$imgcloth)

я так понимаю что, что то с выводом не так сделал, не разобрался, пробовал по разному вывести не получилось. подскажите где не так.
 

ws17

Новичок
Выяснилась проблема, в бд когда записывает параметры, он записывает только image, а id и product_id не записывает, в чем причина?
 

ws17

Новичок
Все с бд я проблему решил, с выводом на фронте не решил.
 

ws17

Новичок
С админкой то же не выходит решить, с выводом картинки там где загружаю.

код такой:

Код:
<?if (!empty($data['imgcloth'])):?>
<a name="img"></a>

<?foreach($data['imgcloth'] as $i =>  $image):?>
<div class="fotoadmin">
<div class="fotoadminnn">
<?=html::anchor('media/uploads/cloth/'. $image->image, html::image1('media/uploads/cloth/' . $image->image, array('height' => '150px')), array('target' => '_blank'))?>
<br><?=html::anchor('admin/products/delimg/' . $image->id, 'Удалить')?> |
<?if ($image->id != $data['image_id'] ):?>
<?=html::anchor('admin/products/mainimg/' . $image->id, 'Сделать  главной')?>
<?else:?>
<b>Сделана главной</b>
<?endif?></div></div>

<?if ($i % 2):?>

<?endif?>
<?endforeach?>

                   
<?else:?>
<div class="empty">Нет изображений</div>
<?endif?>
в админке ничего не показывает.

а на фронтенте вот такую ошибку.

ErrorException [ Notice ]: Undefined variable: imgcloth
APPPATH/views/index/main/view_divani.php [ 14 ]
14 <?php if($imgcloth->image):?>
 

ws17

Новичок
В админке вывел, проработал код, для вывода.

Код:
<?if (!empty($data['imgcloth'])):?>
<a name="img"></a>

<?foreach($data['imgcloth'] as $i =>  $imgcloth):?>
<div class="fotoadmin">
<div class="fotoadminnn">
<?=html::anchor('media/uploads/cloth/'. $imgcloth->image, html::image('media/uploads/cloth/' . $imgcloth->image, array('height' => '150px')), array('target' => '_blank'))?>
<br><?=html::anchor('admin/products/delimg/' . $imgcloth->id, 'Удалить')?> |
<?if ($imgcloth->id != $data['image_id'] ):?>
<?=html::anchor('admin/products/mainimg/' . $imgcloth->id, 'Сделать  главной')?>
<?else:?>
<b>Сделана главной</b>
<?endif?></div></div>

<?if ($i % 2):?>

<?endif?>
<?endforeach?>
а так же добавил код в акшионе редактирование продукта.
$data['imgcloth'] = $products->imgcloth->find_all()->as_array();

остался фронт))
 

ws17

Новичок
пытаюсь на фронте вывести все фото данного товара что загрузил в ткани...

Я так понимаю тут нужно правильно сформировать код, но чет не как не могу.

Код:
// большая фотка
$image = ORM::factory('image')->where('id','=',$product->image_id)->find();

// маленькие фотки
$images = ORM::factory('image')->where('product_id','=',$product->id)->find_all();

// фото ткани - то что я добавил
$imgcloth = ORM::factory('image')->where('id','=',$product->image_id)->find();
вывод на фронте

Код:
<?php if($imgcloth and count($imgcloth) > 1):?>
<div class="fullminifotoall">
<?foreach($imgcloth as $imgcloth):?>
<div class="minifoto">
<a href="/media/uploads/cloth/<?=$imgcloth->image?>" rel="lightbox[roadtrip]">
<img src="/media/uploads/cloth/small/small_<?php echo ($imgcloth->image)?>" />
</a>
</div>
<?endforeach?>
</div>
<?php endif; ?>
пишет что ошибка в
ErrorException [ Notice ]: Undefined variable: imgcloth
15 <?php if($imgcloth and count($imgcloth) > 1):?>
 

ws17

Новичок
Ребята подскажите пожалуйста, как сделать дополнительную загрузку фоток к товару ! по мимо основной загрузки фоток.
 

ws17

Новичок
Почему ошибка если в моделе ставлю так
Код:
<?php defined('SYSPATH') or die('No direct script access.');

class Model_Image1 extends ORM {

    protected $_belongs_to = array(
        'product' => array(
            'model' => 'product',
            'foreign_key' => 'product_id',
        ),
    );

    public function rules()
    {
        return array(
            'name' => array(
                array('not_empty'),
            ),
        );
    }
}
а если так то нет ошибки
Код:
protected $_table_name = 'images1';
 

ws17

Новичок
Все проблему решил, почти два дня мудрил над кодом, кому надо пишите помогу )

Вопрос другой, как можно сделать у фото, что бы можно было менять позиции.

Не совсем понимаю сортировку фоток при загрузке.
Я называю фото 1, 2, 3 и так далее, что бы первая фотка была первой, если добавлять новый товар и загружать то все хорошо, первая фотка она первая и так по очереди фото идут, а если редактировать и добавлять фото, то фото добавляется в конце, то есть идет последняя. все ок.

А если я хочу удалить вторую фотку, и загрузить ее опять, я меняю имя фото, пробовал по разному, он загружает не в конец, а второй.

Как с этим быть? подскажите, может быть есть какой ни будь способ что бы менять позиции у фоток. что бы я выставил какую первую, какую вторую показывать, что бы не было мозайки.
 
Сверху