Перейти к содержимому


Фото
* * * * * 2 голосов

[2.*] Прикрепленные файлы

файлы документация

  • Чтобы отвечать, сперва войдите на форум
54 ответов в теме

#1 mishanya

mishanya
  • Фрилансер
  • 2 547 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 07.12.2015 - 19:56

Что делает: дает возможность прикреплять любые файлы к объекту (товару, посту, странице). Можно использовать для вывода например документации товара и другой информации

 

 

1. выполнить запрос
DROP TABLE IF EXISTS `s_files`;
CREATE TABLE `s_files` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `object_id` int(11) NOT NULL DEFAULT '0',
  `filename` varchar(255) NOT NULL DEFAULT '',
  `type` enum('product','blog','page','order') NOT NULL,
  `position` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

2. добавить в папку /api - Files.php

 
3. добавляем класс в api/Simpla.php
'files'         => 'Files',

4. добавляем в config/config.php

;Директория файлов
cms_files_dir = files/files/;
5. добавляем папку files с правами 777 в папку /files
6. добавить в нужный контролер админки (simpla/PostAdmin.php, simpla/ProductAdmin.php, simpla/PageAdmin.php) код для POST запроса
 
 
на примере simpla/ProductAdmin.php после
$images = $this->products->get_images(array('product_id'=>$product->id));

вставляем код

$files 		= array();
$files 		= (array)$this->request->post('files');

// Удаление файлов
$current_files = $this->files->get_files(array('object_id'=>$product->id,'type'=>'product'));
foreach($current_files as $file)
	if(!in_array($file->id, $files['id']))
			$this->files->delete_file($file->id);

// Порядок файлов
if($files = $this->request->post('files')){
	$i=0;
	foreach($files['id'] as $k=>$id)
	{
		$this->files->update_file($id, array('name'=>$files['name'][$k],'position'=>$i));
		$i++;
	}
}

// Загрузка файлов
if($files = $this->request->files('files')){
	for($i=0; $i<count($files['name']); $i++)
	{
	if ($file_name = $this->files->upload_file($files['tmp_name'][$i], $files['name'][$i])){
   		$this->files->add_file($product->id, 'product', $file_name);
   	}
	else {
		$this->design->assign('error', 'error uploading file');
	}
	}
}

$files = $this->files->get_files(array('object_id'=>$product->id,'type'=>'product')); 

7. В конце контролера из п6 добавляем выборку файлов при открытии страницы админки (на примере товаров)

$files = $this->files->get_files(array('object_id'=>$product->id,'type'=>'product'));
$this->design->assign('cms_files', $files);

8. Добавить в шаблон админки куда нужно (post.tpl, product.tpl, order.tpl)

на примере simpla/design/html/product.tpl

<div class="block layer">
	<h2>Файлы товара</h2>
	{if $cms_files|count>0}
	<div id=list class="sortable files_products">
		{foreach $cms_files as $file}
		<div class="row">
			<div class="move cell">
				<div class="move_zone"></div>
			</div>
			<div class="name cell">
			<input type=text name='files[name][]' value='{$file->name}'>
			</div>					
			<div class="name cell">
			  <input type=hidden name='files[id][]' value='{$file->id}'>
			  <a target="_blank" href="{$config->cms_files_dir}{$file->filename}">
                              {$file->filename}
                          </a>
			</div>
			<div class="icons cell">
				<a href='#' class="delete"></a>
			</div>
			<div class="clear"></div>
		</div>
		{/foreach}
	</div>
    {else}
    	Нет файлов
    {/if}<br/>
    <input class='upload_file' name=files[] type=file multiple  accept='pdf/txt/doc/docx'>	
</div>
9. В файле дизайна п.8 добавить js-код для удаления файла
// Удаление файлов товара
$(".files_products a.delete").live('click', function() {
	 $(this).closest("div.row").fadeOut(200, function() { $(this).remove(); });
	 return false;
});
10. добавить в нужный контролер сайта (view/BlogView.php, view/ProductView.php, simpla/PageView.php) код для выборки файлов объекта
 
на примере view/ProductView.php
$files = $this->files->get_files(array('object_id'=>$product->id,'type'=>'product'));
$this->design->assign('cms_files', $files);  

11. добавить в шаблон строки для вывода файлов

{if $cms_files}
	<h2>Файлы</h2>
	{foreach $cms_files as $file}
		<a href="{$config->cms_files_dir}{$file->filename}">
			{if $file->name}{$file->name}{else}{$file->filename}{/if}
		</a>
	{/foreach}
{/if}

 

