V celé aplikaci bude jistě spousta míst, na kterých budeme potřebovat nějaké standarní informace a hodnoty - email administrátora stránek, kolik novinek se má vypisovat na homepage, obrázek loga, kód Google Analytics atd.
Dnes si tedy vyrobíme modul pro nastavení aplikace a v něm všechny potřebné hodnoty nastavíme.
Už nebudu popisovat dopodrobna umístění souborů a ani kompletní obsah. Takže k modelu a entitám: do entity Setting.php vlož jen 2 vlastnosti:
/**
* @var string
*
* @ORM\Column(type="string", length=20, nullable=false)
*/
private $field;
/**
* @var string
*
* @ORM\Column(type="text", nullable=false)
*/
private $value;
Doplň gettery a settery. Pak SettingFacade.php bude celkem standarní, jen kvůli naplnění editačního formuláře, budeme potřebovat metodu getPairs, která vrátí asociované pole hodnot:
public function getPairs()
{
return $this->repository->findPairs('value', 'field');
}
V adminModule vyrobíme komponentu SettingDetail.php i s Interface a šablonou. V SettingDetail.php vypíšu metodu pro vytvoření formuláře:
public function createComponentDetailForm()
{
$form = $this->formFactory->create();
$form->addText('siteName', "Název stránek")
->setAttribute('placeholder', "Název stránek")
->setAttribute('class', 'col-sm-9 form-control form-control-sm')
->setRequired("Zadejte prosím Název stránek");
$form->addText('adminMail', "E-mail administrátora stránek")
->setAttribute('placeholder', "E-mail administrátora stránek")
->setAttribute('class', 'col-sm-9 form-control form-control-sm')
->setRequired("Zadej prosím e-mail administrátora stránek");
$form->addText('companyAddress', "Firemní adresa")
->setAttribute('placeholder', "Firemní adresa")
->setAttribute('class', 'col-sm-9 form-control form-control-sm');
$form->addText('companyPhone', "Firemní telefon")
->setAttribute('placeholder', "Firemní telefon")
->setAttribute('class', 'col-sm-9 form-control form-control-sm');
$form->addText('logo', "Logo")
->setAttribute('placeholder', "Logo")
->setAttribute('id', "logo")
->setAttribute('class', 'col-sm-9 form-control form-control-sm');
$form->addTextArea('ownScriptHead', "Vlastní javascript v hlavičce")
->setAttribute('placeholder', "Vlastní javascript v patičce")
->setAttribute('class', 'form-control form-control-sm')
->setAttribute('rows', '20');
$form->addTextArea('ownScriptFoot', "Vlastní javascript v patičce")
->setAttribute('placeholder', "Vlastní javascript v patičce")
->setAttribute('class', 'form-control form-control-sm')
->setAttribute('rows', '20');
$form->addTextArea('ownCss', "Vlastní CSS styly")
->setAttribute('placeholder', "Vlastní CSS styl")
->setAttribute('class', 'form-control form-control-sm')
->setAttribute('rows', '20');
$form->addSubmit('process', "Uložit")
->setAttribute('class', 'btn btn-primary');
$facade = $this->facade;
$form->onSuccess[] = function (Form $form) use ($facade) {
$values = $form->getValues();
foreach ($values as $field => $value) {
$setting = $this->facade->findOneBy(['field' => $field]);
$setting->setValue($value);
$this->facade->save($setting);
}
};
return $form;
}
Metoda pro uložení hodnot počítá s tím, že pole jsou už v databázové tabulce uložena. Čili importuj do tabulky setting následující:
INSERT INTO `setting` (`id`, `field`, `value`) VALUES
(1, 'adminMail', 'mail@rsrs.loc'),
(2, 'siteName', 'RS:RS systém'),
(3, 'ownScriptHead', ''),
(4, 'logo', ''),
(5, 'companyPhone', ''),
(6, 'companyAddress', ''),
(7, 'ownScriptFoot', ''),
(8, 'ownCss', '')
Ty hodnoty si klidně uprav či doplň jak potřebuješ podle toho, co plánuješ používat. V presenteru pak vytvoř konponentu a všabloně ji vlož.
Nezapomeň na dependenci injection, takže v DI vyrob SettingExtension.php a ponech vše podle standardního vzoru. Do příslušného setting.neon dodej jen 2 služby:
services:
- SettingModule\AdminModule\Components\Setting\Detail\ISettingDetailFactory
- SettingModule\Model\Facade\SettingFacade
Do app/config/common.neon přidej rozšíření:
setting: SettingModule\DI\SettingExtension
Přidej ho nad řádek homepage, což už jsem snad zmiňoval v nějaké předchozí kapitole.
Musíme vygenerovat novou tabulku v databázi. Stačí zadat do command line příkaz:
php index.php orm:schema-tool:update -f
No, minule jsem zapomněl na malou úpravu v konfiguraci www/js/filemanager/config/config.php. Půjde o nastavení cesty ke složce s nahranými obrázky a soubory. Najdi řádek:
'current_path' => '../source/',
a změň ho na:
'current_path' => '../../source/',
Pak taky založ složku www/source. Do ní se bude ukládat to, co uploadneme. Šablonu komponenty Setting.detail.latte tu vypíšu kvůli tomu logu:
<div class="row" id="snippet--grid">
<div class="col-sm-12" id="snippet-grid-grid">
<div class="panel panel-default datagrid datagrid-grid">
<div class="panel-body">
<div class="box box-success">
<div class="box-header with-border">
<h3 class="box-title">Nastavení</h3>
</div>
<!-- /.box-header -->
<!-- form start -->
<form n:name=detailForm class="form-horizontal card card-1">
<ul class="nav nav-tabs">
<li class="nav-item">
<a class="nav-link active" data-toggle="tab" href="#application">Aplikace</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#owncsript">Vlastní javascript</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#owncss">Vlastní CSS</a>
</li>
</ul>
<div class="tab-content">
<div> </div>
<div id="application" class="tab-pane small active">
<div class="form-group">
<div class="input-group mb-3">
<div class="col-md-12 form-group form-inline">
<div class="col-md-12 form-group form-inline">
<div class="col-sm-3">
<label class="col-form-label justify-content-end" n:name=siteName>
Název webu:</label>
</div>
{input siteName}
</div>
<div class="col-md-12 form-group form-inline">
<div class="col-sm-3">
<label class="col-form-label justify-content-end" n:name=adminMail>
E-mail správce:</label>
</div>
{input adminMail}
</div>
<div class="col-md-12 form-group form-inline">
<div class="col-sm-3">
<label class="col-form-label justify-content-end" n:name=companyAddress>
Adresa:</label>
</div>
{input companyAddress}
</div>
<div class="col-md-12 form-group form-inline">
<div class="col-sm-3">
<label class="col-form-label justify-content-end" n:name=companyPhone>
Telefon:</label>
</div>
{input companyPhone}
</div>
<div class="col-md-12 form-group form-inline">
<div class="col-sm-3">
<label class="col-form-label justify-content-end" n:name=logo>
<a data-toggle="modal" href="javascript:;"
data-target="#logoModal">
Logo:
</a>
</label>
</div>
{input logo}
</div>
</div>
</div>
</div>
</div>
<div id="owncsript" class="tab-pane fade">
<div class="form-group">
<div class="input-group mb-3">
<div class="col-md-12 form-group">
<label class="col-form-label justify-content-end" n:name=ownScriptHead>
Vlastní javascript v hlavičce:</label>
{input ownScriptHead}
</div>
<div class="col-md-12 form-group">
<label class="col-form-label justify-content-end" n:name=ownScriptFoot>
Vlastní javascript v patičce:</label>
{input ownScriptFoot}
</div>
</div>
</div>
</div>
<div id="owncss" class="tab-pane">
<div class="form-group">
<div class="input-group mb-3">
<div class="col-md-12 form-group">
<label class="col-form-label justify-content-end" n:name=ownCss>
Vlastní CSS:</label>
{input ownCss}
</div>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-12">
{input process}
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- The Modal -->
<div class="modal fade" id="logoModal">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Logo</h4>
<button type="button" class="close" data-dismiss="modal">×</button>
</div>
<div class="modal-body">
<iframe src="/js/filemanager/dialog.php?type=2&field_id=logo'&fldr=" scrolling="no"
frameborder="0" style="overflow: hidden; width:100%; height: 400px;"></iframe>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal">Zavřít</button>
</div>
</div>
</div>
</div>
</div>
Celé kouzlo je v tom modal okně, které se spustí kliknutím na label toho loga.
Takže pak už jen zadat http://rsrs.loc/admin/setting a zkusit si vyplnit a uložit. Jakmile pak kdekoli potřebuješ něco z nastavení, vytáhni si v příslušném presenteru buď všechna nastavení pomocí:
$this->settingFacade->getPairs();
nebo jen jednu konkrétní hodnotu, třeba telefon:
$this->settingFacade->findOneBy(['field' => 'companyPhone'])->getValue();
Dnes to bylo těžší hlavně proto, že jsem tě nechal už dost samostatně pracovat. Ale nezoufej, pokud se ti to nepovedlo rozchodit. Jako vždy si totiž můžeš stáhnout aplikaci takovou, jaká je k dnešnímu dni.