Здравствуйте друзья, в php кодинге я начинающий в связи с чем столкнулся с траблой.
Что имеется для начала:
1) У начальника имеется программа в которой хранится база данных, в данной базе данных имеются все клиенты компании и все финансовые операции между компанией и клиентами, называется программа "CarStore".
2) В программе реализована функция экспорта отчетов в файлы формата .PDF.
3) Имеется сайт на CMS WordPress
4) Все экспортируемые файлы PDF имеют название в соответствии логинам на сайте WordPress. То есть
Если на сайте user "00006" то его отчеты будут иметь имена:
00006_09_11_2015.pdf, 00006_16_04_2015.pdf, 00006_23_12_2014.pdf и т.д.
Что было реализовано:
Впринцепе поставленная задача была решена, единственоое с чем столкнулся это то что список не отображается полностью, а отображается только первая его строка. Как реализовать что бы список отображался полностью?
Код index.php:
<?php add_action('init','add_tab_my_report_files'); add_action('init','add_tab_my_report_files'); function add_tab_my_report_files(){ rcl_tab('myform','my_report_files_recall_block','Мои отчеты',array('public'=>0,'class'=>'fa-file-text-o','order'=>20)); } function my_report_files_recall_block($user_lk){ {echo '<a href="http://testgoldauto.com/wp-login.php?action=logout&redirect_to=http://testgoldauto.com" class="recall-button block_button active"><i class="fa fa-sign-in"></i> Выход</a><br>';} global $current_user; get_currentuserinfo(); $user_login = '' . $current_user->user_login; $dir = 'pdf/'; $list = glob($dir.$user_login.'_*.pdf'); foreach($list as $file_path) { $filename = basename($file_path); $rest = substr("$filename", 6, 15); // возвращает "дату" return "<a href="http://testgoldauto.com/pdf/".$filename."" target="_blank">".$rest."<a><br>"; } }
dydaevskiy сказал(а)
Как это сделать?
$links = array(); foreach($list as $file_path){ $filename = basename($file_path); $rest = substr("$filename", 6, 15); // возвращает "дату" $links[] = "<a href="http://testgoldauto.com/pdf/".$filename."" target="_blank">".$rest."<a><br>"; } return implode('<br>',$links);
Здравствуйте Андрей, в общем не много модернизировал свой аддон и столкнулся с проблемой.
На данный момент мой index.php выглядит так:
<?php //Вывод ошибок для отладки на экран ini_set('display_errors',1); error_reporting(E_ALL); //Конц вывода ошибок для отладки на экран //Добавление новой вкладки в WP-RECALL add_action('init','add_tab_my_report_files'); //Функция добавления function add_tab_my_report_files(){ //Внешний вид новой вкладки иконка, тайтл rcl_tab('myform','my_report_files_recall_block','Мои отчеты',array('public'=>0,'class'=>'fa-file-text-o','order'=>20)); } //Содержимое вкладки и место отображения контента - $user_lk function my_report_files_recall_block($user_lk){ //WordPress захват логина пользователя global $current_user; get_currentuserinfo(); $user_login = '' . $current_user->user_login; // END WordPress захват логина пользователя //Входим в каталог _doc за тем в подкаталог имя которого соответствует логину пользователя $dir = '_doc/'.$user_login.'/'; //Загоняем в переменную $list весь список файлов который находится в каталоге и подкаталоге $list = glob($dir.$user_login.'_*.*'); //Создаем пустой массив в который далее будет добавлен весь список файлов $links = array (); //Добавлем список файлов из подкаталога с логином пользователя в пустой массив foreach( $list as $file_path){ $filename = basename($file_path); //Начало отображения имени файла с 14 символа от конца, и отображать 14 символов $rest = substr("$filename", -14, 14); //$links[] = "<a href="http://www.sto.sumy.ua/_doc/$user_login/".$filename."" target="_blank">".$rest."<a>"; //Создаем маску для кнопки загрузки файлов $download = "<a href="testgoldauto.com/_doc/$user_login/".$filename."" download><i class="fa fa-download fa-2x" aria-hidden="true" ></i></a>"; //РЕАЛИЗАЦИЯ ДИАЛОГОВОГО ОКНА ЗАГРУЗКИ ФАЙЛА В БРАУЗЕРЕ $file = ($dir.$user_login.'_*.*'); if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); readfile($file); exit; } // END РЕАЛИЗАЦИЯ ДИАЛОГОВОГО ОКНА ЗАГРУЗКИ ФАЙЛА В БРАУЗЕРЕ //Добавляем в пустой массив список файлов по указанной в переменной маске $links[] = "<a href="http://testgoldauto.com/_doc/$user_login/".$filename."" target="_blank">".$rest."</a> ".$download." "; } //Реверсируем список файлов в обратном порядке $preserved = array_reverse($links, true); //Отображаем в основное содержимое полученый список файлов в обратном порядке return implode ('<br>',$preserved); }
Мне необходимо реализовать загрузку pdf, jpg, png и прочих файлов по кнопке но на данный момент браузер говорит о том что файл пустой и не сохраняет файл.
Андрей подскажите пожалуйста в чем моя ошибка.
я правильно понял, что функция readfile срабатывает при загрузке содержимого вкладки ЛК?
Если это так, то вы пытаетесь отправить заголовки с данными о выгружаемом файле после того как уже был был произведен вывод контента и заголовки уже были отправлены, надо отправлять их раньше, например, во время страбатывания экшна wp
Реализовал так:
<?php //Вывод ошибок для отладки на экран ini_set('display_errors',1); error_reporting(E_ALL); //Конц вывода ошибок для отладки на экран //Добавление новой вкладки в WP-RECALL add_action('init','add_tab_my_report_files'); //Функция добавления function add_tab_my_report_files(){ //Внешний вид новой вкладки иконка, тайтл rcl_tab('myform','my_report_files_recall_block','Мои отчеты',array('public'=>0,'class'=>'fa-file-text-o','order'=>20)); } //Содержимое вкладки и место отображения контента - $user_lk function my_report_files_recall_block($user_lk){ //WordPress захват логина пользователя global $current_user; get_currentuserinfo(); $user_login = '' . $current_user->user_login; // END WordPress захват логина пользователя //РЕАЛИЗАЦИЯ ДИАЛОГОВОГО ОКНА ЗАГРУЗКИ ФАЙЛА В БРАУЗЕРЕ $file = ($dir.$user_login.'_*.*'); if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); readfile($file); exit; } // END РЕАЛИЗАЦИЯ ДИАЛОГОВОГО ОКНА ЗАГРУЗКИ ФАЙЛА В БРАУЗЕРЕ //Входим в каталог _doc за тем в подкаталог имя которого соответствует логину пользователя $dir = '_doc/'.$user_login.'/'; //Загоняем в переменную $list весь список файлов который находится в каталоге и подкаталоге $list = glob($dir.$user_login.'_*.*'); //Создаем пустой массив в который далее будет добавлен весь список файлов $links = array (); //Добавлем список файлов из подкаталога с логином пользователя в пустой массив foreach( $list as $file_path){ $filename = basename($file_path); //Начало отображения имени файла с 14 символа от конца, и отображать 14 символов $rest = substr("$filename", -14, 14); //$links[] = "<a href="http://www.sto.sumy.ua/_doc/$user_login/".$filename."" target="_blank">".$rest."<a>"; //Создаем маску для кнопки загрузки файлов $download = "<a href="testgoldauto.com/_doc/$user_login/".$filename."" download><i class="fa fa-download fa-2x" aria-hidden="true" ></i></a>"; //Добавляем в пустой массив список файлов по указанной в переменной маске $links[] = "<a href="http://testgoldauto.com/_doc/$user_login/".$filename."" target="_blank">".$rest."</a> ".$download." "; } //Реверсируем список файлов в обратном порядке $preserved = array_reverse($links, true); //Отображаем в основное содержимое полученый список файлов в обратном порядке return implode ('<br>',$preserved); }
Логи:
[17-Jun-2016 12:36:10 UTC] PHP Notice: Undefined variable: dir in D:OpenServerdomainstestgoldauto.comwp-contentpluginswp-recalladd-onfilesindex.php on line 24
php ругается на $file = ($dir.$user_login.'_*.*');
Хм... Мой моцг уже течет
Otshelnik-Fm сказал(а)
$file = ($dir.$user_login.'_*.*');
- у вас там $dir не определена
опоздал...в файле .htaccess никаких запретов нет?
Спасибо, $dir объявил в нужном месте сейчас мой код выглядит так (но все равно загрузка файла через диалоговое окно происходит с ошибкой):
0,'class'=>'fa-file-text-o','order'=>20)); } //Содержимое вкладки и место отображения контента - $user_lk function my_report_files_recall_block($user_lk){ //WordPress захват логина пользователя global $current_user; get_currentuserinfo(); $user_login = '' . $current_user->user_login; // END WordPress захват логина пользователя //Входим в каталог _doc за тем в подкаталог имя которого соответствует логину пользователя $dir = '_doc/'.$user_login.'/'; //РЕАЛИЗАЦИЯ ДИАЛОГОВОГО ОКНА ЗАГРУЗКИ ФАЙЛА В БРАУЗЕРЕ $file = ($dir.$user_login.'_*.*'); if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); readfile($file); exit; } // END РЕАЛИЗАЦИЯ ДИАЛОГОВОГО ОКНА ЗАГРУЗКИ ФАЙЛА В БРАУЗЕРЕ //Загоняем в переменную $list весь список файлов который находится в каталоге и подкаталоге $list = glob($dir.$user_login.'_*.*'); //Создаем пустой массив в который далее будет добавлен весь список файлов $links = array (); //Добавлем список файлов из подкаталога с логином пользователя в пустой массив foreach( $list as $file_path){ $filename = basename($file_path); //Начало отображения имени файла с 14 символа от конца, и отображать 14 символов $rest = substr("$filename", -14, 14); //$links[] = "<a target="_blank">".$rest."</a><a>"; //Создаем маску для кнопки загрузки файлов $download = "</a><a><i class="fa fa-download fa-2x"></i></a>"; //Добавляем в пустой массив список файлов по указанной в переменной маске $links[] = "<a target="_blank">".$rest."</a> ".$download." "; } //Реверсируем список файлов в обратном порядке $preserved = array_reverse($links, true); //Отображаем в основное содержимое полученый список файлов в обратном порядке return implode ('<br />',$preserved); }
Но упорно чувствую что какой-то косяк с .htaccess
Так как в нем указано:
# BEGIN WordPress Запретить доступ ко всем файлам Options All -Indexes # END WordPress
Хм... Как сделать что б не было доступа к содержимому каталога, но был доступ к загрузке и открытию файлов из каталога?
Хммм. каким-то удивительным образом ссылка для загрузки файлов через диалоговое окно у меня формируется вот такая:
Firefox не может найти файл
<strong>http://testgoldauto.com/stranitsa-polzovatelya/</strong>testgoldauto.com/_doc/admin/admin_2016-09-26.pdf.
Нахождение косяка уже близко
Но упорно чувствую что какой-то косяк с .htaccess
Так как в нем указано:
так вы на время уберите - и проверите - в нем дело или нет. И браузер другой попробуйте - всяко может быть
код ваш съедает парсер. Попробуйте его вставлять через сервис
- ссылку тут дадите
Друзья на данный момент мой код виглядет так:
0,'class'=>'fa-file-text-o','order'=>20)); } //Содержимое вкладки и место отображения контента - $user_lk function my_report_files_recall_block($user_lk) { //WordPress захват логина пользователя global $current_user; get_currentuserinfo(); $user_login = '' . $current_user->user_login; // END WordPress захват логина пользователя //Входим в каталог _doc за тем в подкаталог имя которого соответствует логину пользователя $dir = '_doc/'.$user_login.'/'; //Загоняем в переменную $list весь список файлов который находится в каталоге и подкаталогах $list = glob($dir.'*.*'); //Создаем пустой массив в который далее будет добавлен весь список файлов $links = array (); //Добавлем список файлов из подкаталога с логином пользователя в пустой массив foreach( $list as $file_path) { $filename = basename($file_path); //Начало отображения имени файла с 14 символа от конца, и отображать 14 символов ///$rest = substr("$filename", -14, 14); //$links[] = "<a target="_blank">".$rest."</a><a>"; //Создаем маску для кнопки загрузки файлов $download = "</a><a><i class="fa fa-download fa-2x"></i></a>"; //$download = "<a><i class="fa fa-download fa-2x"></i></a>"; //LiveComposer Разметка $divStrat = '<div class="col-xs-12 col-sm-12 col-md-4 col-lg-4">'; $divEnd = '</div>'; //Добавляем в пустой массив список файлов по указанной в переменной маске $links[] = "<a target="_blank">".$filename."</a> ".$download." "; } //РЕАЛИЗАЦИЯ ДИАЛОГОВОГО ОКНА ЗАГРУЗКИ ФАЙЛА В БРАУЗЕРЕ $file = ($filename); if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); readfile($file); exit; } // END РЕАЛИЗАЦИЯ ДИАЛОГОВОГО ОКНА ЗАГРУЗКИ ФАЙЛА В БРАУЗЕРЕ //Реверсируем список файлов в обратном порядке $preserved = array_reverse($links, true); //Отображаем в основное содержимое полученый список файлов в обратном порядке return implode ('<br />',$preserved); }
Физически аддон отображается следующим образом:
Мне необходимо поделить содержимое массива на 4 столбика bootstrap, а если в каталоге dir имеются папки то на 3.
Как разделить содержимое массива так что бы в 4 (3) столбиках было по 10 строк массива?
Прошу прощение не описал всю картину того что мне нужно реализовать
Вот идеальный вариант того что мне нужно реализовать:
1) Мне нужно все строки данного массива:
//Добавлем список файлов из подкаталога с логином пользователя в пустой массив foreach( $list as $file_path) { $filename = basename($file_path);
Разделить на 3 в том случае если в каталоге имеются подкаталоги, для того что бы отобразить первые 30 файлов в 3 столбиках, а в четвертом отобразить столбик папок.
Остальне строки массива скрыть в спойлер, но при нажатии на спойлер что б отобразился весь остальной список строк в четыре столбика.
IFELSE
Если в каталоге менее 40 фалов то отобразить то количество столбиков которое соответствует количеству файлов.
IFELSE
Разделить на 4 столбика в том случае если в каталоге не имеется папок, для того что бы отобразить первые 40 файлов в 4 столбика.
Остальне строки массива скрыть в спойлер, но при нажатии на спойлер что б отобразился весь остальной список строк в четыре столбика.
На данном этапе реализации мне нужно понять как мне вытянуть из массива
первые 10 строк и загнать их в переменную
вторые 10 строк и загнать их в переменную
третьи 10 строк и загнать их в переменную
четвертые 10 строк и загнать их в переменную
Может я чего-то не до понимаю, тыкайте меня носом я только учусь.
Спасибо всем.
Супер! Спасибо за подсказку.
Такой вопрос - как мне в return implode добавить "обвертку - сетку грид"
//LiveComposer Разметка $divEnd $divStrat $divStrat = '<div class="dslc-col dslc-3-col dslc-last-col data-dslc-module-size="3">'; $divEnd = '</div>';
//Реверсируем список файлов в обратном порядке
$preserved = array_reverse($links, true);
//Отображаем в основное содержимое полученый список файлов в обратном порядке
return implode
// $divStrat $divEnd
($preserved);
Мне нужно как-то обернуть вывод самого массива типа такого (хотя в этом примере это очень не правильно): //Отображаем в основное содержимое полученый список файлов в обратном порядке return implode // $divStrat $divEnd <strong>echo $divStrat;</strong> ($preserved); <strong>echo $divEnd;</strong>
Я потерял вашу мысль - что вам нужно. Из того что вы написали после моего последнего сообщения я ничего не понял. Вы там кучу каких то css классов хотите использовать...
"обвертку - сетку грид"
- зачем использовать что-то стороннее и избыточное когда это основы css?
если вы будете в return использовать конкатенацию: return $div1.$div2.$div3 тогда вы все фрагменты и свяжете
Ребята, проблема в том что я вывожу через return implode содержимое массива:
//Входим в каталог _doc за тем в подкаталог имя которого соответствует логину пользователя $dir = '_doc/'.$user_login.'/'; //Загоняем в переменную $list весь список файлов который находится в каталоге и подкаталогах $list = glob($dir.'*.*'); //Создаем пустой массив в который далее будет добавлен весь список файлов $links = array ();
То есть я захватываю весь список имен документов в папке и выдаю их через переменную.
В силу того что в WP-RECALLвывод содержимого вкладки возможен только через return я зашел в тупик, так как не могу более одного раза указать return implode .
Может я чего-то не понимаю.