Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: cojack, dodany: 25.02.2010 10:03, tagi: javascript

Dzisiaj chciałbym opisać (pewnie dość znany już problem) występowania białych znaków w strukturze HTML pomiędzy elementami HTML. W czym jest problem? Istotą problemu jest chęć pobrania następnego elementu DOM który się znajduję po elemencie na którym mamy jakąś akcję i teraz jeżeli mamy odstęp pomiędzy tymi dwoma elementami, jakieś znaki ( \s, \t, \r, \n ) lub inne nie zdefiniowane białe znaki, to po pobraniu tego elementu przez funkcję nextSibling nie będziemy oczekiwanego efektu, tylko coś ala undefined lub text. A na pewno każdy z nas się z tym spotka ponieważ mamy zdefiniowane gdzieś w głowie że podgląd źródła strony powinien być ładnie sformatowany. Na stronach developer.mozilla.org odnośnie dokumentacji gecko dom można przeczytać właśnie o tej funkcji i przytoczę fragment z ich strony:

<table>
  <tr>
    <td id="cell1">cell1</td>
    <td id="cell2">cell2</td>
  </tr>
  <tr>
    <td id="cell3">cell3</td><td id="cell4">cell4</td></tr>
</table>

Mamy prostą tabele, pierwszy jej wiersz jest ładnie sformatowany by cieszyło nasze oko, drugi jest prosty, w jednym ciągu zapisany. Teraz po pobraniu następnego elementu poprzez nextSibling dla cell1 będziemy mieli text zamiast oczekiwanego przez nas cell2,a po pobraniu następnego elementu (j/w) dla cell3 będziemy mieli cell4.

Teraz za pewne można sobie zadać pytanie i co z tym zrobić? Otóż każdy element w javascript ma coś takiego jak nodeType, nodeType jest niczym innym jak indeksem elementu DOM przypisanym na stałe ustalonym w dokumentacji ECMA-262, zainteresowanych odsyłam do wiki. Nie ma sensu bym tutaj przytaczał wszystkiego odsyłam do w3shools w3schools – nodeTypes. Wracając do sedna sprawy bo troszkę odbiegłem od tematu, aby pobrać następny element trzeba sprawdzić jakiego jest typu. Także funkcja którą poniżej przedstawię nie jest mojego autorstwa, została już trylion razy przedstawiona w internecie,

   /**
    * Metoda zwraca następny obiekt w DOM
    *
    * @param    obj    obiekt elementu
    * @return    obj    następny obiekt w DOM
    */
   nextObject = function( MyObject ) 
   {
      do NextObject = MyObject.nextSibling;
      while (NextObject && NextObject.nodeType != 1);
        return NextObject;
   }

Tadam, proste, szybkie i skuteczne, użycie?

var div = document.getElementById( "jakiesId" );
var nextElement = nextObject( div );

Mam nadzieję że się komuś przyda i uśmierzy ból który spływa na nasze serca podczas pisania kodu js i wyrywania sobie włosów z głowy przy nieoczekiwanych wynikach wykonanego kodu który względnie teoretycznie jest dobry.

Autor wpisu: Vokiel, dodany: 24.02.2010 16:02, tagi: javascript, php, jquery, css

Na Grafish Design’s Blog natknąłem się na The Small Callendar. Czyli mały kalendarz, który umożliwia sprawdzenie wybranej daty pod kątem dnia tygodnia. Przedstawiony tam kalendarz jest wersją do druku (dostępny do pobrania w ponad 30 językach). Kalendarz ten różni się od standardowych tym, że ma tylko jeden blok z dniami miesiąca. Postanowiłem stworzyć taki kalendarzyk on-line przy wykorzystaniu PHP oraz odrobiny jQuery, plus oczywiście CSS.

ŹródłaDemo

Cel

Kalendarz w wersji oryginalnej wygląda następująco:

The Small Callendar

The Small Callendar - Grafish Design's Blog

źródło: Grafish Design’s Blog – The small calendar 2010 (en) .

Planowana przeze mnie wersja będzie miała:

  1. Wygląd przypominający oryginał
  2. Wybór roku innego niż aktualny
  3. Wielojęzyczność
  4. Możliwość podświetlania kolumny dat
  5. Możliwość podświetlania wierszy miesięcy
  6. Możliwość podświetlania dni tygodnia dla wybranych dat
  7. Możliwość przenoszenia bloku dat po kliknięciu na wiersz miesiąca

