Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: batman, dodany: 20.06.2010 13:00, tagi: zend_framework

Każda aplikacja biznesowa posiada opcję zapisz jako CSV. Najczęściej w takim przypadku tworzony jest osobny skrypt, który pobiera dane z bazy i udostępnia je w odpowiednim formacie. Twórcy Zend Frameworka wyszli na przeciw potrzebom programistów i udostępnili helper akcji o nazwie ContextSwitch, który w skrócie można opisać jako mechanizm do zwracania danych w zadanym formacie.

Domyślnie ContextSwitch ofertuje dwa formaty. Są to JSON oraz XML. Jeśli chcemy, aby nasza aplikacja zwracała dane w innym formacie, musimy stworzyć własny kontekst. Sprowadza się to do określenia nazwy kontekstu oraz określenia dodatkowych parametrów, takich jak suffix pliku widoku, nagłówki jakie zostaną użyte w przypadku zastosowania kontekstu oraz funkcje zwrotne, które zostaną wywołane w metodzie init lub postDispatch podczas obsługi danego kontekstu. Żadna z wspomnianych wyżej opcji nie jest wymagana, jednak aby użycie kontekstu miało sens, należy ustawić co najmniej suffix. W przypadku funkcjonalności polegającej na pobieraniu danych, należy dodać jeszcze odpowiednie nagłówki:

$contextSwitch = $this->_helper->getHelper('ContextSwitch');

$contextSwitch->addContext('csv', array(
	'suffix' => 'csv',
	'headers' => array(
		'Content-Type' => 'text/csv',
		'Content-Disposition' => 'attachment; filename=nazwa-pliku.csv'
	)
));
        
$contextSwitch->addActionContext('index', 'csv')
	      ->initContext();

Drugim i zarazem ostatnim krokiem jest stworzenie odpowiedniego pliku widoku ze wskazanym wcześniej suffixem.

Obok CSV można stworzyć kontekst RSS/ATOM, vCard, PDF i wiele innych.

Przykładową aplikację korzystającą z ContextSwitch znajdziecie w repozytorium SVN.

Autor wpisu: Zyx, dodany: 19.06.2010 14:36, tagi: php

Niektóre systemy bazodanowe takie, jak np. PostgreSQL wspierają koncepcję dziedziczenia tabel. Pozwala ona nie tylko na współdzielenie części deklaracji przez dwie tabele, ale także danych, co znacząco ułatwia realizację niektórych zadań. Choć biblioteka Doctrine obsługuje dziedziczenie od jakiegoś czasu, działało ono na zasadzie emulacji, co oczywiście jest marnotrawstwem, jeśli korzystamy z systemu, który wspiera tę funkcjonalność natywnie.

Autor wpisu: batman, dodany: 18.06.2010 18:00, tagi: apache

Jeśli mieliście za zadanie kiedykolwiek wykonać stronę, która będzie poprawnie się wyświetlać, na pewno korzystaliście z maszyny wirtualnej. Zwłaszcza, jeśli musieliście testować stronę w kilku wersjach IE, Fx i Opery. Pół biedy, jeśli do przetestowania jest “goły” HTML. Gorzej, jeśli trzeba przetestować działającą aplikację, zainstalowaną na serwerze.

Jest na to rada. Wystarczy odpowiednio skonfigurować hosty na wirtualnej maszynie oraz odblokować dostęp w konfiguracji Apache. Poniższy opis będzie działał dla systemu operacyjnego Windows oraz maszyny wirtualnej Virtual PC. Nie testowałem tego rozwiązania na innych systemach operacyjnych oraz maszynach wirtualnych.

Pierwszą rzeczą jaką trzeba zrobić, to dowiedzieć się z jakiego adresu IP będziemy się łączyć do serwera. W tym celu w wierszu poleceń hosta wpisujemy ipconfig /all i szukamy naszego adresu IP. Jak już go znajdziemy, w systemie na maszynie wirtualnej odnajdujemy plik hosts (znajduje się w katalogu C:\WINDOWS\system32\drivers\etc) i dodajemy nowy wiersz:

