Понедельник, 2023-12-04, 8:02 PM

Поиск
Меню
Категории раздела
PHP [40]
Cкриптовый язык программирования общего назначения
MySQL [1]
Cвободная система управления базами данных (СУБД)
jQuery [8]
Библиотека JavaScript, фокусирующаяся на взаимодействии JavaScript и HTML
CSS [60]
Cредство описания, оформления внешнего вида веб-страниц
JavaScript [161]
Прототипно-ориентированный скриптовый язык программирования
Веб-дизайн [2]
Проектирование пользовательских веб-интерфейсов для сайтов или веб-приложений
RegExp [1]
Регулярные выражения
SEO [2]
Продвижение и раскрутка сайтов. Заработок в сети.
C/C++ [3]
Компилируемый статически типизированный язык программирования общего назначения
Windows [4]
Программистам под ОС MS Windows
HGE [2]
Игровой движок HGE (Haaf's Game Engine)
Игровой дизайн [8]
Психология дизайна игр
Разработка игр [2]
Общие моменты, относящиеся к геймдеву
wxWidgets [2]
Библиотека инструментов для разработки кроссплатформенных приложений
PureBasic [10]
Кроссплатформенный компилятор и IDE для быстрой разработки
VST [6]
Steinberg's Virtual Studio Technology (VST)
iOS [1]
Mобильная операционная система, разрабатываемая и выпускаемая американской компанией Apple
Пиксельная графика [9]
Pixel art и все, что с ним связано
libGDX [2]
Кроссплатформенный открытый движок на Java, позволяющий создавать 2D и 3D игры под различные платформы, среди которых: Android, HTML5, Windows, Linux, iOS.
Поддержи проект!
Рекомендуем


Блог разработчика

Главная » PHP
1 2 3 4 »
drupal_basename($uri, $suffix = NULL) — возвращает имя файла. Это аналог PHP функции basename() за исключением того, что поддерживает stream wrappers и имена файлов с не US-ASCII символами.
drupal_basename('sites/default/files/test.jpg'); // test.jpg
drupal_basename('public://test.jpg'); // test.jpg
drupal_basename('/drupal/sites/default/files/test.jpg'); // test.jpg

drupal_dirname($uri) — возвращает директорию файла. Это аналог PHP функции dirname() за исключением того, что поддерживает stream wrappers.
drupal_dirname('sites/default/files/test.jpg'); // sites/default/files
drupal_dirname('public://test.jpg'); // public://
drupal_dirname('/drupal/sites/default/files/test.jpg'); // /drupal/sites/default/files

drupal_realpath($uri) — возвращает абсолютный путь к файлу. Может работать с stream wrappers. Возвращает FALSE если файла не существует. Не рекомендуется к использованию.
drupal_realpath('sites/default/files/test.jpg'); // /drupal/sites/default/files/test.jpg
drupal_realpath('public://test.jpg'); // /drupal/sites/default/files/test.jpg
drupal_realpath('/drupal/sites/default/files/test.jpg'); // /drupal/sites/default/files/test.jpg

file_build_uri($path) — добавляет к пути файла дефолтный протокол (public://).
file_build_uri('test.jpg'); // public://test.jpg

file_create_filename($basename, $directory) — возвращает полный путь для будущего файла с именем $basename в директории $directory. Если файл с таким именем существует, то к имени файла добавляется порядковый номер. Поддерживает stream wrappers.
// если файл test.jpg не существует в указанной директории
file_create_filename('test.jpg', 'sites/default/files'); // sites/default/files/test.jpg
file_create_filename('test.jpg', 'public://'); // public://test.jpg
file_create_filename('test.jpg', '/drupal/sites/default/files/'); // /drupal/sites/default/files/test.jpg
 
// если файл test.jpg существует в указанной директории
file_create_filename('test.jpg', 'sites/default/files'); // sites/default/files/test_0.jpg
file_create_filename('test.jpg', 'public://'); // public://test_0.jpg
file_create_filename('test.jpg', '/drupal/sites/default/files/'); // /drupal/sites/default/files/test_0.jpg

file_create_url($uri) — возвращает URL файла. Поддерживает stream wrappers. Не поддерживает абсолютные пути к файлу.
file_create_url('sites/default/files/test.jpg'); // http://example.com/sites/default/files/test.jpg
file_create_url('public://test.jpg'); // http://example.com/sites/default/files/test.jpg
file_create_url('/drupal/sites/default/files/test.jpg'); // /drupal/sites/default/files/test.jpg

file_destination($destination, $replace) — возвращает путь к существующему файлу в зависимости от значения $replace. Если файла $destination не существует, то функция возвратит то, что передано первым аргументом.
file_destination('sites/default/files/test.jpg', FILE_EXISTS_REPLACE)); // sites/default/files/test.jpg
file_destination('sites/default/files/test.jpg', FILE_EXISTS_RENAME)); // sites/default/files/test_0.jpg
file_destination('sites/default/files/test.jpg', FILE_EXISTS_ERROR)); // FALSE
file_destination('public://test.jpg', FILE_EXISTS_REPLACE)); // public://test.jpg
file_destination('public://test.jpg', FILE_EXISTS_RENAME)); // public://test_0.jpg
file_destination('public://test.jpg', FILE_EXISTS_ERROR)); // FALSE
file_destination('/drupal/sites/default/files/test.jpg', FILE_EXISTS_REPLACE)); // /drupal/sites/default/files/test.jpg
file_destination('/drupal/sites/default/files/test.jpg', FILE_EXISTS_RENAME)); // /drupal/sites/default/files/test_0.jpg
file_destination('/drupal/sites/default/files/test.jpg', FILE_EXISTS_ERROR)); // FALSE