Generowanie kalendarza: PHP

Do wygenerowania kalendarza posłużymy się prostą klasą, która wygeneruje nam kilka rzeczy. Po pierwsze stworzymy listę miesięcy, dla każdego z nich sprawdzimy liczbę dni, sprawdzimy dzień tygodnia dla pierwszego dnia miesiąca. Następnie stworzymy na tej podstawie tablicę, która będzie zawierała skróty nazw miesięcy (w wybranym języku), dla wybranego roku, do każdego z miesięcy przypiszemy ilość dni oraz odpowiednio posortowane skróty nazw dni tygodnia.

Klasa ta jest bardzo prosta, zatem możemy ją nazwać imitacją klasy, zbiorem funkcji opakowanych w klasę. Lista metod:

  1. public __construct – 2 parametry opcjonalne: rok, tablica z danymi języka | konstruktor
  2. public setLanguage – 1 parametr: tablica z tłumaczeniami | ustawienie języka
  3. public getdatesTable – 0 parametrów | tworzy tablicę dni
  4. public getCalendar – 0 parametrów | pobiera tablicę z kalendarzem
  5. private generateMonths – 0 parametrów | generuje miesiące
  6. private generateDayNames – 0 parametrów | tworzy dni tygodnia w odpowiedniej kolejności

Kod klasy

Część po stronie serwera jest na tyle prosta, że nie wymaga większego opisu. Konstruktor może przyjmować 2 parametry: rok oraz tablicę z tłumaczeniem na inny język. Oba parametry są opcjonalne, domyślnym rokiem jest aktualny, język – polski.

Metoda setLanguage ustawia język. Kolejna, getDatesTable generuje tablicę z dniami miesięcy (1-31), oznaczając odpowiednio ilości dni wg miesięcy. getCalendar wywołuje dwie inne: generateMonths – generuję tablicę miesięcy, wraz z ważnymi danymi, oraz generateDayNames – generującą skrótowe nazwy dni tygodnia.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?php
/**
 * VokielSmallCallendar class
 * @author Vokiel | http://blog.vokiel.com
 */
class VokielSmallCallendar {
	/**
	 * Selected year
	 * @var int	$year
	 */
	private $year;
	/**
	 * Shortcuts names for months
	 * @var	array $monthsShort
	 */
	private $monthsShort = array();
	/**
	 * Shortcuts names for week days
	 * @var	array	$daysShort 
	 */
	private $daysShort = array(); 
	/**
	 * Generated months table for the callendar
	 * @var array $months
	 */
	private $months = array();
 
	/**
	 * Construct, 
	 * @param	int	$year
	 * @param	array	$lang
	 */
	public function __construct($year=0,$lang=null){
		$this->year = ($year)? (int)$year : date('Y');
 
		if (!is_array($lang) || !is_array($lang['months']) || !is_array($lang['days'])){
			$lang = null;
		}
		$this->setLanguage($lang);
	}//end of __construct
 
	/**
	 * Setting the monts shortcuts names and days shorcuts names.
	 * Polish is default language.
	 * @param	array	$lang	Monts and days array starting from 1 = January and 1 = Monday
	 */
	public function setLanguage($lang=null){
		$this->monthsShort = (is_array($$lang['months']))? $$lang['months'] : array(1=>'Sty',2=>'Lut',3=>'Mar',4=>'Kwi',5=>'Maj',6=>'Cze',7=>'Lip',8=>'Sie',9=>'Wrz',10=>'Paź',11=>'Lis',12=>'Gru');	
		$this->daysShort = (is_array($$lang['days']))? $$lang['days'] : array(1=>'Pon',2=>'Wt',3=>'Śr',4=>'Czw',5=>'Pt',6=>'Sob',7=>'Nie');
	}//end of setLanguage method
 
