Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] Nie mogę zbudować modelu.
Forum PHP.pl > Forum > PHP > Frameworki
Lk_hc
Witam. Proszę o pomoc: Po skonfigurowaniu parametrów połączenia do bazy danych w pliku $SF_ROOT/config/database.yml i odpowiednim ustawieniu pliku schematu danych w $SF_ROOT/apps/frontend/conf/schema.yml nie mogę wygenerować odpowiednich klas do obsługi bazy danych za pomocą polecenia: symfony propel-build-model Zawsze, czy dane konfiguracyjne są prawidłowe czy nie, czy nawet jak w ogóle ich nie ma to po podaniu tego polecenia dostaje output:

CODE
>> schema converting "/home2/Loko/www/lok...cs/sf/config/schema.yml" to XML
>> schema putting /home2/Loko/www/loko.ro.../sf/config/generated-schema.xml

Warning: ini_set(): Option default_charset cannot be changed after headers have been sent (output started at /usr/share/php/symfony/vendor/pake/pakeFunction.php:366) in /usr/share/php/symfony/vendor/phing/Phing.php on line 1103

Fatal error: Declaration of UnixFileSystem::getBooleanAttributes() must be compatible with that of FileSystem::getBooleanAttributes() in /usr/share/php/symfony/vendor/phing/system/io/UnixFileSystem.php on line 266


O co w tym chodzi? jak się wreszcie podłączyć do tej bazy?

Plik generated-schema.xml wygląda tak:
CODE
<?xml version="1.0" encoding="UTF-8"?>
<database name="">

</database>
mike
A pokaż plik schema.yml, podejrzewam, że masz błedy.
Lk_hc
propel:
article:
_attributes: { phpName: Article }
id:
title: varchar(25)
content: text
created_at:
comment:
_attributes: { phpName: Comment }
id:
article_id:
author: varchar(255)
content: text
created_at:
mike
Ty pisałeś tą schemę? Zrób sobie najlepiej bazę danych a później wygeneruj plik schema.yml na podstawie bazy danych.
Lk_hc
Jak to zrobić?
-=Peter=-
  1. <?php
  2. content: text
  3. ?>

a nie powinno być:
  1. <?php
  2. content: longvarchar
  3. ?>

?
mike
Eeee, no!
Takie pierdoły to w dokumentacji piszą. Warto poczytać.


Kod
symfony propel:build-schema
Lk_hc
CODE
symfony propel-build-schema

Fatal error: Declaration of UnixFileSystem::getBooleanAttributes() must be compatible with that of FileSystem::getBooleanAttributes() in /usr/share/php/symfony/vendor/phing/system/io/UnixFileSystem.php on line 266


Z dwukropkiem zamiast kreski nie działa w ogóle - nieznane polecenie.

zamiana w configu na content: longvarchar nic nie zmienia.
mike
Jaką masz wersję PHP bo symfony masz 1.0.
Lk_hc
No i chyba znaleźliśmy problem:

CODE
php -v
PHP 6.0.0-dev (cli) (built: Jun 13 2007 21:52:48)
Copyright © 1997-2007 The PHP Group
Zend Engine v3.0.0-dev, Copyright © 1998-2007 Zend Technologies
mike
Nom.
W klasie UnixFileSystem funkcja getBooleanAttributes wygląda tak:
  1. <?php
  2.  
  3. function getBooleanAttributes(&$f) {
  4. // ...
  5. }
  6.  
  7. ?>
a w klasie nadrzędnej dla niej wygląda tak:
  1. <?php
  2.  
  3. function getBooleanAttributes($f) {
  4. // ...
  5. }
  6.  
  7. ?>

PHP 6.0.0 na to nie pozwala.
Lk_hc
Udało się zbudować model! guitar.gif Dzięki za pomoc mike.

Jeszcze mam pytanie pokrewne: Mam model, wszystkie pliki klas i xml. Ale za cholere nie mogę wyciągnąć danych z bazy danych. Jestem prawie pewny że te pare linijek kodu co pisze jest ok (według dokumentacji online). Więc moje pytanie brzmi jak sprawdzić czy Smyfony/Creole/Propel łączy się z DB. Ze specyfiki generowania modelu wynika że podanie złego hasła czy innych danych w database.yml nie wyrzuca błędów bo klasy generowane są na podstawie schema.xml. Rozpisałem się. Więc macie pomysł jak to sprawdzić?
phpion
Odpalaj aplikację w trybie dev (np. poprzez frontend_dev.php zamiast index.php), a będziesz wiedział w czym problem. Nie zapomnij o przyjacielu jakim jest "symfony cc" smile.gif
Lk_hc
Cały czas pracuje na frontend_dev.php. Nie wyskakuje błąd tylko zmienna która miała zawierać wartość z bazy jest pusta. Sprawdziłem issestem. Z Symfony cc dość dobrze się znamy ;] Przy czym jeśli w w klasie modelu (załóżmy za tutorialem Article.php) zrobie funkcję test zwracającą na sztywno ustawiony string to pięknie ten string sobie wędruje przez kontroler do widoku więc z przepływem zmiennych nie ma problemu. Chodzi o łączność z bazą.
mike
Jeżeli podałbyś niepoprawne dane do bazy danych to modele poinformują Cie o tym wyjątkiem kiedy zechcesz zapytać bazę o coś.
Podaj kod, zobaczymy co jest nie tak.
Lk_hc
Plik akcji wywołujący obiekt modelu:

  1. <?php
  2. class firstmodActions extends sfActions
  3. {
  4. /**
  5.    * Executes index action
  6.    *
  7.    */
  8. public function executeIndex()
  9. {
  10. // $this->getResponse()->setTitle('FirstMode index');
  11.  
  12.  
  13. $handle = new Article();
  14.  
  15. $this -> art_title = $handle->getTitle();
  16.  
  17.  
  18. }
  19.  
  20. public function executeShow()
  21. {
  22.  
  23. }
  24.  
  25. }
  26. ?>


Plik klasy modelu Article.php
  1. <?php
  2. class Article extends BaseArticle
  3. {
  4.  
  5.  
  6. }
  7. ?>



I nic. Próbowałem już przenoszenia pewnych wywołań do pliku modelu i odwrotnie, podawania jako parametru id do getTitle() i nic. Na złych danych połączeniowych w database.yml nie wywala błędu w trybie dev (wcześniej tak było afair) symfony cc i rm -rf cache/frontend nic nie zmieniają. Na dobrych danych konfiguracyjnych zmienna, która powinna zawierać tytuł jest pusta.

W widoku wiadomo jest echo $art_title.
mike
Załamka. Obawiam się, że masz myle wyobrażenie o działaniu tego kodu.

A działa tak:
1. Tworzysz nowy obiekt klasy Article, czyli tworzysz nowy artykuł. Nowy to znaczy niewypełniony. Bez id, bez tytułu i co tam jeszcze masz.
2. Pobierasz tytuł utworzonego przed chwilą obiektu.

Jakiego tytułu się spodziewasz w rezultacie? tongue.gif
Lk_hc
Zaraz, zaraz, a Article.php to nie jest klasa reprezentująca istniejący w bazie danych rekord, który zawiera artykuły, ich tytuły etc... ? Przecież jest getTitle a nie setTitle ? Tylko właśnie nęka mnie na jakiej podstawie wybiera ten artykuł.

Cholera czyli muszę się zainteresować ArticlePeer.php ?
mike
Article to jest obiekt reprezentujący jeden wiersz a tabeli article.
Możesz taki obiekt pobrać z bazy:
  1. <?php
  2.  
  3. $article = ArticlePeer::retrieveByPk(1);
  4. echo $article->getTitle();
  5.  
  6. ?>
lub stworzyć nowy i zapisać go do bazy:
  1. <?php
  2.  
  3. $article = new Article();
  4. $article->setTitle('Tytuł');
  5. $article->save();
  6.  
  7. ?>


Odnoszę wrażenie, że korzystasz z czegoś czego kompletnie nie rozumiesz. Wróć do dokumentacji Propela i symfony i zacznij od nowa.
Lk_hc
Odnosisz takie wrażenie, bo, przyznaje trochę z pośpiechem przeleciałem ten rozdział. Po prostu w totalną zmyłe mnie wprowadziło to get

SUKCES - wyciągnąłem tytuł z bazy, to chyba znaczy że nie tak "kompletnie nie rozumiem", no wiesz ;] tylko ten peer poprostu no i kwestia pomyłki metody statycznej z obiektem, plama. fuckt.
mike
Cytat(Lk_hc @ 24.07.2008, 15:35:33 ) *
(...) plama. fuckt.
Zdarza się smile.gif
Jak sam widzisz dobrze wrócić do dokumentacji i nie przelatywać jej tongue.gif
Propel 1.2 Documentation
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.