[Joomla 1.5] Boucle sur enregistrement via $row->store()
Bonsoir le Forum,
Je bloque depuis quelques temps sur cette fonction "store()" utilisée dans une boucle. Au lieu de m'enregistrer les éléments de l'objet les uns après les autres, il me les enregistre les uns sur les autres (un INSERT, puis le reste en UPDATE !!!).
Plus précisément : Je travaille sur le relooking d'un site Joomla 1.5, avec une amélioration sur un souhait du webmaster. Des données sont récupérées d'un fichier CSV (ex tableau Excel), et découpées en plusieurs parties pour un enregistrement dans 3 tables différentes. Le but est de faire un enregistrement de masse (une centaine d'enregistrements), afin de pouvoir reproduire le tableau Excel sur le site via Joomla 1.5, et pouvoir le tenir à jour.
Voici le code que j'utilise :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| /**
* Enregistrement des games
*
* @param string $fNameFile Nom du fichier téléchargé
*
* @return boolean Enregistrement ou pas ;)
*/
function storeGame($fNameFile)
{
//Declare the global variables:
global $mainframe;
/* Récupération des données du fichier téléchargé */
$dataFull = $this->getData($fNameFile);
$dateArray = $dataFull['dateCSV']; // Tableau des dates
$playinfo = array(1=>'',2=>'',3=>'',4=>''); // Nombre de jeu par session
/* Connexion bdd */
$db =& JFactory::getDBO();
/* Récupérer les données de la table #__bowlingscores_game */
$db->setQuery('SELECT * FROM #__bowlingscores_game order by gamedate');
$rangeGame = $db->loadObjectList();
/* Récupérer l'id de game pour l'ajouter aux scores */
$db->setQuery( 'SELECT id FROM #__bowlingscores_game ORDER BY id DESC LIMIT 1') ;
if ($db->loadResult() !== NULL) {
$lastGame = (int)$db->loadResult() ;
$firstGame = (int)$lastGame+1;
} else {
$lastGame = 0;
$firstGame = 1;
}
/* Initialisation des variables */
$ct1 = 0; // Compteur du tableau $game
$counter = $firstGame; //
$prevDate = NULL; // Date de la dernière session enregistrée
$games = array(); // Tableau des sessions
$row = $this->getTable('game');
// Vérification de l'existance d'enregistrement dans la table #__bowlingscores_game
if (!empty($rangeGame)) {
// Boucle sur le tableau des dates du fichier CSV
foreach ($dateArray as $date) {
// Boucle sur le tableau de la table #__bowlingscores_game
foreach ($rangeGame as $line) {
if ($line->gamedate !== $date->date) {
// Si la date n'existe pas,
$lastGame++;
// trouver le bon $counter pour le "games"
$games[$ct1]->name = $this->game_name($date->date, 'Session ', $counter, $prevDate);
$games[$ct1]->alias = $this->game_name($date->date, 'Session-', $counter, $prevDate);
$games[$ct1]->description = '<p>[NAME] du [GAMEDATE]</p>';
$games[$ct1]->gamedate = $date->date;
$games[$ct1]->plays = '4';
$games[$ct1]->frame = '1';
$games[$ct1]->playinfo = base64_encode(gzcompress(serialize($playinfo)));
$games[$ct1]->moy0 = '0';
$games[$ct1]->published = '1';
$games[$ct1]->template = '1';
$ct1++; $counter++;
$prevDate = $date->date;
} else {
// Si la date existe déjà,
$games[$ct1] = $line;
$ct1++;
}
}
}
} else {
// Boucle sur le tableau des dates du fichier CSV
foreach ($dateArray as $date) {
$lastGame++;
// trouver le bon $counter pour le "games"
$games[$ct1]->name = $this->game_name($date->date, 'Session ', $counter, $prevDate);
$games[$ct1]->alias = $this->game_name($date->date, 'Session-', $counter, $prevDate);
$games[$ct1]->description = '<p>[NAME] du [GAMEDATE]</p>';
$games[$ct1]->gamedate = $date->date;
$games[$ct1]->plays = '4';
$games[$ct1]->frame = '1';
$games[$ct1]->playinfo = base64_encode(gzcompress(serialize($playinfo)));
$games[$ct1]->moy0 = '0';
$games[$ct1]->published = '1';
$games[$ct1]->template = '1';
$ct1++; $counter++;
$prevDate = $date->date;
}
}
$tabGame = array(); $ct = 0;
foreach ($games as $game) {
// Enregistrement des données
$return = $this->register($row, $game);
if (!$this->getError()){
$tabGame[$ct]->id = $firstGame + $ct;
$tabGame[$ct]->name = $game->name;
$tabGame[$ct]->register = 1;
} else {
$tabGame[$ct]->id = $firstGame + $ct;
$tabGame[$ct]->name = $game->name;
$tabGame[$ct]->register = 0;
}
$mainframe->tabGame[$ct] = $tabGame[$ct];
$ct++;
}
return $return;
} |
Code de la fonction register()
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| /**
* Enregistrement en Base de Données
*
* @param object $row objet table de la base de données
* @param object $data données à enregistrer
*
* @return mixed tableau d'erreurs, ou boolean
*/
function register($row, $data) {
if (!$row->bind($data)) {
$this->setError($this->_db->getErrorMsg());
return false;
}
if (!$row->check()) {
$this->setError($this->_db->getErrorMsg());
return false;
}
if (!$row->store()) {
$this->setError( $row->getErrorMsg() );
return false;
}
return true;
} |
Je suis pratiquement sûr d'avoir une boulette plus grosse que moi, mais à force de plancher dessus, je ne vois plus rien.
J'espère être assez clair, et reste à votre disposition pour des compléments d'informations.
Merci de vos réponses...