Navigation ontwerp class / twig

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Tom Swinkels

Tom Swinkels

05/11/2012 09:43:11
Quote Anchor link
Hoi,

Ik ben bezig met een Navigation class en het gebruik en laten zien in twig, nu ben ik benieuwd of dit op de goede manier is.

Navigation.class.php

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
/**
 * @author Tom Swinkels
 * @version v1.0 last edit on 31-10-2012
 */

class Navigation
{
    private $_id;
    private $_name;
    private $_url;

    public function setId( $id )
    {

        $this->_id = $id;
    }

    public function getId()
    {

        return $this->_id;
    }


    public function setName( $name )
    {

        $this->_name = $name;
    }

    public function getName()
    {

        return $this->_name;
    }


    public function setUrl( $url )
    {

        $this->_url = $url;
    }

    public function getUrl()
    {

        return $this->_url;
    }
}

?>


NavigationMapper.class.php

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
/**
 * @author Tom Swinkels
 * @version v1.0 last edit on 31-10-2012
 */

class NavigationMapper
{
    private $_db;

    public function __construct( PDO $db )
    {

        $this->_db = $db;
    }


    public function select( $place, $navigationId )
    {

        $sql = "SELECT
                      id,
                      name,
                      url,
                      module_id
                FROM
                      navigation
                WHERE
                      state_id = 1
                AND
                      navigation_id = :navigationId
                AND
                      place = :place
                ORDER BY
                      sort
                ASC
               "
;

        $result = $this->_db->prepare( $sql );

        $data = array( 'navigationId' => $navigationId,
                       'place' => $place );

        $result->execute($data);

        $list = $result->fetchAll();
        if($list)
        {

            $navigations = array();
            foreach($list as $listArray)
            {

                $navigation = new Navigation();
                $navigation->setId($listArray['id']);
                $navigation->setName($listArray['name']);
                $navigation->setUrl($listArray['url']);
                $navigations[] = $navigation;
            }

            return $navigations;
        }
    }
}

?>


Base.html.twig

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
            {% if navigation.select( 'cms', '0' ) %}
                {% for nav in navigation.select( 'cms', '0' ) %}
                    <li class="limenu"><a href="{{ nav.getUrl() }}"><span class="ico gray shadow home" ></span><b>{{ nav.getName() }}</b></a>
                    {% if navigation.select( 'cms', nav.getId() ) %}
                        <ul>
                            {% for SubNav in navigation.select( 'cms', nav.getId() ) %}
                                <li><a href="{{ SubNav.getUrl() }}">{{ SubNav.getName() }}</a></li>
                            {% endfor %}
                        </ul>
                    {% endif %}
                    </li>
                {% endfor %}
            {% endif %}
 
PHP hulp

PHP hulp

23/04/2024 13:13:51
 
Wouter J

Wouter J

05/11/2012 09:54:14
Quote Anchor link
Kijk eens naar KnpMenu dat is de meest OO menu maker die ik heb gezien en heeft extensies voor Twig (!).

Ik zou het doen zoals ik hier beschrijf: http://www.phphulp.nl/php/forum/topic/navigation-class/87498/#627284

En kijk ook hoe je Twig extensies maakt, die zou ik gebruiken waardoor je iets als: create_menu('primary') kunt aanroepen in Twig waardoor je het hele menu maakt.

Nog een Twig tip: item.getId() Die getId() is nergens voor nodig. Je kan gewoon item.id doen. Twig gaat dan kijk of hij $item->id kan krijgen, zoniet dan probeert hij $item->getId().
Gewijzigd op 05/11/2012 09:55:08 door Wouter J
 
Tom Swinkels

Tom Swinkels

05/11/2012 10:01:15
Quote Anchor link
Ik zie dat jij gebruik wilt maken van "setAttribute()" ik gebruik liever allemaal losse setters voor wat ik nodig heb. Verder snap ik wel wat je bedoelt met "NavItem", maar wat bedoel je precies met "AnchorElement"?

Ik zal even gaan kijken naar die Twig extensies, dit is overigens mijn eerste keer dat ik een template parsing ga gebruiken.