По аналогии использовать можно для постов, страниц, заказов, как отдельно так и одновременно. не забываем указывать тип объекта при выборке файликов 'type'=>'product' и тд.

 

Скрины:

- https://yadi.sk/i/z_pGbcuJm4Gfh

Прикрепленные файлы:

  • Прикрепленный файл  Files.zip   1,56К   113 раз скачано

Изменено: mishanya, 07.12.2015 - 20:07


#2 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 6 586 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 07.12.2015 - 20:07

Красавчик!

#3 wildrock

wildrock
  • Пользователь
  • 142 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:kiev

Опубликовано 09.12.2015 - 13:58

Красавельчик ) ;)



#4 Eddy

Eddy
  • Пользователь
  • 9 сообщений
  • Дизайн
  • Версия CMS:2.x

Опубликовано 10.12.2015 - 02:37

удалением файлов
 
[Thu Dec 10 01:24:00 2015] [error] [client 10.3.4.146] PHP Notice:  Undefined index: id in /web/simpla/PostAdmin.php on line 55, referer: /simpla/index.php?module=PostAdmin&id=1&return=%2Fsimpla%2Findex.php%3Fmodule%3DBlogAdmin
[Thu Dec 10 01:24:00 2015] [error] [client 10.3.4.146] PHP Warning:  in_array() expects parameter 2 to be array, null given in /web/simpla/PostAdmin.php on line 55, referer: /simpla/index.php?module=PostAdmin&id=1&return=%2Fsimpla%2Findex.php%3Fmodule%3DBlogAdmin

Изменено: Eddy, 10.12.2015 - 02:57


#5 mishanya

mishanya
  • Фрилансер
  • 2 547 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 10.12.2015 - 09:58

удалением файлов
 
[Thu Dec 10 01:24:00 2015] [error] [client 10.3.4.146] PHP Notice:  Undefined index: id in /web/simpla/PostAdmin.php on line 55, referer: /simpla/index.php?module=PostAdmin&id=1&return=%2Fsimpla%2Findex.php%3Fmodule%3DBlogAdmin
[Thu Dec 10 01:24:00 2015] [error] [client 10.3.4.146] PHP Warning:  in_array() expects parameter 2 to be array, null given in /web/simpla/PostAdmin.php on line 55, referer: /simpla/index.php?module=PostAdmin&id=1&return=%2Fsimpla%2Findex.php%3Fmodule%3DBlogAdmin

 

прикрепите файл PostAdmin.php в архив


Изменено: mishanya, 10.12.2015 - 09:58


#6 Eddy

Eddy
  • Пользователь
  • 9 сообщений
  • Дизайн
  • Версия CMS:2.x

Опубликовано 11.12.2015 - 16:28

simpla/ProductAdmin.php

 

// Удаление файлов
$current_files = $this->files->get_files(array('object_id'=>$product->id,'type'=>'product'));
foreach($current_files as $file)
    if(!in_array($file->id, $files['id']))
            $this->files->delete_file($file->id);

 

ошибка в этой строке

 

 if(!in_array($file->id, $files['id']))

 

также simpla/PostAdmin.php 

 

 


Изменено: Eddy, 11.12.2015 - 16:28


#7 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 11.12.2015 - 16:54

Длинный код из п.6, по-моему, хорошо бы оформить в виде функции, передавая  'type'=>'product'  в качестве параметра.

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

 

И код п.8 (кроме заголовка), удобнее бы оформить отдельным tpl-файлом...



#8 mishanya

mishanya
  • Фрилансер
  • 2 547 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 11.12.2015 - 17:10

simpla/ProductAdmin.php

 

// Удаление файлов
$current_files = $this->files->get_files(array('object_id'=>$product->id,'type'=>'product'));
foreach($current_files as $file)
    if(!in_array($file->id, $files['id']))
            $this->files->delete_file($file->id);

 

ошибка в этой строке

 

 if(!in_array($file->id, $files['id']))

 

также simpla/PostAdmin.php 

 

тут должно быть 'type'=>'blog' а не product

дальше тут вместо $product->id должно быть $post->id



#9 sansara0891

sansara0891
  • Пользователь
  • 109 сообщений
  • Откуда:Minsk

Опубликовано 26.01.2016 - 22:41

Здравствуйте. Скажите, а можно ли эту доработку использовать для комментариев ?

#10 mishanya

mishanya
  • Фрилансер
  • 2 547 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 26.01.2016 - 23:14

