Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM    Subskrybuj kanał ATOM dla tagu zend_framework Kanał ATOM (tag: zend_framework)

Autor wpisu: singles, dodany: 11.10.2011 22:15, tagi: php, zend_framework

Jednym z najbardziej znanych komponentów ZendFramework’a jest Zend_Form. Na temat tego komponentu powiedziano wiele dobrego i złego, a opanowanie go nie należy do rzeczy stosunkowo łatwych. Dekoratory, filtry, validatory – sporo rzeczy do nauki. Dzisiaj chciałbym jednak skupić się na problemie dość często spotykanym i jego rozwiązaniu. Mianowicie chodzi o sprawdzenie, czy dana wartość jest większa od zadanej, ale w momencie, kiedy nie jest ona liczbą całkowitą.

Przykład

Przypuścmy, ze mamy formularz, w którym musimy zdefiniować cenę przedmiotu, ale nie może ona być niższa niż 0,90zł. Kod realizujący to zadanie z wykorzystaniem Zend_Form mógłby wyglądać następująco:

$form = new Zend_Form();
$element = new Zend_Form_Element_Text('val');
$element->addValidator(new Zend_Validate_GreaterThan(array('min' => 0.90)));
$form->addElement($element);
 
//input values
$data = array('val' => "0,93");
 
var_dump($form->isValid($data)); // false

Dlaczego dane nie zostały uznane za prawidłowe? Z prostego powodu – w Polsce cześć ułamkową zapisujemy po przecinku, a nie po kropce. Podczas porównania PHP zamienia ciąg tekstowy na liczbę, co w wyniku prowadzi do porównania 0 z 0,90.

echo (float)'0,'93'; //gives 0

Rozwiązanie

Rozwiązaniem tego problemu, jest zmiana wartości zlokalizowanej na znormalizowaną. Dokonać tego możemy automatycznie za pomocą mechanizmu filtrów, gdyż są one stosowane przed walidacją. Musimy dopilnować, żeby przed walidacją wartość 0,90 wyglądała tak: 0.90. Rozwiązaniem będzie zastosowanie filtra przeznaczonego specjalnie dla tego celu, mianowicie: Zend_Filter_LocalizedToNormalized (patrz dokumentacja). Automatycznie rozpoznaje on używane locale i zwraca znormalizowaną wartość. Poprzedni przykład, tym razem działający:

$form = new Zend_Form();
$element = new Zend_Form_Element_Text('val');
$element->addValidator(new Zend_Validate_GreaterThan(array('min' => 0.90)));
$element->addFilter(new Zend_Filter_LocalizedToNormalized()); // !
$form->addElement($element);
 
//input values
$data = array('val' => "0,92");
 
var_dump($form->isValid($data)); //true

Uwagi

Warto rozważyć także używanie filtra odwrotnego Zend_Filter_NormalizedToLocalized w momencie wyświetlania danych w formularzu. Warto zwrócić uwagę na fakt, że filtrów i walidatorów używać można także bez formularza – ww. filtr przydać może się przy zapisywaniu danych w DB.

Autor wpisu: widmogrod, dodany: 30.09.2011 22:42, tagi: php, zend_framework

Już w najbliższy czwartek 6 października o godzinie 18:30 odbędzie się w Albotak KrakSpot TECH #6.

Jest to o tyle ciekawe wydarzenie gdyż będę miał przyjemność poprowadzenia już po raz drugi prezentację na KrakSpot TECH. Temat mojej 15 minutowej prezentacji będzie związaną z nadchodzącą odsłoną Zend Framework 2.

Zapraszam wszystkich programistów PHP tworzących swoje aplikacje w ZF będzie dużo fajnych informacji i będzie konkurs z fajnymi mini nagrodami :)

UPDATE: Niestety KrakSpotTECH został odwołany… ale już wiem, że na zaprezentuję informację o ZF2 na nowej konferencji organizowanej w Krakowie! bądźcie czujni! :)

Autor wpisu: singles, dodany: 09.08.2011 20:26, tagi: php, zend_framework

W dzisiejszym odcinku cyklu ZendFramework Quick Tip zajmiemy się wyjaśnieniem fenomenu parametrów, które „biorą się znikąd” podczas korzystania z helpera url.

Wprowadzenie

