Gå til innhold

Lageret - Tråden hvor forslag til gjenbrukbar PHP-kode legges


Anbefalte innlegg

Jeg har dessverre ikke noen kode jeg sitter på rettighetene til å legge ut her, og som er av en kvalitet jeg føler hører hjemme i dette forumet (mesteparten av det jeg koder om dagen som kunne ha blitt lagt ut er "closed source", og en del av de eldre scriptene mine har begynt å falme etterhvert som jeg får litt mer innsikt i programmering).

 

Mulig jeg skriver en litt bedre variant av CSS-cache-scriptet mitt som eventuelt blir lagt ut her etterhvert. :)

Lenke til kommentar
Videoannonse
Annonse

@PHP_Yoghurt: Det cachescriptet vi bruker på Russ.no er en videreutvikling av scriptet som ligger i den gamle kodetråden i PHP-forumet. Det scriptet gjør er i hovedsak å tolke CSS'en og skrive den ut med færrest mulige tegn, i tillegg til å komprimeres med gzip. Deretter lagres den ferdige gzippede filen enten i filsystemet eller i memcache for å kunne hentes raskt ut igjen. En live versjon kan du se på http://filer.russ.no/static/lib/css/main/.

Endret av Lokaltog
Lenke til kommentar
@PHP_Yoghurt: Det cachescriptet vi bruker på Russ.no er en videreutvikling av scriptet som ligger i den gamle kodetråden i PHP-forumet. Det scriptet gjør er i hovedsak å tolke CSS'en og skrive den ut med færrest mulige tegn, i tillegg til å komprimeres med gzip. Deretter lagres den ferdige gzippede filen enten i filsystemet eller i memcache for å kunne hentes raskt ut igjen. En live versjon kan du se på http://filer.russ.no/static/lib/css/main/.

 

Så du bruker et php-script til å få css'koden på en linje?

Lenke til kommentar

Det kalles aa minify-e paa godt norsk.

http://en.wikipedia.org/wiki/Minify

 

PHP_Yoghurt : Han concatinater sannsynligvis ogsaa flere filer sammen. Det gj0r hvertfall JS/CSS-kompressoren jeg har skrevet til rammeverket vi bruker paa jobben. ( Som ikke blir BSD-lisensiert f0r om et par maaneder, saa jeg kan heller ikke legge det ut her. )

Endret av JohndoeMAKT
Lenke til kommentar

Tror fortsatt jeg kan stå inne for denne posten fra den gamle tråden, selv om den egentlig ble skrevet for PHP4:

 

Skrev en enkel, men nyttig funksjon idag. Tenkte jeg kunne poste den her, og høre om noen river ut håret og ser noen kritiske feil.

Mistenker at indenten kommer til å se #¤%& ut, men men

function listDir($dir, $filter_func) {
$ret = array();
if(function_exists($filter_func) && is_callable($filter_func)) {
	if(is_dir($dir)) {
		if(is_readable($dir)) {
			$curr_dir = getcwd();

			// undocumented notice on error?
			if(@chdir($dir)) {
				if($fp = opendir('.')) {
					while(false !== ($file = readdir($fp))) {
						if($file != '.' && $file != '..') {
							if(call_user_func($filter_func, $file))
								$ret[] = $file;
						}
					}
					closedir($fp);
				}
				chdir($curr_dir);
			}
		}
	}
}
return $ret;
}

 

Kort og godt lister funksjonen filene i mappen basert på en annen definert funksjon.

Merk at den hopper over "." og "..", selv om disse er mapper.

F.eks.

$file_list = listDir('.', 'is_file'); // lister alle filer i denne mappen

$dir_list = listDir('.', 'is_dir'); // lister alle mapper i denne mappen, bortsett fra . og ..

 

Fungerer også (regner jeg med) for egendefinerte funksjoner som returnerer TRUE/FALSE basert på ett argument.

eks. (Delvis pseudo-kode)

function is_image($img) {
if(er_bilde) return true;
else return false;
}

$img_list = listDir('.', 'is_image');

Endret av Peter
Lenke til kommentar
Hvorfor bruker du chdir?

Det er et godt spørsmål som jeg ikke husker i farten. Denne koden ble skrevet for rimelig lenge siden. (PHP5 var fortsatt ganske nytt) Muligens det hadde noe med callback-funksjonene å gjøre, men sannelig om jeg vet. Skulle jeg ha skrevet den idag ville jeg skrevet den for PHP5 only, og med f.eks. glob().

Lenke til kommentar
  • 3 uker senere...

Kjedelig å se det postes så lite i denne tråden, så jeg tar på meg ansvaret med å vekke denne tråden til live igjen :p

 

For et års tid siden lagde jeg en liten kjapp fil-visnings-greie. Ideéen er veldig simpel: Jeg angir hvilke filtyper som er tillatt å liste opp, og så genererer koden min en tre-visnings-sak i venstre del av skjermen, mens valgt fil vises på høyre side.

 

Grunnen til at jeg lagde saken var rett og slett at jeg var svært misfornøyd med en filebrowser jeg lastet ned fra nettet.

Scriptet er tilgjengelig på http://qualbeen.net/skole/?file=11 og hvis noen syns det er brukendes, så er det fritt frem til å bruke det, videreutvikle m.m... Fint om jeg blir gjort oppmerksom på eventuelle bug og/eller bugfix :-)

 

NB: jeg var ikke kjempekjent med PHP da dette scriptet ble skrevet, så det er nok veldig mulig det kan optimaliseres og kodes langt penere. Jeg vet allerede at hvis man prøver å gå til en fil litt nede i hiearkiet med tom session, så kræsjer scriptet..

 

EDIT: Gjorde nettopp en hurtig liten fix: Ikke lenger mulig å oppgi parent-dir som parameter, mao ikke lenger mulig å bla seg ovenfor den katalogen scriptet ligger i. Merkelig at jeg ikke har sett den feilen tidligere, men men..

Endret av qualbeen
Lenke til kommentar
  • 4 uker senere...

Et lite bidrag før pinnekjøttet skal fortæres:

 

Har brukt en del tid på å skrive en skikkelig IMAP-wrapper som kan hente vedlegg. Snutten under brukes i CakePHP, men bør være brukbar så lenge du har PHP5.

 

Disse metodene bruker et modifisert MIME-bibliotek fra en gammel versjon av Horde. Jeg fant disse i Eventum, MySQL sitt feilhåndteringssystem. De nye versjonene av Horde har gjort om på biblioteket og gjort det avhengig av en del fellesklasser. Uansett fungerer dette bra (ingen grunn til å endre kode som funker).

 

De to filene må du hente hos MySQL:

 

http://dev.mysql.com/downloads/other/eventum/

 

Du trenger filen som heter class.mime_helper.php og mime_decode.php. Sistnevnte ligger i mappen Mail/. Jeg kopierte disse til samme katalog og tilpasset include-setningen i mime_helper.php.

 

Først må du opprette en tilkobling til en IMAP-innboks (det er også mulig å bruke POP) med PHP sin standard IMAP-klasse:

 

// Koble til
$mbox = imap_open($args, $user, $pass) or die ("fail");

// Hent antall meldinger
$num = imap_num_msg($mbox);

 

(Forutsetter at vi skal hente ut alle meldingene)

 

while($num > 0) {

// Hent meldinger
$body = imap_body($mbox, $num);
$header_struct = imap_headerinfo($mbox, $num);

// Sett sammen meldingen

// Nå kan du hente ut verdier fra headeren om du er interessert i å lage dette, dette er godt dokumentert i PHP-manualen

//Her henter vi ut senderens navn og sender gjennom en av metodene i MIME-biblioteket som automagisk returnerer rett encoding uansett hva som sendes inn

$mails['Mail']['from'] = Mime_Helper::fixEncoding($header2->from[0]->personal);

//Her er det også en seksjon som behandler flere felter og setter disse inn i databasen, dette er utelatt.

//Så behandler vi vedleggene. Denne metoden returnerer et array med alle vedleggene.

$attachments_uprep = Mime_Helper::getAttachments($body);

//Så kan vi kjøre dette arrayet gjennom en løkke for å formatere det for innsetting. Jeg har gjort dette gjennom en egen funksjon, men her er det vist gjennom en enkel foreach-løkke.
$value = 0;
foreach($attachments_uprep as $att):
$attachment[$value]['File']['name'] = $att['filename'];
  $attachment[$value]['File']['size'] = strlen($att['blob']);
  $attachment[$value]['File']['data'] = $att['blob'];
  $attachment[$value]['File']['checksum'] = md5($att['blob']);	  
  $attachment[$value]['File']['type'] = $att['filetype'];
  $attachment[$value]['File']['mails_id'] = $this->Mail->id;
  $attachment[$value]['File']['erimportert'] = "FALSE";
$value++;
enforeach;

Du har nå et array med filer som er klart til å settes inn i en hvilken som helst database.

 

God jul!

Endret av mathias123
Lenke til kommentar
  • 2 uker senere...

I håp om at jeg ikke blir drept (igjen:)) så legger jeg ut et lite index script som jeg bruker.

Kan jo nevnes at jeg brukte dette scriptet til å prøve ut klasser, så være snill på det feltet.

 

index_config.php

Klikk for å se/fjerne innholdet nedenfor

<?php
//Config klasse
class config {
var $img_size;
var $img_dir;
var $img_file;
var $img_link;
var $ignore;

function values() {
	$this->img_size = '16px';
	$this->img_dir = '<img src="/index/dir.png" alt="Dir" style="width: '.$this->img_size.'; height: '.$this->img_size.'; border: 0px;">';
	$this->img_file = '<img src="/index/file.png" alt="File" style="width: '.$this->img_size.'; height: '.$this->img_size.'; border: 0px;">';
	$this->img_link = '<img src="/index/link.png" alt="Link" style="width: '.$this->img_size.'; height: '.$this->img_size.'; border: 0px;">';
	$this->ignore = array(
	'index.php',
	'index_config.php',
	'index',
	'phpmyadmin',
	'apache2-default'
	);
}
function list_files($hide=false) {
	$this->values();
	$no = $this->ignore;
	$img_dir = $this->img_dir;
	$img_link = $this->img_link;
	$img_file = $this->img_file;
	$img_size = $this->img_size;

	if($hide != false) {
		if(!is_array($hide)) {
			array_push($no,$hide);
		} elseif(is_array($hide)) {
			foreach($hide as $entry) {
				array_push($no,$entry);
			}
		}
	}

	$folder = './';
	$scan = scandir($folder);
	sort($scan);
	$b = 0;
	for($i = 2; $i < count($scan); $i++) {
		$file = $scan[$i];
		if(is_dir($file) && !in_array($file, $no)) {
			echo '<p class="dir"><a class="dir" href="'.$folder.$file.'">'.$img_dir.$file."</a></p>\n";
		}
	}
	unset($i);
	for($i = 2; $i < count($scan); $i++) {
		$file = $scan[$i];
		if(is_link($file) && !in_array($file, $no)) {
		echo '<p class="link">'.$img_link.'<a class="link" href="'.$folder.$file.'">'.$file."</a></p>\n";
		} elseif(is_file($file) && !in_array($file, $no)) {
			echo '<p class="file">'.$img_file.'<a class="file" href="'.$folder.$file.'">'.$file."</a></p>\n";
		}
	}
}
}

function dir_list($hide=false) {
$conf = new config();
return $conf->list_files($hide);	
}

$stil = '/index/stil.css'; //CSS fil


?>

 

index.php (gjelder i alle mappene, bare å endre filbanen til index_config.php)

Klikk for å se/fjerne innholdet nedenfor

<?php
if(@!include('index_config.php'))
die('Fant ikke config filer!');
?>
<html>
<head>
<link rel="stylesheet" href="<?php echo $stil; ?>">
<title>Index</title>
</head>
<body>
<?php
$ignore = array ('secret_porn_folder','hot_stuff'); //Array eller string
dir_list($ignore);
?>
</body>
</html>

 

stil.css

Klikk for å se/fjerne innholdet nedenfor

body {
font-family: Verdana;
}

a.dir {
color: #555555;
}

a.link {
color: #000000;
font-style: italic;
}

a.file {
color: #000000;
}

p {
margin-top: 2px;
margin-bottom: 2px;
}

a.se {
color: #FF0000;
}

 

også har jeg brukt (Fra tango)

dir.png

file.png

link.png

i listinga

 

Er fremdeles under utvikling, litt og litt

 

Brukes her:

http://alexander.no-ip.org/

Endret av AlecTBM
Lenke til kommentar
  • 2 uker senere...
  • 4 måneder senere...
  • 4 uker senere...

Hei!

 

Jeg vet at dette prosjektet ikke er helt oversiktlig da det er lenge siden jeg har jobbet med dette scriptet. Så da benytter jeg anledningen nå til å dele det med dere for at de som interesserte kan ta seg en titt og evt komme med forbedringer. =) Jeg ser at det er forferdelig behov for bedre strutur i koden.. :)

 

 

Emil

uploadscript.zip

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...