wtorek, 28 kwiecień 2009

Integracja Agavi z Doctrine

Kontynuujemy naszą przygodę z Agavi! Czas na ORM. Wybieramy Doctrine.

Pobierzmy paczkę Doctrine-1.1.x.tgz i ją rozpakujmy. Przejdźmy do wypakowanego katalogu i dalej do katalogu lib. Przenieśmy teraz katalog Doctrine oraz plik Doctrine.php do biblioteki naszego projektu blog/libs. Czas na wstępną konfigurację. W pierwszym kroku edytujemy plik blog/app/config.php. Do include_path dodajemy naszą bibliotekę libs oraz konfigurację Doctrine.

ini_set('include_path', dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'libs' . PATH_SEPARATOR . ini_get('include_path'));

AgaviConfig::set('doctrine.data_fixtures_path', AgaviConfig::get('core.app_dir') . '/data/fixtures');
AgaviConfig::set('doctrine.models_path', AgaviConfig::get('core.app_dir') . '/models');
AgaviConfig::set('doctrine.migrations_path', AgaviConfig::get('core.app_dir') . '/migrations');
AgaviConfig::set('doctrine.sql_path', AgaviConfig::get('core.app_dir') . '/data/sql');
AgaviConfig::set('doctrine.yaml_schema_path', AgaviConfig::get('core.app_dir') . '/schema');
AgaviConfig::set('doctrine.phptype', 'mysql');
AgaviConfig::set('doctrine.username', 'blogger');
AgaviConfig::set('doctrine.password', 'bloggie');
AgaviConfig::set('doctrine.hostspec', 'localhost');
AgaviConfig::set('doctrine.database', 'blog');
AgaviConfig::set('doctrine.dsn', AgaviConfig::get('doctrine.phptype') . '://' . AgaviConfig::get('doctrine.username') . ':' . AgaviConfig::get('doctrine.password') . '@' . AgaviConfig::get('doctrine.hostspec') . '/' . AgaviConfig::get('doctrine.database'));

W drugim kroku tworzymy nowe katalogi w naszej aplikacji:

blog/
  app/
    data/
      fixtures/
      sql/
    migrations/
    schema/

Teraz powiadommy Agavi, że chcemy korzystać z bazy danych. W pliku blog/app/config/settings.xml odnajdźmy zmienną konfiguracyjną use_database i ustawmy ją na true.

Kolejny krok to konfiguracja bazy danych w pliku blog/app/config/databases.xml. Zastępujemy całość podanym kodem:

<?xml version="1.0" encoding="UTF-8"?>
<ae:configurations xmlns:ae="http://agavi.org/agavi/config/global/envelope/1.0" xmlns="http://agavi.org/agavi/config/parts/databases/1.0">
  <ae:configuration>
    <databases default="doctrine">
      <database name="doctrine" class="AgaviDoctrineDatabase">
        <ae:parameter name="dsn">%doctrine.dsn%</ae:parameter>
        <ae:parameter name="charset">utf8</ae:parameter>
        <ae:parameter name="options">
          <ae:parameter name="username">%doctrine.username%</ae:parameter>
          <ae:parameter name="password">%doctrine.password%</ae:parameter> 
        </ae:parameter>
        <ae:parameter name="load_models">%doctrine.models_path%</ae:parameter>
      </database>
    </databases>
  </ae:configuration>
</ae:configurations>

Ostatni krok to utworzenie skryptu CLI. Utwórzmy plik doctrine.php w głównym katalogu naszego projektu. Umieśćmy w nim następujący kod:

<?php

require('./libs/agavi/agavi.php');

require('./app/config.php');

require_once('./libs/Doctrine.php');

spl_autoload_register(array('Doctrine', 'autoload'));

$conn = Doctrine_Manager::connection(AgaviConfig::get('doctrine.dsn'), 'doctrine');
$conn->setOption('username', AgaviConfig::get('doctrine.username'));
$conn->setOption('password', AgaviConfig::get('doctrine.password'));

Doctrine_Manager::getInstance()->setAttribute('model_loading', 'conservative');