Jak większość frameworków, ZF udostępnia helpery pomocnicze dla widoków. Jednym z takich helperów jest Zend_View_Helper_Url, który służy do tworzenia adresu URL w ramach naszej aplikacji na bazie przekazanych parametrów. Warto z niego korzystać, ponieważ rozwiązuje problem prawidłowej ścieżki bazowej, kiedy nie używamy vhostów i nasza aplikacja umieszczona jest np. w katalogu http://example.com/some/folder/public/ Przykładowe wywołanie:

<?php
 
// application/views/scripts/foo.phtml
$this->url(array('controller' => 'foo', 'action' => 'bar', 'additional_param' => 123));
 
?>

wygeneruje adres: http://example.com/foo/bar/additional_param/123/

Jednakże, kiedy z poziomu www. strony spróbujemy wygenerować inny adres, np. tylko do kontrolera odpowiedzialnego za zarządzanie użytkownikami:

<?php
$this->url(array('controller' => 'users'))
?>

zamiast adresu http://example.com/users otrzymamy http://example.com/users/bar/additional_param/123/

Ale dlaczego?

Otóż to, aby zrozumieć działanie wystarczy spojrzeć na implementację helpera:

class Zend_View_Helper_Url extends Zend_View_Helper_Abstract
{
    public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true)
    {
        $router = Zend_Controller_Front::getInstance()->getRouter();
        return $router->assemble($urlOptions, $name, $reset, $encode);
    }
}

Pomijając pobieranie obiektu routera z kosmosu, najważniejsze są dla nas parametry, a konkretniej trzeci z nich: $reset. Odpowiada on za zresetowanie obecnie ustawionych parametrów ścieżki. Jak widać, jego domyślną wartością jest false – i to jest powód, dla którego w przedstawionym wcześniej przykładzie otrzymaliśmy dodatkowe parametry.

Rozwiązanie

Jak łatwo się domyślić, rozwiązanie jest bardzo proste – wywołanie powinno wyglądać tak:

$this->url(array('controller' => 'users'), null, true);

Oczywiście, pisanie wielu takich wywołań może być dla niektórych niewygodne. Dlatego możemy albo napisać własny helper, gdzie domyślnie ustawimy parametr na true.

Innym rozwiązaniem może być stworzenie helpera Zend_View_Helper_Url i umieszczenie go w pliku APPLICATION_PATH . /views/helpers/Url.php:

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

Autor wpisu: singles, dodany: 04.08.2011 19:28, tagi: internet, php, zend_framework, apache

Obecnie, aby odpalić jakąkolwiek aplikację WWW napisaną w PHP potrzebujemy serwera WWW. Może być to Apache czy też nginx. Jednakże, czasami chcielibyśmy skorzystać z czegoś lekkiego, bez ogromnych możliwości konfiguracyjnych jakie oferują nam produkcyjne serwery WWW. M.in właśnie dlatego w przypadku Django czy też RubyOnRails wykorzystywane są serwery deweloperskie, dzięki którym bardzo szybko można „postawić” lokalnie działającą aplikację.

PHP w wersji 5.4 ma posiadać wbudowany serwer developerski, ale dzięki temu że z sieci można pobrać i samodzielnie skompilować wersję alpha2, nie omieszkałem tego uczynić i na własnej skórze przetestować to rozwiązanie. Poniżej przedstawiam wyniki mojego małego R&D.

Instalacja

Procedurę instalacji przedstawię na przykładzie systemów POSIXowych.

Najpierw pobieramy archiwum z PHP w wersji alpha2. Następnie rozpakowujemy je, przechodzimy do wypakowanego folderu i kompilujemy. Krótki przewodnik jak skompilować PHP znajdziecie na Wikibooks. Od siebie dodam, że w tym wypadku nie zależy nam na dodatkowej kompilacji PHP jako modułu Apache’a, skoro plik wykonywalny PHP sam sobie będzie serwerem :)

Dodatkowo, domyślnie używam PHP 5.3.6, a wykonując make install ryzykowałem trochę namieszania w systemie, tak więc pominąłem ten krok. Jeśli nie będziecie używać żadnych bibliotek PEARa wystarczy Wam gotowy skompilowany plik, który znajdziecie w katalogu sapi/cli.

Dla upewnienia znajdując się w ww. katalogu wydajemy polecenie: ./php -v aby upewnić się co do wersji interpretera.

Uruchomienie

Aby uruchomić najprostszy skrypt, w dowolnym(!) miejscu systemu plików tworzymy katalog, gdzie znajdzie się nasza aplikacja, a tam tworzymy prosty plik index.php, powiedzmy z taką zawartością:

<?php
 
$action = filter_input(INPUT_GET, 'action', FILTER_SANITIZE_STRING);
 
