Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: batman, dodany: 18.06.2012 15:30, tagi: php

Kilka miesięcy temu ekipa odpowiedzialna za największe polskie forum dla programistów PHP, we współpracy z Microsoftem, zorganizowała konkurs Rockstar Programmer. W skrócie polegał on na stworzeniu aplikacji w języku PHP działającej w chmurze Windows Azure. Miałem ten zaszczyt i zasiadłem w jury, którego zadaniem miała być ocena nadesłanych prac.

Dzisiaj w końcu poznaliśmy laureatów, a dokładniej laureata. Oto oficjalny komunikat zamieszczony na forum.php.pl.

Na wstępie dziękuję w imieniu całego zespołu za zainteresowanie konkursem. W konkursie wzięło udział 120 uczestników.

Decyzja komisji w Kategorii Zaawansowanej: Ze wszystkich przesłanych prac wybraliśmy tylko jedną która wg naszej opinii była możliwa do oceny. I właśnie tę prace zdecydowaliśmy się wyróżnić nagrodą II stopnia czyli 5000 PLN. Jest to praca Michała Czerskiego, której projekt znajduje się pod adresem: http://piclastic.com/ Składam wyrazu szacunku oraz gratulacje dla Michała za jego dzieło!

Komisja jednocześnie podjęła decyzję o nie przyznaniu nagrody za I miejsce.

Decyzja komisji w Kategorii Podstawowej: Tutaj sami się zaskoczycie. Choć zasady były proste to jednak dostarczono jedną pracę, która była niepełna, autor nie odpowiedział na naszą prośbę oraz przysłana po czasie. Z tych powodów nie podlegała ocenie. NIe dostarczono ani jednej pracy i tym samym nikt nie wygrał konsol.

Pieniądze przeznaczone na nagrody zostały przekazane na dalsze konkursy.

Ja ze swojej strony pragnę podziękować uczestnikom za udział zaś Michałowi ponownie złożyć gratulacje.

Do zobaczenia na kolejnym może mniej wymagającym konkursie !

Dołączam się do gratulacji i życzę powodzenia w kolejnych konkursach!

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: Marek, dodany: 17.06.2012 22:20, tagi: zend_framework

zfBardzo często w różnych formularzach musiałem stosować taki schemat postępowania:

  • przy dodawaniu wszystkie pola formularza są dostępne do uzupełnienia
  • przy edycji część pól nie może być zmieniana, ale musi być wyświetlona
Zamiast dodawać atrybut disabled, wolę wyświetlać wartość danego pola jako zwykły tekst. W przypadku pól tekstowych nie ma najmniejszego problemu – wyświetlałem ich wartość, w przypadku selektorów używałem poniższego zapisu:
<?php $c = $this->form->category_id ?>
<?php echo $c->getMultiOption($c->getValue())?>

Dzisiaj przedstawię przykład tworzenia dekoratora formularza, który skróci powyższy zapis i umożliwi korzystanie z niego w wielu miejscach w  aplikacji.

<?php

/**
 * Dekorator wyświetla "treść" zaznaczonej opcji elementu
 * Jeśli element nie jest selektorem, wyświetlana jest wartość elementu,
 * w przypadku pól typu MultiSelect oraz MultiCheckbox,
 * zaznaczone elementy są łączone przy pomocy separatora
 * @author Marek Pietrzak
 */
class My_Decorator_Selected extends Zend_Form_Decorator_Abstract {

    protected $_format = '<span id="%s">%s</span>';

    /**
     * Wyświetlenie zaznaczonej opcji elementu
     * @param string $content
     * @return string
     */
    public function render($content) {
        $element = $this->getElement();
        $id = htmlentities($element->getId());
        $value = $element->getValue();
        if ($element instanceof Zend_Form_Element_Multi) {
            // dla obiektów MultiSelect i MultiCheckbox zaznaczone opcje są sklejane
            if (is_array($value)) {
                $separator = $this->getSeparator();
                $options = $element->getMultiOptions();
                $selectedValues = array_intersect_key($options, array_flip($value));
                $selected = implode($separator, array_map('htmlentities', $selectedValues));
            } else {
                // w przeciwym razie pobieramy zaznaczoną opcję
                $selected = htmlentities($element->getMultiOption($value));
            }
        } else {
            // domyślnie zwracana jest wartość obiektu
            $selected = $value;
        }

        return sprintf($this->_format, $id, $selected);
    }

}

Klasę nazwałem My_Decorator_Selected, a więc należy ją umieścić w pliku library/My/Decorator/Selected.php i nie zapomnieć o dodaniu do pliku application.ini:

autoloadernamespaces[] = "My_"

