„struktura“ presenterů – vaše zkušenosti?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Arynev
Člen | 33
+
0
-

Co je lepší? S čím máte lepší zkušenosti?

a)

ArticlePresenter:
	actionAdd
	actionedit
	actionList
	actionDefault (display article)

b)

AddPresenter:
	actionArticle
	actionPage
EditPresenter:
	actionArticle
	actionPage
ListPresenter:
	actionArticle
	actionPage

c)

ArticlePresenter:
	actionDefault (display)
	actionList
ManageArticlePresenter:
	actionList
	actionAdd
	actionEdit

Doufám že je to dosti jasné. Myslím že B je lepší, jak se na to koukají zkušenější? Vidíte v B nějaké zádrhely

Ascaria
Člen | 187
+
0
-
  1. je blbost, to se zvencneš.

podle mě je nejlepší C buďto jak je uvedeno, a nebo s drobnou úpravou:

\ArticleModule\DefaultPresenter:
        actionDefault (display)
        actionList
\ArticleModule\ManagePresenter:
        actionList
        actionAdd
        actionEdit

Já jsem chtěl si udělat web modulárně a tak jsem skončil s něčím takovým:

\ArticleModule\AdminModule\ManagePresenter
\ArticleModule\FrontModule\DefaultPresenter

Každý modul má svůj administrativní a veřejný submodul. Pokud se rozhodnu přidat další typ modulu, třeba Cron, můžu třeba udělat:

\ArticleModule\CronModule\DefaultPresenter
Arynev
Člen | 33
+
0
-

Díky za odpověď. Můžeš prosím víc rozepsat kde v tom vidíš problém? Je pravda že zatím využívám C, ale nelíbí se mi v manage presenterech list + add. Jedná se o zcela odlišné funkce.

Moduly se mi moc neosvědčily. Zbytečně moc práce a nevidím tam přidanou hodnotu. Dělám spíš jednoduché weby.

Ascaria
Člen | 187
+
0
-

Podle mě je b) špatné proto, že se pokoušíš presenter změnit na action (přidání položky = action), a action se snažíš přeměnit na presenter (presenter je správce, manager, nemá znít že sám dělá nějakou akci (a je to, význam managementu je odhalen :D :D )).

Pokud děláš fakt jednoduché weby, tak můžeš udělat presenter jeden Article kerej bude umět zobrazit i přidat atd.

List + add má smysl. Já třeba používám kombinaci list + edit. List = výpis položek a mazání. Edit = s IDčkem editace, jinak přidávání. Takže to krásně pokryje trojci add-edit-delete.

Editoval Ascaria (24. 5. 2012 14:55)

Arynev
Člen | 33
+
0
-

Takže například máš ManageArticlePresenter

	/** @persistent */
	public $id;
	private $article;
	private $articles;

	public function actionAdd();
	public function actionEdit($id);
	public function renderList();
	protected function createComponentForm();
	public function processSave(Form $form);

Tohle se mi právě moc nelíbí. $articles vs. $article

Chápu to tvé logické hledisko prohození. Ale výrazně by to ulehčilo práci. Jenže co jsem viděl, tak to nikdo takhle nepíše. Musí tam někde být nějaký jiný zádrhel.

Myslel jsem nad něčím jako toto:

<?php

	use Nette\Application\UI\Form;

	use Nette\Utils\Strings;

class EditPresenter extends SecuredPresenter{

	/** @persistent */
	public $id;

	private $item;

	public function  beforeRender() {
		parent::beforeRender();

		$this->item = $this->model->getById($id);
		if(!$this->item){
			throw new Nette\Application\BadRequestException("Item does not exists", 404);
		}

		$this['form']->setDefaults($this->item);

		$this->template->item = $this->item;

	}

	public function editedItem(Form $form){

		if(!$this->item){
			throw new Nette\Application\BadRequestException("Item does not exists", 404);
		}

		$values = $form->getValues();
		$this->model->edit($item, $values);

	}

	public function createComponentForm(){

		$form = $this->context->{"create" . Strings::capitalize($this->action) . "Form"}();
		$form->onSuccess[] = callback($this, "editItem");

		return $form;

	}

	public function getModel(){

		return $this->context->{Strings::capitalize($this->action) . "Model"};

	}

	//Editované "objekty"
	public function actionArticle($id){

		$this->id = $id;
		$this['form']->onSuccess[] = callback($this, "editedArticle");

	}

	public function editedArticle(Form $form){

		$this->flashMessage("Item was edited");
		$this->redirect("this");

	}

}

Je to z hlavy, nevyzkoušený

Ascaria
Člen | 187
+
0
-

Už musím letět domu, kolabuje mi mozek a musím vyzvednout sestru, takže ti sem hážu můj admin presenter pro menu:

<?php
/**
 * Presenter pro správu nabídek
 *
 * @author Jaroslav Ascaria Svoboda
 */

namespace DefaultModule\AdminModule;

use DefaultModule\AdminModule\Forms,
    DefaultModule\AdminModule\Grids;

/**
 * @persistent(menusGrid)
 */
final class MenusPresenter extends BasePresenter
    {
/*
    Helper methods
*/

    /**
     * Vrátí vybraný typ menu, jinak null.
     * @return String|Null
     */
    public function getType()
        {
        $m = $this->MenuAction;
        return null !== $m ? 'menu_'.$m : null;
        }

    /**
     * Vrátí základní tvar akce (určuje se podle ní typ menu), tj. uřízne Add a Edit z konce stringu.
     * @return String|Null
     */
    public function getMenuAction()
        {
        return preg_replace('/(Add|Edit)$/', '', $this->Action);
        }

/*
    Presenter components
*/

    /**
     * Vytvoří formulář pro úpravu menu.
     * @param String $name název komponenty
     */
    protected function createComponentEditMenuForm($name)
        {
        $form = new Forms\EditMenuForm($this, $name);
        $form->Id = $this->getParam('id');
        $form->Type = $this->Type;
        $form->Translator = $this->context->translator;
        $form->Model = $this->context->NavigationModel;
        $form->OkLink = $this->MenuAction;
        $form->StornoLink = $this->MenuAction;
        $form->ApplyLink = $this->MenuAction.'Edit';
        $form->createForm();
        }

    /**
     * Vytvoří DataGrid položek menu.
     * @param String $name název komponenty
     */
    protected function createComponentMenuGrid($name)
        {
        $grid = new Grids\MenuGrid($this, $name);
        $grid->Type = $this->Type;
        $grid->Action = $this->Action;
        $grid->Translator = $this->context->translator;
        $grid->Model = $this->context->NavigationModel;
        $grid->createGrid();
        }

/*
    Presenter actions
*/

/*
    Presenter signals
*/

    public function handleMenuDelete($id)
        {
        // TODO: predelat mazani polozek menu a jinych jazykovych sekci, a lepe upozornit co se bude mazat za jazyky spolu s aktualnim jazykem
        $translator = $this->context->translator;
        // Vytáhneme persistentní parametry komponenty
        $persistent_args = $this->getPersistentArgsFromRequest('\DefaultModule\AdminModule\Grids\MenuGrid');

        // Zjistíme IDčka všech sekcí co se budou mazat
        $ids = array_merge(Array($id), $this->context->NavigationModel->GetAllChildrenIDs($this->Type, $id));
        $menu = $this->context->NavigationModel->GetMenu($this->Type);
        $nazev = Array();
        foreach($menu as $m) { if(in_array($m->id, $ids)) { $nazev[] = $m->nazev; } }
        // Zkusíme smazat položku určeného typu menu ve všech jazykových mutacích.
        $count = $this->context->NavigationModel->Delete($this->Type, $ids);
        $count > 0
            ? $this->flashMessage(sprintf($translator->translate('_polozky_menu_%d_byly_smazany_%s', $count), $count, implode(' / ', $nazev)), 'success')
            : $this->flashMessage($translator->translate('_smazani_polozky_menu_se_nezdarilo'), 'error');

        if(!$this->isAjax())
            $this->redirect('this', $persistent_args);
        }

/*
    Presenter views
*/

    /**
     *
     */
    protected function beforeRender()
        {
        parent::beforeRender();
        // Proměnné určující typ požadavku
        $edit = stripos($this->Action, 'edit') !== false;
        $add = stripos($this->Action, 'add') !== false;
        // Pokud se jedná o editaci či přidání, jinak se jedná o výpis
        if($add || $edit)
            {
            // Při editaci bez IDčka přesměrujeme na výpis menu
            if($edit && null === $this->getParam('id'))
                $this->redirect($this->MenuAction);
            // Přenastavíme view, jelikož add & edit sdílí template
            $this->View = 'edit';
            // Označíme view co je v menu
            $this['adminNavigation']->Select(':'.$this->name.':'.$this->MenuAction);
            }
        else
            {
            // Přenastavíme view
            $this->View = 'default';
            }
        }
    }

Jestli se tím budeš inspirovat, tak to ber s rezervou, je to určité řešení pro určitý případ, není to dost abstraktní. V templatech pak mám jen edit.latte a default.latte.

edit: adresa v prohlížeči pak může být:

/admin-new/menus~main
/admin-new/menus~main-add
/admin-new/menus~main-edit?id=1

Editoval Ascaria (24. 5. 2012 16:20)