Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
mon problème est le suivant :
je suis dans un environnement multi-base
toto.fr a un base de donnée toto
titi.fr à un base de donnée titi
etc...
aujourd'hui sur chaque site j'ai un module d' "administration" ou je mets à jours les tables base par base
taches longue car je dois me connecte sur chaque site pour allez faire la mise a jours
je profite donc des vacances pour faire une administration centralisé sur un site centralisateur
toutes mes bases ayant la même architecture.
ma logique de travail est la suivante :
--- Création d'une vue avec un select pour avoir la base de travail.
exemple de mon controler
public function modeconteAction() {
// generation de la vue dans le controller
$this->checkLogin();
if (!$this->isAdmin()) $this->_redirect('/');
$this->view->dbusers = Utils_Dbuser::getdbuserdifautre();
$this->view->products = Utils_Product::getprodlibplusglobal();
if ($this->getRequest()->isPost()) return $this->modeconteProcess();
}
public function modeconteProcess() {
// pour la selcetion de la base de travail
$type = $this->getRequest()->getParam('type');
if (!in_array($type, array('Credentials', 'Selection'))) return;
$method = 'modeconte'.ucfirst($type).'Process';
return $this->$method();
}
public function modeconteSelectionProcess() {
// la base est selectionne pour avoir la vue correct avec la base désiré
}
--- le detail de ma requete pour la vue
static
public function getprodlibplusglobal($limit = 0) {
$sqlLimit = $limit > 0 ? "LIMIT $limit" : '';
$selectdb = Zend_Db_Table::getDefaultAdapter();
if(isset($_POST['selectdb'])) {
$leselectdb = $_POST['selectdb'] ;
$db = Zend_Db_Table::getDefaultAdapter();
$res = $db->query("SELECT * FROM dbuser WHERE dbname=:dbmane", array('dbmane' => $leselectdb));
foreach ($res->fetchAll() as $row) {
$password = $row['password'];
$dbname = $row['dbname'];
$host = $row['host'];
$username = $row['username'];
}
$selectdb = Zend_Db::factory('Pdo_Mysql', array(
'host' => $host,
'username' => $username,
'password' => $password,
'dbname' => $dbname
));
}
else $selectdb = Zend_Db_Table::getDefaultAdapter();
$res = $selectdb->query("SELECT * FROM product
INNER JOIN account ON product.owner=account.email
WHERE 1 AND (product.libplus='' OR product.name='') ORDER BY product.ctime DESC limit 10");
return $res->fetchAll();
}
--- Mise à jours de la base selectionné LORSQUE JE SUIS EN MODE SITE PAR SITE
exemple de mon controler
public function modeconteCredentialsProcess() {
// mise a jours de la base
ini_set ('display_errors', 'on');
$params = $this->getRequest()->getParams();
$errs = '';
$clefs = array(
'id' => 'id',
'name' => 'name',
'libplus' => 'libplus',
'category_id' => 'category_id',
'hidden' => 'hidden',
);
foreach ($params as $k => $v) {
$f = explode(':', $k, 2);
if (count($f) != 2) continue;
$ids = $f[0];
$key = $f[1];
if ($key == 'id') $v = stripslashes($v);
if ($key == 'name') $v = stripslashes($v);
if ($key == 'libplus') $v = nl2br(stripslashes($v));
if ($key == 'category_id') $v = stripslashes($v);
if ($key == 'hidden') $v = $v == 'on' ? 1 : 0;
require_once 'KS/Product.php';
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH.'/httpdocs/library/'),
get_include_path(),
)));
$ch = new KS_product();
if ($ch->load($ids)) {
$ch->$key = $v;
$ch->save();
} else {
$clef = $clefs[$key];
$errs .= "N'a pas pu traité $ids:$clef de value $v<br/>\n";
}
}
if ($errs == '') {
$this->_redirect('dbuser/modeconte');
} else {
$this->view->errors = $errs;
}
}
Le problème ai que la mise a jours ne se faire pas car le controler ne se connecte pas a la BONNE base
avez vous une piste de solution que je puisse exploiter
type conservation de la "factory" du bout en bout
Pour information mes bases sont parfois hebergé à distance donc la solution d'une base commune a tous les site n'est pas envisagable
merci de votre aide
Marc
Dernière modification par poultier (23-08-2013 01:33:46)
Hors ligne
bonjour,
j'ai obtenu la réponse sur un autre forum mais je vous fait partagé la solution "ma" solution au cas ou.
cela coincé a niveau de la mise a jours car je restais sur la connexion par défaut.
en effet, étant novice sur zend je n'en maitrise pas tous les usages,
donc ma réponse risque d'être longue, je m'en excuse par avance.
J'ai contacté en parallèle le développeur originel du site qui m'a apporté une solution.
ajout au niveau du controller
public function modeconteAction()
if(isset($_POST['selectdb'])) {
$this->view->dbuseractive = Utils_Dbuser::getdbuseractive();
}
----------------------
le Utils_Dbuser::getdbuseractive(); en detail
qui reprend les valeurs de connexion a affiché dans la vue (qui plante avant avant de faire le select je vais encore travailler ce point pour eviter les erreurs inutiles )
public function getdbuseractive () {
$paramdba = new stdClass ;
$paramdba->site = '';
$paramdba->password = '';
$paramdba->dbname = '';
$paramdba->host = '';
$paramdba->username = '';
$leselectdb ='root';
if(isset($_POST['selectdb'])) {
$leselectdb = $_POST['selectdb'] ;
$db = Zend_Db_Table::getDefaultAdapter();
$res = $db->query("SELECT * FROM dbuser WHERE dbname=:dbmane", array('dbmane' => $leselectdb));
foreach ($res->fetchAll() as $row) {
//if ($row = $res->fetch()) {
$paramdba->site = $row['site'];
$paramdba->password = $row['password'];
$paramdba->dbname = $row['dbname'];
$paramdba->host = $row['host'];
$paramdba->username = $row['username'];
}
return $paramdba;
}
return $paramdba;
}
-------------------------------------------------
enfin, dans le controleur au niveau du credential
public function modeconteCredentialsProcess() {
// mise a jours de la base
ini_set ('display_errors', 'on');
/* */
$dbname = $this->getRequest()->getParam('dbname');
$host = $this->getRequest()->getParam('host');
$username = $this->getRequest()->getParam('username');
$password = $this->getRequest()->getParam('password');
$selectdbmaj = Zend_Db::factory('Pdo_Mysql', array(
'host' => $host,
'username' => $username,
'password' => $password,
'dbname' => $dbname
));
Zend_Db_Table_Abstract::setDefaultAdapter($selectdbmaj);
$params = $this->getRequest()->getParams();
voila.
Hors ligne
Merci
Hors ligne
Pas de quoi, ca fait parti du jeux
tu m'aides
je t'aide
bon dev ))
Hors ligne