	/**
	 * Generating the dates table (numbers from 1 to 31)
	 * @return	string	$datesTable	Generated HTML table
	 */
	public function getDatesTable(){
		$datesTable = '<table><tbody><tr>';
		for ($i=1;$i<32;$i++){
			$class = '';
			if ($i>=28){
				if ($i == $this->months[2]['daysCount'] || $i>29){
					$class = 'class="days_'.$i.'"';
				}
			}
			$datesTable .= '<td '.$class.'>'.$i.'</td>';
			if ($i%7==0){
				$datesTable .= '</tr><tr>';
			}
		}
		$datesTable .= '</tr></tbody></table>';
		return $datesTable;
	}//end of getdatesTable method
 
	/**
	 * Getting the calendar
	 * @return	array	$this->months Array with months shortcuts names and sorted week days shortcuts names	 
	 */
	public function getCalendar(){
		$this->generateMonths();
		$this->generateDayNames();
		return $this->months;
	}//end of getCalendar method
 
	/**
	 * Generating months table
	 */
	private function generateMonths(){
		for ($i=1;$i<13;$i++){
			$time = mktime(0,0,0,$i,1,$this->year);
			$this->months[$i]['weekDay'] = date('N',$time);
			$this->months[$i]['montShort'] = $this->monthsShort[$i];
			$this->months[$i]['daysCount'] = date('t',$time);
		}
	}//end of generateMonths method
 
	/**
	 * Generating week day names shortcuts
	 */
	private function generateDayNames(){
		foreach ($this->months as $month => $dayStart){
			$dayStart = $dayStart['weekDay'];
			for ($i=0;$i<7;$i++){
				$day = ($dayStart+$i>7)? (-(7-$dayStart-$i)) : ($dayStart+$i);
				$this->months[$month]['weekdays'][] = $this->daysShort[$day];
				unset($this->months[$month]['weekDay']);
			}
		}
	}//end of generateDayNames method
 
}// end of VokielSmallCallendar class

Obsługa kalendarza: JavaScript

W tej części zajmiemy się oskrytpowaniem kalendarza w JavaScript (korzystając z jQuery) w celu nadania mu funkcjonalności, dynamiki i użytecznosci. Z naszych założeń wynika, że musimy utworzyć kilka funkcji, które będą reagować na przesuwanie kursora myszki ponad polami kalendarza.

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

Autor wpisu: Damian Rusinek, Piotr Wierzgała, dodany: 23.02.2010 21:56, tagi: symfony

Jest to bardzo prosty i krótki wpis mówiący jak dodać biblioteki Zenda do projektu Symfony. Mimo, że to wymaga kilka linijek kodu, to często muszę tego używać i niestety ciągle zapominam :)

Na początku trzeba oczywiście skopiować folder Zend z bibliotekami. Należy go umieścić w folderze /lib/vendor.

Files structure

Następnie jeszcze kilka linijek w głównym pliku konfiguracji ProjectConfiguration.php

require_once dirname(__FILE__).'/..\lib\vendor\symfony\lib/autoload/sfCoreAutoload.class.php';
sfCoreAutoload::register();

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
  	set_include_path(sfConfig::get('sf_lib_dir').'/vendor'.PATH_SEPARATOR.get_include_path());
  	require_once sfConfig::get('sf_lib_dir').'/vendor/Zend/Loader/Autoloader.php';
  	Zend_Loader_Autoloader::getInstance();

  	$this->enablePlugins('sfDoctrinePlugin');
  }
}

I to by było na tyle :)

Autor wpisu: Michał Środek, dodany: 20.02.2010 17:53, tagi: php

Zająłem się ostatnio w analizą konfiguracji PHP oraz sprawdzaniem w jakich okolicznościach jest możliwe dołączenie lub podglądanie plików php znajdujących się na serwerze. W kilku artykułach postaram się wyjaścić większość znanych mi technik. Rozpocznę od dosyć prostych i oczywistych, a w kolejnych częściach będę podnosił poprzeczkę usprawniając konfigurację serwera. Dzisiaj zaprezentuję na czym polega atak LFI(Local File Inclusion) polegający na uruchamianiu pliku dostępnego na serwerze.

Na atak są podatne strony wykorzystujące takie funkcje jak np. file(), file_get_contents(), include(), include_once(), require() i inne czytające dane z jakiegoś pliku. Ważne aby w paramtr określający adres czytanych zasobów był zależny od jakiejść zmiennej przesłanej przez użytkownika. Przykładowy(bardzo popularny) kod:

