Перейти к содержанию
Официальный форум поддержки Simpla

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


Рекомендуемые сообщения

http://s7.hostingkartinok.com/uploads/images/2015/01/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 вопрос, как сделать проверку если такой файл с таким названием есть то выдать ошибку ...

 

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

Ссылка на сообщение
Поделиться на другие сайты

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. Экспорт-импорт...

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

1. И вправду получилось.... странно 

2. Думаю не скоро будет данное решение...

3. ДА точно

Ссылка на сообщение
Поделиться на другие сайты
  • 2 недели спустя...
  • 4 месяца спустя...

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

 

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

Изменено пользователем yourock
Ссылка на сообщение
Поделиться на другие сайты

1. И вправду получилось.... странно 

2. Думаю не скоро будет данное решение...

3. ДА точно

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты
  • 3 недели спустя...

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

А можно ли организовать другие имена для файлов загрузки? Т.е., рандомые, к примеру, 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 от названия впринципе. не забывайте о расширении

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

img_55c3743b9e14d.800x600w.jpg?

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Спасибо.

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Спасибо.

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

Затык был в

 

найдем:

 

 

p.body,
 

 

 

 

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

 

 

p.attachment_files_one,
 
Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты
  • 7 месяцев спустя...

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
  • 3 недели спустя...

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

 

UyDHGLapM64.jpg

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...