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

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

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

 

 

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

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

Лучшие авторы в теме

Лучшие авторы в теме

удалением файлов

 

[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
Ссылка на сообщение
Поделиться на другие сайты

 

удалением файлов
 
[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
Ссылка на сообщение
Поделиться на другие сайты

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
Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

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

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

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

 

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

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

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

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

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

 

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

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

Да, так:

 

 

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;
 
Ссылка на сообщение
Поделиться на другие сайты

 

Да, так:

 

 

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,

 

 

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

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

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

 

 

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

 

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

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

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

 

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


            

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

 

это

 

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

 

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

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

Здравствуйте. Подскажите пожалуйста, пытаюсь вывести объём файла через плагин смарти 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

 

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

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

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

 

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

http://expange.ru/e/%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0_%D0%B2_%D0%BC%D0%B5%D0%B3%D0%B0%D0%B1%D0%B0%D0%B9%D1%82%D0%B0%D1%85_-_PHP

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

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

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

 

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

http://expange.ru/e/%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0_%D0%B2_%D0%BC%D0%B5%D0%B3%D0%B0%D0%B1%D0%B0%D0%B9%D1%82%D0%B0%D1%85_-_PHP

Ссылка на сообщение
Поделиться на другие сайты
{if $cms_files}
<h2>Файлы</h2>
{foreach $cms_files as $file}{$config->cms_files_dir}{$file->filename}{$filename.size|filesize}{/foreach}
{/if}

Могу и ошибаться, по аналогии как предложил mishanya вывести в цикле.

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

 

{if $cms_files}
<h2>Файлы</h2>
{foreach $cms_files as $file}{$config->cms_files_dir}{$file->filename}{$filename.size|filesize}{/foreach}
{/if}

Могу и ошибаться, по аналогии как предложил mishanya вывести в цикле.

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

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

 

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

Выходит, у Вас ошибка еще ДО применения плагина.

 

$filename.size - выглядит как чистая бессмыслица.

 

Проверить плагин отдельно можно так

{3544|filesize}  {32987500|filesize}

 

Пробуйте примерно так:

{assign var=fn value="`$config->cms_files_dir``$file->filename`"}   {filesize($fn)|filesize}

 

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

что мешает в ф-и get_files сразу подсчитывать вес файлов через php а не через модификаторы.

а еще лучше, писать размер файла при загрузке, чтобы каждый раз не дергать ф-ю

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

Подскажите а как это применить к аватарам? Хочу сделать чтобы в карточке пользователя на сайте была возможность загрузить аватар. Ну и соответственно чтобы пропускало только картинки (для безопасности).

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

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

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

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

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

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

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

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

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

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