Ru-Board.club
← Вернуться в раздел «Web-программирование»

» PHP: Полезные (интересные и оригинальные) решения

Автор: SafeWay
Дата сообщения: 26.07.2004 06:30
Начну:

Код:
function err_handler ($errno, $errstr, $errfile, $errline) {
global $display_errors;
if(($errno != E_NOTICE && $errno != E_WARNING) && $display_errors){
echo '';
}
}
$error_flags = E_ALL & ~E_NOTICE;
@error_reporting($error_flags);
@ini_set ('error_reporting', $error_flags);
$old_error_handler = set_error_handler("err_handler");
Автор: SafeWay
Дата сообщения: 26.07.2004 18:45
В поддержание темы:
Данный цикл поможет сделать разбитие на страницы, а именно нумеризацию (1 2 3 4...)

Код:
$num = 10; // Число записей всего.
$perpage = 7; // Кол-во, показываемых записей на странице.
$pages_count = @ceil($num/$perpage);
$pages .= 'Страницы:';
for($j=1;$j<=$pages_count;$j++)
{

if ($_GET['page'] != $j)
{
$pages .= ' <a href="?page='.$j.'"><b>'.$j.'</b></a> ';
}
else
{
$pages .= ' <b>'.$j.'</b> ';
}
}


Автор: Church
Дата сообщения: 29.07.2004 00:08

Код:
<?php
if (isset ($_REQUEST["page"])){
$page=$_REQUEST["page"];
settype($page,"integer");
}
else {$page=1;}

$num_p=2; //Сколько номеров будет показано слева и справа от текущей страницы.
$num_all=15; //Всего "чего-то"
$limit=2; //"Чего-то" на одной странице

$n=$num_all/$limit;
if (!is_integer($n)){settype($n,"integer");$n++;}
if ($n>1){
print "<center>";
$start_p=$page-$num_p;
$end_p=$page+$num_p;
if ($end_p>$n){$end_p=$n;}
$start_p=$end_p-$num_p*2;
if ($start_p<1){$start_p=1;}
$end_p=$start_p+$num_p*2;
if ($start_p>1){
$t=$start_p-1;
print "<a href=\"1.php?page=".$t."\"><== Prev</a> ";
}
for ($i=$start_p;$i<$end_p+1 && $i<$n+1;$i++){
if ($page!=$i){
print "<a href=\"1.php?page=".$i."\">[".$i."]</a> ";
}
else {
print "<a href=\"1.php?page=".$i."\" style=\"color:#cccccc\">[".$i."]</a> ";
}
}
if ($end_p<$n){
print "<a href=\"1.php?page=".$i."\">Next =>></a>";
}
print "</center>";
}
print "Всего страниц: ".$n."<hr>";
if ($num_all>$limit){
$nop2=($page-1)*$limit;
if ($nop2>$num_all or $page<1){
print "Страница не существует";
}
}
?>
Автор: SafeWay
Дата сообщения: 30.07.2004 19:20

Код:

$text = 'Переведём-ка мы всё это хозяйство на латиницу';

echo ru2lat($text); // передаем функции необходимую переменную с текстом

function ru2Lat($string)
{
$rus = array('ё','ж','ц','ч','ш','щ','ю','я','Ё','Ж','Ц','Ч','Ш','Щ','Ю','Я');
$lat = array('yo','zh','tc','ch','sh','sh','yu','ya','YO','ZH','TC','CH','SH','SH','YU','YA');
$string = str_replace($rus,$lat,$string);
$string = strtr($string,
"АБВГДЕЗИЙКЛМНОПРСТУФХЪЫЬЭабвгдезийклмнопрстуфхъыьэ",
"ABVGDEZIJKLMNOPRSTUFH'I'Eabvgdezijklmnoprstufh'i'e");

return($string);
}

/////////
Функция для записи в файл.
//$input - содержимое, которое будем записывать
//$file - полный путь и имя файла
//$chmod - аргумент, указывающий перезаписываем мы или дописываем файл

function Save2File($input,$file,$chmod='w+')
{
$fp = fopen($file,$chmod);
flock($fp,2);
fputs ($fp,$input);
flock($fp,3);
fclose($fp);
}


Автор: Church
Дата сообщения: 31.07.2004 00:58
Для записи/чтения думаю, что будет полезно почитать это:
http://spectator.ru/technology/php/flock_workaround
Автор: sculderspb
Дата сообщения: 04.08.2004 06:13
Моя функция постраничного вывода с описанием и инструкциями по использованию. Довольная мощная и можно настроить под свои нужды:

http://sculder.traktir.ru/stuff/php/scripts/pager.html

Полагаю, пригодится, ибо в инете мало чего толкового есть.
Автор: MAGISTRATE
Дата сообщения: 05.08.2004 23:51
Тут где-то в темах проскакивала просьба сделать функцию, которая печатает заголовок текста и страницы одновременно:


Код:
############# генерируем шапку
function title($pagename,$all)
{
global $SITE;

##### выводим через жаву заголовок если $all == no
if($all == "no"):

$pagename = strtolower($pagename);
$pagename[0] = strtoupper($pagename);
print"<script language=javascript>";
print"window.top.document.title=\"$SITE[comp] :: $pagename\"";
print"</script>";

##### выводим имя раздела, если all == one
elseif($all == 'one'):
$pagename = $pagename;
print"<b>$pagename</b>";

##### выводим все если $all == yes
elseif($all == 'yes'):
$pagenametop = strtolower($pagename);
$pagename = strtoupper($pagename);
$pagenametop[0] = strtoupper($pagename);

print"<script language=javascript>";
print"window.top.document.title=\"$SITE[comp] :: $pagenametop\"";
print"</script>";

print"<b>$pagename</b>";
endif;
}
Автор: SafeWay
Дата сообщения: 06.08.2004 02:06

Цитата:
function untag ($string)
{
$string = ereg_replace("<","&lt;",$string);
$string = ereg_replace(">","&gt;",$string);
$string = ereg_replace('\\\"',"&quot;",$string);
$string = ereg_replace(":","&#58;",$string);
$string = ereg_replace("!","&#33;",$string);
$string = ereg_replace("\r","",$string);
$string = ereg_replace("\n","<br>",$string);
$string = ereg_replace("%","&#37;",$string);
$string = ereg_replace("^ +","",$string);
$string = ereg_replace(" +$","",$string);
$string = ereg_replace(" +"," ",$string);
return $string;
};

Имхо лучше str_replace
$string = ereg_replace('\\\"',"&quot;",$string); - убивается проще - функцией stripslashes()
Автор: SiMM
Дата сообщения: 06.08.2004 13:18
Имхо, лучше использовать PCRE, а в данной задаче по моему достаточно $string=nl2br(htmlspecialchars($string));
PS: по поводу "убивает все нотайсы, выводы ошибок и прочее" - разве error_reporting(0) для этих целей недостаточно?
Автор: Church
Дата сообщения: 06.08.2004 14:00
[POST_EDITING]
Упс.. Не внимательно прочитал содержимое тему... Лишняя месага... Всем сорьки
[/POST_EDITING]
Автор: dacuan
Дата сообщения: 06.08.2004 15:36
MAGISTRATE

Цитата:
function R_strlow ($str)
{

// фиксит баг со strtolower в русском апаче (русские буквы не переводятся в нижний регистр)

Вообще-то этот "баг" лечится установкой локали:

Код:
setlocale(LC_ALL, "ru_RU.CP1251");
Автор: MAGISTRATE
Дата сообщения: 06.08.2004 18:16
dacuan
Я привел то, с чем мне удобнее пользоваться.


SiMM
Ну давай. Юзай дальше свой htmlspecialchars

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

untug(string);

чем

nl2br(addqoutes(stripslashes(htmlspecialchars(untug(string)))))

Так что товарищи, совет почитать книгу по оптимизации кода.
Автор: dacuan
Дата сообщения: 06.08.2004 20:03
MAGISTRATE
Эта ветка для готовых решений, а не для флейма.
Ты привел свой вариант решения проблемы, тебе предложили другой.
И направлять людей "почитать книгу" тоже не есть хорошо, особенно, если не привел ссылку.
Покажи мне в следующей строке "оптимизированный" код:

Цитата:

if (strtolower ("ЖОпа")!="жопа") $str = strtr

На счет эффективности использования eregi_* интересно почитать здесь

А вот и сравнение скорости
Имеем скрипт

Код:
<?
function echo_dif($start, $end){
$aA = explode(' ',$start.' '.$end);
$duration=($aA[2]+$aA[3])-($aA[0]+$aA[1]);
echo $duration."<br>";
}

function untag ($string)
{
$string = ereg_replace("<","&lt;",$string);
$string = ereg_replace(">","&gt;",$string);
$string = ereg_replace('\\\"',"&quot;",$string); //Эта строка не будет работать с отключенным magic_quotes
$string = ereg_replace(":","&#58;",$string);
$string = ereg_replace("!","&#33;",$string);
$string = ereg_replace("\r","",$string);
$string = ereg_replace("\n","<br>",$string);
$string = ereg_replace("%","&#37;",$string);
$string = ereg_replace("^ +","",$string);
$string = ereg_replace(" +$","",$string);
$string = ereg_replace(" +"," ",$string);
return $string;
};

function untag_str ($string)
{
$string = str_replace("<","&lt;",$string);
$string = str_replace(">","&gt;",$string);
$string = str_replace('\\\"',"&quot;",$string); //Эта строка не будет работать с отключенным magic_quotes
$string = str_replace(":","&#58;",$string);
$string = str_replace("!","&#33;",$string);
$string = str_replace("\r","",$string);
$string = str_replace("\n","<br>",$string);
$string = str_replace("%","&#37;",$string);
$string = preg_replace("/\s+/s"," ",$string);
return trim($string);
};

function my_untag ($string) {
return trim(nl2br(htmlspecialchars($string)));
}

$text = implode('\n', file('str_replace.htm'));

set_time_limit(0);
define("STEPS", 1);
//eregi
$start = microtime();
for($i=0; $i<STEPS; $i++){
$str = untag($text);
}
echo "eregi: ";
echo_dif($start, microtime());

//str
$start = microtime();
for($i=0; $i<STEPS; $i++){
$str = untag_str($text);
}
echo "str: ";
echo_dif($start, microtime());

//htmlspecialchars
$start = microtime();
for($i=0; $i<STEPS; $i++){
$str = trim(nl2br(htmlspecialchars($text)));
}
echo "htmlspecialchars: ";
echo_dif($start, microtime());

//myuntag
$start = microtime();
for($i=0; $i<STEPS; $i++){
$str = my_untag($text);
}
echo "my_untag: ";
echo_dif($start, microtime());
?>
Автор: SiMM
Дата сообщения: 06.08.2004 20:18

Цитата:
Как видишь по результатам твой вариант скрипта сильно отстает от str_replace и тем более от htmlspecialchars.
Результаты вполне предсказуемы - htmlspecialchars - единственная функция, решающая задачу "внутри" в один цикл по входной строке, без всяких вложенностей (ссылка по теме).
Автор: MAGISTRATE
Дата сообщения: 06.08.2004 21:15
Вот так будет немного лучше:


Код:
function untag($string)
{
$string = strip_tags($string);
$string = str_replace('\"','&quot;',$string);
$string = str_replace("\'","&quot;",$string);
$string = str_replace("\&","&",$string);
$string = str_replace("<","&lt;",$string);
$string = str_replace('\\\"',"&quot;",$string);
$string = str_replace('\\"',"&quot;",$string);
$string = str_replace("!","&#33;",$string);
$string = str_replace("\r\n","<br>",$string);
$string = str_replace("\n","<br>",$string);
$string = str_replace("%","&#37;",$string);
$string = str_replace("^ +","",$string);
$string = str_replace(" +$","",$string);
$string = str_replace(" +"," ",$string);

return $string;
}
Автор: SiMM
Дата сообщения: 06.08.2004 21:38

Цитата:
Иной раз тупость людей убивает...
Заносит на поворотах? Если до тебя не доходит - как минимум, PCRE быстрее POSIX, суть некоторой части твоих замен для браузера совершенно бесполезна.

Цитата:
Интересно, а как htmlspecialchars поможет, если в строке надо оставить
только <b> <i> <u>.
Это другая задача, которая решается при помощи strip_tags, и не имеет никакого отношения к htmlspecialchars, так же, как eregi не имеет отношения к отправке почты.
Автор: SafeWay
Дата сообщения: 06.08.2004 23:02
MAGISTRATE

Цитата:
nl2br(addqoutes(stripslashes(htmlspecialchars(untug(string)))))

Так что товарищи, совет почитать книгу по оптимизации кода

Это всё можно внутни той же функции сделать.
И выкладываем всё таки гововые решения, для спора что быстрее, или усердное доказывание своей правоты можно создать свой топ.
Одного раза показать на "правильный" с вашей стороны вариант будет предостаточно...
Автор: SafeWay
Дата сообщения: 08.08.2004 15:38

Код: class thumbnail
{
var $imgfile;

function thumb($imgfile)
{
if (!file_exists($imgfile)) die ("Cannot read the file!");
//detect image format
//$this->img["format"] = ereg_replace(".*\.(.*)$","\\1",$imgfile);
$hz = explode(".", $name);
$this->img["format"] = $hz[sizeof($hz-1)];
$this->img["format"] = strtoupper($this->img["format"]);
if ($this->img["format"]=="JPG" || $this->img["format"]=="JPEG")
{
//JPEG
$this->img["format"]="JPG";
$this->img["src"] = ImageCreateFromJPEG($imgfile);
}
elseif ($this->img["format"]=="PNG")
{
//PNG
$this->img["format"]="PNG";
$this->img["src"] = ImageCreateFromPNG($imgfile);
}
elseif ($this->img["format"]=="GIF")
{
//GIF
$this->img["format"]="GIF";
$this->img["src"] = ImageCreateFromGIF($imgfile);

}
else {
//DEFAULT
echo "Not Supported File! Thumbnails can only be made from .gif, .jpg and .png images!";
exit();
}
$this->img["lebar"] = imagesx($this->img["src"]);
$this->img["tinggi"] = imagesy($this->img["src"]);
//default quality jpeg
$this->img["quality"]=100;
}

function size_auto($size=100)
{
//size
if ($this->img["lebar"]>=$this->img["tinggi"])
{
$this->img["lebar_thumb"]=$size;
$this->img["tinggi_thumb"] = ($this->img["lebar_thumb"]/$this->img["lebar"])*$this->img["tinggi"];
}
else
{
$this->img["tinggi_thumb"]=$size;
$this->img["lebar_thumb"] = ($this->img["tinggi_thumb"]/$this->img["tinggi"])*$this->img["lebar"];
}
}

function jpeg_quality($quality=100)
{
//jpeg quality
$this->img["quality"]=$quality;
}



function show($gd_version)
{
Header("Content-Type: image/".$this->img["format"]);
if($gd_version==2)
{
$this->img["des"] = imagecreatetruecolor($this->img["lebar_thumb"],$this->img["tinggi_thumb"]);
imagecopyresampled ($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"],$this->img["tinggi_thumb"], $this->img["lebar"], $this->img["tinggi"]);
}
if($gd_version==1)
{
$this->img["des"] = imagecreate($this->img["lebar_thumb"],$this->img["tinggi_thumb"]);
imagecopyresized ($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"],$this->img["tinggi_thumb"], $this->img["lebar"], $this->img["tinggi"]);
}
if ($this->img["format"]=="JPG" || $this->img["format"]=="JPEG")
{
//JPEG
imageJPEG($this->img["des"],"",$this->img["quality"]);
}
elseif ($this->img["format"]=="PNG")
{
//PNG
imagePNG($this->img["des"]);
}
elseif ($this->img["format"]=="GIF")
{
//GIF
imageGIF($this->img["des"]);
}
}

function save($save="",$gd_version)
{

if($gd_version==2)
{
$this->img["des"] = imagecreatetruecolor($this->img["lebar_thumb"],$this->img["tinggi_thumb"]);
@imagecopyresampled ($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"], $this->img["lebar"], $this->img["tinggi"]);
}
if($gd_version==1)
{
$this->img["des"] = imagecreate($this->img["lebar_thumb"],$this->img["tinggi_thumb"]);
@imagecopyresized ($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"], $this->img["lebar"], $this->img["tinggi"]);
}
if ($this->img["format"]=="JPG" || $this->img["format"]=="JPEG")
{
//JPEG
imageJPEG($this->img["des"],"$save",$this->img["quality"]);
}
elseif ($this->img["format"]=="PNG")
{
//PNG
imagePNG($this->img["des"],"$save");
}
elseif ($this->img["format"]=="GIF")
{
//GIF
imageGIF($this->img["des"],"$save");
}
}


function open_save($open, $save, $size, $gd)
{
$this->thumb($open);
$this->size_auto($size);
$this->save($save, $gd);
}

}
Автор: dacuan
Дата сообщения: 09.08.2004 10:42
Класс, который позволяет создать zip-архив из нескольких файлов.
Взят из phpMyAdmin/
Недостаток: не устанавливается время создания файла в архиве.

Код:
/**
* Zip file creation class.
* Makes zip files.
*
* Based on :
*
* http://www.zend.com/codex.php?id=535&single=1
* By Eric Mueller (eric@themepark.com)
*
* http://www.zend.com/codex.php?id=470&single=1
* by Denis125 (webmaster@atlant.ru)
*
* Official ZIP file format: http://www.pkware.com/appnote.txt
*
* @access public
*/
class zipfile
{
/**
* Array to store compressed data
*
* @var array $datasec
*/
var $datasec = array();

/**
* Central directory
*
* @var array $ctrl_dir
*/
var $ctrl_dir = array();

/**
* End of central directory record
*
* @var string $eof_ctrl_dir
*/
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";

/**
* Last offset position
*
* @var integer $old_offset
*/
var $old_offset = 0;


/**
* Adds "file" to archive
*
* @param string file contents
* @param string name of the file in the archive (may contains the path)
*
* @access public
*/
function addFile($data, $name)
{
$name = str_replace('\\', '/', $name);

$fr = "\x50\x4b\x03\x04";
$fr .= "\x14\x00"; // ver needed to extract
$fr .= "\x00\x00"; // gen purpose bit flag
$fr .= "\x08\x00"; // compression method
$fr .= "\x00\x00\x00\x00"; // last mod time and date

// "local file header" segment
$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data,9);
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
$c_len = strlen($zdata);
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize
$fr .= pack('v', strlen($name)); // length of filename
$fr .= pack('v', 0); // extra field length
$fr .= $name;

// "file data" segment
$fr .= $zdata;

// "data descriptor" segment (optional but necessary if archive is not
// served as file)
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize

// add this entry to array
$this -> datasec[] = $fr;
$new_offset = strlen(implode('', $this->datasec));

// now add to central directory record
$cdrec = "\x50\x4b\x01\x02";
$cdrec .= "\x00\x00"; // version made by
$cdrec .= "\x14\x00"; // version needed to extract
$cdrec .= "\x00\x00"; // gen purpose bit flag
$cdrec .= "\x08\x00"; // compression method
$cdrec .= "\x00\x00\x00\x00"; // last mod time & date
$cdrec .= pack('V', $crc); // crc32
$cdrec .= pack('V', $c_len); // compressed filesize
$cdrec .= pack('V', $unc_len); // uncompressed filesize
$cdrec .= pack('v', strlen($name)); // length of filename
$cdrec .= pack('v', 0 ); // extra field length
$cdrec .= pack('v', 0 ); // file comment length
$cdrec .= pack('v', 0 ); // disk number start
$cdrec .= pack('v', 0 ); // internal file attributes
$cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set

$cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
$this -> old_offset = $new_offset;

$cdrec .= $name;

// optional extra field, file comment goes here
// save to central directory
$this -> ctrl_dir[] = $cdrec;
} // end of the 'addFile()' method


/**
* Dumps out file
*
* @return string the zipped file
*
* @access public
*/
function file()
{
$data = implode('', $this -> datasec);
$ctrldir = implode('', $this -> ctrl_dir);

return
$data .
$ctrldir .
$this -> eof_ctrl_dir .
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall
pack('V', strlen($ctrldir)) . // size of central dir
pack('V', strlen($data)) . // offset to start of central dir
"\x00\x00"; // .zip file comment length
} // end of the 'file()' method

} // end of the 'zipfile' class
Автор: dacuan
Дата сообщения: 10.08.2004 19:47
Класс для отправления почтовых сообщений в виде html с прикрепленными файлами

Код:
class html_mime_mail {
var $headers;
var $multipart;
var $mime;
var $html;
var $parts = array();

function html_mime_mail($headers="") {
$this->headers=$headers;
}

function add_html($html="") {
$this->html.=$html;
}

function build_html($orig_boundary,$kod) {
$this->multipart.="--$orig_boundary\n";
if ($kod=='w' || $kod=='win' || $kod=='windows-1251') $kod='windows-1251';
else $kod='koi8-u';
$this->multipart.="Content-Type: text/html; charset=$kod\n";
$this->multipart.="Content-Transfer-Encoding: Quot-Printed\n\n";
$this->multipart.="$this->html\n\n";
}


function add_attachment($path="", $name = "", $c_type="application/octet-stream") {
if (!file_exists($path.$name)) {
print "File $path.$name dosn't exist.";
return;
}
$fp=fopen($path.$name,"r");
if (!$fp) {
print "File $path.$name coudn't be read.";
return;
}
$file=fread($fp, filesize($path.$name));
fclose($fp);
$this->parts[]=array("body"=>$file, "name"=>$name,"c_type"=>$c_type);
}


function build_part($i) {
$message_part="";
$message_part.="Content-Type: ".$this->parts[$i]["c_type"];
if ($this->parts[$i]["name"]!="")
$message_part.="; name = \"".$this->parts[$i]["name"]."\"\n";
else
$message_part.="\n";
$message_part.="Content-Transfer-Encoding: base64\n";
$message_part.="Content-Disposition: attachment; filename = \"".
$this->parts[$i]["name"]."\"\n\n";
$message_part.=chunk_split(base64_encode($this->parts[$i]["body"]))."\n";
return $message_part;
}


function build_message($kod) {
$boundary="=_".md5(uniqid(time()));
$this->headers.="MIME-Version: 1.0\n";
$this->headers.="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
$this->multipart="";
$this->multipart.="This is a MIME encoded message.\n\n";
$this->build_html($boundary,$kod);
for ($i=(count($this->parts)-1); $i>=0; $i--)
$this->multipart.="--$boundary\n".$this->build_part($i);
$this->mime = "$this->multipart--$boundary--\n";
}


function send($server, $to, $from, $subject="", $headers="") {
$headers="From: $from\nX-Mailer: Zveno\n$headers";
$res=mail($to, $subject, "", $this->headers.$headers.$this->mime);
return $res;
/* $headers="To: $to\nFrom: $from\nSubject: $subject\nX-Mailer: The Mouse!\n$headers";
$fp = fsockopen($server, 25, &$errno, &$errstr, 30);
if (!$fp)
die("Server $server. Connection failed: $errno, $errstr");
fputs($fp,"HELO $server\n");
fputs($fp,"MAIL FROM: $from\n");
fputs($fp,"RCPT TO: $to\n");
fputs($fp,"DATA\n");
fputs($fp,$this->headers);
if (strlen($headers))
fputs($fp,"$headers\n");
fputs($fp,$this->mime);
fputs($fp,"\n.\nQUIT\n");
while(!feof($fp))
$resp.=fgets($fp,1024)."<br>";
echo "<br><br><br>RESP=$resp<br><br><br>";
fclose($fp);*/
}
}
Автор: Sardaukar
Дата сообщения: 21.08.2004 22:29
Давайте и чего-нибудь подкину.

Вот, например, сильно облегчает жизнь с выключенным register_globals:

Код: /**
* Вспомогательная ф-я. Ищет в запросе первый аргумент.
* Если находит - кладет его в глобальные переменные (в случае уст. флага $set_glob)
* со значением из запроса, если нет - со значением, которое передано в ф-ию
* @since 2004-7-14
* @author Rumata
* @param string $var_name имя переменной
* @param string $def_val дефолтовое значение
* @param string $type Тип переменной. Если mixed, то приведение не производится
* @param bool $set_glob Флаг, показывающий, надо ли устанавливать значение глобальной переменной
* @return mixed Переменная, которая была установлена
*/
function pretest($var_name, $def_val, $type, $set_glob = true) {
if (isset($_REQUEST[$var_name])) {
$tmp = $_REQUEST[$var_name];
} else {
$tmp = $def_val;
}
if ($type != "mixed" && $type != "")
settype($tmp, $type);
if ($set_glob) $GLOBALS[$var_name] = $tmp;
return $tmp;
}
Автор: SafeWay
Дата сообщения: 22.08.2004 02:10

Код: <?

class template{

var $var_names = array();
var $files = array();
var $start = '{';
var $end = '}';

/***************************************
** Function to load a template into
** the class.
***************************************/


function load_file($file_id, $filename){$this->files[$file_id] = file_get_contents($filename);}


/***************************************
** Function to load a template into
** the class.
***************************************/
function set_identifiers($start, $end){
$this->start = $start;
$this->end = $end;
}

/***************************************
** This function is used only by the
** register() method, for going through
** arays and extracting the values.
***************************************/
function traverse_array($file_id, $array){
while(list(,$value) = each($array)){
if(is_array($value)) $this->traverse_array($file_id, $value);
else $this->var_names[$file_id][] = $value;
}
}

/***************************************
** Function to register a variable(s).
***************************************/
function register($file_id, $var_name){
if(is_array($var_name)){
$this->traverse_array($file_id, $var_name);
}elseif($var_name != ''){
if(is_long(strpos($var_name, ',')) == TRUE){
$var_name = explode(',', $var_name);
for(reset($var_name); $current = current($var_name); next($var_name)) $this->var_names[$file_id][] = trim($current);
}else{
$this->var_names[$file_id][] = $var_name;
}
}
}

/***************************************
** Function to include another file.
** eg. A header/footer.
***************************************/
function include_file($file_id, $filename){
if(file_exists($filename)){
$include = fread($fp = fopen($filename, 'r'), filesize($filename));
fclose($fp);
}else $include = '[ERROR: "'.$filename.'" does not exist.]';

$tag = substr($this->files[$file_id], strpos(strtolower($this->files[$file_id]), '<include filename="'.$filename.'">'), strlen('<include filename="'.$filename.'">'));
$this->files[$file_id] = str_replace($tag, $include, $this->files[$file_id]);
}

/***************************************
** Function for reading and parsing the
** html file for normal variables. Also
** now checks for include tags and if
** necessary calls include_file()
***************************************/
function parse($file_id){
$file_ids = explode(',', $file_id);
for(reset($file_ids); $file_id = trim(current($file_ids)); next($file_ids)){
while(is_long($pos = strpos(strtolower($this->files[$file_id]), '<include filename="'))){
$pos += 19;
$endpos = strpos($this->files[$file_id], '">', $pos);
$filename = substr($this->files[$file_id], $pos, $endpos-$pos);
$this->include_file($file_id, $filename);
}

if(isset($this->var_names[$file_id]) AND count($this->var_names[$file_id]) > 0){
for($i=0; $i<count($this->var_names[$file_id]); $i++){
$temp_var = $this->var_names[$file_id][$i];

if(is_long(strpos($this->files[$file_id], $this->start.$temp_var.$this->end))){
global $$temp_var;
$this->files[$file_id] = str_replace($this->start.$temp_var.$this->end, $$temp_var, $this->files[$file_id]);

}elseif(is_long(strpos($this->files[$file_id], $this->start.$temp_var.'()'.$this->end))){
global $$temp_var;
$arguments = array();
for($i=0; $i<count($$temp_var); $i++) $arguments[] = ${$temp_var}[$i];
if(count($arguments) > 0) $arguments = '"'.implode('", "', $arguments).'"'; else $arguments = '';
eval('$output = '.$temp_var.'('.$arguments.');');
$this->files[$file_id] = str_replace($this->start.$temp_var.'()'.$this->end, $output, $this->files[$file_id]);
}
}
}
}
}

/***************************************
** Function for parsing an array.
***************************************/
function parse_loop($file_id, $array_name){
global $$array_name;
$loop_code = '';

$start_pos = strpos(strtolower($this->files[$file_id]), '<loop name="'.$array_name.'">') + strlen('<loop name="'.$array_name.'">');
$end_pos = strpos(strtolower($this->files[$file_id]), '</loop name="'.$array_name.'">');

$loop_code = substr($this->files[$file_id], $start_pos, $end_pos-$start_pos);

$start_tag = substr($this->files[$file_id], strpos(strtolower($this->files[$file_id]), '<loop name="'.$array_name.'">'),strlen('<loop name="'.$array_name.'">'));
$end_tag = substr($this->files[$file_id], strpos(strtolower($this->files[$file_id]), '</loop name="'.$array_name.'">'),strlen('</loop name="'.$array_name.'">'));

if($loop_code != ''){
$new_code = '';
for($i=0; $i<count($$array_name); $i++){
$temp_code = $loop_code;
while(list($key,) = each(${$array_name}[$i])){
$temp_code = str_replace($this->start.$key.$this->end,${$array_name}[$i][$key], $temp_code);
}
$new_code .= $temp_code;
}
$this->files[$file_id] = str_replace($start_tag.$loop_code.$end_tag, $new_code, $this->files[$file_id]);
}
}

/***************************************
** Function for parsing a Mysql result
** set.
***************************************/
function parse_sql($file_id, $result_name){
global $$result_name;
$loop_code = '';

$start_pos = strpos(strtolower($this->files[$file_id]), '<loop name="'.$result_name.'">') + strlen('<loop name="'.$result_name.'">');
$end_pos = strpos(strtolower($this->files[$file_id]), '</loop name="'.$result_name.'">');

$loop_code = substr($this->files[$file_id], $start_pos, $end_pos-$start_pos);

$start_tag = substr($this->files[$file_id], strpos(strtolower($this->files[$file_id]), '<loop name="'.$result_name.'">'),strlen('<loop name="'.$result_name.'">'));
$end_tag = substr($this->files[$file_id], strpos(strtolower($this->files[$file_id]), '</loop name="'.$result_name.'">'),strlen('</loop name="'.$result_name.'">'));

if($loop_code != ''){
$new_code = '';
$field_names = array();
for($i=0; $i<mysql_num_fields($$result_name); $i++) $field_names[] = mysql_field_name($$result_name,$i);
while($row_data = mysql_fetch_array($$result_name, MYSQL_ASSOC)){
$temp_code = $loop_code;
for($i=0; $i<count($field_names); $i++){
$temp_code = str_replace($this->start.$field_names[$i].$this->end, $row_data[$field_names[$i]], $temp_code);
}
$new_code.= $temp_code;
}
$this->files[$file_id] = str_replace($start_tag.$loop_code.$end_tag, $new_code, $this->files[$file_id]);
}
}

/***************************************
** Function for parsing a Postgres result
** set.
***************************************/
function parse_pgsql($file_id, $result_name){
global $$result_name;
$loop_code = '';

$start_pos = strpos(strtolower($this->files[$file_id]), '<loop name="'.$result_name.'">') + strlen('<loop name="'.$result_name.'">');
$end_pos = strpos(strtolower($this->files[$file_id]), '</loop name="'.$result_name.'">');

$loop_code = substr($this->files[$file_id], $start_pos, $end_pos-$start_pos);

$start_tag = substr($this->files[$file_id], strpos(strtolower($this->files[$file_id]), '<loop name="'.$result_name.'">'),strlen('<loop name="'.$result_name.'">'));
$end_tag = substr($this->files[$file_id], strpos(strtolower($this->files[$file_id]), '</loop name="'.$result_name.'">'),strlen('</loop name="'.$result_name.'">'));

if($loop_code != ''){
$new_code = '';
$field_names = array();
for($i=0; $i<pg_numfields($$result_name); $i++) $field_names[] = pg_fieldname($$result_name,$i);
for($i=0; $i<pg_numrows($$result_name) AND $row_data = pg_fetch_array($$result_name, $i); $i++){
$temp_code = $loop_code;
for($j=0; $j<count($field_names); $j++){
$temp_code = str_replace($this->start.$field_names[$j].$this->end, $row_data[$field_names[$j]], $temp_code);
}
$new_code.= $temp_code;
}
$this->files[$file_id] = str_replace($start_tag.$loop_code.$end_tag, $new_code, $this->files[$file_id]);
}
}

/***************************************
** Function looking for if blocks
** added by Stephan L&#252;deritz
***************************************/
function parse_if($file_id, $array_name){

$var_names = explode(',', $array_name);

for($i=0; $i<count($var_names); $i++){
$if_code = '';
$start_pos = strpos(strtolower($this->files[$file_id]), '<if name="'.strtolower($var_names[$i]).'">') + strlen('<if name="'.strtolower($var_names[$i]).'">');
$end_pos = strpos(strtolower($this->files[$file_id]), '</if name="'.strtolower($var_names[$i]).'">');

$if_code = substr($this->files[$file_id], $start_pos, $end_pos-$start_pos);
$start_tag = substr($this->files[$file_id], strpos(strtolower($this->files[$file_id]), '<if name="'.strtolower($var_names[$i]).'">'),strlen('<if name="'.strtolower($var_names[$i]).'">'));
$end_tag = substr($this->files[$file_id], strpos(strtolower($this->files[$file_id]), '</if name="'.strtolower($var_names[$i]).'">'),strlen('</if name="'.strtolower($var_names[$i]).'">'));

$new_code = '';
if($if_code != ''){
global ${$var_names[$i]};
if(@${$var_names[$i]})
$new_code = $if_code;

$this->files[$file_id] = str_replace($start_tag.$if_code.$end_tag, $new_code, $this->files[$file_id]);
}
}
}

/***************************************
** Function for printing the resulting
** file(s).
***************************************/
function print_file($file_id){
if(is_long(strpos($file_id, ',')) == TRUE){
$file_id = explode(',', $file_id);
for(reset($file_id); $current = current($file_id); next($file_id)) echo $this->files[trim($current)];
}else{
echo $this->files[$file_id];
}
}

/***************************************
** Function for returning the resulting
** file(s).
***************************************/
function return_file($file_id){
$ret = '';
if(is_long(strpos($file_id, ',')) == TRUE){
$file_id = explode(',', $file_id);
for(reset($file_id); $current = current($file_id); next($file_id)) $ret .= $this->files[trim($current)];
}else{
$ret .= $this->files[$file_id];
}
return $ret;
}

/***************************************
** Parses and then immediately prints
** the file. This function added by
** Bruce Christensen.
***************************************/
function pprint($file_id, $replacements = ''){
$this->register($file_id, $replacements);
$this->parse($file_id);
$this->print_file($file_id);
}

/***************************************
** Parses and then immediately returns
** the file's contents. Function added
** by Bruce Christensen.
***************************************/
function pget($file_id, $replacements = ''){
$this->register($file_id, $replacements);
$this->parse($file_id);
return $this->return_file($file_id);
}

/***************************************
** Loads a file, parses it, and prints it.
** This function added by Bruce Christensen.
***************************************/
function pprint_file($filename, $replacements = ''){
for($file_id=1; isset($this->files[$file_id]); $file_id++);
$this->load_file($file_id, $filename);
$this->pprint($file_id, $replacements);
unset($this->files[$file_id]);
}

/***************************************
** Loads, parses and then immediately
** returns the file's contents.
** Function added by Bruce Christensen.
***************************************/
function pget_file($filename, $replacements = ''){
for($file_id=1; isset($this->files[$file_id]); $file_id++);
$this->load_file($file_id, $filename);
return $this->pget($file_id, $replacements);
}

} // End of class
?>
Автор: Cheery
Дата сообщения: 22.08.2004 02:24
SafeWay

Цитата:
Неплохой шаблонизатор оригинал от phpguru.org, немного переделан.

а не лучше бы было просто дать ссылку?
http://www.phpguru.org/static/template.html
немного переделан? только тут?

Цитата:
function load_file($file_id, $filename){$this->files[$file_id] = file_get_contents($filename);}

Автор: SafeWay
Дата сообщения: 22.08.2004 02:36
Cheery
я пробегался по всему классу, не помню что менял конкретно.
Автор: MAGISTRATE
Дата сообщения: 22.08.2004 08:18
Не вижу смысла юзать такие классы шаблонизации. Php для того и Php, он
легко встраивается в html. Поэтому иногда легче написать не сильно
напрягаясь


Код: <title><?=$title?></title>
<?=body?>
Автор: Church
Дата сообщения: 22.08.2004 16:03

Цитата:
Поэтому иногда легче написать не сильно
напрягаясь

Ключевое слово иногда. А если ты хочешь использовать несколько скинов? ПисАть отдельные скрипты с разными дизайнами? А если ты не знаешь PHP?
Я лично пришел к выводу, что в таких случаях лучше использовать шаблонизатор, который из
<title>{title}</title>
{body}
Делает
<title><?=$title?></title>
<?=body?>

А потом уже готовый PHP-код спокойно инклюдится... В итоге, самому не нужно писАть простые, но большие PHP-коды, а достаточно отредактировать обычный HTML и получить результат...
Например, кусок шаблона регистрации:

[IF_ERROR]
При регистрации были обнаружены следующие ошибки:<font color="#ab0000"><b><i>
[ERROR]
<li>{T_ERROR}
[/ERROR]
</i></b></font><p>
[/IF_ERROR]

Преобразовывается в:

<?php
if ($error){
?>
При регистрации были обнаружены следующие ошибки:<font color="#ab0000"><b><i>
<?php
foreach ($error as $k=>$v){
?>
<li><?php echo $er_array[$k]?>
<?php
}
?>
</i></b></font><p>
<?php
}
?>

Когда его полностью доделаю - обязательно выложу... Но тем, кто не знает такого варианта - думаю, что будет полезно про него узнать
Автор: MAGISTRATE
Дата сообщения: 22.08.2004 16:23
Все, что ты мне написал, решается легко, гораздо легче без классов.
Чайника, может запутать не меньше такое {title}, чем просто <?=$title?>.
Я, например, не всегда понимаю в бредовом коде эдакой шаблонизации.

Делай хоть 20, хоть тридцать скринов. Указываешь путь к этой папке со
скином и все. Не вижу препядствий. Итого, такая шаблонизация (что ты
привел), якобы нужна, чтобы отделить html от основного кода, это
сделано в моем примере гораздо легче, шаблонизация нужна для того,
чтобы сделать кучу скинов, не вижу препядствий,вставляй в конфиг
название шаблона, шаблонизация (приведенная тобой) будет тормозить, хоть и
не на много, работу скрипта.


Код:
[IF_ERROR]
При регистрации были обнаружены следующие ошибки:<font color="#ab0000"><b><i>
[ERROR]
<li>{T_ERROR}
[/ERROR]
</i></b></font><p>
[/IF_ERROR]
Автор: makarka2004
Дата сообщения: 27.08.2004 08:44
Помогите с ПХП нюком разобраться!
Автор: SafeWay
Дата сообщения: 27.08.2004 13:53
makarka2004
А сюда посмотреть: http://forum.ru-board.com/forum.cgi?action=filter&forum=24&filterby=topictitle&word=nuke ?
Автор: Church
Дата сообщения: 08.09.2004 12:49

Цитата:
шаблонизация (приведенная тобой) будет тормозить, хоть и
не на много, работу скрипта.


И чем она будет тормозить? Преобразование происходит НЕ в момент генерации страницы, а при редактировании шаблона... Отредактировал шаблон - сгенерировался PHP-код, который просто инклюдится....
Мне лично проще испольховать "чистый" PHP+HTML без шаблонов.... Но не все знают PHP....


Цитата:
if($error == 1) $content = 'Error';
if($error == 0) $content = 'Добро пожаловать на мою компагу';


И дизайн для каждого условия ты тоже будешь в $content совать? Ладно, если дизайн одинаковый... А если хочешь разный? Как ни крути, а PHP придется применять.... В отличии от моего варианта...

Страницы: 12345678910

Предыдущая тема: Perl: Полезные решения


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.