Blog. Just Blog

Web-мастеру и не только

Полезные решения для Web-мастеров
Web-мастеру и не только - RSS-канал Web-мастеру и не только - Карта сайта

Выборка родительских элементов в древовидном массиве

18.08.2017 | Категория: Web-мастеру и не только | Автор: ManHunter
Создавать многомерный массив из одномерного массива с указателями на родительские элементы мы уже умеем. Но может возникнуть другая задача: зная ID элемента, надо получить все его родительские элементы, причем уровень вложенности может быть абсолютно любым. Пример из практики. В базе хранится список стран и регионов, перелинкованный через указатели на родительские элементы. Если его развернуть в многомерный массив, то получится примерно следующее:
  1. $regions=array(
  2.     1=>array(
  3.         'name'=>'Россия',
  4.         'parent'=>0,
  5.         'child'=>array(
  6.             2=>array(
  7.                 'name'=>'Москва и Московская область',
  8.                 'parent'=>1,
  9.                 'child'=>array(
  10.                     3=>array(
  11.                         'name'=>'Москва',
  12.                         'parent'=>2,
  13.                         'child'=>array(
  14.                         ),
  15.                     ),
  16.                     5=>array(
  17.                         'name'=>'Московская область',
  18.                         'parent'=>2,
  19.                         'child'=>array(
  20.                             6=>array(
  21.                                 'name'=>'Дмитровский район',
  22.                                 'parent'=>6,
  23.                                 'child'=>array(
  24.                                     7=>array(
  25.                                         'name'=>'Дмитров',
  26.                                         'parent'=>6,
  27.                                         'child'=>array(),
  28.                                     ),
  29.                                     9=>array(
  30.                                         'name'=>'Яхрома',
  31.                                         'parent'=>6,
  32.                                         'child'=>array(),
  33.                                     ),
  34.                                 ),
  35.                             ),
  36.                         ),
  37.                     ),
  38.                 ),
  39.             ),
  40.             4=>array(
  41.                 'name'=>'Пермский край',
  42.                 'parent'=>1,
  43.                 'child'=>array(
  44.                     8=>array(
  45.                         'name'=>'Пермь',
  46.                         'parent'=>4,
  47.                         'child'=>array(),
  48.                     ),
  49.                     10=>array(
  50.                         'name'=>'Соликамск',
  51.                         'parent'=>4,
  52.                         'child'=>array(),
  53.                     ),
  54.                     11=>array(
  55.                         'name'=>'Кунгур',
  56.                         'parent'=>4,
  57.                         'child'=>array(),
  58.                     ),
  59.                 ),
  60.             ),
  61.         ),
  62.     ),
  63. );
Есть некие объекты, привязанные к региону по его ID. Как получить список всех вышестоящих регионов для конкретного объекта?

Читать статью целиком »
Просмотров: 1023 | Комментариев: 2

Сумма прописью на PHP

07.08.2017 | Категория: Web-мастеру и не только | Автор: ManHunter

Сумма прописью на PHP

В соответствии с нормативными актами, регламентирующими порядок работы с бухгалтерскими документами, при заполнении многих унифицированных форм сумма указывается не только числами, но и прописью. Формат записи принят следующий: рублевая часть суммы указывается прописью в именительном падеже с заглавной буквы, а копейки обозначаются цифрами. При автоматической генерации документов на PHP с цифровыми выражениями проблем в принципе не возникает, а для преобразования чисел в сумму прописью я уже давно написал и использую вот такую функцию.

Читать статью целиком »
Просмотров: 3838 | Комментариев: 7

Рекурсивный обход каталогов на PHP

17.07.2017 | Категория: Web-мастеру и не только | Автор: ManHunter
Понадобилась универсальная функция для рекурсивного сканирования выбранного каталога, но не просто так, а с обработчиком найденных файлов. Вот что у меня получилось:
  1. //--------------------------------------------------------------
  2. // Функция рекурсивного сканирования каталога
  3. //--------------------------------------------------------------
  4. // Параметры:
  5. //   $directory - начальный каталог
  6. //   $callback - функция для обработки найденных файлов
  7. //--------------------------------------------------------------
  8. function scan_recursive($directory$callback=null) {
  9.     // Привести каталог в канонизированный абсолютный путь
  10.     $directory=realpath($directory);
  11.  
  12.     if ($d=opendir($directory)) {
  13.         while($fname=readdir($d)) {
  14.             if ($fname=='.' || $fname=='..') {
  15.                 continue;
  16.             }
  17.             else {
  18.                 // Передать путь файла в callback-функцию
  19.                 if ($callback!=null && is_callable($callback)) {
  20.                     $callback($directory.DIRECTORY_SEPARATOR.$fname);
  21.                 }
  22.             }
  23.  
  24.             if (is_dir($directory.DIRECTORY_SEPARATOR.$fname)) {
  25.                 scan_recursive($directory.DIRECTORY_SEPARATOR.$fname$callback);
  26.             }
  27.         }
  28.         closedir($d);
  29.     }
  30. }
