Oop mvc extends – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Oop mvc extends – PHP – Fórum – Programujte.comOop mvc extends – PHP – Fórum – Programujte.com

 

luboš
~ Anonymní uživatel
95 příspěvků
31. 8. 2015   #1
-
0
-

Ahoj potřebuju osvětlit problém s přístupem do cizí třídy k private metodě,
 vlastně se to týká vícenásobné dědičnosti, mám hlavní abstraktní třídu ze které dědí ostatní třídy, v této třídě je třeba mtoda pro připojení k DataBázi apod. pokud nějaký kontroler potřebuje připojení tak si z abstraktní třídy podědí a jeto jenže ten kontroler potřebuje zároveň dědit z kontroleru ve kterém jsou metody zajišťující bezpečnost aplikace např. generování tokenů pro heslo nebo pro formuláře - vícenásobná dedičnost v php není tak jsem to vyřešil tak že jsem vytvořil vstupní metodu public která potom volá metody které jsou private.

i když ne přímo ale asi porušuju zapouzdření


 
//soubor DefaultController.php
<?php
abstract class DefaultController
{
abstract function process(//blah){//blah;}
	
	 //pripojeni k db
	 protected function dbCon()
	{
	 return $this->objDb = new Db;//pripojeni k db	 
	}
}

//soubor RouterController.php
<?php
final class RouterController extends DefaultController 
{
//blah
//blah
public function process(//blah)
{
$objRegistruj = new RegistrujController;
$objRegistruj->process(//blah);
}
//blah
//blah
//blah
}

//soubor RegistrujController.php
<?php
final class RegistrujController extends DefaultController
{
//blah
//blah
// generovani tokenu pro pwd
public function process(//blah)
{
$this->objProtector = new ProtectorController;
$this->token = $this->objProtector->process("tokenizer");
}
}

//soubor ProtectorController.php
<?php
final class ProtectorController extends DefaultController 
{
//blah
//blah
  public function process($protectorMethodName)
         {
         return $this->protectorMethod = $this->$protectorMethodName();
	 }
  private function tokenizer()
	{
	$this->tokenRandNum = mt_rand(1, 1000000).chr(rand(97,122));	
        }
}

důležitý je přístup z registruj do protector přes metodu process k privatni metode tokenizer.

Sice to funguje ale nevím jestl ito je dobrý přístup a pokud špatný tak jaký je ten dobrý?? předem dík za rady

Nahlásit jako SPAM
IP: 89.103.9.–
ondrej39+1
Věrný člen
31. 8. 2015   #2
-
0
-

#1 luboš
Controller NEMÁ přistupovat k datové vrstvě (u tebe databáze) přímo. Na to máš mít modely. Do controllerů se přes modely tahají data, ať již to je přímo z databáze, přes nějaké api, v controlleru se ta data zpracovávají a po zpracování je vyplivneš do presenteru, který je zobrazí.

Co se týče těch bezpečnostních tokenů, proč jednoduše nevytvoříš novou třídu dědící DefaultController, pojmenujme ji třeba SecureController, a když budeš potřebovat používat v tvém controlleru secure tokeny, tak namísto abys dědil default controller budeš dědit ten zabezpečený.

<?php
abstract class DefaultController
{
    protected function doTheThing() { }
}

abstract class SecureController extends DefaultController
{
    protected function iAmVerySecure()
    {
        return "totally random salt";
    }
}

final class NormalController extends DefaultController
{
    protected function aBeautifulMethod() { }
}

final class ThisControllerNeedsToBeSecure extends SecureController
{
    protected function hashPasswords()
    {
        $securityString = $this->iAmVerySecure();
    }
}

Pokud bys ale někdy přece jen měl pocit, že nutně potřebuješ dědit ze dvou tříd, tak se spíš mrkni na rozhraní.

Dodatek: Když nastavíš proměnnou či metodu třídy jako private, tak ji neuvidí ani potomci. Když vytváříš abstraktní třídy, tak do nich privátní proměnné nepatří, protože abstraktní třídu stejně nikdy vytvářet nebudeš.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
luboš
~ Anonymní uživatel
95 příspěvků
31. 8. 2015   #3
-
0
-

#2 ondrej39

Já samozřejmně mám modely a v nich pripojeni k db a dalsi veci , ta metoda dbcon()  v abstract defaultcontrolleru jen vytvori objekt a pres nej si do controleru taham data např, v registruj controller potřebuji

overit jestli je již jmeno v databazi, tak to udelam takto


$this->objRegistration = new Registruj;//jen objekt pro nacteni prikazu do db
$this->query[1] = $this->objRegistration->searchUser();//dotaz pro db v metode searchuser()
$this->resultName = parent::dbCon()->query($this->query[1],$_POST["name"]) ;//vysledek

pres objRegistration v registrujController nactu prikaz pro wraper, ten prikaz je ulozen v navratovy hodnote metody searchUser() a v resultName mam jiz natazena data z modelu,

ve zkratce je to tak že v registruj kontroluju data od uzivatele které třeba porovnávám v db a v protectoru už data neřeším ale zjištuji třeba jestli nepřišel příkaz ze sítě TOR nebo jestli mi někdo nepodstrkuje přes adresu nejaky hnůj nebo jestli nejde již o 3 pokus  odeslani formuláře a to si ukládám do databáze takze v protectoru taky potrebuju využít metodu dbcon() z té abstraktni třídy, teď mně tak napadá že ta metoda by měla mít spíš název objDB než dbCon, tak se omlouvám za matení.

Mně teď spíš nejvíc zajímá jestli si každý objekt který přistupuje k Db nevytvoří svoje vlastní spojení , to by třeba při deseti objektech došlo k vytvoření deseti spojení? to by pak bylo dost náročný na výkon.

Nahlásit jako SPAM
IP: 89.103.9.–
ondrej39+1
Věrný člen
31. 8. 2015   #4
-
0
-

#3 luboš
Nastuduj si dependency injection. To, co aktuálně děláš, že vytváříš třídu Registruj přímo v jiné třídě ti povede k tak šíleně těsným vazbám, že se z toho v budoucnu zblázníš. Raději si Registruj vytvoř někde jinde a pokud tvoje třída (tvůj kontroler) třídu Registruj bude potřebovat, tak ji předej jako parametr při vytváření kontroleru.

Pokud tě tak trápí, že bys měl více připojení do DB, pokud tě vůbec napadá, že bys měl více připojení, tak opět děláš něco špatně. Vytvoř si třídu, která se ti o připojení do DB postará, třídu, která se do DB připojí třeba v konstruktoru, a když budeš potřebovat pracovat s databází, tak tuto databázovou třídu opět injectni přes konstruktor třídě, která s databází manipuluje.

A aby to bylo úplně správně, tak bys to kontroleru, který bude pracovat s nějakými daty, neměl přes konstruktor posílat třídu pracující s databází, ale interface (dejme tomu MySuperInterface), který ti sjednotí volání nad databází. Pak si můžeš udělat novou třídu která bude MySuperInterface implementovat, ale nebude již pracovat s databází, ale data získávat jiným způsobem, a vzhledem k tomu, že v kontroleru používáš metody rozhraní, tak můžeš databázovou vrstvu jednoduše vyměnit za úplně jiný modul.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
Kit+15
Guru
31. 8. 2015   #5
-
0
-

#3 luboš
Proč taháš data z databáze do controlleru? Cotroller nemá žádný důvod se jí na cokoli ptát. Jeho role (z názvu controller==řadič) je rozkazovat, co má databáze prostřednictvím modelu zapsat, modifikovat nebo smazat. Výsledkem je pouze stavový kód, zda jeho rozkaz byl splněn, případně proč nebyl splněn.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
luboš
~ Anonymní uživatel
95 příspěvků
31. 8. 2015   #6
-
0
-

#5 Kit
nevím jak to myslíš ? vždyť to mám přesně jak to píšeš, ty předešlý kódy jsou jen vytržený z kontextu.

kontroler:

//blah
//blah
public function process()
{
 if($_POST["name"] !=="" and empty($this->error["nameBlankSpace"]) and empty($this->errorRegistruj["nameSemicolons"]))
		{		          
 $this->query[1] = $this->objRegistration->searchUser();//tady rozkazuju databazi pres model
 $this->resultName = parent::dbCon()->query($this->query[1],$_POST["name"]) ;//vysledek
// tady jen kontroluju jestli ano nebo nebo ne
 if($this->resultName !== false)
{
$this->errorRegistruj["nameExist"] = '<span class="red"> ' .$this->objReadFile->fileRead($this->globalPathToErrorText.'error-name-exist-1.txt') . $_POST["name"] . $this->objReadFile->fileRead($this->globalPathToErrorText.'error-name-exist-2.txt'). ' </span>';
}
//blah
//blah
}

model:

// Třída poskytuje metody pro controller 
class Registration
{	
	// Vrátí rozkaz pro vytvoreni databaze
	public function searchUser()
	{
	     //select
          return "SELECT jmeno FROM admin WHERE jmeno = ?";
	}	
}

model:

<?php
//DB.class.php

class Db 
{ 
  private $conn;
  private $host, $user, $pass, $name;
  function __construct()
  {
	 $this->host = "blah";
	 $this->user = "blahh"; 
	 $this->pass = "blahhh";
	 $this->name = "blahhhh";
      $options=array(
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
		 PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
      );
     $this->conn= @new PDO("mysql:host=".$this->host.";dbname=".$this->name."",$this->user, $this->pass, $this->options);
    //$this->spojeni= @new PDO("mysql:host=$host",$user,$pass,$options);
  } 
function query($query, $value= array()){
      $navrat=$this->conn->prepare($query);
      $navrat->execute(array($value));
     return $navrat->fetch();
  }

nechci se s tebou dohadovat o tom jestli se kontroler dotazuje nebo rozkazuje , do databaze se zasilaji dotazy

Nahlásit jako SPAM
IP: 89.103.9.–
Kit+15
Guru
31. 8. 2015   #7
-
0
-

#6 luboš

Controller

Už z názvu metody searchUser() je patrné, že to není rozkaz, ale dotaz, který vrací nějakou hodnotu. To nepatří do controlleru, ale do view.

Co si myslíš, že dělá operátor "and"? Určitě něco jiného, než co chceš. Navíc pokud zapomeneš na závorky kolem $_POST["name"] !=="", tak si to dělá úplně co chce.

Co pohledává HTML v controlleru? To přece také patří do view. Do controlleru nepatří ani písmenko.

Controller nemá právo pracovat s databází. To smí pouze model. Controller vůbec nesmí tušit, že nějaká databáze existuje.

Nauč se zalamovat řádky. Takové nudle, kvůli kterým musíš horizontálně scrollovat, se fakt nedají číst. Editory mívají přednastavený limit 80 sloupců.

Model

Model nemá dodávat text SQL dotazů, ale data. Obsahem tvého "modelu" je pouze a jen jedna konstanta. Jeho úkolem je pracovat s datovými zdroji, tedy i s databází. On jediný s ní umí komunikovat.

Databázová nadstavba

Chybí ti parametry v konstruktoru s přístupovými údaji - máš tam jen konstanty. Ale budiž, časem se to dá udělat pořádně.

V metodě query máš chybu v parametru $value. Pokud ten parametr nezadáš, vloží se pole do pole. Proč se omezuješ pouze na jeden parametr? Stačí drobná úprava a budeš to mít správně: 

$navrat->execute($value);

Je mi jasné, že naráz to asi nepobereš, ale pokus se o to.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
31. 8. 2015   #8
-
0
-

#4 ondrej39
Osvědčilo se mi injektovat:

  • databázi do modelu
  • model do controlleru
  • model do view

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ondrej39+1
Věrný člen
31. 8. 2015   #9
-
0
-

#6 luboš
Tady máš ukázku, jak se to dá oddělit...

<?php
/* interfaces/models/User.php */

namespace Interfaces\Models;

interface User
{
    public function id();
    public function username();
    public function password();
    public function registerDate();
    public function lastActivity();

    public function updateActivity();
}
<?php
/* models/database/User.php */

namespace Models\Database;

use Modules\Database;

final class User implements \Interfaces\Models\User
{
    private $_id;
    private $_database;

    public function __construct($id, Database $database)
    {
        $this->_id = $id;
        $this->_database = $database;
    }

    public function id()
    {
        return $this->_id;
    }

    public function username()
    {
        return $this->_database->runQuery(
            "SELECT username FROM user WHERE id = :id",
        array(
            ":id" => $this->id(),
        ));
    }

    public function password()
    {
        return $this->_database->runQuery(
            "SELECT password FROM user WHERE id = :id",
            array(
                ":id" => $this->id(),
            ));
    }

    public function registerDate()
    {
        return $this->_database->runQuery(
            "SELECT registerDate FROM user WHERE id = :id",
            array(
                ":id" => $this->id(),
            ));
    }

    public function lastActivity()
    {
        return $this->_database->runQuery(
            "SELECT lastActivity FROM user WHERE id = :id",
            array(
                ":id" => $this->id(),
            ));
    }

    public function updateActivity()
    {
        $this->_database->runQuery(
            "UPDATE user SET lastActivity = NOW() WHERE id = :id",
            array(
                ":id" => $this->id(),
            ));

        return $this->lastActivity();
    }
}
<?php
/* models/immutable/User.php */

namespace Models\Immutable;

class User implements \Interfaces\Models\User
{
    protected $_id;
    protected $_username;
    protected $_password;
    protected $_registerDate;
    protected $_lastActivity;

    protected $_iUser;

    public function __construct(\Interfaces\Models\User $iUser)
    {
        $this->_iUser = $iUser;

        $this->id = $this->_iUser->id();
        $this->_username = $this->_iUser->username();
        $this->_password = $this->_iUser->password();
        $this->_registerDate = $this->_iUser->registerDate();
        $this->_lastActivity = $this->_iUser->lastActivity();
    }

    public function id()
    {
        return $this->_id;
    }

    public function username()
    {
        return $this->_username;
    }

    public function password()
    {
        return $this->_password;
    }

    public function registerDate()
    {
        return $this->_registerDate;
    }

    public function lastActivity()
    {
        return $this->_lastActivity;
    }

    public function updateActivity()
    {
        $this->_lastActivity = $this->_iUser->updateActivity();
    }
}
<?php
/* modules/Database.php */

namespace Modules;

class Database
{
    /** @var \PDO */
    protected $_pdo = null;

    public function __construct($dsn, $username, $password, array $options)
    {
        $this->_pdo = new \PDO($dsn, $username, $password, $options);
    }

    public function runQuery($query, array $params)
    {
        $result = array();

        try {
            $statement = $this->_pdo->prepare($query);

            foreach ($params as $paramKey => $value) {
                $statement->bindParam($paramKey, $value);
            }

            $statement->execute();
            $result = $statement->fetchAll();
        } catch (PDOException $e) {
            // Exception handling
        }

        return $result;
    }

    public function beginTransaction()
    {
        $this->_pdo->beginTransaction();
    }

    public function commitTransaction()
    {
        $this->_pdo->commit();
    }

    public function rollBack()
    {
        $this->_pdo->rollBack();
    }
}

V controlleru bys potom používal ten immutable objekt.

(U tohoto kódu neřeš, zda by fungoval, nebo ne, nebo že by tobě zrovna třeba nevyhovoval, jde převážně o principy.)

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
lubos
~ Anonymní uživatel
95 příspěvků
1. 9. 2015   #10
-
0
-

#9 ondrej39

Dík za rady vsem , ale to mi chcete ríct ze tenhle tutoriál http://www.itnetwork.cz/php/mvc na programování v OOP s MVC podle kterýho se to snazím naucit, je spatne a s MVC to vlastne nemá nic spolecného? :-( takze

tenhle druhý serál o MVC uz asi ani nemusím vobec http://www.itnetwork.cz/php/e-shop . to bude urcite ten samý blud??

Nahlásit jako SPAM
IP: 78.80.135.–
lubos
~ Anonymní uživatel
95 příspěvků
1. 9. 2015   #11
-
0
-

#9 ondrej39
Jinak ten tvuj prístup je hodne profesionální, dost mi pripomíná vnitrek nette frameworku, o tenhle pristup jsem se pokousel ale jsem rád ze jsem to odlozil , ted když vidím ze musím prekopat celý MVC mysleni tak by to bylo pro me ještě horsí , ještě ze jsem teprve na zacatku tak me to tolik bolet nebude. opravdem Vám dekuji za cenné rady , ted ještě najit nejaky novy tutorial na netu nebo knihu o MVC  a muzu zacit znovu :-(

Nahlásit jako SPAM
IP: 78.80.135.–
ondrej39+1
Věrný člen
1. 9. 2015   #12
-
0
-

#10 lubos
V tom návodu je problém, že ti ukazuje, jak funguje MVC, ale neukazuje ti, jak správně programovat. Podle toho návodu klidně jeď, na něm se principy MVC naučit můžeš, ale jak to udělat dobře, na to potřebuješ znalosti jiné. Zkus si nastudovat SOLID, v tom je víceméně obsáhnuté vše, jak by měl správný program vypadat. Pokud nebudeš některým věcem rozumět, tak je to zcela normální, klidně se můžeš zeptat tady. Jakmile budeš znát převážně myšlenky za SOLID principy, decoupling objektů už ti půjde úplně sám   .

Nahlásit jako SPAM
IP: 78.156.159.–
Inject all the dependencies!
Kit+15
Guru
1. 9. 2015   #13
-
0
-

#10 lubos
V tom tutoriálu jsou zásadní chyby v implementaci. Když jsem to autorovi napsal formou veřejného příspěvku, vyhodil mě z konference a zabanoval přístup. Dva kohouti se na jednom smetišti prostě nesnesou.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
luboš
~ Anonymní uživatel
95 příspěvků
1. 9. 2015   #14
-
0
-

#13 Kit
to je dost drsný na to že autor má pod každým svým tutoriálem text : Autor je C# a PHP programátor, dále se věnuje webovým technologiím a redaktorské činnosti na ITnetwork. Rád své znalosti sdílí s komunitou a tak je rozšiřuje, věří, že smysl života je poznání. :-(

Nahlásit jako SPAM
IP: 89.103.9.–
Kit+15
Guru
1. 9. 2015   #15
-
0
-

#14 luboš
On pak stejně zavedl na svém portálu pravidla dobrá tak pro Velkého bratra, kvůli kterým bych stejně odešel.

Jinak ta propagovaná databázová nadstavba pro INSERT ze struktury array() je moje, on ji jen znetvořil do statiky. Ta pravá je normálně objektová.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
luboš
~ Anonymní uživatel
95 příspěvků
1. 9. 2015   #16
-
0
-

#12 ondrej39
otázka mimo, můžu na Cpp jazyku postavit kompletní řídící systém pro elektroautomobil?? pokud se mně zeptáš co včechno má systém umět tak odpověď je uplně všechno :-)např:  zvednout podvozek , sám zaparkovat, zjistit polohu, apod, dík za odpověď.

Nahlásit jako SPAM
IP: 89.103.9.–
luboš
~ Anonymní uživatel
95 příspěvků
1. 9. 2015   #17
-
0
-

#15 Kit
já jsem to poznal že to je tvoje předelaný dílo, už jsem se s tvojí prací na netu setkal a nesedí mi k tvým znalostem

Nahlásit jako SPAM
IP: 89.103.9.–
Kit+15
Guru
1. 9. 2015   #18
-
0
-

#17 luboš
Však mi to také zvedá adrenalin, když to někde vidím v té předělané podobě, jak se to někdo snaží napasovat na správně napsaný kus kódu a kvůli tomu to celé předělává do statiky. Originál nyní vypadá takto: 

<?php
function insert($tabulka, array $data=array()) {
    $table = str_replace("`", "``", $tabulka);
    $keys = array_map(
        function ($key) {
            return "`" . $key . "`";
        },
        str_replace("`", "``", array_keys($data))
    );
    $columns = implode(', ', $keys);
    $size = sizeof($data);
    $marks = $size == 0 ? array() : array_fill(0, $size, "?");
    $values = implode(', ', $marks);
    $sql = "INSERT INTO `$table` ($columns) VALUES ($values)";
    $insert = $this->getDB()->prepare($sql);
    $insert->execute(array_values($data));
    return $insert->rowCount();
}

Popravdě to používám spíše výjimečně, protože v jednotlivých doménách modelu mám konkrétní SQL dotazy, u které nejsem tolik omezován, jako u této metody.

Privátní metoda $db->getDB() mi dodá deskriptor databáze, kterou si umí při prvním volání otevřít. Ostatní to většinou řeší Singletonem, což jim znemožňuje otevřít si více databází než jednu.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
1. 9. 2015   #19
-
0
-

#16 luboš
ridici systemy, kde jde o zivoty se vcelku krom C/C++ ani v nicem jinym nedelaji. Jen se musi jeste drzet pomerne striktni pravidla psani kodu (napriklad MISRA C/C++), aby se daly spousty chyb odchytit uz analyzatory kodu, aby se dala kazda cast unit testovat, ...  A samozrejme certifikovat

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
1. 9. 2015   #20
-
0
-

#19 KIIV
S čistým céčkem se dá souhlasit, ale místo C++ je doporučován spíše Lisp. Zejména tam, kde je vyžadována umělá inteligence, na kterou je Lisp vybaven mnohem lépe.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
luboš
~ Anonymní uživatel
95 příspěvků
1. 9. 2015   #21
-
0
-

#19 KIIV
kolik myslíš že je u nás v republice takových programátorů kteří jsou na takové úrovni že by byli schopni takový system postavit????,

Nahlásit jako SPAM
IP: 89.103.9.–
KIIV
~ Moderátor
+43
God of flame
1. 9. 2015   #22
-
0
-

#21 luboš
postavit kompletne vse? Asi zadnej, to chce celej team.

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
1. 9. 2015   #23
-
0
-

#16 luboš
Kup si nějaký trošku větší model auta s motorkem a servořízením. Dej si dovnitř Arduino nebo Raspberry Pi, přidej senzory a začni experimentovat.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
luboš
~ Anonymní uživatel
95 příspěvků
1. 9. 2015   #24
-
0
-

#22 KIIV
samozřejmně že tým jen jestli se dá na tom našem malým rybníčku takový tým dát do kupy?? toť otázka

Nahlásit jako SPAM
IP: 89.103.9.–
KIIV
~ Moderátor
+43
God of flame
1. 9. 2015   #25
-
0
-

#24 luboš
No nebyla by to zadna sranda, ale slo by to.. Musel bys mit patricne ohodnoceni, promakane vyberove rizeni a tak. Mozna i pretahnout lidi z firem jako Valeo. Pak spickovy analytiky, testery...

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
luboš
~ Anonymní uživatel
95 příspěvků
1. 9. 2015   #26
-
0
-

#25 KIIV
takže  šance tu je to jsem rád. Dík za odpovědi.

Nahlásit jako SPAM
IP: 89.103.9.–
Kit+15
Guru
1. 9. 2015   #27
-
0
-

#26 luboš
Počítej však s počátečními investicemi v řádu několika set miliónů, či spíše několika miliard Kč.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý