Autor Zpráva
martin20a
Profil
Dobrý den,

chtěl bych poprosit o radu. Chci si nastavit defaultní hodnoty pro phpMailer, tyto hodnoty mám v databázi aby se mohli měnit v RS.

Jak by to bylo aby fungovalo je:
class MyPhpMailer extends PHPMailer {
    // DEFAULT VARIABLES
    var $Host = "smtp.savana.cz";                  // zadáme adresu SMTP serveru
    var $SMTPAuth = true;                           // nastavíme true v případě, že server vyžaduje SMTP autentizaci
    var $Username = "***";       // uživatelské jméno pro SMTP autentizaci
    var $Password = "***";                    // heslo pro SMTP autentizaci
    var $From = "email@email.cz";            // adresa odesílatele
    var $FromName = "Jméno webu";                // jméno odesílatele
}

Jenže já potřebuji tam mít data z databáze, takže jsme si to přepsal na:
class MyPhpMailer extends PHPMailer {
    public $val;
        $val = new SettingsValue;
        // DEFAULT VARIABLES
        $Host         = $val->getValue('smtp_host'); 
        $SMTPAuth     = true;                               
        $Username     = $val->getValue('smtp_name'); 
        $Password    = $val->getValue('smtp_pass');
        $From         = $val->getValue('mail_email');
        $FromName     = $val->getValue('mail_from_name');
}

Jenže samozřejmě to takto nemůžu udělat, jelikož to musí být v metodě, jenže zas když to obalím do konstruktéru, tak to nefunguje.
Ještě dolňuji třídu pro získání dat z tabulky:
class SettingsValue {
        public $array;
        public function __construct() {
                $result = dibi::query("SELECT value, name FROM settings");
                foreach ($result as $key => $row) {
                        $this->array[$row['name']] = $row['value'];
                }
               
        }
        public function getValue($name) {
                return $this->array[$name];
        }
}

Děkuji za každou pomoc. S OOP teprve začínám, děkuji.[pre][/pre]
Tori
Profil
Někde mimo PhpMailer si načtěte data z DB do pole a to pak předejte konstruktoru:
class MyPhpMailer extends PHPMailer {
  public function __construct(array $defaults = array(), $useExceptions = false) {
    // nastavení, jestli má PhpMailer vyhazovat výjimky nebo obyč. chyby
    parent::__construct($useExceptions);
    // ostatní nastavení
    $this->Host = $defaults['smtp_host'];
    // ... atd. pro každou hodnotu
  }
}
martin20a
Profil
Tori:
Někde mimo PhpMailer si načtěte data z DB do pole a to pak předejte konstruktoru:

Tak nakonec jsem zjistil že jsem tam pak v konstruktéru jen zapomněl dát this, takže to mám takto:
class MyPhpMailer extends PHPMailer {
    public $val;
    public function __construct() {
        $val = new SettingsValue;
        // DEFAULT VARIABLES
        $this->Host         = $val->getValue('smtp_host');  
        $this->SMTPAuth     = true; 
        $this->Username     = $val->getValue('smtp_name');   
        $this->Password    = $val->getValue('smtp_pass'); 
        $this->From         = $val->getValue('mail_email');    
        $this->FromName     = $val->getValue('mail_from_name');
        $this->CharSet     = "utf-8";    
        $this->WordWrap     = 60;        
    }
}

nevím jestli je to lepší tím tvým způsobem nebo takto jak jsem to udělal. Každopádně pokud mě tam něco chybí nebo cokoliv mám blbě tak uvítám kritiku s vysvětlením problematiky. Děkuji
Tori
Profil
[#3] není úplně dobré řešení kvůli tomu, že
1. konstruktor vyžaduje existenci nějaké třídy SettingsValue, aniž by tuhle závislost nějak navenek dával najevo (např. že by požadoval jako parametr instanci této třídy)
2. zcela zakrývá 1. parametr rodičovského konstruktoru a neumožňuje tedy změnu způsobu reakce na chyby.
A teď koukám na PHPMailer, že vlastně ty proměnné jsou veřejné. Takže by mělo jít i tohle:
$settings = new SettingsValue;
$mailer = new PHPMailer;
$mailer->Host = $settings->getValue('smtp_host');
// ... atd.
martin20a
Profil
Tori:
není úplně dobré řešení kvůli tomu, že

Ok děkuji zkusím si s tím pohrát :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0