file_directory_temp() — возвращает путь к временной директории, указанной на странице admin/config/media/file-system. Не рекомендуется использовать.
file_directory_temp(); // /tmp

file_munge_filename($filename, $extensions, $alerts = TRUE) — если файл имеет двойное расширение, например file.php.jpg, то функция добавит нижнее подчёркивание к первому расширению, во избежание взлома при криво настроенном апаче.
file_munge_filename('sites/default/files/exploit.php.pps', ''); // sites/default/files/exploit.php_.pps
file_munge_filename('public://exploit.php.pps', ''); // public://exploit.php_.pps
file_munge_filename('/drupal/sites/default/files/exploit.php.pps', ''); // drupal/sites/default/files/exploit.php_.pps

file_unmunge_filename($filename) — отменяет эффект от функции file_munge_filename().
file_unmunge_filename('sites/default/files/exploit.php_.pps'); // sites/default/files/exploit.php.pps
file_unmunge_filename('public://exploit.php_.pps'); // public://exploit.php.pps
file_unmunge_filename('/drupal/sites/default/files/exploit.php_.pps'); // drupal/sites/default/files/exploit.php.pps

file_stream_wrapper_uri_normalize($uri) — нормализует URI файла: удаляет завершающий слэш из имени директории и исправляет тройной слэш в протоколе.
file_stream_wrapper_uri_normalize('sites/all/files/'); // sites/all/files
file_stream_wrapper_uri_normalize('public:///test.jpg'); // public://test.jpg

file_uri_scheme($uri) — возвращает протокол из URI.
file_uri_scheme('public://test.jpg'); // public
file_uri_scheme('temporary://'); // temporary

file_uri_target($uri) — возвращает часть пути без протокола.
file_uri_target('public://test.jpg'); // test.jpg
file_uri_target('temporary://test.jpg'); // test.jpg
file_uri_target('sites/default/files/test.jpg'); // FALSE

file_valid_uri($uri) — возвращает TRUE если в $uri валидный Drupal URI.
file_valid_uri('public://test.jpg'); // TRUE
file_valid_uri('foo://test.jpg'); // FALSE
file_valid_uri('sites/default/files/test.jpg'); // FALSE
Категория: PHP | Просмотров: 1229 | Добавил: pop | Дата: 2014-06-16

Добавить в template.php своей темы:
/**
 * Implements hook_js_alter().
 */
function THEMENAME_js_alter(&$javascript) {
 $javascript['misc/jquery.js']['data'] = '//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js';
 $javascript['misc/jquery.js']['version'] = '1.8.3';
 $javascript['misc/jquery.js']['type'] = 'external';
 $javascript['misc/jquery.js']['preprocess'] = FALSE;
}
Сбросить кэш.
Если не нравится использовать CDN гугла, то всё ещё проще:
/**
 * Implements hook_js_alter().
 */
