Využití modulu Settings

Rudolf Svátek 2016-07-29 09:06

Pokud chceš, můžeš si apikaci po dnešní kapitole stáhnout: kapitola23.zip.

V administraci jsme si dělali modul Settings. Dá se tam nastavit spousta věcí - kontaktní údaje na majitele stránek, logo, motto, SMTP server atd. Už jsme narazili třeba na situaci, kdy jsme do hlavní šablony vložili motto, ale jen ručně. Nebo vypisujeme 5 novinek, ale co když jich majitel stránek, kterému nasadíme náš redakční systém, bude chtít jen 3? Podobně je to v situaci, kdy odesíláme mail. Už na 2 místech jsme nastavovali SMTP server. To trochu odporuje dobrému zvyku psát něco jen jednou. K tomu všemu začneme využívat modul Settings.

Úprava BasePresenteru

Jelikož modul Settings budeme využívat vlastně všude, bude samozřejmé, že starost o něj necháme na BasePresenteru. První co uděláme je, že předáme závislosti na službách Settings. To, co tam už máš, to tam nech, ale přidej:

use App\Model\SettingsRepository;
use App\Model\SettingsEntity;

abstract class BasePresenter extends Presenter
{

	/** @var SettingsRepository @inject */
	public $settingsRepository;

	/** @var SettingsEntity */
	protected $settings;

	public function startup() {
		parent::startup();
		$this->settings = $this->settingsRepository->getAll()->fetchPairs('field', 'value');
	}

	public function beforeRender() {
		parent::beforeRender();
		$this->getTemplate()->settings = $this->settings;
	}

V metodě stratup() nastavíme parametr $this->settings, aby ho mohly používat všechny presentery, které dědí z BasePresenteru. A žádný, který z něj nedědí, ani nechceme mít. Metoda beforeRender() se volá, jak už napovídá název, před vykreslením šablony. Máme tu tedy prostor ještě něco se šablonou udělat. My do ní předáme proměnnou settings.

Jestli si chceš vyzkoušet jak to funguje, začneme něčím jednoduchým. Například v hlavní šabloně @layout.latte najdi ty 2 motta a nahraď je za:

	<div id="divLogo" class="pull-left">
		<a n:href="Homepage:default" id="divSiteTitle">{$settings['motto1']}</a><br/>
		<a n:href="Homepage:default" id="divTagLine">{$settings['motto2']}</a>
	</div>

Samozřejmě předpokládám, že máš v administraci motta vyplněna, aby bylo co zobrazit. Zobraz si tedy stránky teď a uvidíš svá motta. V jakékoli šabloně tedy můžeš používat proměnnou $settings a uvedením správného klíče vypíšeš jeho hodnotu. Snadné.

Teď jak toho využít v presenterech. Třeba pro připojení k mail serveru. V BasePresenteru vytvoř metodu, která zaprvé rozhodne, zda použít mailový server tvého webového serveru, nebo se rozhodne pro SMTP server. Rozhodovací procedura a nastavení SMTP se zase řídí tím, co máš vyplněno v administraci na kartě SMTP server. Takže ta metoda:

	/**
	 * @return SendmailMailer|SmtpMailer
	 */
	protected function setMailer() {
		if ($this->settings['useMail']) {
			/** @var SendmailMailer mailer */
			$mailer = new SendmailMailer;
		} else {
			/** @var SmtpMailer mailer */
			$mailer = new SmtpMailer([
				'host' => $this->settings['smtpHost'],
				'username' => $this->settings['smtpUsername'],
				'password' => $this->settings['smtpPassword'],
				'secure' => $this->settings['smtpSecure'],
			]);
		}
		return $mailer;
	}

Jelikož používám zkrácenou cestu bez NameSpace, nesmíš zapomenout na:

use Nette\Mail\SendmailMailer;
use Nette\Mail\SmtpMailer;

No, a od této chvíle, kterýkoli presenter potřebuje poslat mail, může si zavolat metodu $this-> setMailer() a všechno dostane připraveno. Zkusíme to třeba s kontaktním formulářem. V BasePresenteru máme metodu createComponentContactForm(), kterou mírně upravíme. Doplníme volání metody setSettings a také setMailer nad objektem komponenty:

	/**
	 * @return ContactControl
	 */
	protected function createComponentContactForm() {
		$control = new ContactControl($this->pagesRepository, $this->formFactory);
		$control->setSettings($this->settings);
		$control->setMailer($this->setMailer());
		return $control;
	}

Ty 2 volané metody v komponentě ještě nejsou, čili je nutné je doplnit. Komponenta kontaktního formuláře teď vypadá takto:

<?php

namespace App\FrontModule\Controls;

use App\Model\PagesRepository;
use App\Forms\FormFactory;
use Nette\Application\UI;
use Nette\Mail\Message;
use Kdyby\BootstrapFormRenderer\BootstrapRenderer;

class ContactControl extends UI\Control
{

