Archiwum dla sierpień, 2007

26
sie
07

Autoloader przy dziedziczeniu w CI

Korzystając z hierarchi klas, przedstawionej wcześniej, napotkałem na problem. Otóż korzystając z kontrolera np AdminNews, gdzie wywoływany jest konstruktor klasy Admin, CI nie widział klasy nadrzędnej. Dało się to ominąć w prosty sposób, nie dokładając żadnych include ani require do kodu klas dziedziczących.

Do pliki config.php dodałem:

function __autoload($class)
{
if(stristr($class,'controller'))
require_once(APPPATH . '/controllers/' . $class . EXT);
}

Niestety to rozwiązanie jest możliwe tylko w przypadku korzystania z PHP5.

25
sie
07

Streszczenia

Adres: http://e-streszczenia.info

Technologie: XHTML, CSS, PHP5, MySQL

20
sie
07

Administracyjna hierarchia klas

Rozpocząłem prace nad nową wersją serwisu. Na pierwszy ogień poszedł PA. Wymyśliłem i zacząłem implementację hierarchi klas do obsługi PA jak na rysunku

admin.png

Zobaczymy jak to wyjdzie w efekcie końcowym. W każdym razie PHP teoretycznie umożliwia takie coś. Można jeszcze rozszerzyć tą hierarchie o interface, który byłby implementowany przez klasy AdminNews i AdminArt. Ale na razie to zaniechałem.

Całość opieram na Code Igniter.

18
sie
07

Jak korzystać z cURL ?

cURL to bardzo przydatne rozszerzenie dostępne w PHP. Dzięki niemu nie musimy się męczyć z headerami, socketami etc. Korzystamy z eleganckich funkcji. Zacznijmy od najprostszego skryptu, pobranie strony i jej wyświetlenie:
$curl = curl_init( 'http://masterixzone.wordpress.com' );
curl_exec( $curl );
curl_close( $curl );

Inicjujemy, otwieramy połączenie i je zamykamy. Przy okazji funkcja curl_exec() wyświetla nam stronę ( tą pobraną ). Małofunkcjonalne. Zapiszmy stronę do zmiennej:
$curl = curl_init( 'http://masterixzone.wordpress.com' );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER , TRUE );
$content = curl_exec( $curl );
curl_close( $curl );

Korzystamy tutaj z funkcji curl_setopt() aby ustawić odpowiednią opcję. Jakie można ustawiać to można znaleźć w manualu PHP. Teraz w zmiennej $content mamy cały kod pobranej strony.

Na koniec nieco bardziej wyrafinowany fragment, wyślemy formularz – tzn zasymulujemy za pomocą cURL jego wysłanie:
$post_fields['z'] = 'wartość z';
$post_fields['zawod'] = $zawod;// przypisujemy wartość zmiennej
$curlr = curl_init( 'http://masterixzone.wordpress.com' );
curl_setopt( $curl, CURLOPT_POST, TRUE );
curl_setopt( $curl, CURLOPT_POSTFIELDS, $post_fields );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, TRUE );
$content = curl_exec( $curl );
curl_close( $curl );

W zmiennej $content mamy również zawartość strony, ale po wysłaniu formularza metodą POST. Tablica $post_fields zawiera wartości, którymi ‘uzupełniamy’ formularz. Indeksy są nazwami zmiennych i muszą się pokrywać z tymi co są w interesującym nas formularzu.

18
sie
07

FED się obudził

Dziś popołudniu (naszego czasu) FED ogłosił obniżenie stóp procentowych. Na tą informację czekał cały giełdowy świat – wcześniejsze dofinansowanie sektora ryzykownych kredytów, liczne w dziesiatkach miliardów dolarów nie zadziałało.

Po tym ogłoszeniu GPW automatycznie odbiła w górę. Punkt wsparcia się utrzymał. Jednak ciągłej “zieleni” raczej spodziewać się nie należy – ostatnio bardzo zmiennie jest na giełdach…