function THEMENAME_js_alter(&$javascript) {
 $javascript['misc/jquery.js']['data'] = path_to_theme() . '/js/jquery-1.8.3.min.js';
}
Категория: PHP | Просмотров: 782 | Добавил: pop | Дата: 2014-06-16

Функция, которая получает размер удалённого (находящегося на другом сервере) файла, не скачивая его на сервер:
function get_remote_filesize($url) {
 $result = drupal_http_request($url, array('method' => 'HEAD'));
 if (empty($result->error) && isset($result->headers['content-length'])) {
 return $result->headers['content-length'];
 }
}

Пример использования:
echo get_remote_filesize('http://img.yandex.net/i/www/logo.png') . ' bytes' // 3729 bytes
Категория: PHP | Просмотров: 777 | Добавил: pop | Дата: 2014-06-16

Даже объяснять ничего не буду) Код в полном тексте статьи
Категория: PHP | Просмотров: 861 | Добавил: pop | Дата: 2014-05-01

Для чего вам нужен автоматический постинг в ЖЖ - не мое дело :)
Мое дело - рассказать, как это можно осуществить.
Категория: PHP | Просмотров: 1985 | Добавил: pop | Дата: 2013-01-17

Например, на сайте у нас есть папка upload, в которую пользователи нашего сайта заливают свои фотки. Проверять на допустимые типы файлов в скрипте надо в любом случае, но как дополнительную защиту можно использовать вот такую конструкцию в файле .htaccess (файл следует положить в папку, куда будут происхоить загрузки):

Order allow,deny
Deny from all

Как видим, ко всем файлам скриптов закрыт доступ. И даже в том случае, если будет залит php-файл, ничего страшного не произойдет.

Также можно при помощи .htaccess в нашей папке, в которую загружаются файлы переопределить обработчик исполняемых файлов php, perl и заставить воспринимать их как текстовые:
RemoveHandler .php .phtml .pl
AddType text/plain .php .phtml .pl

Еще можно в папке прописать запрет на исполнение скриптов :
Options -ExecCGI
AddHandler cgi-script .pl .py .php .jsp .htm .shtml .sh .asp .cgi 
Категория: PHP | Просмотров: 1241 | Добавил: pop | Дата: 2012-08-31

Отладка php-скриптов в браузере - штука полезная и удобная. Для Firefox есть вполне вменяемая вещь, как FirePHP, которая использует консоль Firebug.

Как оказалось, для Хрома также есть подобное решение, PHP Console. Умеет выводить сообщения не только в консоль Хрома, но и в виде попапчиков.

Для минимального использования достаточно установить расширение и подключить класс PhpConsole. Для более продвинутого использования имеется библиотека Lagger.

Пример использования (исключение, предупреждение и отладочное сообщение):
require_once('PhpConsole.php');
PhpConsole::start(true, true, dirname(__FILE__));

debug('SELECT * FROM users', 'db');

class TestErrorBacktrace {
 function __construct() {
 $this->yeah(12, array());
 }
 function yeah() {
 self::oops('some string', new stdClass());
 }
 static function oops() {
 file_get_contents('oops.txt');
 throw new Exception('Exception with call backtrace');
 }
}

new TestErrorBacktrace();



Класс - http://code.google.com/p/php-console/
Расширение для Chrome - https://chrome.google.com/webstore/detail/nfhmhhlpfleoednkpnnnkolmclajemef
Почитать на Хабре - http://habrahabr.ru/post/107810/
Категория: PHP | Просмотров: 1654 | Добавил: pop | Дата: 2012-08-31

Все предельно просто, но не все в курсе, что для того, чтобы file_get_contents() можно было вызывать с таймаутом, нужно создать контекст и передать его в функцию:
function file_get_contents_timeout($filename, $timeout = 5) 
 { 
 $ctx = stream_context_create(array(
 'http' => array(
 'timeout' => $timeout
 )
 )
 );
 
 return file_get_contents($filename, 0, $ctx);
 }
Категория: PHP | Просмотров: 1652 | Добавил: pop | Дата: 2012-08-30