include('strony/'.$_GET['page'].'.html');

Atak działa podobnie jak SQL Injection. Musimy tak spreparować adres aby odnosił się on do innego pliku. Spróbujmy wpisać:

example.com?page=../index

Skrypt powinien wczytać plik strony/../index.html czyli po prostu index.html. Problem stanowi rozszerzenie określone z góry przez programistę. Gdybyśmy się go pozbyli, możliwe byłoby dołączenie dowolnego pliku, do którego posiadamy uprawnienia. Zastanówmy się jednak w jaki sposób działają powyższe funkcje. Wiemy, że PHP jest pisany w C. Jako parametr podajemy ciąg znaków. Każdy programujący w C wie, że stringi w tym języku to po prostu tablice znaków wyglądające następująco:

Jakis ciag znakow\0

Znakiem który określa zakończenie napisu jest znak zero. Jest to spowodowane tym, że tablica może mieć większy rozmiar niż długość napisu. Jezyk C jest tak napisany, że sam nie zeruje wartośći w pamięci na które wskazujemy więc brak znaku zero powodowałoby wyświetlanie „śmieci“ z pamięci. Tak więc dobrym pomysłem byłoby wszczepienie znaku \0 do naszego zapytania. Spróbujmy wpisać w adresie strony coś takiego:

example.com?page=../index.php%00

Jak zinterpretuje to PHP? Do funkcji include() zostanie przekazany ciąg znaków strony/../index.php\0.html. Funkcja include otrzymując w parametrze tablicę znaków wybierze wszystkie aż do znaku \0. W ten sposób końcówka .html zostanie uznana za śmieci z pamięci. Jak się chronić przed tym atakiem? Wystarczy prosty test poprawności przesyłanych danych:

if( preg_match('/^[a-zA-Z0-9]*$/', $_GET['page']) )
  include('strony/'.$_GET['page'].'.html');

Ograniczenia? Niestety możemy uruchomić jedynie pliki znajdujące się na serwerze. Jest jednak kilka sposobów aby sobie z tym problemem poradzić. Następnym razem przedstawię jak uruchomić własny kod PHP w przypadku dziury przedstawionej w tym artykule oraz błędnej konfiguracji serwera.

Autor wpisu: batman, dodany: 19.02.2010 21:03, tagi: zend_framework

Zend Framework oferuje kilka sposobów na obsługę web service. Najprostszym z nich jest Zend_Soap. Jedyną funkcjonalnością, która odróżnia Zend_Soap od rozszerzenia Soap dostępnego w PHP, jest Zend_Soap_AutoDiscover. W skrócie Zend_Soap_AutoDiscover pozwala na wygenerowanie pliku WSDL na podstawie metod klasy, przekazanych do Zend_Soap. Tworzenie usługi sieciowej zaczniemy od napisania nowego

Autor wpisu: Damian Rusinek, Piotr Wierzgała, dodany: 19.02.2010 18:57, tagi: php

Lately I was building an backend (admin-side) application in Flex. Most of the data was presented in data grids.

However, when working with services (PHP in my case) it is risky to load all data  to the DataGrid. It may lead to an application crash, ie. when we work on 1000’s of items.

Therefore I decided to create the component that handles pagination itself – it is similar to ExtJS’ data grid (however much simpler :) ).

The example is below… (You can view source by right-clicking on application)

This components dispatches 2 events (for now):

  • when page is changes
  • when data is sorted

I also added DATA_FILTER event, but I do not have idea how to include the filtration form in the component GUI.

To download source click here.

Any comments would be welcomed.

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

Autor wpisu: Damian Tylczyński, dodany: 18.02.2010 18:18, tagi: php

HipHop to twór wciąż dość nowy i wiele kwestii związanych z jego działaniem cały czas jest niejasnych. Najważniejsza kwestia, która wymaga wytłumaczenia to różnice i ograniczenia względem implementacji Zend. Dzięki prezentacji wideo możemy przynajmniej kilka obaw odrzucić w niepamięć. Dynamiczne include będzie wspierane. Podobnie dynamiczne wywołania funkcji poprzez “call_user_func” i co bardzo miłe, [...]
Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.