18
sie
07

e-streszczenia.info na sprzedaż!

Wystawiłem na aukcji serwis, ze streszczeniami lektur.

link do aukcji

Zapraszam do licytacji!

17
sie
07

Kolejny “czarny czwartek”

Jakieś dwa albo trzy tygodnie temu prasa pisała o czarnym czwartku na GPW i w sumie na giełdach światowych. To co stało się wczoraj na GPW powoduje, że tamten “czarny” czwartek należałoby nazwać co najwyżej “beknięciem hossy”.

WIG20 stracił w ciągu sesji 5,4%, mWIG40 i sWIG80 niecałe 10%. Przez prawie całą sesję indeksy małych i średnich spółek były ponad 10% na minusie! WSZYSTKIE spółki notowane na GPW zaliczyły spadek – to można nazwać czarnym czwartkiem.

Teraz na giełdzie będzie trwał bój dobrych sygnałów z bardzo złymi wiadomościami napływającymi zza oceanu. Może się ustabilizuje, ale równie dobrze może niestety jeszcze sporo spaść. Praktycznie padł już punkt wsparcia na 3400pkt a kolejny jest na poziomie 3100.

Czekamy…

16
sie
07

Integracja forum phpBB2 z CI

Będę pisał serwis ( nową wersję ) i musi być on zintegrowany z forum. Zasięgnąłem języka w google i powstałą taka oto klasa:
class Integration
{
private $userdata;
public function __construct()
{
global $db, $board_config, $phpbb_root_path, $phpEx;
DEFINE( 'IN_PHPBB', TRUE );
$phpbb_root_path = 'forum/';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
if ( !defined( 'IN_PHPBB' ) )
{
die( "Hacking attempt!" );
}
$userdata_tmp = session_pagestart( $user_ip, 0 );
init_userprefs( $userdata_tmp );
$this -> userdata = $userdata_tmp;
}
public function get()
{
return $this -> userdata;
}
}

Jest klasa umieszczona w katalogu libraries ( czyli biblioteka ) więc na samym początku pliku należy umieścić linijkę:
if (!defined('BASEPATH')) exit('No direct script access allowed');

Jako, że integracja w serwisie z forum musi być praktycznie w każdym miejscu to bibliotekę tą dołączam automatycznie. Plik config/autoload.php:
$autoload['libraries'] = array( 'database', 'validation', 'integration' );
Do standardowych, które na razie używam dopisałem integration. Na obecne testy działa :)

15
sie
07

Modyfikacja redirect() w Code Igniter

Zajrzałem dzisiaj do pliku system/helpers/url_helper.php i zmodyfikowałem funkcję redirect na następujacą ( zmieniłem też nazwę ze względów, które poruszę pewnie w innym temacie ):

function CI_redirect($uri = '', $method = 'location', $time = 0 )
{
switch($method)
{
case 'refresh' : header("Refresh:".$time.";url=".site_url($uri));
break;
default : header("Location: ".site_url($uri));
break;
}
exit;
}

Dodałem jeden argument z domyślną wartością. Jest to czas, po jakim zostanie wysłany nagłówek Refresh, jeśli z takim argumentem wywołamy naszą funkcję. Wcześniej było wpisane 0, czyli w działaniu się nie różniło od Location – teraz jest bardziej elastycznie.

14
sie
07

easyNotes – skrypt notatek

Jest to wyciąganie armaty na muchę, ale żeby poznać dobrze FW trzeba sporo pisać. Więc na potrzebę chwili ( a może i dużej chwili ) napisałem skrypt notatek bazując na Code Igniterze.