Handige tip :) Alleen vraag ik me af of je die keuze aan Twig moet overlaten en niet gewoon zelf moet bepalen?
Gewijzigd op 05/11/2012 10:03:12 door Tom Swinkels
 
Wouter J

Wouter J

05/11/2012 22:14:29
Quote Anchor link
Quote:
Handige tip :) Alleen vraag ik me af of je die keuze aan Twig moet overlaten en niet gewoon zelf moet bepalen?

Laat die keuze maar aan twig over, het is sneller om een property te pakken dan om een method uit te voeren. Twig zal dus altijd eerst kijken of de snelle methode te gebruiken is.

Quote:
Ik zie dat jij gebruik wilt maken van "setAttribute()" ik gebruik liever allemaal losse setters voor wat ik nodig heb. Verder snap ik wel wat je bedoelt met "NavItem", maar wat bedoel je precies met "AnchorElement"?

Die setAttribute was een voorbeeld en om eerlijk te zijn ben ik ook voor aparte setters.
Een Anchor is een link (vandaar de <a> tag). Ik bedoelde er dus een <a> element mee.
Gewijzigd op 05/11/2012 22:16:37 door Wouter J
 
Tom Swinkels

Tom Swinkels

06/11/2012 10:47:04
Quote Anchor link
Is dat niet een onderdeel van het NavigationItem? En is het dan geen eigenschap van het Item? I.v.m een nieuw object maken?

Verder zag ik trouwens ook er in dat andere topic ook HTML in een klasse gezet werd, dat is toch ook niet de bedoeling?
 
Wouter J

Wouter J

06/11/2012 11:22:20
Quote Anchor link
Quote:
Is dat niet een onderdeel van het NavigationItem? En is het dan geen eigenschap van het Item? I.v.m een nieuw object maken?

Ik was laatst even begonnen aan een opzetje om met 1 hoofdinterface en heel veel subklassen een hele DOM tree te kunnen maken. Daar heb ik dit idee op gebaseerd. Het zou er dan ong. zo uitzien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$nav
= new UlElement();

$nav->addChild(
    new
LiElement()
        ->
addChild(new AnchorElement('/home')->text('Home'))
);


$blog = new LiElement()
    ->
addChild(
        new
UlElement()
            ->
addChild(new LiElement(new AnchorElement('/cat/php')->text('php')))
            ->
addChild(new LiElement(new AnchorElement('/cat/html')->text('html')))
    )
;


$nav->addChild($blog);

// ...
?>


Eventueel maak je dan een special NavItemElement die alles een beetje combineert zodat je zoiets kunt doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$nav
= new NavItemElement();

$nav->addChild(new NavItemElement('home', '/home'));

$blog = new NavItemElement();
$blog
    ->addChild(new NavItemElement('php', '/cat/php'))
    ->
addChild(new NavItemElement('html', '/cat/html'))
;


$nav->addChild($blog);
// ...
?>


Er komt nu nog een mooi idee bij me op die ook wordt gebruik in het Symfony2 Config component:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$navbuilder
= new NavBuilder();
$navbuilder
    ->children()
        ->
item('home')
            ->
goto('/home')
        ->
end()
        ->
item('blog')
            ->
item('php')
                ->
goto('/cat/php')
            ->
end()
            ->
item('html')
                ->
goto('/cat/html')
            ->
end()
        ->
end()
    ->
end()
;

?>


Dit zijn zomaar wat ruwe ideeën die ik erg vet vind, je moet natuurlijk zelf kijken wat jij het best wilt gebruiken.

Quote:
Verder zag ik trouwens ook er in dat andere topic ook HTML in een klasse gezet werd, dat is toch ook niet de bedoeling?

Niet op de manier zoals het daar gebeurd. Ik zou speciale render klassen maken die voor het weergeven van een menu zorgen. Bijv:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$navbuilder
= new NavBuilder();
// ...

$renderer = new HTMLListRenderer($navbuilder);

echo $renderer->render();
?>
Gewijzigd op 06/11/2012 11:23:41 door Wouter J
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.