Szivattyú: PHP 5.2 – parse_ini_string

Nagyjából egy órája szívok a parse_ini_string() miatt. Ugyanis nem ugyanazt a működést produkálja PHP5.2 és PHP5.3 alatt.

A megoldás amit most hirtelenjében kitaláltam: fogod a parzolni vágyott stringet, lerakod egy átmeneti állományba, aztán a parse_ini_file() segítségével visszaolvasod.

if (version_compare(phpversion(), '5.3.0', '>=')) {
	$ini = parse_ini_string($iniString, true, INI_SCANNER_RAW);
} else {
	$tmpFile = '/tmp/ini.ini';
	file_put_contents($tmpFile, $iniString);
	$ini = parse_ini_file($tmpFile, true);
	unlink($tmpFile);
}

Safari és a #:#BmwP#:#charset szabály

Akkor a mai napon egy életre megtanultam, hogy a Safari nem ismeri/nem érti a CSS #:#BmwP#:#charset szabályt. Ezzel a szabállyal értelmezési hibába fut bele, emiatt a következő szabályok értelmezésével is problémák lesznek.

Először csak az tűnt fel, hogy az #:#BmwP#:#import-al behúzott további CSS-ek egyszerűen nem érvényesülnek az oldalon, de a barátom volt, és egy 2008 márciusi fórum téma rávilágított, hogy Webkit hiányosságáról.

Drupal submit gombok cseréje

Elég sokszor belefutottam már Drupal smink készítésekor, hogy az űrlapok elküldésére szolgáló “Beküldés” gombot is formázni kell. Az legegyszerűbb eset, amikor egyszerű színezésről van szó. Ha fix szélességű gombokkat szeretnénk látni, akkor egy háttérkép beállításával bármilyen bonyolult formázás “megvalósítható”. Viszont most változó szélességű gombok szerepelnek a tervben, lekerekített szélekkel.

Persze megint elkezdtem egyenként felülírni az űrlapokat, amit kissé körülményesnek éreztem. És, mivel, az oldalon szereplő minden gombot így kell formázni, kicsit jobban megvizsgáltam a kódot, és felfedeztem, hogy megváltoztatható az alapértelmezett működés. A smink template.php végére írtam a következőt:

function phptemplate_button( $element ) {
	// Make sure not to overwrite classes.
	if ( isset( $element[ '#attributes' ][ 'class' ] ) ) {
		$element[ '#attributes' ][ 'class' ] =
			'form-'.$element[ '#button_type' ].' '.
			$element[ '#attributes' ][ 'class' ];
	}
	else {
		$element[ '#attributes' ][ 'class' ] =
			'form-'.$element['#button_type' ];
	}

	$name = ( empty( $element[ '#name' ] ) ? '' : 'name="'. $element[ '#name' ] .'" ' );
	$value = check_plain( $element[ '#value'] );
	$attribs = drupal_attributes( $element[ '#attributes' ] );

	return
		'<button type="submit" value="'.$value.'">'.
		'<span>'.$element[ '#value' ].'</span></button>';
}

Extra CSS classok beállítása WordPress widgetekre

Többször is felmerült már, egy-egy WordPress sablon fejlesztésekor, hogy a widget-eket, a sidebar regisztrálásakor megadott CSS osztályok mellet, további osztályokkal is felruházzam. Jó lett volna megjelölni pl. az elsőt, az utolsót, vagy minden másodikat, harmadikat. A legutolsó munkámnál egyszerűen nem találtam kerülő megoldást, elengedhetetlenné vált ennek a megvalósítása.

A WP widgetekért felelős kódjait végigbogarászva bukkantam a dynamic_sidebar_params filter tag-ra. Ezen a ponton lehet a widget-ek által is megkapott paramétereken szűrő függvényeket futtatni. Lássuk a kódot:

<?php
function widget_param_filter( $params ) {
    $id = $params[0]['id'];
    static $counter;
    static $counts;
    if ( is_null( $counter ) ) {
        $counter = array();
    }
    if ( is_null( $counts ) ) {
        $counts = array();
        $sidebars_widgets = wp_get_sidebars_widgets();
        foreach ( $sidebars_widgets as $sidebar_id => $widgets ) {
            $counts[ $sidebar_id ] = count( $widgets );
        }
    }
    if ( !isset( $counter[ $id ] ) ) {
        $counter[ $id ] = 0;
    }
    $count = $counter[ $id ];
    $class = array();
    $m = array();
    $alowedQuotes = "['\"]";
    if ( preg_match( '/\sclass=('.$alowedQuotes.')(?P<class>.*?)\\1/', $params[0]['before_widget'], $m ) ) {
        $class = array( $m['class'] );
    }
    if ( $count == 0 ) {
        $class[] = 'first';
    }
    if ( $count + 1 == $counts[ $id ] ) {
        $class[] = 'last';
    }
    $class[] = ( $count % 2 ) ? 'odd' : 'even';
    switch ( $count % 3 ) {
        case '0' : $class[] = 'one-thirds'; break;
        case '1' : $class[] = 'two-thirds'; break;
        case '2' : $class[] = 'three-thirds'; break;
    }
    switch ( $count % 4 ) {
        case '0' : $class[] = 'one-fourth'; break;
        case '1' : $class[] = 'two-fourth'; break;
        case '2' : $class[] = 'three-fourth'; break;
        case '3' : $class[] = 'four-fourth'; break;
    }
    if ( count( $m['class'] ) &gt; 0 ) {
        $params[0]['before_widget'] = preg_replace( '/\sclass=('.$alowedQuotes.').*?\\1/', '', $params[0]['before_widget'], 1 );
    }
    elseif ( preg_match( '/< \w+/', $params[0]['before_widget'] ) ) {
        $params[0]['before_widget'] = preg_replace( '/<(\w)+/', '<$1', $params[0]['before_widget'], 1 );
    }
    else {
        $params[0]['before_widget'] = '<div>';
        $params[0]['after_widget'] .= '';
    }
    $counter[ $id ]++;
    return $params;
}
add_filter( 'dynamic_sidebar_params', 'widget_param_filter' );

A két static változót használjuk számolásra. A függvény első hívásakor állítódik be a $counter változó értéke, mely egy, a regisztrált oldalsávokban található elemek számát tartalmazzó tömb. A $counts is egy tömb, melyben azt tartjuk nyílván, hogy adott oldalsávban éppen hanyadik widget-et bővítjük.

Ezután kinyerjük az eddig beállított osztályokat, és elkezdjük összeszedni a sorban elfoglalt hely szerintieket. Ha az aktuáls számláló nulla, akkor ez az első, ha egyel kisebb mint az elemek száma akkor ez az utolsó. Ha a számláló értéke osztható kettővel akkor páros (odd), ha nem akkor páratlan (even). Még megállapítja hanyadik harmad, és hanyadik negyednél jár.

Utolsó lépésben lecseréljük az eddigi osztályokat az összeszedettre. Ha nincs beállítva semmilyen osztály, akkor a legkülső HTML tag kapja meg mint új attributumot. Ha a határoló kód üres, akkor beállítunk egy div elemet az előbb összeszedett osztályokkal (és egyúttal a zárót is bővítjük, az előbbi div záró felével).

Ezt a kódot a használt téma functions.php állományába kell elhelyezni

A mai nap tanulsága

De a törpök webfejlesztők élete nem csak játék és mese. Hallottál már a gonoszról, a csúf kopasz Hókuszpókról kivénhedt, minden szempontból túlhaladott, vénséges vén Internet Explorer 6-ról?

Ma délután egy életre megtanultam: Ha IE6-ban nem jelenik meg a Thickbox által megjelenített kép, akkor nagy valószínűséggel a body tagra be van állítva a position: relative; szabály. Kivéve/hatástalanítva egyből szép lesz minden.