Ide egy symfony 1.3 + Propel project elkészítését szánom. Ubuntu rendszeren dolgozom, azért mert egyszerűbb, mint Windowson. Ha Windowson próbálkoznék, akkor is valamilyen virtuális Linuxot (pl: virtualbox) telepítenék fejlesztői teszt környezetnek.
A symfony 1.3-ra pedig azért esett a választás, mert ez az utolsó verzió, ami kompatibilis az 1.0-val. Rengeteg 1.0-as plugin található, aminek nincs 1.2-1.3-1.4-es verziója. Ha esetleg gyorsan be kell üzemelnem valamelyiket, akkor 1.3 alatt talán könnyebb lesz. A propelt pedig azért választottam, mert a cég, ahol dolgozom ezt használja és ezért én sem használtam még doctrinet.
A projektemnél az adatbázis már kész volt és használták is. Erre fogjuk ráhúzni a symfonyt admin felületét.
Telepítsük a hiányzó szoftvereket:
Az alap rendszer az, hogy a LAMP (Linux-Apache-MySql-PHP) környezet már megvolt.
Ha mégsem, akkor egy már telepített Ubuntu/Debian Linuxon, a sudo apt-get install mysql-server phpmyadmin paranccsal a legegyszerűbb telepíteni, egy mozdulattal mindent 🙂 Utána jöhet a symfony:

[code lang=”bash”]
sudo-s #rendszergazda módba váltunk
apt-get install php-pear
pear channel-discover pear.symfony-project.com
pear install symfony/symfony-1.3.5 #ha van újabb, akkor azt
apt-get install php5-xsl #xsl php kiterjesztés telepítése, a propelhez kell
a2enmod rewrite # mod rewrite
/etc/init.d/apache restart
exit #kilépünk a rendszergazda módból
mkdir sandbox #létrehozzuk a project könyvtárat
cd sandbox #belépünk a könyvtárba
symfony generate:project sandbox –orm=Propel #project készítése
symfony generate:app frontend #alkalmazás létrehozása
# hogy a majdani felület kapja meg az alap symfony designt
ln -s /usr/share/php/data/symfony/web/sf web/sf
[/code]

Ezzel létre is hoztunk egy alkalmazást.
Ami problémával szembesülhetünk hogy valamiért nem lehet újraindítani az apache szervert, mert a 80/443-as portok valamelyike már foglalt. Ez általában az /etc/apache/ports.conf fileban keletkezett duplikált bejegyzés miatt fordulhat elő. Töröljük az egyiket…

Most be kell állítanunk az adatbázist. Ez most több fájlt érint, hiszen alapból az 1.3 már doctrine modeleket használ, ha a projektet nem –orm=Propel direktívával hoztuk létre. Mi azzal tettük 🙂
De ha mégsem, akkor először is szükségünk lesz egy propel.ini fájlra a sandbox/config könyvtárunkban. A fájlt nekünk kell létrehozni az alábbi sorokkal. Értelemszerűen át kell szerkeszteni (host,dbname, password, user, output dir), akkor is ha nem mi hoztuk létre.

[code language=”plain”]
propel.targetPackage = lib.model
propel.packageObjectModel = true
propel.project = sandbox
propel.database = mysql
propel.database.driver = mysql
propel.database.url = mysql:host=localhost;dbname=teszt
propel.database.creole.url = ${propel.database.url}
propel.database.user = felhsznalo
propel.database.password = jelszo
propel.database.encoding = utf8

; mysql options
propel.mysql.tableType = InnoDB

propel.addVendorInfo = true
propel.addGenericAccessors = true
propel.addGenericMutators = true
propel.addTimeStamp = true
propel.addValidators = false

propel.useDateTimeClass = true
propel.defaultTimeStampFormat = Y-m-d H:i:s
propel.defaultTimeFormat = H:i:s
propel.defaultDateFormat = Y-m-d

propel.schema.validate = false
propel.samePhpName = false
propel.disableIdentifierQuoting = false
propel.emulateForeignKeyConstraints = true

; directories
propel.home = .
propel.output.dir = /home/user/sandbox
propel.schema.dir = ${propel.output.dir}/config
propel.conf.dir = ${propel.output.dir}/config
propel.phpconf.dir = ${propel.output.dir}/config
propel.sql.dir = ${propel.output.dir}/data/sql
propel.runtime.conf.file = runtime-conf.xml
propel.php.dir = ${propel.output.dir}
propel.default.schema.basename = schema
propel.datadump.mapper.from = *schema.xml
propel.datadump.mapper.to = *data.xml

; builder settings
propel.builder.peer.class = plugins.sfPropelPlugin.lib.builder.SfPeerBuilder
propel.builder.object.class = plugins.sfPropelPlugin.lib.builder.SfObjectBuilder
propel.builder.objectstub.class = plugins.sfPropelPlugin.lib.builder.SfExtensionObjectBuilder
propel.builder.peerstub.class = plugins.sfPropelPlugin.lib.builder.SfExtensionPeerBuilder
propel.builder.objectmultiextend.class = plugins.sfPropelPlugin.lib.builder.SfMultiExtendObjectBuilder
propel.builder.mapbuilder.class = plugins.sfPropelPlugin.lib.builder.SfMapBuilderBuilder