123.123.123.123	jakas-nazwa

W miejsce 123.123.123.123 wpisujemy adres IP naszego komputera, a w miejsce jakas-nazwa, nazwę, po wpisaniu której wyświetli się zawartość głównego katalogu serwera. Ostatnią czynnością jaką musimy wykonać, jest zezwolenie na łączenie się z maszyny wirtualnej do serwera zainstalowanego na hoście. Wystarczy dodać w pliku konfiguracyjnym Apache regułkę

Allow from 123.123.123.123

gdzie 123.123.123.123 jest tym samym adresem, który wpisaliśmy do pliku hosts na maszynie wirtualnej.

Jeśli korzystacie z wirtualnych hostów na serwerze (na hoście) i chcecie, by również one działały z poziomu maszyny wirtualnej, wystarczy, że jako nazwę w pliku hosts podacie ich nazwę lub alias. Pamiętajcie o dodaniu adresu IP do konfiguracji vhosta.

Autor wpisu: sokzzuka, dodany: 17.06.2010 23:08, tagi: php

Część z Was pewnie wie o istnieniu listy dyskusyjnej php.internals. Jest to lista na której to core developerzy PHP rozmawiają o zmianach w języku. Jako, że praktycznie codziennie odwiedzam ową listę, postanowiłem co jakiś czas pisać post o aktualnych dyskusjach na niej oraz zapytać Was czyli społeczność o zdanie w poruszanych tam kwestiach. Ostatnio najświeższym tematem na tapecie jest usunięcie z głównej dystrybucji PHP rozszerzenia SQLite w wersji 2 na rzecz wersji 3.

Proponenci argumentują konieczność usunięcia tego rozszerzenia tym, że biblioteka (i baza) SQLite w wersji 2 nie jest już rozwijana i trzymanie tego kodu w głównej dystrybucji jest bez sensu.

Przy okazji dyskusji kilka osób zaproponowało aby usunąć również nie rozwijane rozszerzenie mssql oraz rozszerzenie mysql oparte na natywnych bibliotekach dostarczanych przez producenta bazy, a zamiast niego silniej promować mysqli i pdo. Argumentacja była taka, że rozszerzenie mssql również nie jest rozwijane i są lepsze sposoby na komunikacje z tą bazą np. w windowsie oficjalny microsoftowy driver a na linkusie odbc. Natomiast co do drivera mysql, że nie jest to natywny PHP-owy driver. Padł również argument, że powinno się ograniczać ilość dostępnych sposobów realizacji jednej rzeczy.

A Wy co sądzicie ?

Czy należy usunąć rozszerzenie SQLite2 z dystrybucji ? Czy należy pozbyć się drivera MySQL dostarczanego przez producenta na rzecz mysqli i pdo, a może zostawić obie rzeczy by była lepsza kompatybilność wsteczna ?

Autor wpisu: sokzzuka, dodany: 17.06.2010 22:51, tagi: php

W poprzednich częściach tutorialu omawiałem jak stworzyć szkielet aplikacji webowej w Pythonie przy użyciu mod_wsgi oraz jak wykonywać proste operacje na bazie (select, insert). Dzisiejszy wpis będzie o odczytywaniu informacji z plików w popularnych formatach XML i CSV.

Jak zaraz zobaczycie w obu językach wygląda to podobnie, najpierw parsowanie CSV w Pythonie oraz wyświetlanie HTML-owej tabelki:

import csv
 
def test(path):
    sFile = path + 'files/sample.csv'
    oReader = csv.reader(open(sFile), delimiter=',', quotechar='"')
    aResult = []
    for row in oReader:
        aResult.append(row)
 
    sResult = '<table><tbody>'
    for row in aResult:
        sResult += '<tr>'
        for cell in row:
            sResult += '<td>' + cell + '</td>'
        sResult += '</tr>'
 
    sResult += '</tbody></table>'
    return sResult

Ekwiwalent w php

<?php
$sPath = 'res' . DIRECTORY_SEPARATOR . 'csv' . DIRECTORY_SEPARATOR . 'sample.csv';
 
$rFile = fopen( $sPath, 'r' );
$aResult = array();
$mResult = array();
do {
    $mResult = fgetcsv( $rFile );
    $aResult[] = $mResult;
} while ($mResult !== false);
 
$iRows = count($aResult);
unset ($aResult[$iRows-1]);
?>
<table>
    <tbody>
<?php foreach ($aResult as $row): ?>
            <tr>
        <?php foreach ($row as $cell): ?>
                    <td><?php echo $cell ?></td>
            <?php endforeach; ?>
                    </tr>
            <?php endforeach; ?>
    </tbody>
</table>

Jak widać kod w Pythonie jest troszkę krótszy ze względu na większą abstrakcje – w PHP można by osiągnąć ten sam efekt poprzez opakowanie funkcji fgetcsv w obiekt implementujący interfejs Iterator.

Naszym kolejnym obiektem zainteresowanie będzie parsowanie plików XML, za zadanie weźmiemy sobie wyciągnięcie z pliku RSS wszystkich tytułów wpisów, będziemy korzystać z pasera typu DOM.

Kod pythonowy:

def test(path):
    from xml.dom.minidom import *
 
    sFile = path + 'files/rss.xml'
    # @type oDom xml.dom.minidom.Document
    oDom = parse(sFile)
 
    lTitles = oDom.getElementsByTagName('title')
    output = ''
 
    output += "<h1>Titles</h1>"
    output += "<ul>"
 
    for node in lTitles:
        output += "<li>" 
        output += node.childNodes[0].nodeValue
        output += "</li>"
    output += "</ul"
    return output

Kod w PHP:

$sPath = 'res'.DIRECTORY_SEPARATOR.'xml'.DIRECTORY_SEPARATOR.'rss.xml';
 
$oDom = new DOMDocument();
$oDom->preserverWhiteSpace = false;
$oDom->load($sPath);
 
$oTitles = $oDom->getElementsByTagName('title');
echo "<h1>Titles</h1>";
echo "<ul>";
foreach($oTitles as $title){
    $sTitle = $title->nodeValue;
    echo "<li>",$sTitle,"</li>";
}
echo "</ul>";

Widać kilka zasadniczych różnic w obu językach, po pierwsze aby parsować dokument XML w php należy użyć metody DOMDocument::load, natomiast w Pythonie mamy metode parse modułu minidom.

Po drugie w PHP jeżeli mamy noda którego jedyną zawartością jest tekst, to możemy się do niego dostać przez właściwość nodeValue, natomiast Pythonowy parser widzi nod z tekstem wewnątrz jak nod z dzieckiem, które to jest nodem tekstowym.

Tym wpisem prawdopodobnie zakończę serię “Aplikacje webowe w Pythonie dla programistów PHP”, mam nadzieje, że udało mi się zachęcić Was do zabawy z tym ciekawym językiem i spojrzenia z innej perspektywy na znane Wam zapewne zagadnienia w programowaniu.

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

Autor wpisu: batman, dodany: 16.06.2010 18:00, tagi: zend_framework

Zend Frameworku oferuje kilka różnych routerów. Jednym z ciekawszych i zarazem najtrudniejszych w zastosowaniu jest Zend_Controller_Router_Route_Hostname. Router ten w połączeniu z modułami daje ogromne możliwości. Można na przykład stworzyć kilka modułów aplikacji, na które wskazują odpowiadające im subdomeny.