Пример вызова функции:
  1. // Callback-функция, которая будет принимать имена файлов
  2. function scan_callback($fname) {
  3.     echo $fname.'<br/>';
  4. }
  5.  
  6. // Вывести список файлов и каталогов
  7. scan_recursive('C:/some_dir\subfolder/''scan_callback');
В этом случае будет просто выведен список файлов и вложенных каталогов с содержимым, находящихся по указанному пути. Функцию можно доработать, например, добавив возможность остановки сканирования при получении какого-нибудь ответа из callback-функции. Но пока такой задачи не возникало.

Просмотров: 3588 | Комментариев: 3

Как поменять пароль root на MySQL

24.06.2017 | Категория: Web-мастеру и не только | Автор: ManHunter
На одном из серверов потребовалось сбросить забытый рутовый пароль от MySQL. Сервер крутится на CentOS, рутовый доступ к серверу есть. На всякий случай небольшая шпаргалка для себя, чтобы потом не искать.

1. Останавливаем сервер MySQL

service mysqld stop
2. Запускаем MySQL в безопасном режиме без привилегий

/usr/bin/mysqld_safe -skip-grant-tables -user=root &
3. Заходим в клиент MySQL под пользователем root без пароля

mysql -u root
4. Устанавливаем новый пароль для пользователя root

UPDATE `mysql`.`user` SET `password`=PASSWORD('newpassword') WHERE `user`='root';
5. Сбрасываем привилегии пользователей MySQL

FLUSH PRIVILEGES;
6. Выходим из клиента MySQL

quit;
7. Запускаем сервер MySQL

service mysqld start
После этого можно использовать новый пароль. Для разных версий Linux команды работы с сервисами могут отличаться, здесь пример конкретно под CentOS.

Просмотров: 930 | Комментариев: 0

Как узнать, что web-страница была распечатана на принтере

13.05.2017 | Категория: Web-мастеру и не только | Автор: ManHunter
В процессе создания одной из рабочих систем, с подачи начальства возникла очень необычная задача. Организационные подробности описывать не буду, только техническую сторону. В системе пользователю генерируется некий документ, который он должен распечатать. Задача заключалась в том, что система должна была узнать, что документ был распечатан. Причем просто просмотр версии для печати на экране не считается, требовалось определить именно факт отправки документа на принтер. После недолгих размышлений пришло на ум следующее решение. На страницу документа, которая должна быть распечатана, добавляется примерно следующий код:
  1. <style type="text/css">
  2. .print_hook {
  3.     displayinline-block;
  4. }
  5. @media print {
  6.     .print_hook {
  7.         background:url('/print_hook.php?id=123');
  8.     }
  9. }
  10. </style>
  11. <div class="print_hook"></div>
Поясню словами. Вспомогательному элементу div назначается фоновый рисунок в виде скрипта-перехватчика. Стили, определенные через @media print, задействуются только при печати, просто при просмотре страницы фоновый рисунок дергаться не будет. В параметрах перехватчику передаются определенные значения, по которым идентифицируется печатаемый документ. Файл-перехватчик print_hook.php, к которому выполняется обращение, разбирает переданные ему параметры, заносит в базу необходимые статистические данные, а затем выдает в качестве фона прозрачный однопиксельный GIF.

Стили для перехватчика динамически генерируются на странице, во внешних файлах и в глобальных таблицах CSS их хранить не надо. Способ кроссбраузерный, работает везде, где поддерживаются CSS3 Media Queries и не требует включения никаких скриптов на стороне клиента.

В полной мере задача не решилась, потому что пользователь может просто открыть в браузере предварительный просмотр страницы, а потом закрыть его, не отправив фактически документ на печать. При этой операции также задействуется перехватчик, поскольку браузер отрисовывает страницу, как она бы выглядела на печати. Но более лучшего способа я так и не придумал, так что после согласования с начальством остановились на таком решении. Может быть пригодится кому-нибудь еще.

Просмотров: 1260 | Комментариев: 2

prev 01 ... 06 07 08 09 10 11 12 ... 34 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0016 сек.) / Память: 4.75 Mb
Наверх