Na początek logowanie w kontrolerze easyNotes:
public function login()
{
if ( $this -> is_logged() )
{
redirect( 'easynotes/index', "Location" );
}
else
{
$form_data['login'] = array( 'id' => 'login_id', 'name' => 'login' );
$form_data['password'] = array( 'id' => 'pass_id', 'name' => 'password' );
$form_rules['login'] = 'required|xss_clean';
$form_rules['password'] = 'required|xss_clean';
$this -> validation -> set_rules( $form_rules );
if ( $this -> validation -> run() == FALSE )
{
$form_data['login']['value'] = $this -> input -> post ( 'login' );
$form_data['password']['value'] = $this -> input -> post( 'password' );
$this -> response['content'] = $this -> load -> view( 'login_form', $form_data, TRUE );
}
else
{
$this -> load -> model( 'User' );
$query = $this -> User -> get_user( $this -> input -> post( 'login' ), $this -> input -> post( 'password' ) );
// login and password are correct
if ( $query -> num_rows() == 1 )
{
$item = $query -> result_array();
$array_data = array( 'user_id' => $item[0]['user_id'], 'logged_in' => TRUE );
$this -> session -> set_userdata( $array_data );
redirect( 'easynotes/index' );
}
}
}

Korzystam tutaj z biblioteki validation. Najciekawszy fagment tego kodu to właśnie przygotowanie reguł do walidacji oraz jej sprawdzenie:
$form_rules['login'] = 'required|xss_clean';
$form_rules['password'] = 'required|xss_clean';
$this -> validation -> set_rules( $form_rules );
if ( $this -> validation -> run() == FALSE )

Wywołana jest tu metoda set_rules, która jak argument przyjmuje tablicę z regułami walidacji dla poszczególnych pól formularza ( nazwy pól to klucze tablicy ). Jeśli walidacja się uda to sprawdzamy w bazie czy taki użytkownik z takim hasłem istnieje.
$this -> load -> model( 'User' );
$query = $this -> User -> get_user( $this -> input -> post( 'login' ), $this -> input -> post( 'password' ) );
// login and password are correct
if ( $query -> num_rows() == 1 )
{
$item = $query -> result_array();
$array_data = array( 'user_id' => $item[0]['user_id'], 'logged_in' => TRUE );
$this -> session -> set_userdata( $array_data );
redirect( 'easynotes/index' );
}

Ładujemy model User i pobieramy użytkownika. Jeśli mamy 1 wynik to za pomocą biblioteki do obsługi sesji zapisujemy sobie jakieś dane w niej ( tutaj przykładowe ), po czym następuje przekierowanie na stronę główną. Kolejna metoda kontrolera:
private function is_logged()
{
if( $this -> session -> userdata( 'logged_in' ) && $this -> session -> userdata( 'user_id' ) > 0 )
return TRUE;
else
return FALSE;
}

Sprawdza czy użytkownik jest zalogowany i zwraca odpowiednia wartość logiczną.
public function logout()
{
if ( $this -> is_logged() )
{
$this -> session -> sess_destroy();
}
redirect( 'easynotes/index', 'Location' );
}

Wylogowanie polega na zniszczeniu sesji i przekierowaniu użytkownika na stronę główną.
Model User i jego metody:
class User extends Model
{
public function __construct()
{
parent::__construct();
}

public function get_user( $login, $pass )
{
$this -> db -> where( 'login', $login );
$this -> db -> where( 'password', md5( $pass ) );

return $this -> db -> get( 'users' );
}
}

Możnaby pobierać do metody get_user jako trzeci parametr sposób hashowania hasła, ale dla uproszczenia napisałem to tak jak jest. Korzystam tutaj z biblioteki database, do której dostęp mam poprzez:
$this ->db -> metoda();
Za pomocą metody WHERE ustawiam klauzulę warunkową dla zapytania SQL a następnie zwracam zasób z metody get(), która jako argument przyjmuje nazwę tabeli.

Pozostałych modeli oraz widoków opisywał nie będę, są one analogiczne do przedstawionego kodu. Tu opisałem pokrótce sposób korzystania z bazy danych oraz z sesji.




 

sierpień 2007
P W Ś C P S N
« lip   wrz »
 12345
6789101112
13141516171819
20212223242526
2728293031  

a

Strony