Krzysztof Biernacki programista PHP
Temat: [admin-generator] Jak okiełznać to "ustrojstwo"?
Witajcie.Z Symfony 1.4 pracuję od niedawna. Wcześniej miałem styczność tylko z wersją 1.0, więc uprzejmie proszę o wyrozumiałość i pomoc. Ogólnie rzecz ujmując, mam problem z admin-generatorem i relacjami artykułów z kategoriami.
Może na początek pytanie: czy wszelkie akcje, moduły etc. wygenerowane przy użyciu admin-generatora są dostępne tylko i wyłącznie w katalogu 'cache'? Czy jest możliwość ich "usytuowania" na stałe w jednym miejscu - tak jak w przypadku CRUD w apps/backend/modules? Chciałbym nieco zmodyfikować wygląd i funkcjonalność, ale za każdym razem gdy cache jest czyszczony efekty mojej pracy znikają.
Poza tym, w bazie danych posiadam m.in. takie oto tabele i rekordy:
Tabela 'Kategoria'
| id | kategoria_id | nazwa |
Tabela 'hashująca' - 'Kategoria_has_Artykul'
| kategoria_id | artykul_id |
Tabela 'Artykul'
| id | tytul | tresc |
Na stronie właściwej mają się znajdować dwie główne kategorie: 'dla mieszkańca', 'dla studenta' (w przyszłości możliwość dodania nowej grupy tematycznej). Oprócz tego ma być dostępne menu składające się z kategorii i podkategorii (podkategorie mają się wyświetlać po najechaniu na kategorie). Nazwy kategorii i podkategorii są stałe (menu jest globalne i wygląda zawsze tak samo, bez względu na wybór grupy tematycznej - np.: 'dla studenta'), z tymże skojarzone z nimi artykuły są zależne od kategorii głównych: 'dla mieszkańca', 'dla studenta'.
Czyli przykładowo: Klikamy 'dla mieszkańca', następnie 'Wiadomości' (kategoria), 'Prasa' (podkategoria) i na podstronie wyświetlają się artykuły skojarzone z tymi działami. Kiedy wybierzemy 'dla studenta'->'Wiadomości'->'Prasa' mają się wyświetlić artykuły dla grupy tematycznej związanej ze studiami.
Stworzyłem formsy dla kategorii, artykułów - dane są zapisywane do bazy, jak i pomyślnie z niej odczytywane, ale... W jaki sposób zrobić powiązania artykułów z kategoriami? Chciałbym w formularzu dodawania nowego artykułu, bądź przy jego edycji, mieć drzewko z kategoriami do wyboru.
Mój plik 'generator.yml' wygląda następująco:
generator:
class: sfDoctrineGenerator
param:
model_class: Article
theme: admin
non_verbose_templates: true
with_show: false
singular: ~
plural: ~
route_prefix: article
with_doctrine_route: true
actions_base_class: sfActions
config:
actions: ~
fields:
title: { label: Tytuł, help: Tytuł artykułu }
thumb: { label: Miniaturka, help: Miniaturka }
created_at: { label: Data utworzenia }
updated_at: { label: Data aktualizacji }
is_active: { label: Aktywny }
list:
title: Zarządzanie artykułami
layout: stacked
display: [title, thumb, created_at, updated_at, is_active]
max_per_page: 30
filter:
display: [created_at]
form: ~
edit:
title: Edycja artykułu - "%%title%%"
new:
title: Dodaj artykuł
Natomiast plik 'ArticleForm.class.php' przedstawia się następująco:
class ArticleForm extends BaseArticleForm
{
protected static $artIsActive = array('true' => 'Tak', 'false' => 'Nie');
public function configure() {
$this->disableCSRFProtection();
$this->setWidgets(array(
'title' => new sfWidgetFormInput(array(), array('class' => 'artInput')),
'keywords' => new sfWidgetFormInput(array(), array('class' => 'artInput')),
'description' => new sfWidgetFormTextarea(array(), array('class' => 'no-editor')),
'text' => new sfWidgetFormTextarea(),
'image' => new sfWidgetFormInput(array(), array('class' => 'artInput')),
'created_at' => new sfWidgetFormDate(array('format' => '%year% - %month% - %day%')),
'updated_at' => new sfWidgetFormDate(array('format' => '%year% - %month% - %day%')),
'is_active' => new sfWidgetFormSelect(array('choices' => self::$artIsActive))
));
$this->widgetSchema->setLabels(array(
'title' => 'Tytuł',
'keywords' => 'Słowa kluczowe',
'description' => 'Skrócony opis (description)',
'text' => 'Treść',
'image' => 'Zdjęcie (charakterystyczne)',
'created_at' => 'Data utworzenia',
'updated_at' => 'Data modyfikacji',
'is_active' => 'Aktywny'
));
$this->setValidators(array(
'title' => new sfValidatorString(array('min_length' => 3, 'max_length' => 255), array(
'required' => 'Wpisz tytuł artykułu.',
'min_length' => 'Tytuł artykułu jest za krótki. Musi składać się z co najmniej %min_length% znaków.',
'max_length' => 'Tytuł artykułu jest za długi. Może składać się z co najwyżej %max_length% znaków.'
)),
'keywords' => new sfValidatorString(array('required' => false
)),
'description' => new sfValidatorString(array('min_length' => 3, 'max_length' => 255), array(
'required' => 'Wpisz skrócony opis artykułu.',
'min_length' => 'Skrócony opis artykułu jest za krótki. Musi składać się z co najmniej %min_length% znaków.',
'max_length' => 'Skrócony opis artykułu jest za długi. Może składać się z co najwyżej %max_length% znaków.'
)),
'text' => new sfValidatorString(array('min_length' => 3), array(
'required' => 'Wpisz treść artykułu.',
'min_length' => 'Treść artykułu jest za krótka. Musi składać się z co najmniej %min_length% znaków.'
)),
'image' => new sfValidatorString(array(
'required' => false
)),
'created_at' => new sfValidatorDate(array(
'required' => false
)),
'updated_at' => new sfValidatorDate(array(
'required' => false
)),
'is_active' => new sfValidatorChoice(array(
'choices' => array_keys(self::$artIsActive),
'required' => false
)),
));
}
}
Pomoże ktoś? Byłbym wdzięczny.