Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MVC ja ZF

Sivun loppuun

walkout_ [06.09.2009 14:24:08]

#

Olisi kysymys MVC:stä ja ZF:tä.
http://framework.zend.com/manual/en/zend.controller.html

Eli jos käytän ylläolevaa ja Bootstrapissa on seuraava:

<?php

$route = new Zend_Controller_Router_Route_Regex(
    '(\d+).(\d+).index.html',
    array(
        'module' => 'default',
        'controller' => 'index',
        'action'     => 'index'
        ),
	array(
        1 => 'month',
        2 => 'year'
    ),
    '%d.%d.index.html'
    );

    $router->addRoute('index', $route);

?>

ja contorollerit ovat kansiossa modules/default/controllers

Niin miten määrittäisin tohon Bootstrapin noi Router_Route_Regex:it dynamisesti ettei jokaista ns. moduulia varten tarvitse hardkoodata tota routeria erikseen.
Vaikka, että modules kansiossa olisi XML tiedosto (vai kannattaisiko käyttää jotekin tietokantaa vai mitä.. riittäkö vain noiden modulikansioiden lukeminen jollain tiedosto listauksella)..
Idea on siis se, että kaikelle mitä moduulissa on saisi määritettyä niin, että mnun tarvitse tehdä esim. tällaisia linkkejä /index/index?month=12&year=2008 vaan se voisi olla vaikka /index/index/12/2008 tai juurikin kuin mallissa /12.2008.index.html

<?xml version="1.0" encoding="utf-8"?>
    <routes>
      <route name="default_index" routeurl="(\d+).(\d+).index.html" regexurl="%d.%d.index.html">
        <module>default</module>
        <controller>index</controller>
        <action>index</action>
        <params>
          <param name="month" order="1"/>
          <param name="year" order="2"/>
        </params>
      </route>
	  <route name="default_javascript" routeurl="(\d+).(\d+).index.js" regexurl="%d.%d.index.js">
        <module>default</module>
        <controller>javascript</controller>
        <action>index</action>
        <params>
          <param name="month" order="1"/>
          <param name="year" order="2"/>
        </params>
      </route>
    </routes>

Entäs sitten miten määrittäisin dynaamisesti, että jokaisen controllerin ns. actionien käynnistysoikeudet olisi vaikka käyttäjäryhmille?

Idea: http://www.sqlrecipes.com/database_design/fine_grained_role_based_access_control_rbac_syst­em-3/

Mutta miten koodaan Zend Frameworkilla niin että controllereiden actioneja (siis functioita) ei voi oletuksena käynnistää, ellei siihen ole tietokannassa märitetty lupaa erikseen???

walkout_ [06.09.2009 21:53:45]

#

       <params>
          <param name="month" order="1"/>
          <param name="year" order="2"/>
        </params>

Joo sain systeemejä toimimaan..

Mutta miten saisin yllä olevasta arrayn?

array(
        1 => 'month',
        2 => 'year'
    )

walkout_ [07.09.2009 18:25:33]

#

Sain edellisen toimiin:

Jos minulla on tällainen

<?php

/** Zend_Controller_Action */

class Timesheet_IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {

	$request = $this->getRequest();

    }
    public function fooAction()
    {
    }
    public function barAction()
    {
    }
}

Missä määrittelen onko esim. action funktio bar mahdollista käynnistä true/false arvolla? Lopullisessa se haetaan tietty session arvolla user_group tietokannasta PDO statementina jonka silmukalla ajan kaikkiin actioneihin.

Onko siis ketään Zend Framework tyypiä joka osaisi neuvoa minua alkuun?

Entäs mitä teen Modeleilla ja miten käytän niitä?

map_ [07.09.2009 21:18:22]

#

Tuon routerien konfiguraation voit kirjoittaa suoraan PHP-arrayksi. Ei tarvitse käydä XML:n kautta. Siis vaikka:

<?php // routes.conf.php
return array(
    'index' => array(
        'regex' => '(\d+).(\d+).index.html',
        'defaults' => array(
            'module' => 'default',
            'controller' => 'index',
            'action'     => 'index'
        ),
        'map' => array(
            1 => 'month',
            2 => 'year'
        ),
        'reverse' => '%d.%d.index.html'
    )
);

En ihan ymmärtänyt kysymystäsi bar-funkton käynnistämisestä true/false-arvolla.


Modeleihin laitetaan kaikki sovelluksen toimintalogiikka. Controllerin tehtävä on vain käskyttää modelia saadun requestin perusteella ja tehdä uudelleenohjaus tai (Zendissä) antaa modelista tulevaa tavaraa viewlle. Siis esim. kaikki tietokannan sekä session käsittelyt tehdään modelissa.

Tässä pidempi ja parempi vastaus:
http://blog.astrumfutura.com/archives/373-The-M-in-MVC-Why-Models-are-Misunderstood-and-Unappreciated.html

walkout_ [07.09.2009 23:17:20]

#

Jos selvennän:
http://mattikiviharju.name/zf/public/
Teen siis yllä olevaa..
Eli vasempaan boxiin ladataan ./application/modules/ kansiosta puu valikoon kaikki moduulit ja niiden asetukset tulee nyt XML-tidosta.
Ja kun modulin valikkoa painaa se lataa keskellä olevaan manged irfamen moduulin.

Oikeus taso systeemin haluasin niin että jos nyt otan tämän moduulin ilman iframea: http://mattikiviharju.name/zf/public/timesheet/index/index
Eli kun painan vaikka refresh niin se tekee AJAXilla seuraavan requestin /zf/public/timesheet/json/index ja laittaa parametrit POSTilla.. eli siis käyttäjä ryhmä X ei omaa oikeuksia painaa refresh joten AJAX-requesti /zf/public/timesheet/json/index pitäisi palauttaa {"success":false,"msg":"Access denied!"} oletuksena ilman että sitä pitää kodata erikseen kaikkiin controllerin action methodeihin.

Sori tää on vähän vaiheessa mm. iframe JaveScript tiedosto hajoittaa joitakin ExtJS:n toimintoja kuten tuon accordionin vasemmalla.. ja ulkoasu on kesken.

Tarkoitus on tehdä syysteemi jossa on valmis ACL, AUTH (kirjautuminen), Modularisuus (Moduulit). Jotka on pistetty toimimaan kunnolla yhdessä. Vaikeaa on se että tässä on Client Side ja Server Side.. Eli siis pitäs esim. tuottaa dynaamisesti ExtJS:ää käyttäviä scriptejä jotka olisi erilaisia ACL:n mukaan.

map_ [08.09.2009 20:03:21]

#

Zendissä on monta tapaa käsitellä pyyntöjä keskitetysti. Yksi niistä on controller pluginit:
http://framework.zend.com/manual/en/zend.controller.plugins.html

Voit tehdä oman pluginin, jonka preDispatch()-metodissa teet ACL-tarkistukset. Vaihtoehtoisesti voit tehdä controllereillesi yhteisen yläluokan, joka korvaa preDispatch()-metodin.

walkout_ [09.09.2009 00:45:47]

#

Jaa en ymmärrä..

Mut joo noi mun XML-readerit on perseestä jos laitan XML:n eri järjestykseen:

<?xml version="1.0" encoding="utf-8"?>
    <routes>
      <route name="default_index" routeurl="(\d+).(\d+).index.html" regexurl="%d.%d.index.html">
       <params>
          <param name="month" order="1"/>
          <param name="year" order="2"/>
        </params>
        <module>default</module>
        <action>index</action>
        <controller>index</controller>
      </route>
      <route name="default_javascript" routeurl="(\d+).(\d+).index.js" regexurl="%d.%d.index.js">
        <module>default</module>
        <controller>javascript</controller>
        <action>index</action>
        <params>
          <param name="month" order="1"/>
          <param name="year" order="2"/>
        </params>
      </route>
    </routes>

niin ei toimi joten pitää koittaa Zend_Xml_To_Json --> Zend_Json_To_Array niin ehkä sitte..

