Temat: Osoba, która odpowie na kilka pytań

Witam,
poszukuję osoby, która ma pojęcie o Symfony2 i byłaby chętna do przekazania swojej wiedzy. Nie mówię o całości. Chodzi o pytania dotyczące tego FW. Podstawy znam, przerobiłem książkę W. Gajdy, ale to jednak za mało i teraz napotykam problemy, z którymi ciężko mi się zmierzyć.

Chodzi o pomoc za darmo, z dobrej woli.

Do moderatora:
Podpowiedziano mi, że lepiej napisać w tym dziale, więc założyłem nowy temat.
Piotr Lewandowski

Piotr Lewandowski Programista
aplikacji
internetowych (PHP,
MySQL, SF2, Mag...

Temat: Osoba, która odpowie na kilka pytań

Chętnie odpowiemy i pomożemy jak usłyszymy pytania.

Temat: Osoba, która odpowie na kilka pytań

Zacznę od tego, że teraz mam problem, ponieważ muszę podpiąć stronę pod Symfony, wszystko w html prawie gotowe, z podpięciem też nie byłoby problemu (tutaj mam na myśli ustawienia routingu, twig, obsługa bazy danych i przesłanie danych do widoków), ale ja potrzebuję zrobić automatyczny routing. Czyli na podstawie bazy danych muszę wygenerować routingi i je obsłużyć za pomocą kontrolera.

Załóżmy, że w bazie mam wpisy: about_us, contact -> na tej podstawie tworzone musi być menu w belce oraz do tego menu podpięty odpowiedni routing (np. @Route("{lang}/about") ). Ręcznie nie ma problemu z tym. Początkowo myślałem, że będzie musiał być do tego generowany kontroler, a dokładniej jego metody ze względu na to, że każda metoda zwracałaby co innego, ale po dłuższej chwili namysłu doszedłem ze znajomym do wniosku, że w sumie nie jest to potrzebne, a potrzebne dane z bazy, które mają być umieszczone w widoku mogą być generowane i wysyłane. Każdy twig już by sobie tam odebrał co potrzebne.

Co mi doradzali ? Zapoznanie się z Symfony CMF, a dokładniej routingExtraBundle. Przyjrzałem się, uruchomiłem, przeglądałem i nadal nie mogę pojąć jak to zrobić. Czytałem też dokumentację tego, ale niestety nie daję rady.

Tutaj chyba byłbym zmuszony o jakieś łopatologiczne wyjaśnienie działania tego, najlepiej prosty przykład, na którym mógłbym sprawdzić działanie tego, zmienić coś i zobaczyć co się zmienia.
Krzysztof Z.

Krzysztof Z. Programista PHP/
Webdeveloper

Temat: Osoba, która odpowie na kilka pytań

Zakładam, że masz wartości slug w bazie danych unikalne dla każdego rekordu.

Definiujesz routing np. taki:

@Route("{lang}/{$slug}")


i kontrolerze akcje:

public function pageAction($slug) {}


i w tej akcji wybierasz z bazy danych rekord odpowiadający odpowiedniej wartości slug.
np:

$rep->getOneBySlug($slug)


Dodatkowo zainteresuj się tym dodatkiem:
https://github.com/l3pp4rd/DoctrineExtensions

Pozdrawiam

Temat: Osoba, która odpowie na kilka pytań

Hmmm zaraz zacznę testować, ale czy ta wartość musi być Unique ? Ze względu na to, że mam w sumie podwójne wpisy w bazie
Id / Name / Content / Lang / Slug
1 / about / I am the best / en_EN / about
2 / about / Jestem najlepszy / pl_PL / about

W sumie jest Name === Slug.
Mogę też zrobić zapytanie:
SELECT content FROM contents WHERE name=$slug AND lang=$lang...

Skoro tak to można zrobić, to czemu polecali mi na innym forum tego bundle z Symfony CMF ?
Krzysztof Z.

Krzysztof Z. Programista PHP/
Webdeveloper

Temat: Osoba, która odpowie na kilka pytań

Można zrobić i tak jak mówisz ale lepiej zmodyfikować slug zamiast about dać pl/about i wtedy masz porządek w bazie.

Skoro tak to można zrobić, to czemu polecali mi na innym forum tego bundle z Symfony CMF ?

Każdy ma własne upodobania ;)

