Jump to content

Recommended Posts

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

 

 

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

Edited by mishanya
Link to post
Share on other sites
  • Replies 85
  • Created
  • Last Reply

Top Posters In This Topic

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

 

[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
Edited by Eddy
Link to post
Share on other sites

 

удалением файлов
 
[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 в архив

Edited by mishanya
Link to post
Share on other sites

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 

 

 

Edited by Eddy
Link to post
Share on other sites

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

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

 

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

Link to post
Share on other sites

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

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

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

 

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

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

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

Link to post
Share on other sites

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

 

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

Link to post
Share on other sites

Да, так:

 

 

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;
 
Link to post
Share on other sites

 

Да, так:

 

 

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,

 

 

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

Link to post
Share on other sites

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

 

 

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

 

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

Link to post
Share on other sites

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

 

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


            

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

 

это

 

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

 

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

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

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

 

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

Link to post
Share on other sites

Выведите отдельно {$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

Link to post
Share on other sites

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

Выведите отдельно {$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

Link to post
Share on other sites
{if $cms_files}
<h2>Файлы</h2>
{foreach $cms_files as $file}{$config->cms_files_dir}{$file->filename}{$filename.size|filesize}{/foreach}
{/if}

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

Edited by sergeevizh
Link to post
Share on other sites

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

 

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

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

 

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

 

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

{3544|filesize}  {32987500|filesize}

 

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

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

 

Edited by miltonmors
Link to post
Share on other sites

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

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

Link to post
Share on other sites

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

Edited by Julius123
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...