$config = array(
  'data_fixtures_path' => AgaviConfig::get('doctrine.data_fixtures_path'),
  'models_path' => AgaviConfig::get('doctrine.models_path'),
  'migrations_path' => AgaviConfig::get('doctrine.migrations_path'),
  'sql_path' => AgaviConfig::get('doctrine.sql_path'),
  'yaml_schema_path' => AgaviConfig::get('doctrine.yaml_schema_path')
);

$cli = new Doctrine_Cli($config);
$cli->run($_SERVER['argv']);

?>

Przetestujmy CLI w wierszu poleceń. Przejdźmy do katalogu naszego projektu i uruchommy skrypt wpisując php doctrine.php. Powinniśmy otrzymać w wyniku listę dostępnych poleceń.

Czas utworzyć bazę danych oraz użytkownika. Wybraliśmy MySQL, więc najlepiej skorzystać z phpMyAdmin. Tworzymy bazę danych blog oraz użytkownika blogger identyfikującego się hasłem bloggie. Utworzonemu użytkownikowi nadajemy wszystkie uprawnienia dla naszej bazy danych.

Możemy jeszcze raz przetestować CLI usuwając bazę danych za pomocą polecenia php doctrine.php drop-db oraz tworząc ponownie wpisując php doctrine.php create-db.

Odwiedźmy teraz w przeglądarce adres http://localhost/blog/pub/. Jeśli nie sypnie żadnym błędem, to mamy teraz dostęp do naszej bazy danych.

Podsumowując, zintegrowaliśmy z naszym projektem Agavi ORM Doctrine. Nasz projekt ma teraz następującą strukturę:

blog/
  app/
    cache/
    config/
    data/
      fixtures/
      sql/
    lib/
    log/
    migrations/
    models/
    modules/
    schema/
    templates/
    config.php
  dev/
  libs/
    agavi/
    Doctrine/
    Doctrine.php
  pub/
  agavi.bat
  build.properties
  build.xml
  doctrine.php

Paczkę z projektem możemy pobrać z http://www.agavi.org.pl/moj-pierwszy-projekt/integracja-agavi-z-doctrine.zip.

Już niebawem zaczniemy tworzyć szkielet panelu administracyjnego.

środa, 18 marzec 2009

Tworzenie nowego projektu Agavi

Zacznijmy przygodę z Agavi! Pobierzmy Agavi i wypakujmy. W naszym htdocs utwórzmy strukturę naszego projektu. Nazwijmy go blog:

blog/
  libs/

Przejdźmy do wypakowanych plików. Przenieśmy folder src do folderu libs i zmieńmy jego nazwę na agavi. Teraz jeszcze z wypakowanych plików, a dokładniej z folderu bin, skopiujmy jeden z plików: agavi.bat-dist (jeżeli korzystamy ze środowiska Windows) lub agavi-dist (jeśli jesteśmy w środowisku Unix) do katalogu naszego projektu. Zmieńmy nazwę tego pliku na agavi.bat lub agavi odpowiednio. Nasza struktura projektu wygląda teraz mniej więcej tak:

blog/
  libs/
    agavi/
  agavi.bat

Zajmiemy się teraz zawartością pliku agavi.bat. Otwórzmy go w notatniku. Naszym zadaniem jest ustawienie dwóch zmiennych: AGAVI_SOURCE_DIRECTORY oraz PHP_EXECUTABLE. Pierwsza z nich powinna wskazywać na katalog, w którym znajduje się agavi, a dokładniej plik agavi.php. Druga powinna wskazywać na plik wykonywalny PHP, czyli konkretnie na php.exe. W przypadku pierwszej podmieniamy wartość @PEAR-DIR@ na libs. W drugim przypadku wartość @PHP-BIN@ np. na C:/php5/php.exe. Zapisujemy plik, którego zawartość powinna wyglądać tak:

@ECHO OFF
:: This file is part of the Agavi package.
:: Copyright (c) 2005-2009 the Agavi Project.
::
:: For the full copyright and license information, please view the LICENSE file
:: that was distributed with this source code. You can also view the LICENSE
:: file online at http://www.agavi.org/LICENSE.txt

:: Set this to the path to the Agavi installation's source directory. This is
:: the directory that contains the `agavi.php' file.
SET AGAVI_SOURCE_DIRECTORY=libs/agavi

:: Set this to the path to a PHP binary.
SET PHP_EXECUTABLE=C:/php5/php.exe

%PHP_EXECUTABLE% -d memory_limit=4294967295 -f "%AGAVI_SOURCE_DIRECTORY%/build/agavi/script/agavi.php" -- --agavi-source-directory "%AGAVI_SOURCE_DIRECTORY%" %*

W przypadku środowiska Unix procedura wygląda podobnie.

Teraz odpalmy wiersz poleceń i sprawdźmy, czy wszystko działa. Przejdźmy do katalogu naszego projektu i uruchommy polecenie agavi. Powinniśmy uzyskać komunikat podobny do tego:

Agavi > status:

[echo] PHP:
[echo]   Version: 5.2.10
[echo]   Include path: .;C:\php5\pear
[echo]
[echo] Phing:
[echo]   Version: Phing version 2.3.3
[echo]
[echo] Agavi:
[echo]   Installation directory: C:\htdocs\blog\libs\agavi
[echo]   Version: 1.0.1
[echo]   URL: http://www.agavi.org
[echo]
[echo] Project:
[echo]   (not found)
[echo]
[echo] For a list of possible build targets, call this script with the -l argument.

Teraz utworzymy świeży projekt za pomocą polecenia agavi project. Kreator będzie nas prosił o wprowadzanie danych o naszym projekcie. Pozostawiamy domyślne wartości. Zatrzymujemy się tylko na początku przy Project name [New Agavi Project]:. Wpisujemy Blog. Spytani o .htaccess wpisujemy y, a w kolejnym pytaniu podajemy ścieżkę /blog/pub. Gdy skrypt zakończy działanie struktura naszego projektu powinna wyglądać następująco:

blog/
  app/
  dev/
  libs/
    agavi/
  pub/
  agavi.bat
  build.properties
  build.xml

Odwiedźmy teraz w przeglądarce adres http://localhost/blog/pub/. Naszym oczom powinna się ukazać nasza ulubiona roślinka. Jeżeli w środowisku Unix sypnie błędem, to prawdopodobnie musimy zmienić prawa dostępu dla katalogu cache w folderze app znajdującym się w naszym projekcie.

Tak przygotowany projekt możemy pobrać z http://www.agavi.org.pl/moj-pierwszy-projekt/tworzenie-nowego-projektu-agavi.zip.

W kolejnych postach odsłonimy kolejne tajemnice Agavi i rozbudujemy naszą aplikację. Napiszemy prostego bloga.

piątek, 13 marzec 2009

Kolorowanie składni - SyntaxHighlighter

Aby mieć ślicznie pokolorowaną składnię na Bloggerze wykorzystamy SyntaxHighlighter.

Wystarczy przejść do Pulpit nawigacyjny / Układ / Edytuj kod HTML i przed zamykającym znacznikiem head wstawić:

<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css" />
<link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css" />
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript" />
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js" type="text/javascript" />
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript" />
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript" />
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js" type="text/javascript" />
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript" />
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js" type="text/javascript" />
<script type="text/javascript">
  SyntaxHighlighter.config.bloggerMode = false;
  SyntaxHighlighter.all();
</script>

Opcjonalnie możemy ustawić w Pulpit nawigacyjny / Ustawienia / Formatowanie opcję Konwertuj podziały wierszy na NIE.

Gotowe!

Ja używać? Dodając nowy post przechodzimy do Edytuj kod HTML i kod, który chcemy, aby był pokolorowany umieszczamy w znaczniku pre i nadajemy mu odpowiednią klasę, np: brush: python.

<pre class="brush: python">
from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField()
</pre>

Efekt byłby taki:

from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField()

Pamiętaj aby wszystkie < oraz > zamienić odpowiednio na &lt; i &gt;.

piątek, 27 luty 2009

Nareszcie jest: Agavi 1.0

Agavi to potężny, skalowalny framework aplikacji PHP5, który bazuje na wzorcu projektowym MVC. Umożliwia programistom pisanie przejrzystego, łatwego w utrzymaniu i rozszerzaniu kodu. Agavi stawia na wolność wyboru i skupia się na trwałej jakości.

sobota, 3 styczeń 2009

Numerowanie linii w Microsoft Visual Studio 2008

Aby wyświetlić numerowanie linii w edytorze przejdź do: Tools / Options / Text Editor / All Languages / General i zaznacz Line numbers.