switch ($action) {
    case 'foo':
        echo 'Foo action';
        break;
    case 'bar':
        echo 'Bar action';
        break;
    default:
        echo 'Main action';
}
?>

Następnie kopiujemy skompilowany wcześniej plik wykonywalny PHP do utworzonego właśnie katalogu. Można oczywiście podlinkować go i używać globalnie w całym systemie, ale jak pisałem, w moim przypadku nie chciałem namieszać.

Serwer odpalamy poprzez wydanie komendy:

Penny:public singles$ ./php -S localhost:1234

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

Autor wpisu: Diabl0, dodany: 29.06.2011 15:37, tagi: mysql, php, sql, zend_framework

Od jakiegoś czasu borykałem się z problemem dlaczego czasami zapisywane do bazy danych zserializowane dane są „obcinane. Poszukiwania, googlanie niewiele pomagało aż a końcu trafiłem gdzieś na informację że problemem może być znak NULL (0×00) w którym PHPowe serialize się lubuje :) . A koro tak, to postanowiłem napisać swoją wersję serialize.

Kod tutaj:

<?php
/**
 * Serializowanie i deserializowanie treści zawierających 0x00
 *
 * @category    Mao
 * @package     Mao_Serializer
 * @author      Krzysztof 'Diabl0' Szatanik
 * @copyright   Copyright (c) 2011, MAO Group
 * @version     $Id: Form.php 1164 2009-11-10 13:01:53Z diabl0 $
 */

/**
 * Własna nakładka na serializację
 *
 */
class Mao_Serializer {

	const CHAR_0x00 = '\\$0x00$/';

	/**
	 * Serializuje obiekt jak serialize() z tym że zastępuje znak 0x00
	 * aby nie sprawiał problemu przy zapisie do bazy danych
	 *
	 *
	 * @param mixed $obj
	 *
	 * @return string
	 */
	static function serialize( $obj ) {
		return str_replace( chr(0x00), self::CHAR_0x00, serialize( $obj ) );
	}

	/**
	 *
	 * Deserializuje obiekt jak unserialize() z tym że przywraca
	 * zastąpiony znak 0x00
	 *
	 * @param string $string
	 *
	 * @return mixed
	 */
	static function unserialize( $string ) {
		return unserialize( str_replace( self::CHAR_0x00, chr(0x00), $string ) );
	}

}

Użycie jest banalne:

<?php
$text = 'to jest test znaku [' . chr(0) . '] - czy sie dobrze zapisuje do bazy';
$serialized = Mao_Serializer::serialize($text);
$unserialized = Mao_Serializer::unserialize($serialized);
?>

Wiem że nie jest to idealne rozwiązanie ale na razie nie mam czasu aby przysiąść i dorobić jakąś konwersję w locie na poziomie Zend_Db_Adapter

Autor wpisu: batman, dodany: 15.06.2011 07:46, tagi: zend_framework

Wydanie drugiej wersji Zend Frameworka jest coraz bliżej. Świadczyć może o tym fakt pojawienia się trzeciej deweloperskiej wersji frameworka, a wraz nią takich zmian jak:

  • refaktoring komponentu Markup
  • refaktoring komponentu Zend\Tool oraz CodeGenerator
  • przeniesienie nowych funkcjonalności z wersji 1.11
  • refaktoring komponentu LiveDocx
  • dodanie komponentu EvenManager
  • propozycja komponentu DI

Niestety dokumentacja nadal jest na etapie tworzenia i jedyne co nam pozostaje, to wydobywanie informacji ze slajdów – http://www.slideshare.net/weierophinney/zend-framework-20-patterns-tutorial. Jedyny fragment dokumentacji, to wiki opisujące DI wraz z przykładami – http://framework.zend.com/wiki/display/ZFDEV2/Zend+DI+QuickStart. Już nie mogę się doczekać wersji beta (i nieco obszerniejszej dokumentacji).

Autor wpisu: singles, dodany: 11.06.2011 12:43, tagi: zend_framework

Kolejny krótki wpis, także w ramach autolansu ;)

Dla tych co nie mają, bądź nie śledzą Twittera, to informuję, że od kilku miesięcy Getting Started With Zend Framework 1.11 autorstwa Rob Allena dostępny jest po polsku (w tłumaczeniu mojej skromnej osoby;). Znajdziecie go tutaj.

Wiem, że podstawowym językiem developera jest albo powinien być angielski, ale może wersja w ojczystym języku pomoże niektórym w zrozumieniu działania ZF.

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.