Eredmény: 1 - 3 (3) összesen

Téma: Symfony tartalmi oldalak

  1. #1
    MinderBinder edem logója
    Csatlakozott
    09-09-02
    Hely
    Budapest
    Hozzászólás
    1.093
    Thanked 1 Time in 1 Post

    Alapbeállítás Symfony tartalmi oldalak

    Sziasztok!

    Alapos kutatás után sem találtam kielégítő választ arra, hogy a symfony (azaz a doctrine) nestedSet viselkedését hogyan tudnám felhasználni arra, hogy hierarchikus felépítésű tartalmi oldalakat készítsek.

    Az világos, hogy hogyan tudom az adatbázisban kezelni őket, de ami nem világos az az útvonalkezelés (routing).

    Olyasmit szeretnék, hogy valahogy így nézzenek ki az url-jeim: /tartalmi-oldal-1/tartalmi-oldal2/...stb és ezeket a routing tudja kezelni.

    Kindulópontom ez a leírás volt: _http://dev.mysql.com/tech-resources/articles/hierarchical-data.html.
    Körülnéztem a plugins oldalon is, de nem találtam használható plugint erre a célra.

    Volt már ilyen problémája valamelyikőtöknek? Mi erre a megfelelő módszer?


    // Only illogics can find
    // hidden flaws in a straight logic line

  2. #2
    MinderBinder edem logója
    Csatlakozott
    09-09-02
    Hely
    Budapest
    Hozzászólás
    1.093
    Thanked 1 Time in 1 Post

    Alapbeállítás re: Symfony tartalmi oldalak

    Időközben megszületett az első részmegoldás. Ha esetleg valakinek szüksége lenne ilyesmire, akkor egy query-ről van szó (1 db), ami az egész fa struktúrát képes kioperálni egy táblából, ami így néz ki:

    Kód:
    CREATE TABLE IF NOT EXISTS `page` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `page_title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `menu_title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `link_title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `content` mediumtext COLLATE utf8_unicode_ci,
      `meta_keywords` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `meta_description` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `sequence` mediumint(8) unsigned DEFAULT NULL,
      `in_menu` tinyint(1) DEFAULT '1',
      `is_active` tinyint(1) DEFAULT '1',
      `viewed` mediumint(8) unsigned NOT NULL DEFAULT '0',
      `root_id` bigint(20) DEFAULT NULL,
      `lft` int(11) DEFAULT NULL,
      `rgt` int(11) DEFAULT NULL,
      `level` smallint(6) DEFAULT NULL,
      `created_at` datetime NOT NULL,
      `updated_at` datetime NOT NULL,
      `slug` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `page_sluggable_idx` (`slug`,`root_id`,`level`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;
    Sima nested set...

    A query, ami ebből kiszedi a tartalmat sorrend szerint (sequence), pedig ilyen:

    Kód:
    SELECT
    main_node.name as name,
    
    (SELECT group_concat( parent.slug SEPARATOR '/' ) AS path
    FROM page AS node, page AS parent
    WHERE node.lft BETWEEN parent.lft AND parent.rgt AND node.id = main_node.id
    ORDER BY parent.lft) as path,
    
    
     
    FROM page AS main_node, page AS main_parent
    WHERE main_node.lft
    BETWEEN main_parent.lft
    AND main_parent.rgt
    AND main_parent.id = (
    SELECT root_id
    FROM page
    GROUP BY root_id
    LIMIT 1 )
    ORDER BY main_node.sequence
    A trükk a lekérdezésben a GROUP_CONCAT() funkció, ami egy többsoros (de egy oszlopos) subquery sorait egy sorba tudja összefűzni egy elválasztóval, így az eredmény a következő (tesztadatok)



    Ebből menüt építeni már gyerekjáték.

    Ami még nem világos, az az, hogy ezekkel az url-ekkel hogyan fogok majd lekérdezni az adatbázisból 1-1, rekordot, ha valakinek van ötlete, akkor azt megköszönném.


    Utoljára módosítva: edem által : 2010-09-30 20:41

  3. #3
    MinderBinder edem logója
    Csatlakozott
    09-09-02
    Hely
    Budapest
    Hozzászólás
    1.093
    Thanked 1 Time in 1 Post

    Alapbeállítás re: Symfony tartalmi oldalak

    Közben rájöttem, hogy a megoldás egyszerű:

    Kód:
    SELECT
    main_node.id
    FROM page AS main_node
    WHERE (SELECT group_concat( parent.slug SEPARATOR '/' ) AS path
    FROM page AS node, page AS parent
    WHERE node.lft BETWEEN parent.lft AND parent.rgt 
    AND node.id = main_node.id
    ORDER BY parent.lft) = 'fooldal/2-oldal/2-oldal-alatt-1'
    A végeredmény:



    Bocsi, ha esetleg valaki úgy érzi, hogy átmeneti tárolónak használtam a fórumot a gondolataimnak.



A téma címkéi:

Könyvjelzők

Hozzászólás szabályai

  • Új témákat nem hozhatsz létre
  • Válaszokat nem küldhetsz
  • Fájlokat nem csatolhatsz
  • A hozzászólásaidat nem módosíthatod
  •