Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: sokzzuka, dodany: 12.11.2010 09:20, tagi: php

Oj gorąco ostatnio jest na liście php.internals. Co chwilę coś się ciekawego dzieje, ostatnio na tapecie mamy binarną notację dla liczb całkowitych. Jonah H. Harris zaproponował, by oprócz możliwości wpisywania liczb w systemie 8-mkowym, 10-tnym czy 16-tkowym można było wpisywać liczby całkowite w systemie binarnym. Powstało oczywiście odpowiednie RFC. Chyba wszystkim na liście dyskusyjnej ten pomysł się spodobał i wygląda na to, że łatka wprowadzająca tą funkcjonalność już niedługo wyląduje w „trunku”.

Jak by to miało wyglądać ? Dla porównania zapis liczby 2010 w trzech dotychczas obsługiwanych systemach zapisu i nowym binarnym:

  • 8: 03732
  • 10: 2010
  • 16: 0x7da
  • 2: 0b11111011010 lub jako flagi – 0b00001, 0b00010, 0b00100, 0b01000, 0b10000

Jak dla mnie ten nowy „ficzer” jest całkowicie zbędny, jednak domyślam się, że dla niektórych okaże się przydatny. Szkoda, że chłopaki nie pomyśleli o jakimś bardziej generycznym zaprojektowaniu tego. Mam na myśli coś w stylu rNxLICZBA. Gdzie N to podstawa systemu liczbowego a LICZBA to liczba zapisana w tym systemie. Wtedy dla binarnego zapisu było by coś w rodzaju r2x01010101 a dla 16-tkowego r16x7da.

Autor wpisu: batman, dodany: 12.11.2010 08:00, tagi: zend_framework

Co by nie pisać o Zend_Db, można z niego sporo wycisnąć. Jedną z takich wyciśniętych funkcjonalności są relacje. Wystarczy zdefiniować w klasach modelu zależne klasy i możemy cieszyć się relacjami, zamiast kombinować z joinami. Z początku relacje mogą być niejasne, jednak jak już je poznacie, nie będziecie mogli się bez nich obejść.

Wszystko zaczyna się w bazie. Przykładowe tabele to:

  • users – lista użytkowników
  • user_params – dodatkowe parametry użytkownika
  • roles – role, np admin
  • user_role – relacja między użytkownikami i rolami
CREATE TABLE users
(
  id serial NOT NULL,
  "login" character varying(50),
  "password" character varying(32),
  CONSTRAINT users_pkey PRIMARY KEY (id)
)

CREATE TABLE user_params
(
  id serial NOT NULL,
  iduser integer,
  param_name character varying(250),
  param_value text,
  CONSTRAINT user_params_pkey PRIMARY KEY (id),
  CONSTRAINT user_params_iduser_fkey FOREIGN KEY (iduser)
      REFERENCES users (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
)

CREATE TABLE roles
(
  id serial NOT NULL,
  "name" character varying(150),
  CONSTRAINT roles_pkey PRIMARY KEY (id)
)

CREATE TABLE user_role
(
  iduser integer NOT NULL,
  idrole integer NOT NULL,
  CONSTRAINT user_role_pkey PRIMARY KEY (iduser, idrole),
  CONSTRAINT user_role_idrole_fkey FOREIGN KEY (idrole)
      REFERENCES roles (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT user_role_iduser_fkey FOREIGN KEY (iduser)
      REFERENCES users (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
)

Następnie musimy stworzyć odpowiadające im klasy modeli (każda klasa powinna znaleźć się w osobnym pliku).

class Application_Model_DbTable_Users extends Zend_Db_Table_Abstract
{
    protected $_name = 'users';
    protected $_dependentTables = array(
        'Application_Model_DbTable_UserParams',
        'Application_Model_DbTable_UserRole'
    );

}

class Application_Model_DbTable_UserParams extends Zend_Db_Table_Abstract
{
    protected $_name = 'user_params';
    protected $_referenceMap = array(
    	'User' => array(
    		'columns' => array('iduser'),
    		'refTableClass' => 'Application_Model_DbTable_Users',
    		'refColumns' => array('id')
        )
    );
}

class Application_Model_DbTable_Roles extends Zend_Db_Table_Abstract
{
    protected $_name = 'roles';
    protected $_dependentTables = array(
        'Application_Model_DbTable_UserRole'
    );
}

class Application_Model_DbTable_UserRole extends Zend_Db_Table_Abstract
{
    protected $_name = 'user_role';
    protected $_referenceMap = array(
    	'User' => array(
    		'columns' => array('iduser'),
    		'refTableClass' => 'Application_Model_DbTable_Users',
    		'refColumns' => array('id')
        ),
    	'Role' => array(
    		'columns' => array('idrole'),
    		'refTableClass' => 'Application_Model_DbTable_Roles',
    		'refColumns' => array('id')
        )
    );
}

Jak to działa? W klasie “rodzica”, należy określić jaka tabela jest od tego rodzica zależna. Innymi słowy należy wskazać, w której klasie znajduje się klucz główny bieżącej klasy.

Zastosowanie relacji jest banalne i sprowadza się do wywołania jednej metody oraz wskazania, do której tabeli się odwołujemy. Jeśli chcielibyśmy pobrać wszystkie możliwe informacje, wystarczy, że napisze coś takiego:

$modelUser = new Application_Model_DbTable_Users();
// dane o uzytkowniku
$user = $modelUser->find(1)->current();
// parametry uzytkownika. jako parametr podajemy nazwe klasy, z ktorej pobieramy dane
$userParams = $user->findDependentRowset(
	'Application_Model_DbTable_UserParams'
);
// role uzytkownika. pierwszym parametrem jest tabela docelowa, drugim - tabela posrednia
$userRoles = $user->findManyToManyRowset(
	'Application_Model_DbTable_Roles',
	'Application_Model_DbTable_UserRole'
);

Relacje oferują jeszcze jedną ciekawą funkcjonalność. Możliwość pobrania danych z tabeli na podstawie relacji. Czyli mamy dany wiersz, np z tabeli user_params i na jego podstawie możemy pobrać dane powiązanego z nim użytkownika z tabeli users. Wygląda to następująco.

$modelUserParams = new Application_Model_DbTable_UserParams();
$userParam = $modelUserParams->find(1)->current();
$user = $userParam->findParentRow('Application_Model_DbTable_Users');

Do opisanych powyżej funkcjonalności dochodzi jeszcze jedna. W każdym z przypadków możemy do metody dodać obiekt Zend_Db_Table_Select, którym mamy możliwość ograniczania wyników.

Nie są to jedyne możliwości oferowane przez relacje w Zend_Db. Mamy możliwość skorzystania z “magii”, czyli z metod automatycznie tłumaczonych na odpowiednie klasy oraz reguł (jeśli w jednej tabeli jest kilka kluczy obcych z innej tabeli).

Autor wpisu: Wojciech Sznapka, dodany: 11.11.2010 17:42, tagi: php

Let's say that PHP isn't the best if it goes with language organization. But thing I discovered yesterday scared me and surprised in the same moment.

Autor wpisu: batman, dodany: 11.11.2010 16:00, tagi: php

Od dłuższego czasu obserwuję starania Microsoftu, mające na celu przekonanie do siebie programistów PHP. Co pewien czas pojawia się kolejne usprawnienie wprowadzające obsługę jakiejś usługi z poziomu PHP. Wystarczy wspomnieć o Windows Azure, czy API do Bing Maps. Z projektów niezwiązanych bezpośrednio z PHP można wymienić ASP.NET MVC, Web Platform Installer, czy WebMatrix. Każdy z nich na swój sposób jest ukłonem w stronę ogromnego rynku PHP. Ostatni z nich – Web Matrix, został wydany w wersji beta 3 i nie byłoby w tym nic nadzwyczajnego, gdyby nie fakt, że oferuje on obsługę PHP 5.3.3 oraz PEAR.

A co to takiego ten WebMatrix?

WebMatrix jest projektem, którego zadaniem jest maksymalne uproszczenie tworzenia aplikacji. Oferuje on serwer, bazę danych oraz szablony najpopularniejszych funkcjonalności dostępnych na stronach internetowych. Oczywiście mamy również możliwość zainstalowania aplikacji bazującej na gotowym rozwiązaniu (Wordpress, Drupal, SugarCRM, Joomla! itp).

Z poziomu WebMatrix mamy możliwość zarządzania bazami danych, z których korzysta nasz projekt oraz wygenerować raport, w którym znajdziemy informacje na temat uszkodzonych linków, brakujących znaczników meta oraz innych istotnych dla SEO informacji. Możemy również otworzyć projekt w Visual Studio i w nim kontynuować pracę.

Po co mi Web Platform Installer?

Web Platform Installer jest narzędziem pomagającym w instalacji niezbędnych narzędzi, m.in. WebMatrixa. Dzięki niemu w kilka chwil skonfigurujemy IIS, zainstalujemy darmową wersję Visual Studio (Visual Web Developer 2010 Express) oraz liczne dodatki, np. ASP.NET MVC. Jest to spora oszczędność czasu, ponieważ nie musimy szukać w sieci linków do pobrania i mamy pewność, że zainstalowane oprogramowanie pochodzi z zaufanego źródła. Jeśli WebMatrix nie przydanie nam do gustu, zawsze można zrezygnować z jego instalacji i dostępne aplikacje (Wordpress, Joomla!, itd) instalować bezpośrednio z poziomu Web Platform Installera.

To musi być “zuo” albo czarna magia

Jeśli zastanawiacie się gdzie jest haczyk, możecie przestać. Nie ma żadnego haczyka. Microsoft zdał sobie sprawę, że bez społeczności daleko nie zajedzie i dlatego coraz więcej projektów jest darmowych (lub posiada darmowe wersje). Ukłon w stronę środowiska PHP jest najlepszym posunięciem, jakie Microsoft może zrobić, ponieważ środowisko to, mino, że bardzo rozdrobnione, jest największe. Nie można wykluczyć, że MS stosuje taktykę dilera – na początek dostajemy coś za darmo, a za każdą kolejną dawkę trzeba płacić. Jednak skoro Visual Studio od tylu lat jest wydawany w wersji Express i do tej pory nie pojawiły się żadne przesłanki, że to się zmieni, można założyć, iż nie mamy do czynienia z dilerem ;)

Garść linków

Autor wpisu: batman, dodany: 10.11.2010 09:21, tagi: php

Framework PHP, który stworzyłem dla platformy PFA (PHP for Android) doczekał się swojej strony. Pod adresem blog.pfaframework.com znajduje się blog, w którym będę zamieszczał informacje o nowych wersjach, tutoriale, przykłady, FAQ, itp.

Projekt ten będzie o tyle ciekawy, że oprócz prowadzenia projektu, będę mógł podszkolić angielski, w którym robię wszystko, poza pisaniem. Informacje o PFAf będę zamieszczał również na blogu Hello World! (w języku polskim). Trzymajcie kciuki za powodzenie projektu ;)

Autor wpisu: Daniel Burchardtt, dodany: 09.11.2010 21:19, tagi: php

Pracując nad dzisiejszym projektem doszedłem do momentu w którym potrzebowałem wyświetlić datę w formacie

wtorek 9.11.2010

PHP oferuje szereg funkcji do operowania na datach jednak wybór padł na najprostszą i najpopularniejszą funkcję date().

Date

Funkcja date() zwraca datę zgodną z podanym formatem oraz znacznikiem czasu (domyślnie time()). Przyjmuje ona dwa parametry:

  • format – Format wyświetlania daty
  • timestamp – Opcjonalny parametr. Unix-owy znacznik czasu. Brak parametru oznacza domyślną wartość time()

Listę dostępnych opcji formatowania można znaleźć można w dokumentacji php.

Do naszych potrzeb użyjemy formatu D j.m.Y

<?php
echo date('D j.m.Y');
?>

Wynikiem działania powyższego skryptu jest

Tue 9.11.2010

Problemem pozostało w jaki sposób zmusić php do wyświetlania polskich nazw dni i miesięcy? Według dokumentacji wystarczy zastosowanie funkcji setlocale().

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

Autor wpisu: batman, dodany: 09.11.2010 08:00, tagi: jquery, javascript

Wpadł mi właśnie w ręce bardzo ciekawy skrypt – Snippet. Jest to plugin do jQuery, oferujący możliwość kolorowania składni. W przeciwieństwie do większości dostępnych na rynku skryptów, ten ma możliwość bardzo prostej zmiany stylu kolorowania składni, dzięki czemu można dopasować jego wygląd do wyglądu strony.

Użycie plugina jest banalnie proste i sprowadza się do dołączenia do kody strony pugina oraz pliku css ze stylami oraz wywołania na znaczniku pre funkcji snippet.

$("pre.koloruj-kod").snippet("html");

Wymaganym parametrem funkcji snippet jest rodzaj kodu do kolorowania. Do wyboru mamy 15 języków, miedzy innymi, PHP, C#, Javę, HTML, Javascript, czy CSS. Ilość gotowych stylów do zastosowania wynosi 40, więc każdy znajdzie coś dla siebie.

Jedyną wadą tego plugina jest bardzo skromna lista dodatkowych funkcjonalności. Jedyne co można dodatkowo zdefiniować, to pokazanie/ukrycie numeracji oraz określenie, czy tło ma być przeźroczyste. Niemniej plugin zapowiada się ciekawie i warto śledzić jego rozwój.

Dokładne informacje na temat snippet (wspierane języki, więcej przykładów oraz style) znajdziecie na stronie projektu - http://www.steamdev.com/snippet/

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