	/** @var PagesRepository */
	private $pagesRepository;

	private $mailer;
	private $settings;

	/** @var FormFactory */
	private $factory;

	/**
	 * @param PagesRepository $pagesRepository
	 */
	public function __construct(PagesRepository $pagesRepository, FormFactory $factory) {
		parent::__construct();
		$this->pagesRepository = $pagesRepository;
		$this->factory = $factory;
	}

	/**
	 * @param $mailer
	 */
	public function setMailer($mailer) {
		$this->mailer = $mailer;
	}

	/**
	 * @param $settings
	 */
	public function setSettings($settings) {
		$this->settings = $settings;
	}

	public function render() {
		$this->getTemplate()->setFile(__DIR__ . '/ContactControl.latte');
		$this->getTemplate()->render();
	}

	/**
	 * @return UI\Form
	 */
	public function createComponentContactForm() {
		$form = $this->factory->create();

		$form->addText('name', 'Vaše jméno:')
				->addRule(UI\Form::FILLED, 'Zadejte jméno')
				->setAttribute('class', 'form-control input-sm');
		$form->addText('email', 'Vaše e-mailová adresa:')
				->addRule(UI\Form::EMAIL, 'Email nemá správný formát')
				->setAttribute('class', 'form-control input-sm');
		$form->addText('subject', 'Předmět:')
				->addRule(UI\Form::FILLED, 'Zadejte předmět')
				->setAttribute('class', 'form-control input-sm');

		$form->addTextArea('message', 'Zpráva:')
				->addRule(UI\Form::FILLED, 'Zadejte zprávu')
				->setAttribute('class', 'form-control input-sm');

		$form->addSubmit('process', 'Odeslat')
				->setAttribute('class', 'btn btn-primary');

		$form->setRenderer(new BootstrapRenderer);
		$form->getElementPrototype()->class('form-horizontal');

		$form->onSuccess[] = callback($this, 'processForm');
		return $form;
	}

	/**
	 * @param UI\Form $form
	 */
	public function processForm(UI\Form $form) {
		$values = $form->getValues();
		$template = $this->createTemplate();
		$mail = new Message;

		$template->setFile(__DIR__ . '/../presenters/templates/Emails/contactForm.latte');

		$mail->addTo($this->settings['adminMail'])
				->setFrom($values['email']);

		$template->title = 'Zpráva z kontaktního formuláře';
		$template->values = $values;
		$mail->setHtmlBody($template);
		
		$this->mailer->send($mail);
		$this->flashMessage('Zpráva byla odeslána');
		$this->presenter->redirect('Pages:view', ['id' => $this->settings['thanksPage']]);
	}
}

Všimni si nově i použití proměnné $settings. Například přesměrování na děkovnou stránku po odeslání formuláře proběhne na stránku, kterou si zvolíš v administraci nastavení.

TIP: Jestli používáš SMTP Google, pak se ujisti, že máš povoleno přihlášení z méně zabezpečených aplikací - https://www.google.com/settings/security/lesssecureapps

Co dál? Můžeš upravovat další presentery, komponenty, šablony. Například pokud jsi dělal komponentu pro zobrazování novinek, je tam limit na 5 nejčerstvějších novinek. V administraci nastavení je ale pole "Počet stránek ve výpisu". No proč to nevyužít? Přímo ti to tu už vypisovat nebudu, ale jistě víš co dělat - doplnit do komponenty metodu setSettings() a upravit v BasePresenteru metodu pro vznik komponenty. Fakt je to takhle snadné :-)

Čili vypisovat všechna místa, kde se změní napevno vložené řetězce za to, co mám v $settings tady nebudu. Ale pokud chceš, můžeš si apikaci po dnešní kapitole stáhnout: kapitola23.zip.

To už je dnes všechno. Příště se podíváme na přívětivější URL adresy, aby uživatelé neviděli při prohlížení stránek něco jako http://localhost:8000/pages/view/5, ale hezčí http://localhost:8000/redakcni-system.

Redakční systém RS::RS Předchozí kapitola

Zobrazení fotogalerie

Redakční systém RS::RS Celý seriál

Vývoj redakčního systému v PHP

Redakční systém RS::RS Následující kapitola

Uživatelsky přívětivá URL

Komentáře (0)

Přidej svůj komentář

O mně

Jmenuji se Rudolf Svátek. Jsem lektor výpočetní techniky a PHP programátor. Stavím firemní stránky a eshopy. Aby se mi to dělalo pohodlně, vytvořil jsem redakční systém RS::RS, který ti tu nabízím k použití.

Rychlý kontakt na mně

  • Rudolf Svátek
  • Telefon:
    +420 777 828 353
  • Email:
  • Adresa:
    Josefa Hory 1097/5
    736 01 Havířov
    ČR



Tyto stránky používají Cookies. Používáním stránek s tím souhlasíte Další informace