Klasa dziedziczy po Zend_Form_Decorator_Abstract, a więc musi implementować metodę render($content). Zmienna $_format przechowuje format w jakim zostanie wyświetlony wynik działania dekoratora. W metodzie render() pobieram dekorowany element, potem jego id i wartość. Następnie sprawdzam czy element dziedziczy po Zend_Form_Element_Multi (czyli jest selektorem, checkboxem lub polem typu radio). Jeśli nie – w wynikowym <span> będzie wyświetlona jego wartość. Jeśli tak, sprawdzam czy jego wartość jest tablicą. Gdy nie jest – pobieram wartość zaznaczonej opcji, w przeciwym przypadku pobieram separator i za jego pomocą sklejam wszystkie zaznaczone wartości.

Przykłady wywołania:

<pre>
<?php
$options = array('adin' => 'jeden', 'dwa' => 'dwa', 'tri' => 'trzy');

/* multiselektor */
$ms = new Zend_Form_Element_Multiselect('multiselektor');
$ms->addMultiOptions($options)
        ->addDecorator(new My_Decorator_Selected(array('separator' => PHP_EOL)))
        ->setValue(array('adin', 'tri'));
echo $ms->renderViewHelper() . PHP_EOL;
echo $ms->renderSelected();
echo PHP_EOL . '***************************' . PHP_EOL;

/* selektor */
$s = new Zend_Form_Element_Select('selektor');
$s->addMultiOptions($options)
        ->addDecorator(new My_Decorator_Selected())
        ->setValue(array('dwa'));
echo $s->renderViewHelper() . PHP_EOL;
echo $s->renderSelected();
echo PHP_EOL . '***************************' . PHP_EOL;

/* multi checkbox */
$c = new Zend_Form_Element_MultiCheckbox('checkbox');
$c->addMultiOptions($options)
        ->addDecorator(new My_Decorator_Selected(array('separator' => ', ')))
        ->setValue(array('adin', 'tri'));
echo $c->renderViewHelper() . PHP_EOL;
echo $c->renderSelected();
echo PHP_EOL . '***************************' . PHP_EOL;

/* radio */
$r = new Zend_Form_Element_Radio('radio');
$r->addMultiOptions($options)
        ->addDecorator(new My_Decorator_Selected())
        ->setValue(array('adin'));
echo $r->renderViewHelper() . PHP_EOL;
echo $r->renderSelected();
echo PHP_EOL . '***************************' . PHP_EOL;
?>
</pre>

Wynik: [przykład użycia renderSelected]

Autor wpisu: Śpiechu, dodany: 13.06.2012 21:41, tagi: internet

6 czerwca mieliśmy oficjalny dzień uruchomienia protokołu IP w wersji 6 — World IPv6 Launch. Przez 24 godziny ponad 1000 witryn internetowych działało na protokole IPv6. Było to pierwsze na masową skalę wykorzystanie nowego protokołu. Oczywiście całość była raczej symbolicznym wydarzeniem, niemniej wyznacza koniec pewnej epoki. Wobec kończącej się puli wolnych adresów IP całkowite przejście na IPv6 jest nieuniknione. Właściwie to pod koniec 2011 roku straszono, że już się skończyły…

Dzisiaj wziąłem na warsztat RFC 2460, Internet Protocol, Version 6 (IPv6) Specification, który opisuje IPv6. Wsparłem się literaturą z uwagi na bardzo hardcorowy żargon RFC. Żeby nie zanudzać wyciągnąłem co ciekawsze rzeczy. Czytać i błyszczeć wśród geeków:

  • przez jakiś czas nie zabraknie nam adresów IP; zamiast trochę ponad 4 miliardy będziemy mieli do dyspozycji 340,282,366,920,938,463,463,374,607,431,768,211,456 adresów IP,
  • podstawowy nagłówek IPv6 liczy sobie 40 bajtów, z których 32 bajty stanowią dwa 128 bitowe adresy nadawcy i odbiorcy; w IPv4 nagłówek „bez dodatków” to 20 bajtów,
  • tylko pole Version działa i nazywa się tak samo jak w IPv4,
  • nie ma pola Header Checksum zawierającego sumę kontrolną nagłówka IP (w obecnych czasach światłowodów przekłamania bitowe zdarzają się dosyć rzadko, a odpowiedzialność za integralność danych i tak pilnują sobie protokoły wyższych poziomów, np. TCP ma własny checksum),
  • pole Time-To-Live w IPv4 pierwotnie było zaprojektowane do przechowywania liczby sekund pozostałego „życia” datagramu1, jednakże szybko z tego zrezygnowano na korzyść przeskoków pomiędzy routerami; polu ostatecznie zmieniono nazwę na Hop Limit w IPv6,
  • 20 bitowy Flow Label zapewni znaczną „ulgę” routerom: dla pierwszego pakietu strumienia zostaje wytyczona trasa, a suma kontrolna tej trasy zostaje zapisana do pola i cache routera, dzięki czemu pozostałe pakiety oznaczone tak samo mogą wędrować tą samą trasą bez potrzeby każdorazowego wyznaczania drogi; inna możliwość wykorzystania pola to gwarantowanie prędkości transferu, tzn. jedne pakiety mogą mieć pierwszeństwo przed innymi2,
  • pole Options z IPv4 zostało zamienione na łańcuch Extension Headers o określonej kolejności,
  • maksymalna wielkość przenoszonych danych to 4 GB (tzw. Jumbogram).
  1. Kevin R. Fall, W. Richard Stevens : TCP/IP Illustrated, Volume 1 : The Protocols. — 2 ed. Upper Saddle River, NJ (i in.), 2011, s. 185
  2. L. Dostálek, A. Kabelová : Understanding TCP/IP : A clear and comprehensive guide to TCP/IP protocols. Birmingham ; Mumbai, 2006, s. 215

Autor wpisu: Marek, dodany: 11.06.2012 19:28, tagi: zend_framework

zfW celu uniknięcia powtarzania pewnych fragmentów kodu w widokach używamy view helper’ów. W Zend Framework jest to banalnie proste. Przedstawię tutaj zupełne podstawy tworzenia pomocników widoku na prostym przykładzie, który będzie zwracał kwotę brutto.

Na początek tworzymy w katalogu library ścieżkę: My/View/Helper/ i umieszczamy w niej nowy plik Brutto.php

Żeby plik był widoczny w aplikacji, dodajemy do application.ini:

resources.view.helperPath.My_View_Helper = "My/View/Helper"

 Poniżej kod pliku pomocnika Brutto.php:

<?php
/**
 * Pomocnik widoku - kwota brutto
 * @package helpers
 */

/**
 * Klasa pomocnika widoku Brutto
 * Służy do przeliczania kwoty z netto na brutto
 * @package helpers
 */
class My_View_Helper_Brutto extends Zend_View_Helper_Abstract {

    /**
     * Zwraca wartość kwoty brutto
     * @param double $netto wartość netto
     * @param int    $vat wartość vat
     * @return double
     */
    public function brutto($netto, $vat = 23){
        return sprintf("%.2f", $netto + $netto * $vat / 100);
    }
}

Kilka szczegółów:

  • klasa My_View_Helper_Brutto musi dziedziczyć po Zend_View_Helper_Abstract
  • klasa musi posiadać przynajmniej jedną metodę, która nazywa się tak jak plik Brutto.php (z tym, że nazwę rozpoczynamy małą literą) – brutto()
  • w widoku odwołujemy się do metody helpera poprzez zmienną $this

Wywołanie helpera – w widoku:

<?php echo $this->brutto($netto, $vat); ?>

I to na tyle. Więcej szczegółów w manualu: http://framework.zend.com/manual/en/zend.view.helpers.html

Autor wpisu: matipl, dodany: 04.06.2012 21:06, tagi: php

PHPCon Poland - logoCzas pędzi, jak rakieta. Może kiedyś się zbiorę i opiszę co takiego działo się od listopada 2011, tymczasem…

Miło jest mi poinformować, że rozpoczął się nabór propozycji prelekcji na kolejną już edycję   PHPCon Poland. Ale to nie wszystko. W tym roku organizatorzy biorą urlop ;) i prelekcje wybierać będziecie Wy (precyzując – osoby zarejestrowane w serwisie PHPCon).

Na propozycje prelekcji czekamy do 20 czerwca, później zapraszamy do głosowania.

Kiedy PHPCon? W tym roku konferencja odbędzie się w dniach 28-30 września (piątek-niedziela), jak poprzednio w Mąchocicach Kapitulnych koło Kielc.

Autor wpisu: bastard13, dodany: 04.06.2012 13:12, tagi: oop

bo trzeba być oryginalnym

Często spotykam się z sytuacją, że programista za wszelką cenę stara się wyeliminować wszystkie powtórzenia w swoim kodzie. Dlaczego? Ponieważ uważa, że duplikacja kodu to czyste zło i każda linijka kodu powinna być unikalna. Tylko czy takie przeświadczenie jest słuszne? Nie. Czytaj więcej »

Autor wpisu: bastard13, dodany: 01.06.2012 10:36, tagi: oop

to już koniec

Po kilku miesiącach w końcu udało mi się wczoraj opublikować ostatni wpis z tej serii:)Czytaj więcej »
Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.