schema.xml
Kod
<?xml version="1.0" encoding="utf-8"?>
<!--Autogenerated by PropelSchemaReverseTask class.-->
<database name="orglee" defaultIdMethod="native">
<table name="article_categories" phpName="Categories">
<column name="acs_id" type="INTEGER" size="11" primaryKey="true" autoIncrement="true" required="true"/>
<column name="acs_name" type="VARCHAR" size="256" required="false"/>
<column name="acs_color" type="VARCHAR" size="9" required="false"/>
</table>
<table name="article_category" phpName="Category">
<column name="_al_id" type="INTEGER" size="11" primaryKey="true" required="true"/>
<column name="_acs_id" type="INTEGER" size="11" required="false"/>
<foreign-key foreignTable="article_list">
<reference local="_al_id" foreign="al_id"/>
</foreign-key>
<foreign-key foreignTable="article_categories">
<reference local="_acs_id" foreign="acs_id"/>
</foreign-key>
</table>
<table name="article_list" phpName="Article">
<column name="al_id" type="INTEGER" size="11" primaryKey="true" autoIncrement="true" required="true"/>
<column name="al_title" type="VARCHAR" size="256" required="false"/>
<column name="al_desc" type="LONGVARCHAR" required="false"/>
<column name="al_content" type="LONGVARCHAR" required="false"/>
<column name="al_date_added" type="TIMESTAMP" required="false"/>
<column name="al_date_update" type="TIMESTAMP" required="false"/>
<column name="_u_id" type="INTEGER" size="11" required="false"/>
</table>
</database>
Ładnie generuje mi się abstrakcja ( _u_id - jeszcze nie jest zaimplementowane )<!--Autogenerated by PropelSchemaReverseTask class.-->
<database name="orglee" defaultIdMethod="native">
<table name="article_categories" phpName="Categories">
<column name="acs_id" type="INTEGER" size="11" primaryKey="true" autoIncrement="true" required="true"/>
<column name="acs_name" type="VARCHAR" size="256" required="false"/>
<column name="acs_color" type="VARCHAR" size="9" required="false"/>
</table>
<table name="article_category" phpName="Category">
<column name="_al_id" type="INTEGER" size="11" primaryKey="true" required="true"/>
<column name="_acs_id" type="INTEGER" size="11" required="false"/>
<foreign-key foreignTable="article_list">
<reference local="_al_id" foreign="al_id"/>
</foreign-key>
<foreign-key foreignTable="article_categories">
<reference local="_acs_id" foreign="acs_id"/>
</foreign-key>
</table>
<table name="article_list" phpName="Article">
<column name="al_id" type="INTEGER" size="11" primaryKey="true" autoIncrement="true" required="true"/>
<column name="al_title" type="VARCHAR" size="256" required="false"/>
<column name="al_desc" type="LONGVARCHAR" required="false"/>
<column name="al_content" type="LONGVARCHAR" required="false"/>
<column name="al_date_added" type="TIMESTAMP" required="false"/>
<column name="al_date_update" type="TIMESTAMP" required="false"/>
<column name="_u_id" type="INTEGER" size="11" required="false"/>
</table>
</database>
Połączenie i test:
Pomińmy na razie ścieżki, ale z tym też mam mały kłopot.
<?php Propel::init(DIR_OS_MODULE.'Articles/Model/ORM/conf/Article-conf'.EXT); $arts = Module_Articles_Model_ORM_ArticlePeer::doSelect(new Criteria()); /* @var $art Module_Articles_Model_ORM_Article */ foreach($arts as $art) { $cat = $art->getCategory(); $cats = $cat->getCategories(); } ?>
No i teraz problem numero uno.
var_dump() wyświetla mi następujące wyniki ( pominąłem kilka prywatnych pół żeby skrócić wynik )
Kod
object(Module_Articles_Model_ORM_Article)[7]
protected 'al_id' => int 1
protected 'al_title' => string 'Tytuł pierwszego' (length=17)
protected 'al_desc' => string 'Opis pierwszego artykułu' (length=25)
protected 'al_content' => string 'Treść pierwszego artykułu' (length=28)
protected 'al_date_added' => string '0000-00-00 00:00:00' (length=19)
protected 'al_date_update' => string '0000-00-00 00:00:00' (length=19)
protected '_u_id' => int 1
protected 'singleCategory' =>
object(Module_Articles_Model_ORM_Category)[10]
protected '_al_id' => int 1
protected '_acs_id' => int 2
protected 'aArticle' => null
protected 'aCategories' =>
object(Module_Articles_Model_ORM_Categories)[15]
protected 'acs_id' => int 2
protected 'acs_name' => string 'Cat 2' (length=5)
protected 'acs_color' => null
protected 'collCategorys' => null
private 'lastCategoryCriteria' => null
protected 'alreadyInSave' => boolean false
protected 'alreadyInValidation' => boolean false
protected 'validationFailures' =>
Przede wszystkim propel nie pobrał mi wszystkich kategorii artykułów. Testowy artykuł podpiąłem pod dwie kategorie. Drugim problemem jest ten bezsensowny adapter 'Category'. Najpierw muszę pobrać z artykułu adapter a potem dopiero kategorię.protected 'al_id' => int 1
protected 'al_title' => string 'Tytuł pierwszego' (length=17)
protected 'al_desc' => string 'Opis pierwszego artykułu' (length=25)
protected 'al_content' => string 'Treść pierwszego artykułu' (length=28)
protected 'al_date_added' => string '0000-00-00 00:00:00' (length=19)
protected 'al_date_update' => string '0000-00-00 00:00:00' (length=19)
protected '_u_id' => int 1
protected 'singleCategory' =>
object(Module_Articles_Model_ORM_Category)[10]
protected '_al_id' => int 1
protected '_acs_id' => int 2
protected 'aArticle' => null
protected 'aCategories' =>
object(Module_Articles_Model_ORM_Categories)[15]
protected 'acs_id' => int 2
protected 'acs_name' => string 'Cat 2' (length=5)
protected 'acs_color' => null
protected 'collCategorys' => null
private 'lastCategoryCriteria' => null
protected 'alreadyInSave' => boolean false
protected 'alreadyInValidation' => boolean false
protected 'validationFailures' =>
Było by wielkim uproszczeniem gdyby dało się połączyć ...ORM_Category i ORM_Categories w taki sposób żeby metoda z ORM_Article zwracała mi tablicę z obiektową reprezentacją kategorii. Czy jest to wykonalne? Tak na marginesie chciałbym dodać że przeczytałem http://propel.phpdb.org/trac/wiki/Users/Do...nyRelationships i niestety w moich obiektach nie wiedzieć czemu nie ma żadnej metody z Join w nazwie.
Lecimy dalej.
Kolejną sprawą z którą mam kłopot to podział na katalogi. Zapewne zwróciliście uwagę na diabelnie długie nazwy obiektów. Dlatego są one takie bo chciałem umieścić abstrakcję danych w katalogach modułów czyli [root]/module/Articles/Model/ORM/etc... Kiedy zainicjowałem propela zdałem sobie sprawę z tego że w większości fw modele są umieszczane w jednym katalogu. Chciałbym żebyście mi pomogli rozpatrzeć dwie możliwości ich składowania. 1) j/w w katalogach modułów i 2) w jednym katalogu ogólnym.
Nie wiem nawet czy pierwszy przypadek jest możliwy. Bo może zachodzić potrzeba wielokrotnej inicjalizacji propela z różnymi plikami konfiguracyjnymi. W drugim nie podoba mi się rozprzestrzenienie bibliotek. Jeśli bym chciał kiedyś zrobić z mojego fw cms i udostępnić. Spory kłopot sprawiłaby mi implementacja systemu paczek z rozszerzeniami właśnie przez abstrakcyjny dostęp do danych składowany w jednym katalogu ( kopiowanie plików sprawdzanie wersji nadpisywanie etc. ).
Ostatnią sprawą jest możliwość korzystania z bibliotek generowanych przez Propela z innych jego bibliotek.
Przykładem może być wspomniane wcześniej pole _u_id. Chciałbym żeby model User był częścią FW, a nie dodatkową biblioteką.
Więc może zajść spora rozbieżność ścieżek do plików z klasami. [root]/engine/User/klasy Oprócz tego pozostaje problem pobierania np. Artykułów przez User i odwrotnie. No i czy przy okazji dodania nowego modułu lub jego modyfikacji będę musiał generować wszystko na nowo?