Router można zdefiniować na dwa sposoby – w pliku konfiguracyjnym lub w pliku Bootstrap. W tym przypadku preferuję drugą metodę, co nie oznacza, że pierwsza jest zła. W przypadku korzystania z pliku Bootstrap należy pamiętać o jednej rzeczy. Metoda musi nazywać się _initRouter. W przeciwnym wypadku nasz router nie będzie działał. Niestety nie udało mi się ustalić dlaczego tak się dzieje.

Zend_Controller_Router_Route_Hostname można stosować jako osobny router, jednak wówczas nasza aplikacja nie będzie w stanie dotrzeć do innych akcji niż domyślne. Dzieje się tak dlatego, ponieważ każda ścieżka będzie pasowała do naszego routera. Aby temu zapobiec, należy użyć innego routera – Zend_Controller_Router_Route_Chain. Na szczęście jego wykorzystanie jest banalne i sprowadza się do wywołania metody chain na obiekcie routera hostname.

W praktyce wygląda to następująco:

protected function _initRouter()
{
	$this->bootstrap('frontController');
	$front = $this->getResource('frontController');
	$router = $front->getRouter();

	$hostRouter = new Zend_Controller_Router_Route_Hostname(
		':module.przykladowa-domena.pl',
		array(
			'module' => ''
		)
	);

	$defaultRouter = new Zend_Controller_Router_Route(
		':controller/:action/*',
		array(
			'controller' => 'index',
			'action' => 'index'
		)
	);
	
	$router->addRoute('subdomain', $hostRouter->chain($defaultRouter));
}

Do poprawnego działania, router potrzebuje dwóch parametrów. Pierwszym jest adres, który zostanie przetłumaczony na moduł, drugim domyślna nazwa modułu jaki zostanie użyty w helperze widoku url. Jeśli jako moduł zdefiniujemy pusty string, wówczas helper url zwróci nam adres wskazujący na domenę, bez żadnej subdomeny.

echo $this->url(array(), 'subdomain');
// wyświetli http://przykladowa-domena.pl

Jeśli jako moduł domyślny ustawiony zostanie jakiś string, np admin, wówczas helper wyświetli http://admin.przykladowa-domena.pl. Do helpera możemy przekazać nazwę modułu. Wówczas wygenerowany zostanie adres z odpowiednią subdomeną.

echo $this->url(array('module' => 'jakis-modul'), 'subdomain');
// wyświetli http://jakis-modul.przykladowa-domena.pl

Drugim zdefiniowanym routerem jest Zend_Controller_Router_Route. Dzięki niemu wszystkie parametry przekazane w ścieżce zostaną przetłumaczone na nazwę kontrolera, nazwę akcji oraz dodatkowe parametry.

Autor wpisu: batman, dodany: 16.06.2010 12:46, tagi: zend_framework

Dwa dni temu wydana została nowa wersja Netbeans, oznaczona numerem 6.9. W sumie nie byłoby nic w tym ciekawego, gdyby nie fakt, że do IDE dodana została obsługa Zend Frameworka.

Zanim będziemy mogli skorzystać z możliwości tworzenia projektu ZF, musimy skonfigurować nasze środowisko. Konfiguracja wygląda bardzo podobnie jak w przypadku dodawania ścieżek do zmiennych środowiskowych. Musimy wskazać katalog, w którym znajduje się Zend Framework oraz katalog z plikiem wykonywalnym php.

Po poprawnym skonfigurowaniu IDE, można stworzyć projekt PHP w oparciu o Zend Framework. Projekt będzie posiadał standardową strukturę katalogów. Niestety dodawanie elementów frameworka do projektu (np formularze, akcje, czy moduły) sprowadza się do wpisywania tych samych komend, z których byśmy korzystali w wierszu poleceń. Jedyną różnicą jest to, że Netbeans podpowiada nam składnię poleceń.

Prezentację możliwości nowej wersji Netbeans możecie obejrzeć na oficjalnej stronie tego środowiska.

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