Pozdrawiam.

Szymon Skirgajllo:
Hmmm zaraz zacznę testować, ale czy ta wartość musi być Unique ? Ze względu na to, że mam w sumie podwójne wpisy w bazie
Id / Name / Content / Lang / Slug
1 / about / I am the best / en_EN / about
2 / about / Jestem najlepszy / pl_PL / about

W sumie jest Name === Slug.
Mogę też zrobić zapytanie:
SELECT content FROM contents WHERE name=$slug AND lang=$lang...

Skoro tak to można zrobić, to czemu polecali mi na innym forum tego bundle z Symfony CMF ?

Temat: Osoba, która odpowie na kilka pytań

A internacjonalizacje pewnie lepiej robić w myśl i18n :)

w Symfony np: https://github.com/docteurklein/TranslatorBundle

po pierwsze i najwazniejsze nie ma sensu obciążać bazy danych redundantnymi danymi gdzie mamy przetłumaczony 1 string na rekord
po drugie jak będziesz chciał dodać 3, 4, n-ty język wystarczy przetłumaczyć 1 plik z keywordsami a nie dostosowywać cały kod

Temat: Osoba, która odpowie na kilka pytań

Jak do tego dodać w twigu odwołanie ?
Chodzi o to, że normalnie mógłbym dodać @Route(..., name="index"...) i w twigu {{ path('index') }}

Lepiej by to działało, ale teraz nie wiem czy można to ustawić poza @Route ?
Krzysztof Z.:
Zakładam, że masz wartości slug w bazie danych unikalne dla każdego rekordu.

Definiujesz routing np. taki:

@Route("{lang}/{$slug}")


i kontrolerze akcje:

public function pageAction($slug) {}


i w tej akcji wybierasz z bazy danych rekord odpowiadający odpowiedniej wartości slug.
np:

$rep->getOneBySlug($slug)


Dodatkowo zainteresuj się tym dodatkiem:
https://github.com/l3pp4rd/DoctrineExtensions

Pozdrawiam
Krzysztof Z.

Krzysztof Z. Programista PHP/
Webdeveloper

Temat: Osoba, która odpowie na kilka pytań

Coś w tym stylu:

path('index', {id:5, name:nazwa})

Temat: Osoba, która odpowie na kilka pytań

<li> <a href="{{ path('about', {"lang":"pl", "slug": "about"}) }}"> home </a></li> 


Tak ?
Nie działa, otrzymuję błąd z tą linią: Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("Route "about" does not exist.") in "MartaSiteBundle:Content:about.html.twig" at line 31.

Próbowałem też:
$response = $this->render("MartaMorawieckaSiteBundle:Content:$slug.html.twig", array('url_index' => '../' . $lang . '/' . $slug, 'url_about' => '../' . $lang . '/about'));
return $response;


No i wiadomo w Twigu: {{ path('url_about') }}
Lecz też error.
Krzysztof Z.

Krzysztof Z. Programista PHP/
Webdeveloper

Temat: Osoba, która odpowie na kilka pytań

Route "about" does not exist

Nie ma routingu "About"

sprawdź czy masz dobrze zadeklarowany.

Temat: Osoba, która odpowie na kilka pytań

Ale gdzie mam mieć to zadeklarowane ?

Kontroler:

/**
* @Route("{lang}/{slug}", requirements={"lang" = "(pl|en)"})
*/
public function pageAction($lang, $slug)
{


app/config/routing.yml

marta_morawiecka_site:
resource: "@MartaSiteBundle/Controller/"
type: annotation
prefix: /


EDIT::
Zrobiłem
<li> <a href="{{ path('page', {'lang':'pl', 'slug': 'about'}) }}"> home </a></li>


A w kontrolerze:

* @Route("{lang}/{slug}", requirements={"lang" = "(pl|en)"}, name="page")


Ale to chyba jeszcze nie do końca to, muszę się zastanowić jak przełączać język itd, a to wymaga konsultacji ze znajomym.Szymon Skirgajllo edytował(a) ten post dnia 20.12.12 o godzinie 18:28

Temat: Osoba, która odpowie na kilka pytań

Napotkałem kolejny problem.
Do bazy danych wrzuciłem w kolumny:

kontroler:

...
$json = json_decode($entities[0]->getContentJson());
$template = $entities[0]->getContentTwig();
$image = $json->data->image;
$content = $json->data->content;

$response = $this->render("MartaSiteBundle:Content:$slug.html.twig", array('template' => $template,'contents' => array('image' => $image, 'content' => $content)));
return $response;


contents_json

{ "data": { "image": "http://userserve-ak.last.fm/serve/_/240981/Elliott%20Smith.jpg", "content": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet nulla aliquet libero convallis ut tempus metus tempus. Maecenas sed ullamcorper nunc.</p><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet nulla aliquet libero convallis ut tempus metus tempus. Maecenas sed ullamcorper nunc.</p><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet nulla aliquet libero convallis ut tempus metus tempus. Maecenas sed ullamcorper nunc.</p><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet nulla aliquet libero convallis ut tempus metus tempus. Maecenas sed ullamcorper nunc.</p><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet nulla aliquet libero convallis ut tempus metus tempus. Maecenas sed ullamcorper nunc.</p>" } }


content_twig

<div class="wrapper">
<div id="title_about" class="title">
<div id="content_header_about">
<h1>O mnie</h1>
</div>
</div>

<div id="about">
{{ contents.content|raw }}
</div>
<div id="about_pic">
<img src="{{ asset(contents.image) }}">
</div>
</div>

<footer>
<div id="logo">
<a title="Home" href="index.html"><img src="{{ asset('images/logo.png') }}">Home</a>
</div>
<navigation>
<ul>
<li> <a href="index.html"> home </a></li>
<li> <a href="omnie.html"> o mnie </a></li>
<li> <a href="portfolio.html"> portfolio </a></li>
<li> <a href="publikacje.html"> publikacje </a></li>
<li> <a href="http://link.com/blog"> blog </a></li>
<li> <a href="opinie.html"> opinie </a></li>
<li> <a href="wspolpraca.html"> współpraca </a></li>
<li> <a href="odkuchni.html"> od kuchni </a></li>
<li> <a href="kontakt.html"> kontakt </a></li>
</ul>
</navigation>
</footer>


Wszystko jestem w stanie pobrać itd, wszystko PRAWIE się wyświetla w widoku.

Sam widok wygląda w ten sposób:

{% extends ('::base.html.twig') %}

{% block body %}
{{ template|raw }}
{{ contents.content }}
{% endblock %}

z {{ contents.content|raw }} tez próbowałem tyle tylko się zmieniło, że tekst wyświetlił się sformatowany.

template|raw działa znakomicie, gdyby nie fakt, że nie ładuje mi przekazany content i image...
Podejrzewam, że problemem jest zawartość kolumny content_twig, w której z góry zadeklarowane mam miejsca, w których ma się wyświetlić zdjęcie i opis.

Chodzi mi o pobranie szablonu twig z bazy, załadowanie go do pliku co mi się w sumie udało, ale przestało mi rozróżniać polecenia twig.

Mam nadzieję, że mnie rozumiecie.Szymon Skirgajllo edytował(a) ten post dnia 20.12.12 o godzinie 23:33
Piotr Lewandowski

Piotr Lewandowski Programista
aplikacji
internetowych (PHP,
MySQL, SF2, Mag...

Temat: Osoba, która odpowie na kilka pytań

Szymon Skirgajllo:

template|raw działa znakomicie, gdyby nie fakt, że nie ładuje mi przekazany content i image...
Podejrzewam, że problemem jest zawartość kolumny content_twig, w której z góry zadeklarowane mam miejsca, w których ma się wyświetlić zdjęcie i opis.

Chodzi mi o pobranie szablonu twig z bazy, załadowanie go do pliku co mi się w sumie udało, ale przestało mi rozróżniać polecenia twig.

Mam nadzieję, że mnie rozumiecie.


Musisz wyrenderować ten template. W tej chwili tylko wyświetlasz zawartość.

zerknij:
http://twig.sensiolabs.org/doc/functions/template_from...
albo jeśli wolisz wyrenderować jeszcze w kontrolerze:
https://github.com/r1pp3rj4ck/TwigstringBundle

Temat: Osoba, która odpowie na kilka pytań

Sposób prawie ok albo ja robię coś źle, bo otrzymuję wyjściowy komunikat:
The controller must return a response (u v x y z 1 2 3 4 5 given).


W kontrolerze mam dokładnie to co na https://github.com/r1pp3rj4ck/TwigstringBundle
czyli:

/**
* @Route("{lang}/{slug}", requirements={"lang" = "(pl|en)"}, name="page")
*/
public function pageAction($lang, $slug)
{

// get twigstring service
$tpl_engine = $this->get('twigstring');

// render example string
$vars['test'] = 'u ' . $tpl_engine->render('v {{ var }} {% if var is defined %} y {% endif %} z{% for i in 1..5 %} {{ i }}{% endfor %}', $vars);
return $vars['test'];


Oczywiście próbowałem też na swoim przykładzie, ale wtedy dostawałem również komunikat: (po usunięciu asset, otrzymywałem komunikat podobny do powyższego, więc w sumie nic nowego nie odkryłem)
The function "asset" does not exist in.... <img src="{{ asset('contents.image') }}"> ...

Do powyższego dodam, że nie działa też bez apostrofów.

Natomiast w bazie jest to zapisane w sposób:
<div id="about_pic">
<img src="{{ asset('contents.image') }}">
</div>


EDIT::
Trochę mnie oświeciło, już działa renderowanie widoku itd, ale pytanie teraz co dalej z asset ? Bo dalej wywala błąd.
Dodatkowo nie działa w twigu komenda
app.request.basepath
która mogłaby mi tu pomóc w ostateczności.Szymon Skirgajllo edytował(a) ten post dnia 22.12.12 o godzinie 15:30

Temat: Osoba, która odpowie na kilka pytań

Witam, kolejne pytanko zadanko, z którym nie mogę sobie poradzić:

Mam controller, w którym zadeklarowane jest:
@Route("{lang}/{slug}", requirements={"lang" = "(pl|en)"})


to działa spoko jeśli chodzi o pojedyncze podstrony typu about-me, contact etc, ale co mam zrobić z galerią ?
Tutaj może być np:
1) /pl/gallery/
2) /pl/gallery/dzial1/
3) /pl/gallery/dzial1/zdjecia-fashion/
4) /pl/gallery/dzial1/zdjecia-fashion/12

Czyli ogólnie może być różnie, nigdy nie wiem jak ktoś będzie chciał to dodać, ale ma działać automatycznie.

Pracuje na plikach json, więc pewne informacje mogę trzymać w nich np. to jak jest zbudowane menu czy submenu.
Największym problemem na razie wydaje mi się to ładowanie danych do kontrolera, gdzie url jest różny, a route jeden.
Piotr Lewandowski

Piotr Lewandowski Programista
aplikacji
internetowych (PHP,
MySQL, SF2, Mag...

Temat: Osoba, która odpowie na kilka pytań

Taki szybki pomysł


@Route("{lang}/gallery/{slug}", requirements={"lang" = "(pl|en)", "slug" = ".+"})


2) /pl/gallery/dzial1/
3) /pl/gallery/dzial1/zdjecia-fashion/
4) /pl/gallery/dzial1/zdjecia-fashion/12


