Jump to content

Дополнительное поле "загрузка файла" в товаре


Recommended Posts

6f25703f19732e2069dd84674b55e850.jpg

 

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

 

Нам надо:

Дополнительно поле type="file" для загрузки файла
 

Возможности:

- Загрузка файла

- Удаление Файла

- Вывод ссылки и название файла в шаблон

- Расширение файлов которые можно загружать

 

#0 - Запрос в БД:

ALTER TABLE  `s_products` ADD  `attachment_files_one` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER  `name`

 

#1 - \simpla\design\html\product.tpl

найдем:

// Удалить файл к варианту
	$('#variants_block a.remove_attachment').click(function() {
		closest_li = $(this).closest('li');
		closest_li.find('.attachment_name').hide('fast');
		$(this).hide('fast');
		closest_li.find('input[name*=delete_attachment]').val('1');
		closest_li.find('a.add_attachment').show('fast');
		return false;		
	});

и ниже вставим:

 

// Загрузить файл 1
	$('#variants_block_one a.add_attachment_one').click(function() {
		$(this).hide();
		$(this).closest('li').find('div.browse_attachment_one').show('fast');
		$(this).closest('li').find('input[name*=attachment_files_one]').attr('disabled', false);
		return false;		
	});
	
	// Удалить файл 1
	$('#variants_block_one a.remove_attachment_one').click(function() {
		closest_li = $(this).closest('li');
		closest_li.find('.attachment_name_one').hide('fast');
		$(this).hide('fast');
		closest_li.find('input[name*=delete_attachment_one]').val('1');
		closest_li.find('a.add_attachment_one').show('fast');
		return false;		
	});

найдем: 

<!-- Правая колонка свойств товара -->	
	<div id="column_right">

ниже вставим:

<!-- Документация товара -->	
		<div class="block layer" >
			<h2>Документация товара </h2>
			<ul>
				<li id="variants_block_one">
				<b>Техническая документация:</b>
				
				{if $product->attachment_files_one}
					<span class=attachment_name_one><a href="../{$config->documents_dir}{$product->attachment_files_one}">{$product->attachment_files_one|truncate:25:'...':false:true}</a></span>
					<a href='#' class=remove_attachment_one><img src='design/images/bullet_delete.png'  title="Удалить цифровой товар"></a>
					<a href='#' class=add_attachment_one style='display:none;'><img src="design/images/cd_add.png" title="Добавить цифровой товар" /></a>
				{else}
					<a href='#' class=add_attachment_one><img src="design/images/cd_add.png"  title="Добавить цифровой товар" /></a>
				{/if}
				<div class=browse_attachment_one style='display:none;'>
					<input type=file name=attachment_files_one>
					<input type=hidden name=delete_attachment_one>
				</div>
				</li>
			</ul>
			
			
		</div>

#2 - \simpla\ProductAdmin.php

найдем:

 

class ProductAdmin extends Simpla
{

ниже вставим:

 

private $allowed_files_extentions = array('pdf', 'doc', 'rar', 'zip');

найдем:

// Категории товара
			$product_categories = $this->request->post('categories');
			if(is_array($product_categories))

выше вставим:

// Удаление файла_one
			if($this->request->post('delete_attachment_one'))
			{
				$this->products->delete_attachment_one($product->id);
			}
			// Загрузка файла_one
			$attachment_files_one = $this->request->files('attachment_files_one');
			if(!empty($attachment_files_one['name']) && in_array(strtolower(pathinfo($attachment_files_one['name'], PATHINFO_EXTENSION)), $this->allowed_files_extentions))
			{
				$this->products->delete_attachment_one($product->id);   	    			
				move_uploaded_file($attachment_files_one['tmp_name'], $this->root_dir.$this->config->documents_dir.$attachment_files_one['name']);
				$this->products->update_product($product->id, array('attachment_files_one'=>$attachment_files_one['name']));
			}

#3 - \api\Products.php

найдем:

p.body,

и ниже вставим (в 2-х случаях):

p.attachment_files_one,

найдем: 

public function delete_image($id)
	{

выше вставим:

/*
	*
	* Удаление файла_one
	* @param $id
	*
	*/
	public function delete_attachment_one($id)
	{
		$query = $this->db->placehold("SELECT attachment_files_one FROM __products WHERE id=?", intval($id));
		$this->db->query($query);
		$attachment_files_one = $this->db->result('attachment_files_one');
		if(!empty($attachment_files_one))
		{
			$query = $this->db->placehold("UPDATE __products SET attachment_files_one=NULL WHERE id=?", $id);
			$this->db->query($query);
			$query = $this->db->placehold("SELECT count(*) as count FROM __products WHERE attachment_files_one=? LIMIT 1", $attachment_files_one);
			$this->db->query($query);
			$count = $this->db->result('count');
			if($count == 0)
			{			
				@unlink($this->config->root_dir.$this->config->documents_dir.$attachment_files_one);		
			}
		}
	}

найдем:

// Удаляем варианты
			$variants = $this->variants->get_variants(array('product_id'=>$id));
			foreach($variants as $v)
				$this->variants->delete_variant($v->id);

ниже вставим:

 

// Удаляем файл_one
			$this->delete_attachment_one($id);	
			$query = $this->db->placehold("DELETE FROM __products WHERE id=? LIMIT 1", $id);

 

#5 - \confing\confing.php

найдем:

;Изображения брендов
brands_images_dir = files/brands/;

ниже вставим:

;Документация товара
documents_dir = files/documents/;

Не забываем создать папку "documents" в папке "file

 

#4 - вывод в шаблоне

{if $product->attachment_files_one}<li><a href="../{$config->documents_dir}{$product->attachment_files_one}">Техническая документация</a></li>{/if}

 

 

Сразу скажу при создании дубля товара файлы и запись в бд не про дублируется.

Еще есть 1 вопрос, как сделать проверку если такой файл с таким названием есть то выдать ошибку ...

 

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

Link to post
Share on other sites

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

2. как сделать проверку если такой товар с таким названием есть то выдать ошибку  - лучше всего подождать, когда разработчик исправит ошибку http://forum.simplacms.ru/topic/9097-%D0%BA%D0%B0%D0%BA-simpla-%D0%BF%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B6%D0%B0%D0%B5%D1%82-%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%BE%D0%B9-%D1%82%D0%BE%D0%B2%D0%B0%D1%80/  а потом уже действовать по аналогии.

3. Экспорт-импорт...

Link to post
Share on other sites

1. По моему,  при создании дубля товара запись в бд должна благополучно дублироваться.
2. как сделать проверку если такой товар с таким названием есть то выдать ошибку  - лучше всего подождать, когда разработчик исправит ошибку http://forum.simplacms.ru/topic/9097-как-simpla-перезагружает-цифровой-товар а потом уже действовать по аналогии.
3. Экспорт-импорт...

1. И вправду получилось.... странно 
2. Думаю не скоро будет данное решение...
3. ДА точно
Link to post
Share on other sites
  • 2 weeks later...
  • 4 months later...

А как в шаблон передать расширение файла?
 
Хочу сделать, чтобы на странице товара, рядом с ссылкой на скачивание файла отображалась иконка, соответствующая типу загруженного файла - PDF, ZIP и так далее.
 
Переменная {$product->attachment_files_one} содержит полное название загруженного файла, например "instrukciya-svarka.pdf". Как из нее вычленить только "pdf" ?

 

... и если возможно то размер файла, как-то отобразить.

Edited by yourock
Link to post
Share on other sites

1. И вправду получилось.... странно 
2. Думаю не скоро будет данное решение...
3. ДА точно

:) дружище подскажи как сделать чтоб возможно было загружать 1 одному товару несколько инструкций?

Link to post
Share on other sites

Несколько инструкций - сделать сложнее.

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

Link to post
Share on other sites

Несколько инструкций - сделать сложнее.

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

:) а если создать 5 полей и обращаться к ним это сильно загрузит сайт? получается все продублировано будет.

Link to post
Share on other sites
  • 1 month later...

Еще есть 1 вопрос, как сделать проверку если такой файл с таким названием есть то выдать ошибку ...

 

я добавлял в название файла еще айди объекта. ну там товара/категории/поста. таким образом затирать не будет.

Link to post
Share on other sites
  • 3 weeks later...

А можно ли организовать другие имена для файлов загрузки? Т.е., рандомые, к примеру, dfg64dg65d4gd564gd.zip

 

З.Ы. Я с картинками такое сделал, а вот с файлами не получается!

Link to post
Share on other sites

А можно ли организовать другие имена для файлов загрузки? Т.е., рандомые, к примеру, dfg64dg65d4gd564gd.zip

 

З.Ы. Я с картинками такое сделал, а вот с файлами не получается!

 

move_uploaded_file($attachment_files_one['tmp_name'], $this->root_dir.$this->config->documents_dir.$attachment_files_one['name']);
				$this->products->update_product($product->id, array('attachment_files_one'=>$attachment_files_one['name']));

нужно $attachment_files_one['name'] заменить на ваше название, которое будет сгенерировано каким-то генератом на php, можно просто брать md5 от названия впринципе. не забывайте о расширении

Link to post
Share on other sites

Для картинок я сделал следующее:

$ext = pathinfo($uploaded_file, PATHINFO_EXTENSION);
$new_name = uniqid('img_') . '.' . $ext;

Картинки получаются такого вида:

img_55c3743b9e14d.800x600w.jpg?

С загрузкой файлов пытался такое же проделать: не прокатило..

Link to post
Share on other sites

Добрый день. Все проделал по инструкции, но

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

Проверил несколько раз правильность установки. Что может быть?

Спасибо.

Link to post
Share on other sites

Добрый день. Все проделал по инструкции, но

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

Проверил несколько раз правильность установки. Что может быть?

Спасибо.

Все разобрался))

Затык был в

 

найдем:

 

 

p.body,
 

 

 

 

и ниже вставим (в 2-х случаях):

 

 

p.attachment_files_one,
 
Link to post
Share on other sites

Спасибо! Супер) надо придумать как вывести в вместо текста один вариант из характеристик (наример модель : mck27j ) и выводить "инструкция {$f->value->id=5} " как правильно?

Link to post
Share on other sites
  • 7 months later...

Принцип обычный. А практическая реализация слабовата. Использовать не рекомендуется.

Поиском по фразе "цифровой товар" можете найти сведения о недостатках.

За много лет работы с Simpla не встретил ни одного сайта, работающего  с цифровым товаром.

Зато встречал фрилансеров, который используют свои сайты для продажи доработок, но при этом СОЗНАТЕЛЬНО не используют функционал цифрового товара...

Link to post
Share on other sites
  • 3 weeks later...

Столкнулся с проблемой, при загрузке pdf файла размером более 8мб он не сохранялся, если кому пригодится решение проблемы, нужно в настройках хостинга увеличить размер отправляемых файлов (post_max_size)

 

UyDHGLapM64.jpg

Link to post
Share on other sites
×
×
  • Create New...