Ajattelin vaan et voisi olla parempi et koko moduuli kaikilla variableilla kuvataan XML-tiedostossa.

map_ [09.09.2009 06:19:00]

#

Minusta kannattaa suosia yksinkertaisempia vaihtoehtoja. Jos sinulla ei ole jotain erityista syytä käyttää XML:ää, niin tee konfiguraatiosta mielummin sisäkkäinen array-määritelmä. Siitä on suoraviivaisempaa tehdä tarpeen vaatiessa JSONiakin.

preDispatch() on siis controller plugineissa (ja itse controllereissa) oleva metodi, jota kutsutaan aina ennen kuin kutsutaan ...Action()-metodia. Voit tehdä käyttöoikeus yms. tarkistuksia siellä.

walkout_ [25.09.2009 18:46:32]

#

Hei,

Sain nyt hommat toimimaan ohjeista.

Mutta sellainen kyssäri on että miten localisoin?

Tiedän miten käytän ZenD_Locale:a mutta miten saisin niin että oletuksena linkitys mene näin?

/fi_FI/module/controller/action
/en_US/module/controller/action
/en_GB/module/controller/action

map_ [25.09.2009 23:20:01]

#

En oikein ymmärrä, mitä yrität.

Yleensä järjestelmän vakioviestit lokalisoidaan Zend_Translatella ja muuttuvista asioista tallennetaan erikieliset versiot tietokantaan.

Zend_Routessa on myös mekanismi, jolla voi lokalisoida urleja siten, että esim. /board/1/post/3 olisi suomenkielisillä /alue/1/viesti/3.

walkout_ [26.09.2009 11:36:42]

#

Tarkoitan että $_GET-muutujalla määritetään mikä kieli on päällä ja se taas sitten voidaan tallentaa sessioon joten vain ensimmäinen kielen vaihdos linkityskerta tarvitaan. Eli siellä on vaikka alasvetovalikko josta vaihdetaan kieltä lennossa.
Olen tekemässä vain systeemiä missä HTML-koodin vakiotekstit on vaikka CSV-tiedostoissa ja ne luetaan Zend_Translatella ja $_GET-muutuja tai sen jäkeen sessio määrää mitä kielitiedostoa luetaan. Osaan tehdä tämän GET-muutujalla vaikka näin ?lang=en_GB mutta miten laitan sen MVC-malliin niin, että siihen lisätän /module/controller/action linkitys mallin lisäksi vielä paikka kielelle.
Itse sisältöä mikä on tietokannassa ei tarvise saada monikieliseksi koska se olisi työlästä ylläpitää vaikka jossain CRM:ssä että tiedot vaikka asiakaasta syötetään monella kielellä.
Voisin tosin miettiä onko tällaisesta ollenkaan hyötyä, koska pääasetustiedostossa voitaisiin vain määrittää minkä kielinen koko ohjelma on eikä sitä sitten voisi muuttaa sen jälkeen.

walkout_ [27.09.2009 10:58:37]

#

http://www.extjs.com/forum/showthread.php?p­=391185#post391185

Ohjelman sorsa on julkaistu..

Tää on nyt vähän prototyyppivaiheessa.

Jospa teen niin että kieltä ei voi lennossa vaihtaa vaan se määritellään asetuksissa niin ei tarvitse säätää.

walkout_ [27.09.2009 19:52:50]

#

Jos joku joinaa mun projekteihin voidaan tehdä sopimus yksityishenkilöinä, että annan vaikka 500 Mt tilaa omalta palvelimeltani PHP-juttujen kehittelyyn jota myös käytät tähän minun projektiin. Voin määritellä tilakohtaisesti PHP.ini-asetuksia jos vaatimukset eivät ole liian kovat ja minulle ei tule ylisuuria tietoturva riskejä joihin en suostu. Näkyvyyttä voidaan miettiä sitten ohjelmilla jotka saadaan terpeeseen ilmaiseksi oli ne Open Source tai ei.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta