Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] Dodawanie zmiennych do YAML
Forum PHP.pl > Forum > PHP > Frameworki
strife
Witam,

Ostatnio męczę się z dodaniem zmiennych z akcji do plików konfiguracyjnych w Symfony. Problem wygląda następująco posiadam sobie przykładową akcję:

  1. <?php
  2. class defaultActions extends sfActions
  3. {
  4. public function executeIndex()
  5. {
  6. $dupa = 2; // dynamiczna wartosc;
  7. sfConfig::set('dupa', $dupa );
  8.  
  9. // próbuje odczytać
  10. $var = sfConfig::get('dynamiczna_dupa'); // zwraca NULL
  11. }
  12. }
  13. ?>


I chce aby zmienna $dupa, znalazła się w pliku konfiguracyjnym app.yml i dała się odczytać. Plik app.yml wygląda u mnie w ten sposób:

Kod
all:
  dynamiczna_dupa: <?php echo sfConfig::get('dupa') ?> # nie jest widoczna


Pewnie problem jest z parsowaniem plików yaml, po dodaniu wartości. Żeby to zadziałało trzeba by zapewne jeszcze raz przeparsować ten plik. Pytanie tylko jak. A może macie jakiś inny pomysł na rozwiązanie tego problemu.

Pozdrawiam.
mike
Hmm, to działa inaczej niż (chyba) myślisz.

Chodzi o to, że:
Kod
all:
  dynamiczna_dupa: <?php echo sfConfig::get('dupa') ?>
spowoduje zwrócenie za pomocą kodu:
  1. <?php
  2. sfConfig::get('app_dynamiczna_dupa'); // zwróć uwagę na to app_
  3. ?>
tego co zostanie zapisane podczas tego samego wywołania za pomocą pod zmienną konfiguracyjną dupa.

To nigdy nie będzie zapis do tego pliku.

Ty chcesz w akcji najpierw zapisać/ustawić zamienną a potem ją odczytać, ale plik konfiguracyjny został już dawno sparsowany więc nie ma to sensu. Musiałbyś zrobić to baaardzo wcześnie, tuż przed parsowaniem pliku app.yml

Tak w ogóle to byłoby to bardzo trudno zrobić bo to wszystko dzieje się w bardzo wczesnych momentach przetwarzania żądania.
Stąd ten mechanizm dynamicznych zmiennych nie do końca służy temu żeby to programista ustalał wartości dla tych zmiennych z poziomu kodu.
Ten mechanizm ma pozwolić na dynamiczność zmiennych konfiguracyjnych zależnych od wartości innych zmiennych konfiguracyjnych.
(trochę to zamotane)

Na przykład (kod z dokumentacji):
Kod
all:
  translation:
    format:  <?php echo sfConfig::get('sf_i18n') == true ? 'xliff' : 'none' ?>

Zmienna konfiguracyjna o kluczu app_translation_format będzie równa xliff bądź none ale to nie jest zależne od decyzji programisty ale od zmiennej sf_i18n ustawionej w innym pliku.


A możesz powiedzieć co chciałbyś uzyskać? Pomyślimy.
strife
Przede wszystkim dziękuje za odpowiedź. Tak, wiem że jest to zamotane i już tłumaczę do czego jest mi to potrzebne. Wymyśliłem sobie jakiś czas temu aby dopisać w Symfony filtr, który będzie odpowiadał za ustawianie title na *podstawie pliku konfiguracyjnego.

app.yml
Kod
all:
    title:        
        main: web site
        separator:  " / "
        
        escape: off
        
        module:
          default:
              # index:  [ jeden, dwa, trzy ]
              index: "Index"
              example: "Jaka strona przykladowa"
          contact:
              index: "Kontakt"


Natomiast filtr wygląda w następujący sposób ( umieszczony jest lib/titleFilter.class.php ) :

titleFilter.class.php
  1. <?php
  2.  
  3. /**
  4.  * Filtr ktory ustawia tytuly dla modulow z pliku konfiguracyjnego w zaleznosci 
  5.  * od wybranego modulu.
  6.  *
  7.  * @author  strife <strife.dev(at)gmail(dot)com>
  8.  * @version 0.1a
  9.  */
  10.  
  11. class titleFilter extends sfFilter
  12. {
  13. public function execute( $filterChain )
  14. {
  15.  
  16. $context = sfContext::getInstance();
  17. $response = $context -> getResponse();
  18.  
  19. // wczytywanie konfiguracji tytulow
  20. $arrTitles = sfConfig::get('app_title_module');
  21.  
  22. // separator
  23. $separator = sfConfig::get('app_title_separator');
  24.  
  25. // ustawienie glownego tytulu
  26. if ( sfConfig::has('app_title_main') )
  27. {
  28. $mainTitle = sfConfig::get('app_title_main');
  29. $result = $mainTitle;
  30. }
  31.  
  32. $action = $context -> getActionName();
  33. $module = $context -> getModuleName();
  34.  
  35.  
  36. if ( is_array( $arrTitles ) )
  37. {
  38. if ( isset( $arrTitles[ $module ][ $action ] ) )
  39. {
  40. if ( is_array( $arrTitles[ $module ][ $action ] ) )
  41. {
  42. $implode = implode( sfConfig::get('app_title_separator'), $arrTitles[ $module ][ $action ] );
  43. $result = $mainTitle . sfConfig::get('app_title_separator') . $implode;
  44. } 
  45. else
  46. {
  47. $result = $mainTitle . $separator . $arrTitles[ $module ][ $action ];
  48. }
  49.  
  50. }
  51. }
  52.  
  53. $response -> setTitle( $result, sfConfig::get('app_title_escape') ) ;
  54.  
  55. $filterChain -> execute();
  56. }
  57.  
  58. }
  59.  
  60.  
  61. ?>


Taki kod pięknie mi działa i uzyskuje to co chce, mogę nawet dodawać sobie tablicę w ten sposób ustawiam sobie tytułu dla konkretnych akcji w modułach.

Kod
Web site / Artykuly / [var]  / Hello world


Problem pojawia się, gdy chciałbym aby [var], była pobierana powiedzmy z bazy danych, czyli była to dynamiczna wartość. Mam nadzieję, że teraz rozjaśniłem o co mi dokładnie chodzi.

Może idę w złym kierunku i macie jakiś inny pomysł jak to rozwiązać, każda sugestia będzie widziana.

________________
* - Tak wiem, że można ustawiać tytuł dla konkretnego modułu poprzez view.yml, ale nie podoba mi się ten zapis, ponieważ aby dopisać tytuł trzeba pobrać główny. Dlatego wolałem napisać własne rozwiązanie z uwzględnieniem tablic.


~edit
Problem rozwiązany, udało mi się z tym jakoś uporać szczegóły dla zainteresowanych na moim blogu. Trochę inna zmiana tytułu w Symfony
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.