Основная проблема с "водяными знаками" в том, что если их добавлять при загрузке изображения, то они остаются на нем навечно. Заменить в дальнейшем ватермарк на другой не представляется возможным. Можно сохранять оригинал изображения, но это приводит у удвоению контента, и если изображений на сайте много, то потребуется вдвое больше места.

Предложенное ниже решение позволяет накладывать ватермарки автоматически. В каталог с файлами изображений следует поместить файл .htaccess следующего содержания:
DirectoryIndex index.php

<FilesMatch "\.(gif|jpg|jpeg|png)$">
 RewriteEngine On
 RewriteCond %{REQUEST_FILENAME} -f
 RewriteRule ^(.*)$ /watermark/_watermark.php [T=application/x-httpd-php,L,QSA]
</FilesMatch>

В корне сайта создается папка watermark в которую помещается изображение-ватермарк watermark.png и файл _watermark.php:
waterMark($_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI']);

function waterMark($original)
{

 $original = urldecode($original);
 $info_o = @getImageSize($original);
 if (!$info_o)
 return false;
 $info_w = @getImageSize('watermark.png');
 if (!$info_w)
 return false;

 header("Content-Type: ".$info_o['mime']);

 $original = @imageCreateFromString(file_get_contents($original));
 $watermark = @imagecreatefrompng("watermark.png");
 $out = imageCreateTrueColor($info_o[0],$info_o[1]);

 imageCopyMerge($out, $original, 0, 0, 0, 0, $info_o[0], $info_o[1], 100);
 // Водяной знак накладываем только на изображения больше 250 пикселей по вертикали и по горизонтали
 if( ($info_o[0] > 250) && ($info_o[1] > 250) )
 {
 // Последний параметр функции - степень непрозрачности водяного знака
 imageCopyMerge($out, $watermark, ($info_o[0]-$info_w[0])/2, ($info_o[1]-$info_w[1])/2, 0, 0, $info_w[0], $info_w[1], 25);
 }

 switch ($info_o[2])
 {
 case 1:
 imageGIF($out);
 break;
 case 2:
 imageJPEG($out);
 break;
 case 3:
 imagePNG($out);
 break;
 default:
 return false;
 }

 imageDestroy($out); 
 imageDestroy($original); 
 imageDestroy($watermark); 

 return true; 
} 

Если общая мысль понятна, то не составит труда изменить код под свои нужды. К сожалению, данная методика вряд ли подойдет для высоконагруженных проектов: т.к. изображения отдает php, а не веб-сервер напрямую, это создает дополнительные нагрузки.
Категория: PHP | Просмотров: 1076 | Добавил: pop | Дата: 2012-08-30

Как перемещаться по дереву объекта DOM?
// Пример
echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id;
// или 
echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');
Метод Описание
mixed $e->children ( [int $index] ) Возвращает N-ный дочерний объект если index указан, в остальных случаях возвращает массив потомков.
element $e->parent () Возвращает родителя элемента.
element $e->first_child () Возвращает первого потомка элемента, или null если ничего не найдено.
element $e->last_child () Возвращает последнего потомка элемента, или null если ничего не найдено.
element $e->next_sibling () Возвращает следующий элемент, находящийся на том же уровне или null если ничего не найдено.
element $e->prev_sibling () Возвращает предыдущий элемент, находящийся на том же уровне или null если ничего не найдено.

Также эти методы существуют и в "верблюжьей" нотации. О них мы еще поговорим позже, в разделе про API.


Как получить содержимое объекта DOM?

Быстрый способ:
// Дамп дерева DOM обратно в строку 
$str = $html;

// Печатаем
echo $html;
ООП-способ:
// Дамп дерева DOM обратно в строку 
$str = $html->save();

// Дамп дерева DOM обратно в файл
$html->save('result.htm');

Как определить функцию обратного вызова на найденный элемент?
// Напишем функцию с параметром "$element"
function my_callback($element) {
 // Скрываем все <b>
 if ($element->tag == 'b')
 $element->outertext = '';
} 

// Регистрируем коллбэк, указывая имя функции
$html->set_callback('my_callback');

// Во время дампа будет вызван коллбэк
echo $html;
Категория: PHP | Просмотров: 1108 | Добавил: pop | Дата: 2012-08-20