@Route("{lang}/gallery", requirements={"lang" = "(pl|en)"})


1) /pl/gallery/

Jako że reguły routingu są dopasowywane od góry do dołu (pierwsza znaleziona kończy proces)
umieśc to przed:


@Route("{lang}/{slug}", requirements={"lang" = "(pl|en)"})


Odrazu dodam, że aby {slug} normalnie nie może zawierać slasha, więc diabeł tkwi tutaj:


"slug" = ".+"


I oczywiście musisz uważać z tego typu wildcardami bo możesz "pochłonąć inne reguły". Nalepiej dodaj je na samym końcu jak możesz.

Temat: Osoba, która odpowie na kilka pytań

Jeszcze zapomniałem dopisać, że może być
gallery lub galeria, w zależności od języka.

Jak to ogarnąć ?

W sumie mógłbym zrobić

@Route("{lang}/{content}/{slug}.... requirements={"content" = "(galeria|gallery)"....

Ale to nie zadziała mi za dobrze chyba, gdy tam będzie pl/about...
Czy też jakaś kolejność ma tutaj znaczenie ?

Albo tak sobie myślę, że jeszcze inaczej, bo np informacja o możliwych językach jest trzymana w pliku site.json i stamtąd chciałbym ją pobierać i dopiero na tej podstawie tworzyć odpowiedni routing.Szymon Skirgajllo edytował(a) ten post dnia 07.01.13 o godzinie 19:02
Piotr Lewandowski

Piotr Lewandowski Programista
aplikacji
internetowych (PHP,
MySQL, SF2, Mag...

Temat: Osoba, która odpowie na kilka pytań

Hmm.. jak masz gallery i galeria to może w url nie potrzebujesz juz "pl"? ;-)
A locale jako defualt w parametrach routingu?

Temat: Osoba, która odpowie na kilka pytań

Myślę, że właśnie muszę to mieć w url, ponieważ przy zmianach językach to powinno być tak zachowane i po wejściu kogoś na stronę np en/about lub pl/o-mnie otwierają się od razu w danym języku.

"metadata": {
"version": "1.00",
"generator": "Admin v.4",
"contents_path": "data/contents",
"twig_path": "data/twig",
"languages": "pl_PL|en_EN"
},
"contents": [
{
"id": 1,
"slug": "start",
"name": "Home",
"lang": "en_EN",
"file_content": "start_en.json",
"file_twig": "start_en.html.twig"
},
{
"id": 2,
"slug": "start",
"name": "Home",
"lang": "pl_PL",
"file_content": "start_pl.json",
"file_twig": "start_pl.html.twig"
},
{
"id": 3,
"slug": "about",
"name": "About",
"lang": "en_EN",
"file_content": "about_en.json",
"file_twig": "about_en.html.twig"
},
{
"id": 4,
"slug": "o-mnie",
"name": "O mnie",
"lang": "pl_PL",
"file_content": "o_mnie_pl.json",
"file_twig": "o_mnie_pl.html.twig"
},


To jest fragment pliku json, jak widać na jego podstawie jest pobierany slug, name (do menu potrzebne), lang jest sprawdzany i dalej wiem, które pliki pobrać i otwierać.
W całej tej stronie chodzi o jak największą automatyzację oraz współpracę z administratorem (powiedzmy CMS).
Jeszcze w metadata możesz zauważyć, że jest ""languages": "pl_PL|en_EN""
I teraz jeśli ktoś będzie chciał stworzyć np jeszcze język niemiecki dodatkowo, to wystarczy, że dodałby tutaj do tego "|de_DE", stworzył następujące wpisy w contents i dodał tłumaczenia na niemiecki.



Wyślij zaproszenie do