PHP: CMS Rendszer fejlesztéshez társat keresek
2010-12-10T21:39:39+01:00
2010-12-16T18:35:13+01:00
2022-06-30T13:57:38+02:00
  • Egyébként ebből is tanultam
    Mutasd a teljes hozzászólást!
  • Nem is vártam, hogy megcsináld, ha ennyit sem tudnék (tudok), akkor bele se vágtam volna
    Mutasd a teljes hozzászólást!
  • Akkor majd megcsinálod úgy, hogy a konfigurációs fájl adatait használja fel. Én csak egy elvi javaslatot tettem, amit úgy módosítasz, ahogy akarsz.
    Mutasd a teljes hozzászólást!
  • a kódodban az adatbázis típusa és a felhasználói adatok megadása fölösleges, mivel ez egy Config.php-ból lesz betöltve
    Mutasd a teljes hozzászólást!
  • A Zend Framework nem egy komplex rendszer, inkább egy osztálygyűjtemény; ez már többször volt téma errefelé
    Építhetsz rá rendszert, de azt is megteheted, hogy csak néhány részét használod.
    Mutasd a teljes hozzászólást!
  • @ez nem megy: Elnézést a durva megfogalmazásért. Egyébként igazad van - lényege az volt, hogy egységes legyen, és ebben egyet is értek velük. Mert végül is a php elég szabad nyelv - úgy értve, hogy van egy Database osztály mélyén egy kapcsolódás meg rengeteg metódus, de szinte semmi nem akadályoz meg, hogy csak úgy a kódba én mysql_query -t írjak, mivel úgy is megtalálja az aktív kapcsolatot (ha az osztály is mysql_* függvényeket használ).

    Szóval valóban, a lényeg az egységesítés, más kérdés, hogy az ember nem látja át rögtön a teljes query-t 4-5 paraméterből. De gyakorlat kérdése.

    ---

    @Rendi: Igen ez egy egész jó kis megoldás, átnézem jobban is a Zendet majd. Köszi a tippet.

    ---

    Egyébként én is mostanság szoktam egy saját rendszert írni, de egyet kell értenem nova76-tal, hogy lényegében sokat nem érek vele, mivel a piacon a meglévő rendszerekkel fogok találkozni, és majd azokat kellene jobban megtanulni.
    Akármilyen jó is amit írok, a cégnek annyit nem ér, hogy most én azt használjam, amíg mások az elterjedtebb keretrendszereket.

    Az én logikám most az, hogy ami ötletem van kiírom magamból, addig is tanulgatok/tapasztalok új dolgokat. Aztán utána átnyálazom a meglévő keretrendszereket, hogy az én elképzeléseimet ott hogyan lehetne megoldani. Összehasonlítom a megoldásokat és levonom a következtetéseket, hogy pl. a Zendes query összerakás tényleg jobb mint az én elképzelésem, de lehet, hogy az én View rendszerem egyszerűbb mint másé, de még az is lehet, hogy olyan rejtett hibák is vannak az enyémben amire mások ügyeltek. Úgy érzem, hogy ha előtte merülnék el benne, akkor semmi kreativitás nem lenne, csak az innen-onnan való ötletek összelapátolása.

    De lehet ez a felfogás is hibás, és rögtön a meglévőekben kéne gondolkoznom és el kellene felejtenem a saját elképzeléseimet.
    Mutasd a teljes hozzászólást!
  • Én nem akarok újat írni...
    (illetve, ha mégis ilyesmire vetemednék, akkor pusztán azért, hogy egy olyan blogféleségem legyen, aminek minden részletét ismerem és bármikor belenyúlhatok úgy, hogy nem kell tartanom az esetleges mellényúlás következményeitől. )
    Mutasd a teljes hozzászólást!
  • Nem
    Inkább úgy értettem, hogy ha nem olvasod el a dokumentációt, akkor a saját kutfőből kitalált dolgokat fogsz megalkotni. Jobb esetben erősen hajazni fog egy már meglévő megoldásra. Minél kevesebb a tapasztalatod a már kitalált megoldások terén, annél valószínűbb hogy valami silány dolgot fogsz kitalálni. Ha a létező megoldásokból minnél többet, vagy akár mindet ismered, akkor megvan a lehetőséged arra, hogy az elődök hibáit figyelembe vedd és alkoss egy jobbat.
    Ez igaz, ha egy új ORM réteget akarsz írni, igaz, ha egy keretrendszert, és akkor is ha egy új CMS-t akarsz létrehozni. Sőt minden esetben igaz. Anélkül nem állok neki programozni, hogy a programmal szemben támasztott követelményeket nem fektetem le. Már pedig jelen esetben még itt sem tart ez a jelenlegi projekt, pedig már rengeteg kód van.

    Végül is mi lenne ez a project? Egy új CMS, egy új keretrendszer, vagy egy új ORM, vagy egy új PHP, vagy egy új operációs rendszer? Honnan kivántok elindulni? Mennyire az alapoktól? Miért nem lehet használni már meglévő technológiákat, amik akár már PHP-ban kész vannak? Miért kell a dbconnecttől indulni? Mi a baj a meglévő rendszerekkel? Addig mig erre az utolsó kérdésemre nem tudsz választ adni, nincs értelme újat írnod.
    Mutasd a teljes hozzászólást!
  • Meggyőztetek, belátom igazatok van, ez nem túl sokoldalú. Viszont ha így csinálnám, akkor elveszne az egyszerűsége a dolognak, értem ez alatt azt, hogy neked csak a táblát és adatait kell beírnod, és a function meg lefordítja azt a config.php-ban megadott adatbázis nyelvére.

    Bár... úúú, most jut eszembe, hogy nem gyakran használnak PHP-t a CMS rendszerek felhasználói sem, vagy ha igen, akkor meg én (mi) megpróbáljuk leegyszerűsíteni a használatot, de úgy, hogy így lehetőségeket ne zárjon ki.

    Mostmár teljesen meg vagyok győzve
    Mutasd a teljes hozzászólást!
  • 2., Tanulni sem tanulsz olyan sokat belőle, hiszen amit magadtól találsz ki, azt már most is tudod. Pont az lenne a lényeg, hogy olyat tanulj, amit még nem ismersz.


    Izé... ugye, ezt te sem gondolod komolyan?
    Elképzelek valamit, felvázolom, majd nekiállok feltúrni a doksikat, hogy mindezt hogy lehet fizikailag is kivitelezni. Szerinted csak úgy lehet tanulni, ha ülök a dokumentáció előtt és magolom a szövegét? Vagyhogy?
    Mutasd a teljes hozzászólást!
  • Nekem csak a "rám erőszakoltak" kifejezés nem tetszik.
    Ha munkahelyen, a munkáltatód által rád bízott feladatot végzel, akkor (szerintem) teljesen mindegy, hogy jobb-e a te megoldásod, kénytelen vagy a többiekhez igazodni, pusztán azért, hogy a rendszer kódja viszonylag egységes legyen. Pláne, ha nem tudod, hogy mi minden van a "rád erőszakolt" alkatrészben.
    Vagy félreértettelek?
    Mutasd a teljes hozzászólást!
  • Mostanság Zend Framework-öt használok, ott ilyen van:
    $select = $db->select() ->from($table,array('mezo1','mezo2')) ->where('mezo<=?',$valtozo) ->where('mezo=1') ->limit($limit) ->order('mezo') ;
    Mutasd a teljes hozzászólást!
  • fél

    melóhelyemen rám erőszakoltak anno egy általuk készített adatbázis osztályt, aminek egy hasonló selectje volt:

    function select($from,$what,$where,$orderby,$limit)


    én személy szerint nem szerettem ezt, mivel ha volt egy többszörös inner joinolt lekérdezés akkor szét kellett vágni, úgy hogy a paramétereknek jó legyen. Illetve olvasásra sem a legkellemesebb.

    Jobban szeretem egyben látni a lekérdezést, mert akkor még az is tudja miről van szó aki nem használta az osztályt/metódust.

    Példa:

    $db->select("tábla","oszlop1,oszlop2","oszlop3 = 'valami'","oszlop4","10,10"); vs. $db->select("SELECT oszlop1,oszlop2 FROM tábla WHERE oszlop3 = 'valami' ORDER BY oszlop4 LIMIT 10,10");

    Amikor megkérdeztem miért jó így (felső), akkor azt mondták, hogy így tudják ellenőrizni a futás előtt, hogy az adott tábla létezik-e, esetleges sql injection ellen is tudnak valamit tenni stb...

    Szerintem az alsó jobb, az értékeket meg esetleg bindolom (pdo/mysqli/saját) vagy előtte szűröm, így elkerülöm az esetleges támadást.

    Szerintetek igazuk volt? Jobb több paraméterbe szétszedni a query-t?
    Mutasd a teljes hozzászólást!
  • Tanulni sem tanulsz olyan sokat belőle, hiszen amit magadtól találsz ki, azt már most is tudod.


    Én pl. egy hasonló rendszer elkészítéséből "tanultam meg" az OOP alapjait és a modularitást (amin több, mint 1 hónapon át törtem a fejem).

    rolaca11:
    És mondjuk összetett lekérdezéseket (pl. inner join) hogy valósítasz meg benne? Egyébként én is gondolkoztam ilyesmin, de rájöttem, hogy megnehezíteném vele az életem.

    Hogyha feltétlenül maradni akarsz az absztrakciónál, akkor ne egy osztályba tömködd bele minden adatbázishoz a kódot. Írj egy "alap" osztályt, amit a programban meghívhatsz. Legyen ezen felül minden adatbázishoz egy-egy külön osztály, amikben ugyanolyan nevű metódusokat hozol létre. Az "alap" osztályban példányosítod az adott adatbázishoz tartozó osztályt. Minden adatbázis-műveletnél az alap osztály metódusát hívod meg, ami meghívja a példányosított osztály metódusát és az általa visszaadott értékkel visszatérsz. Mondjuk lehet, hogy a Singleton minta használható lenne itt.

    Példa:

    class DB { private $Driver; public function __construct($Driver, $Host, $User, $Pass) { require_once("./driverek/".$Driver.".php"); $Driver=new DBDriver($Host, $User, $Pass); } public function Select($What, $From, $Where) { return $Driver->Select($What, $From, $Where); } } //Hasonlóan minden adatbázishoz: class DBDriver { //driverek/mysql.php private $Conn; public function __construct($Host, $User, $Pass) { $this->Conn=mysql_connect($Host, $User, $Pass); } public function Select($What, $From, $Where) { return mysql_query("SELECT `$What` FROM `$From` WHERE $Where"); } } //Működés: $db=new DB("mysql", NULL, NULL, NULL); //Majd megadod $query=$db->Select("ezt", "innen", "`mezo`='ertek'");
    Mutasd a teljes hozzászólást!
  • Itt van egy másik verziója az MVC egyik darabjának, pontosabban annak, hogy kapcsolódjon a telepítőben már meghatározott adatbázishoz, az gyancsak meghatározott adatok alapján.

    Sőt a kód lehetőséget adna arra is, hogy ha nincs adatbázis, mint MySQL, vagy MSSQL elérhető, akkor egy database.xml fájllal helyettesíti az adatbázist.
    Íme, várom a kritikákat:
    <?php include('config.php'); class Datebase extends hostdata { public function getdata() { return parent::$dbdata; } public function connection() { switch (getdata()) { case 'MySQL': $db = mysql_connect($host,$username,$password) or die(mysql_error()); $selected=mysql_select_db($datebase,$db) or die (mysql_error($db)); break; case 'MySQLi': $db = mysqli_connect($host,$username,$password,$datebase) or die(mysqli_error($db)); break; case 'MSSQL': $db = mssql_connect($host,$username,$password) or die('Connection failed'); $selected=mssql_select_db($datebase,$db) or die ('Connection failed'); break; case 'filecontrolled': $dir = ""; $type = "database.xml"; $fn = glob($dir.$type); break; } } public function select($what,$from,$var,$value) { //$what = row //$from = table //$var = column //$value = $var row értéke if($var != NULL) { $condition = " WHERE ".$var."=".$value; } else { $condition = NULL; } if($what == NULL || $what == 'all') { $what = "*"; } switch(getdata()) { case 'MySQL': $query = mysql_query("SELECT ".$what." FROM ".$from.$condition, $db); $result = mysql_fetch_array($query); break; case 'MySQLi': $query = mysqli_query($db, "SELECT ".$what." FROM ".$from.$condition); $result = mysqli_fetch_array($query); break; case 'filecontrolled': foreach($fn as $f) { $xml = simplexml_load_file($f); foreach($xml->children() as $child) { //Kidolgozásra vár if ($what == '*' && $child == $from) { $result = array(); if($condition != NULL) { for($i = 0 ; $child->getName() != 'row';) { if($child == $value) { $result[$i] = $child; $i++; } } } else { for($i = 0; $child != 'row'; $i++) { $result[$i]; } } } } } break; } return $result; } public function closecon() { switch (getdata()) { case 'MySQL': mysql_close(self::$db); break; case 'MySQLi': mysqli_close(self::$db); break; case 'MSSQL': mssql_close(self::$db); break; case 'filecontrolled': NULL; break; } } } ?>

    A kód nem tesztelt, még odáig nem jutottam el, hogy tesztelni is tudjam, ez gyakorlatilag egy 0.5beta verzió körül van.

    Biztos, hogy nem működik (rendesen) a kód, mert miért is működne, amilyen az én szerencsém, az utolsó karakterig mindent át kellesz variálni

    Úgyérzem, hogy kezdem megérteni a Class főbb részeit, minden segítséget előre, és visszamenőleg is köszönök.
    Mutasd a teljes hozzászólást!
  • Nagyon aranyosak vagytok hogy próbáltok neki segíteni és oktatni. De úgy érzem hogy még van mit.

    rolaca11,
    Talán nem egy alap rendszer megírásával kellene kezdened a tanulást. Hanem azzal, hogy a meglévő rendszereket tanulmányozod. Talán tanulási célből a legfejlettebb rendszer a Symfony. Ha azt készség szinten tudnád használni és fejleszteni benne, plussz megismerkednél még jó pár másik keretrendszerrel (Cake, Zend, CI, Yii), és CMS-sel (joomla, Drupal, Wordpress), akkor térjél vissza rá, hogy saját rendszert fejlesztesz. Hiszen arról sincs fogalmad hogy mit tudnak vagy épp nem tudnak ezek. De még azt sem tudod, mit csinálnál másképp.

    Több szempontból sem éri meg a saját keretrendszer.
    1., A munkaerőpiacon nem érsz vele annyit. Hiszen, amíg a keretrendszered nem lesz eléggé elterjedt, addig munkát sem találsz vele
    2., Tanulni sem tanulsz olyan sokat belőle, hiszen amit magadtól találsz ki, azt már most is tudod. Pont az lenne a lényeg, hogy olyat tanulj, amit még nem ismersz.

    Ráadásul ha saját DB kezelőt írsz, akkor pont a lényeget bukod: nem azt használod, amelyiket szeretnéd. Pont az lenne a lényeg, hogy a meglévőket tud használni (pl: Propel-PDO, Doctrine), azokhoz kellene írnod egy interfacet és nem a DB-hez.
    Mutasd a teljes hozzászólást!
  • segítségképp php-ben interpet2 c# -os kódja (1-2 kis módosítással):

    <?php interface IConnection { function Connect(); } abstract class Connection implements IConnection { public function Connect() { // ... általános connect } } class MSSQLConnection extends Connection { public function Connect() { // ... mssql connection // parent::Connect() -tel tudod meghívni a Connection-ben lévő Connect()-et. } } class Database { public function CreateConnection() { $result = NULL; $dbType = ReadDBTypeFromConfigFile(); switch ($dbType) { case 'MSSQL': $result = new MSSQLConnection(); break; // case 'MYSQL' ... default: die('Hiba!'); } return $result; } } // ... $db = new Database(); $connection = $db->CreateConnection(); $connection->Connect(); ?>

    Ha jól emlékezek akkor a Database osztály egy Factory Method pattern (Gyártófüggvény minta).

    De a fenti linken megtalálsz vagy 23 oop-s tervezői mintát, ami később jól jön
    Mutasd a teljes hozzászólást!
  • Én ezt a kétkötetest ajánlanám, igaz Java, de nagyon kezdőknek való és nagyon érthető.
    Ha tudod,szerezd meg. Ezt úgysem fogod még ma este megérteni
    Mutasd a teljes hozzászólást!
  • Igazából ez az egész osztály dolog nem világos, és alapos magyarázatot igényel (vizsgálgatom a PHP.net Manual-t)
    ui.: Az Abstract már világos, most elemzem ki az Interface-t
    Haladok!
    Mutasd a teljes hozzászólást!
  • hát most nem értem, hogy mit nem értesz :)

    A CreateConnection() csinál egy objektumpéldányt, ahogy az első hozzászólásomban csináltam egy példát. (switch case rész)

    és ennek az objektumnak meghívom a connect metódusát.
    Mutasd a teljes hozzászólást!
  • aha ez nagyon nagyjából ok.
    Most konkrétan kérdezek:
    hogy lesz ebből
    Database db = new Database(); IConnection connection = db.CreateConnection();

    ez
    connection.Connect();
    ?

    Még nagyon kezdő vagyok class-ból, kb 2 órája ismergetem (közben mást is csináltam)
    Mutasd a teljes hozzászólást!
  • Csinálnék minden adatbázishoz egy-egy connection osztályt, mssqlconnection, mysqlconnection, stb.
    Ezek mind megvalósítanak egy interfészt, amely biztosítja, hogy ugyanúgy tudod használni őket, és nem is kell ismerned a típusukat.

    Azaz a database osztály createconnection visszaad egy IConnection típusú objektumot, és ahol ezt használod, nem kell tudnod milyen adatbázisról is van szó, csak annyit tudsz, hogy tud kapcsolódni az adatbázishoz.

    valahogy így kéne használni:

    //Ezt amúgy singleton kéne használni
    Database db = new Database();

    IConnection connection = db.CreateConnection();

    connection.Connect();


    ...

    connection.Close();
    Mutasd a teljes hozzászólást!
  • amit írtál, hogy te hogy akartad megcsinálni az én verzióm helyett. Interface és társai.
    Mutasd a teljes hozzászólást!
  • melyik részét? :)
    Mutasd a teljes hozzászólást!
  • még mindig nem értem
    Mutasd a teljes hozzászólást!
  • Nézz utána az interface-nek, származtatásnak, metódus felülírásnak (override) és érteni fogod :)
    Mutasd a teljes hozzászólást!
  • Ja, még annyit, hogy ez nem php, hanem c#, de az elv ugyanez lenne, csak kicsit más a szintaktika...
    Mutasd a teljes hozzászólást!
  • hoppá... Ez nekem új.
    Google nem segített eleget a Class-sal kapcsolatban

    Valaki elmagyarázná

    Nagyon nem értem.
    Mutasd a teljes hozzászólást!
  • Elsőre én valahogy így csinálnám:

    interface IConnection { void Connect() { } } abstract class Connection : IConnection { public virtual void Connect() { } } class MSSQLConnection : Connection { public override void Connect() { } } class Database { public IConnection CreateConnection() { IConnection result = null; string dbType = ReadDBTypeFromConfigFile(); switch (dbType) { case "MSSQL": result = new MSSQLConnection(); break; } ... return result; }
    Mutasd a teljes hozzászólást!
  • Ahogy már nemtudom ki írta, hogy
    azért írnak ilyen CMS-t mert azt hiszik könnyü
    .

    Én ezt cáffolom, nem azért akarok ilyet írni, mert olyan könnyűnek találom, hanem mert tanulni akarok.

    Van egy témám arról, hogy a fuction vagy a class-e a jobb. Azért írtam, mert nem ismerem a class hazsnálatát. Most éppen azon dolgozom, hogy megírjak egy olayn "izét" (ha jól gondolom ez az MCV), amivel a fő php fájlban 1-2 sor alatt a lehető legtöbb, ma gyakran használatos DB rendszerhez csatlakozni tudok.
    Pl.: Én ezt így írnám meg, véleményeket, változtatásokat várok:

    a "MCV":
    <? include('config.php'); class connect_to_db { function mysql() { ... } function mssql() { ... } function postagresql() { ... } function access() { ... } function sqlite() { } function firebird() { ... } function oracle() { ... } } ?>
    a fő PHP fájlban:
    ... connect_to_db; ...

    Ahol a config.php-ban tárolom a csatlakozási adatokat, és a class automatikusan kiválasztja a megfelelő function-t
    Mutasd a teljes hozzászólást!
abcd