propel.builder.addIncludes = false
propel.builder.addComments = true
propel.builder.addBehaviors = true
[/code]

a config/database.yml fájlt is átszerkesztjük:

[code language=”plain”]
dev:
propel:
param:
classname: DebugPDO
debug:
realmemoryusage: true
details:
time: { enabled: true }
slow: { enabled: true, threshold: 0.1 }
mem: { enabled: true }
mempeak: { enabled: true }
memdelta: { enabled: true }

test:
propel:
param:
classname: DebugPDO

all:
propel:
class: sfPropelDatabase
param:
classname: PropelPDO
dsn: mysql:dbname=teszt;host=localhost
username: user
password: password
encoding: utf8
persistent: true
pooling: true
[/code]

Majd át kell szerkeszteni a config/ProjectConfiguration fájlt is. Engedélyezzük a pluginokat.

[code language=”php”]
public function setup()
{
$this->enableAllPluginsExcept(array(‘sfDoctrinePlugin’));
// vagy : $this->enablePlugins(‘sfPropelPlugin’);
}
[/code]

Ezekután az adatbázisunkhoz legeneraálhatjuk a schema.yml fájlt. Majd abból a modelt, a formot és a filtereket. Majd végül az első modulunkat is (modelname a modelünk – táblánk – neve):

[code lang=”bash”]
# az alábbi paranccsal tudjuk a web könyvtárunkba a szükséges symlinkeket
# létrehozni, amire szintén a design miatt lesz szükség
./symfony plugin:publish-assets
./symfony propel:build-schema #ezzel jön létre a config/schema.yml fájl a beállított adatbázis alapján
./symfony propel:build-model #modelek (táblák) legenerálása
./symfony propel:build-form #formok generálása
./symfony propel:build-filter #a táblázatokhoz tartozó filterek legenerálása
# vagy az előző 3 helyett csak egyszerűen
# ./symfony propel:build-all –classes-only
# most pedig következzen a tábláink admin felületének legenerálása:
./symfony propel:generate-admin frontend modelname #a modul is ezt a nevet kapja
# vagy ha más néven szeretnénk:
#./symfony propel:generate-admin –module="modelnameAdmin" frontend modelname
[/code]

Az utolsó parancsot érdemes az összes modulunkra (értsd: tábla) lefuttatni.
Én két problémába ütköztem, ezen parncsok futtatásakor.

  • A propel nem szereti a default értékként beállított CURRENT_TIMESTAMP-et, viszont a schema.yml-be beírja. Ezért át kellett szerkesztenem a generált fájlban: defaultValue: ‘0000-00-00 00:00:00’.
    Ráadásul a hibaüzenet is nagyon buta volt:Szegmens hiba. Na ebből találja ki az ember 🙁
  • A másik probléma pedig az volt, hogy szerettem volna egyben lefuttatni a model, form, filter építő parancsokat, de elfogyott a memória. Nem tudom melyik memória volt kevés, mert a php.ini-ben a négyszeresére emeltem, de még mindig ugyanannyira kevés volt. De legalább a hibaüzenet és az utasítások érthetők voltak

Zárjuk le egyszerűen a telepítésünket:
Lehetne szenvedni az apache virtuális könyvtáraival, de az egy másik leírás lesz. 🙂
Most egy egyszerű Linux link is megteszi nekünk. Tehát létre kell hozni a /var/www könyvtárban egy linket a projectünknek. Ehhez el lehetne mélyednünk az ln parancs használatában, de én mindig a midnight commandert használtam ehhez. Ha nem lenne feltelepítve, akkor a sudo apt-get install mc paranccsal telepíthetjük. A két ablakos rendszerben a CTRL+X, majd utána S gomb lenyomásával hozhatunk létre linket. Hozzuk hát létre a /var/www könyvtárban egy linket sandbox néven, ami a sandbox/web könyvtárunkra mutat. És a máris elérhető a táblázatunk a http://mydomain/sandbox/index.php/modul url alatt. Ehhez lehet rendszergazdai módba kell váltanunk.

Ha el akarjuk hagyni az index.php -t az URL-ből, akkor az /etc/apache/sites-available/default fájlt kell módosítani. A “Directory” szegmens alatt az AllowOverride None sort módosítani kell AllowOverride All -ra. Ezzel engedélyezzük a .htaccess fájlok használatát. Így a http://mydomain/sandbox/index.php/modul helyett használhatjuk simán a http://mydomain/sandbox/modul URL-t is.

Illetve ha valami hibába ütköznénk, akkor a fehér képernyő helyett a http://mydomain/sandbox/frontend_dev.php/modul alatt informálódhatunk a problémáról. Ha nem localhoston dolgozunk, akkor a frontend_dev.php fájl elején engedélyeznünk kell a saját IP címünket is.