mishanya Posted December 7, 2015 Report Share Posted December 7, 2015 (edited) Что делает: дает возможность прикреплять любые файлы к объекту (товару, посту, странице). Можно использовать для вывода например документации товара и другой информации 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 в папку /files6. добавить в нужный контролер админки (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_pGbcuJm4GfhFiles.zip Edited December 7, 2015 by mishanya Quote Link to post Share on other sites
Noxter Posted December 7, 2015 Report Share Posted December 7, 2015 Красавчик! Quote Link to post Share on other sites
wildrock Posted December 9, 2015 Report Share Posted December 9, 2015 Красавельчик ) Quote Link to post Share on other sites
Eddy Posted December 9, 2015 Report Share Posted December 9, 2015 (edited) удалением файлов [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 December 9, 2015 by Eddy Quote Link to post Share on other sites
mishanya Posted December 10, 2015 Author Report Share Posted December 10, 2015 (edited) удалением файлов [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 December 10, 2015 by mishanya Quote Link to post Share on other sites
Eddy Posted December 11, 2015 Report Share Posted December 11, 2015 (edited) 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 December 11, 2015 by Eddy Quote Link to post Share on other sites
Kors Posted December 11, 2015 Report Share Posted December 11, 2015 Длинный код из п.6, по-моему, хорошо бы оформить в виде функции, передавая 'type'=>'product' в качестве параметра.Было бы намного проще и удобнее, с учетом того, что этот код планируется вставлять в разные места... И код п.8 (кроме заголовка), удобнее бы оформить отдельным tpl-файлом... Quote Link to post Share on other sites
mishanya Posted December 11, 2015 Author Report Share Posted December 11, 2015 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 Quote Link to post Share on other sites
sansara0891 Posted January 26, 2016 Report Share Posted January 26, 2016 Здравствуйте. Скажите, а можно ли эту доработку использовать для комментариев ? Quote Link to post Share on other sites
mishanya Posted January 26, 2016 Author Report Share Posted January 26, 2016 Здравствуйте. Скажите, а можно ли эту доработку использовать для комментариев ? впринципе, да, просто надо переделать загрузку не из админки а из страници комментариев, и использовать новый тип - comments например. и к каждому айти комментария будет привязан файл/файлы. а дальше уже выбирать их выводить их на странице Quote Link to post Share on other sites
trainracing Posted January 25, 2017 Report Share Posted January 25, 2017 сохраняет в админке, файл закачивает, а когда переоткроешь то все пропадает. остается только файл на сервере ни к чему не привязаный. Пробовал для брендов прикрутить Quote Link to post Share on other sites
mishanya Posted January 25, 2017 Author Report Share Posted January 25, 2017 сохраняет в админке, файл закачивает, а когда переоткроешь то все пропадает. остается только файл на сервере ни к чему не привязаный. Пробовал для брендов прикрутить вы уверены что все правильно сделали? у многих людей все работает. в базе создали таблицу? Quote Link to post Share on other sites
trainracing Posted January 25, 2017 Report Share Posted January 25, 2017 Да, так: 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; Quote Link to post Share on other sites
mishanya Posted January 25, 2017 Author Report Share Posted January 25, 2017 Да, так: 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, видите тут блог? она же отличается от моей Quote Link to post Share on other sites
trainracing Posted January 25, 2017 Report Share Posted January 25, 2017 я как бы для брендов а не для блога, работает все, кроме сохранения файла к бренду Quote Link to post Share on other sites
shooroop Posted January 26, 2017 Report Share Posted January 26, 2017 вы уверены что все правильно сделали? у многих людей все работает. в базе создали таблицу? юзал дефолтный шаблон и мануал тоже самое все сохраняет в админке для товара, а после того как снова войти в карточку товара в админке исчизает, хот на сайте выводит у товара.. Quote Link to post Share on other sites
shooroop Posted January 26, 2017 Report Share Posted January 26, 2017 разобрался, пропустил в файле ProductsAdmin.php не добавил после // Свойства товара $options = $this->features->get_options(array('product_id'=>$product->id)); это // Прикрепленые файлы $files = $this->files->get_files(array('object_id'=>$product->id,'type'=>'product')); прикрепленые файлы перестали пропадать Quote Link to post Share on other sites
jonny008 Posted October 29, 2017 Report Share Posted October 29, 2017 Здравствуйте. Подскажите пожалуйста, пытаюсь вывести объём файла через плагин смарти 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 Кто нибудь реализовывал? Quote Link to post Share on other sites
miltonmors Posted October 29, 2017 Report Share Posted October 29, 2017 Выведите отдельно {$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 Quote Link to post Share on other sites
jonny008 Posted October 29, 2017 Report Share Posted October 29, 2017 Ничего не выводит. Выведите отдельно {$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 Quote Link to post Share on other sites
fuckmoney Posted October 29, 2017 Report Share Posted October 29, 2017 (edited) {if $cms_files} <h2>Файлы</h2> {foreach $cms_files as $file}{$config->cms_files_dir}{$file->filename}{$filename.size|filesize}{/foreach} {/if}Могу и ошибаться, по аналогии как предложил mishanya вывести в цикле. Edited October 29, 2017 by sergeevizh Quote Link to post Share on other sites
jonny008 Posted October 29, 2017 Report Share Posted October 29, 2017 {if $cms_files} <h2>Файлы</h2> {foreach $cms_files as $file}{$config->cms_files_dir}{$file->filename}{$filename.size|filesize}{/foreach} {/if}Могу и ошибаться, по аналогии как предложил mishanya вывести в цикле.0.00b Quote Link to post Share on other sites
miltonmors Posted October 30, 2017 Report Share Posted October 30, 2017 (edited) Ничего не выводит. А что ж Вы тогда хотите? Плагин применяется к пустому значению, и показывает 0, т.е. плагин отрабатывает нормально.Выходит, у Вас ошибка еще ДО применения плагина. $filename.size - выглядит как чистая бессмыслица. Проверить плагин отдельно можно так{3544|filesize} {32987500|filesize} Пробуйте примерно так:{assign var=fn value="`$config->cms_files_dir``$file->filename`"} {filesize($fn)|filesize} Edited October 30, 2017 by miltonmors Quote Link to post Share on other sites
mishanya Posted October 30, 2017 Author Report Share Posted October 30, 2017 что мешает в ф-и get_files сразу подсчитывать вес файлов через php а не через модификаторы.а еще лучше, писать размер файла при загрузке, чтобы каждый раз не дергать ф-ю Quote Link to post Share on other sites
Julius123 Posted October 31, 2017 Report Share Posted October 31, 2017 (edited) Подскажите а как это применить к аватарам? Хочу сделать чтобы в карточке пользователя на сайте была возможность загрузить аватар. Ну и соответственно чтобы пропускало только картинки (для безопасности). Edited October 31, 2017 by Julius123 Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.