Rozparsování linku na modul, presenter, akci a parametry

- maw
 - Člen | 6
 
Dobrý den, mám dotaz, zda existuje nějáký chytrý způsob, jak
rozparsovat nette link (něco ve stylu :Modul:Product:show $productId,
lang ⇒ cs) na jednotlivé části (modul, presenter, akci,
parametry). Chtěl bych to použít v BasePresenteru jako metodu:
parseLink($link);
a to aby to fungovalo i pokud bude link např, this, nebo
!signal, nebo kdyby obsahoval jen akci popř. presenter + akci
atd.
Zn. ideál, kdyby vracel asociativní pole, kde klíče by byly: module,
presenter, action, params a příslušné hodnoty.
Děkuji za radu.
Editoval maw (5. 10. 2012 13:44)

- maw
 - Člen | 6
 
Mno, nakonec jsem to vyřešil takto (viz. níže). Pro mé účely to zatím dostačuje (i když to teda asi není úplně ideální řešení). Pozn.: metody jsou v BasePresenteru.
    /**
     * Returns Module name
     * @return string
     */
    public function getModuleName()
    {
        $pos = strrpos($this->name, ':');
        if (is_int($pos)) {
            return substr($this->name, 0, $pos);
        }
        return NULL;
    }
    /**
     * Return presenter pure name
     * @return string
     */
    public function getPresenterName()
    {
        $pos = strrpos($this->name, ':');
        if (is_int($pos)) {
            return substr($this->name, $pos + 1);
        }
        return $this->name;
    }
    /**
     * Rozparsuje link na modul, presenter, akci - př. :Administration:Default:default
     * @param string $link
     * @return array associativní pole s klíči module, presenter, action
     */
    public function parseLink($link){
        $matches = array();
        preg_match_all("/\,\s?.+/i", $link, $parameters);
        $replace = $parameters[0];
        $linkwithoutparams = str_replace($replace, "", $link);
        preg_match_all("/\:?([a-zA-Z]+)/i", $linkwithoutparams, $matches);
        $match = $matches[1];
        switch(count($match)){
            case 1:
                $out = array('module' => $this->getModuleName(), 'presenter' =>$this->getPresenterName(), 'action' => $match[0]);
            break;
            case 2:
                $out = array('module' => $this->getModuleName(), 'presenter' => $match[0], 'action' => $match[1]);
            break;
            case 3:
                $out = array('module' => $match[0], 'presenter' => $match[1], 'action' => $match[2]);
            break;
            default:
                $out = false;
            break;
        }
        return $out;
    }
				
- maw
 - Člen | 6
 
Ještě upravená verze metody parseLink…
<?php
/**
     * Rozparsuje link na modul, presenter, akci - př. :Administration:Default:default
     * @param string $link
     * @return array associativní pole s klíči module, presenter, action
     */
    public function parseLink($link) {
        $matches = array();
        preg_match_all("/\,\s?.+/i", $link, $parameters);
        $replace = $parameters[0];
        $linkwithoutparams = str_replace($replace, "", $link);
        preg_match_all("/\:?([a-zA-Z]+!?)/i", $linkwithoutparams, $matches);
        $match = $matches[1];
        if(substr($linkwithoutparams, -1) == '!') { array_pop($match); } // Vyhodíme z "parametrů" signály (na ty se práva nevztahují)
        switch (count($match)) {
            case 0:
                $out = array('module' => $this->getModuleName(), 'presenter' => $this->getPresenterName(), 'action' => $this->getAction());
                break;
            case 1:
                $out = array('module' => $this->getModuleName(), 'presenter' => $this->getPresenterName(), 'action' => $match[0]);
                break;
            case 2:
                $out = array('module' => $this->getModuleName(), 'presenter' => $match[0], 'action' => $match[1]);
                break;
            case 3:
                $out = array('module' => $match[0], 'presenter' => $match[1], 'action' => $match[2]);
                break;
            default:
                $out = false;
                break;
        }
        return $out;
    }
?>
				
- Filip Procházka
 - Moderator | 4668
 
Tak se teda zeptám já – na co to potřebuješ? Nešlo by to udělat bez toho, lépe?

- llook
 - Člen | 407
 
Dá se to udělat tak, že si z toho nejdřív vytvoříš URL pomocí $presenter->link() a tu potom proženeš zpětně přes $router->match(). Tím získáš Application\Request, tzn. název presenteru a hodnoty parametrů.
Něco podobného jsem dělal u seleniových testů, abych mohl psát aserce
na URL otevřené stránky (něco jako
$this->assertPresenter(':Module:Presenter', 'action => default, id => 5')).