Здравствуйте. Скажите, а можно ли эту доработку использовать для комментариев ?

 

впринципе, да, просто надо переделать загрузку не из админки а из страници комментариев, и использовать новый тип - comments например. и к каждому айти комментария будет привязан файл/файлы. а дальше уже выбирать их выводить их на странице



#11 trainracing

trainracing
  • Пользователь
  • 175 сообщений
  • Дизайн, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 25.01.2017 - 12:44

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



#12 mishanya

mishanya
  • Фрилансер
  • 2 547 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 25.01.2017 - 13:54

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

 

вы уверены что все правильно сделали? у многих людей все работает. в базе создали таблицу?



#13 trainracing

trainracing
  • Пользователь
  • 175 сообщений
  • Дизайн, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 25.01.2017 - 17:08

Да, так:

 

 

DROP TABLE IF EXISTS `s_files`;
CREATE TABLE `s_files` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`object_id` int(11) NOT NULL DEFAULT '0',
`filename` varchar(255) NOT NULL DEFAULT '',
`type` enum('brand','page') NOT NULL,
`position` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 


#14 mishanya

mishanya
  • Фрилансер
  • 2 547 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 25.01.2017 - 17:14

Да, так:

 

 

DROP TABLE IF EXISTS `s_files`;
CREATE TABLE `s_files` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`object_id` int(11) NOT NULL DEFAULT '0',
`filename` varchar(255) NOT NULL DEFAULT '',
`type` enum('brand','page') NOT NULL,
`position` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 

 

так посмотрите на строку 

`type` enum('brand','page') NOT NULL,

 

 

видите тут блог? она же отличается от моей



#15 trainracing

trainracing
  • Пользователь
  • 175 сообщений
  • Дизайн, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 25.01.2017 - 17:40

я как бы для брендов а не для блога, работает все, кроме сохранения файла к бренду



#16 shooroop

shooroop
  • Фрилансер
  • 698 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Antarktida

Опубликовано 26.01.2017 - 07:55

вы уверены что все правильно сделали? у многих людей все работает. в базе создали таблицу?

 

 

юзал дефолтный шаблон и мануал

 

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



#17 shooroop

shooroop
  • Фрилансер
  • 698 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Antarktida

Опубликовано 26.01.2017 - 10:10

разобрался, пропустил в файле ProductsAdmin.php

 

не добавил после


            

				// Свойства товара
				$options = $this->features->get_options(array('product_id'=>$product->id));
				
				

 

это

 

// Прикрепленые файлы
				$files = $this->files->get_files(array('object_id'=>$product->id,'type'=>'product'));

 

прикрепленые файлы перестали пропадать



#18 jonny008

jonny008
  • Пользователь
  • 96 сообщений

Опубликовано 29.10.2017 - 16:29

Здравствуйте. Подскажите пожалуйста, пытаюсь вывести объём файла через плагин смарти modifier.filesize.php

 

<?php

function smarty_modifier_filesize($size)
{
  $size = max(0, (int)$size);
  $units = array( 'b', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb', 'Eb', 'Zb', 'Yb');
  $power = $size > 0 ? floor(log($size, 1024)) : 0;
  return number_format($size/pow(1024, $power), 2, '.', ',') . $units[$power];
} 
?>

Закинул его в Smarty/lib/plugins

 

В шаблоне {$config->cms_files_dir}{$file->filename}{$filename.size|filesize}

 

Пишет 0.00b

 

Кто нибудь реализовывал?



#19 miltonmors

miltonmors
  • Забаненый
  • 91 сообщений
  • Программирование
  • Версия CMS:2.x
  • Откуда:Николаев

Опубликовано 29.10.2017 - 17:00

Выведите отдельно {$filename.size} и проверьте, в каком виде выводится размер и выводится ли вообще.

 

Имейте в виду, такой плагин с гарантией не будет работать с большими размерами, так как  (int)$size имеет пределы в 4G.

http://expange.ru/e/...егабайтах_-_PHP



#20 jonny008

jonny008
  • Пользователь
  • 96 сообщений

Опубликовано 29.10.2017 - 18:52

Ничего не выводит. 

Выведите отдельно {$filename.size} и проверьте, в каком виде выводится размер и выводится ли вообще.

 

Имейте в виду, такой плагин с гарантией не будет работать с большими размерами, так как  (int)$size имеет пределы в 4G.

http://expange.ru/e/...егабайтах_-_PHP







Также с меткой «файлы, документация»

0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых