IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MkFramework Discussion :

Importer dans deux tables de ma base mysql depuis csv


Sujet :

MkFramework

  1. #1
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 201
    Points : 75
    Points
    75
    Par défaut Importer dans deux tables de ma base mysql depuis csv
    Bonjour Imikado et autres utilisateurs.

    Il y a trois ans j'ai fait une application de gestionnaire d'évaluation des élèves sur l'utilisation de machines dangereuse.
    Imikado m'a beaucoup aidé et je le remercie à nouveau.

    Pour charger la base de mes nouveaux élèves et des nouvelles classes en Sept un collègue le fait via les formulaires.
    Comme c'est un peu long pour les élèves je le fais directement via phpmyadmin en sql.

    j'aimerai que ce soit possible en import d'un fichier CSV. pour rendre l'application plus facile d'utilisation par d'autres.

    J'aimerai savoir s'il existe un plugin dans MKframework qui fait ça?
    Si ce n'est pas le cas, pouvez-vous me conseiller vers quelle librairie, script m'orienter et facile d'utilisation?

    En fait j'ai deux table à charger en même temps: "user" et "classes". Au moment de charger il faut éviter les doublons. En effet, certains élèves continues leur formation dans une autre classe et bénéficies des évaluations déjà faites.

    Encore bravo pour le travail que vous faite. Je constate que le framework a bien évolué depuis la dernière fois, et qu'il n'a pas fini de surprendre. Je vous félicite.
    Cordialement

  2. #2
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Bonjour,

    Imaginons que votre fichier csv est de la forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nom;prenom;classe;
    hugo;victor;class A;
    et qu'il est stoqué ici /tmp/import.csv

    Imaginons que vous ayez deux classes model: model_eleve.php et model_classe.php relative aux deux tables suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    eleve
    -id
    -nom
    -prenom
     
    classe
    -id
    -eleve_id
    -nom
     
    une troisieme classe d'une table permettant de faire le lien entre un eleve et une classe non ?
    par exemple 
     
    eleve_classe
    -id
    -eleve_id
    -classe_id
    Vous pouvez ajouter à votre classe model_eleve une methode pour verifier que l'eleve n'existe pas et ne pas le creer deux fois

    1. Ajoutons dans model_eleve une methode findByNameAndLastName()
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function findByNameAndLastName($sName,$sLastname){
    	return $this->findOne('SELECT * FROM eleve WHERE prenom=? and nom=?',$sName,$sLastname);
     
    }

    2.meme chose pour model_classe
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function findByName($sName){
     
    	return $this->findOne('SELECT * FROM classe WHERE nom=?',$sName);
    }

    3. creer un module d'import avec une action _import:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    public function _import(){
     
    	$sFilename='/tmp/import.csv';
     
    	$tLine=file($sFilename);
    	//boucle sur le fichier csv
    	foreach($tLine as $i => $sLine){
     
    		if($i==0){
    			//on ignore la premiere ligne si c'est l'entete 
    			continue;
    		}
    		//pour chaque ligne on découpe avec le caractère ";" pour recuperer nos 3 colonnes dans des variables:
    		list($sName,$sLastname,$sClassname)=explode(';',trim($sLine));
     
    		//ensuite on passe au traitement
     
    		//on verifie si l'eleve existe deja
    		$oEleveInDatabase=model_eleve::getInstance()->findByNameAndLastName($sName,$sLastname );
    		if($oEleveInDatabase){
    			$id_eleve=$oEleveInDatabase->id;
    		}else{
    			//l'eleve existe pas : on le cree
    			$oEleve=new row_eleve();
    			$oEleve->prenom=$sName;
    			$oEleve->nom=$sLastname;
    			$oEleve->save();
     
    			//sous mysql et sql server, le champ de l'id va etre mis a jour dans l'objet
    			$id_eleve=$oEleve->id;
    		}
     
    		//on verifie si la classe existe
    		$oClasseInDatabase=model_classe::getInstance()->findByName($sClassname);
    		if($oClasseInDatabase){
    			$id_classe=$oClasseInDatabase->id;
    		}else{
    			//la classe n'existe pas on la cree
    			$oClasse=new row_classe;
    			$oClasse->nom=$sClassname;
    			$oClasse->save();
    		}
     
     
    		//on ajoute le lien entre l'eleve et la classe
    		$oEleveClasse=new row_eleve_classe;
    		$oEleveClasse->eleve_id=$id_eleve;
    		$oEleveClasse->classe_id=$id_classe;
    		$oEleveClasse->save();
     
     
    	}
     
    }
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  3. #3
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    Merci Imikado,

    J'ai tout fait comme il faut mais j'ai oublié de préciser que je suis amateur débutant pas très à l'aise.
    pour la méthode findByNameAndLastName() tu écris
    WHERE prenom=? and nom=?',$sName,$sLastname) le nom et prénom sont inversé est-ce normal? C'est pas plutôt
    WHERE nom=? and prenom=?',$sName,$sLastname) ?

    Après avoir ajouté correctement compléter mes modéles, j'ai créer mon module importcsv avec main.php comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php 
    class module_importcsv extends abstract_moduleembedded{
    	public function before(){
    		$this->oLayout=new _layout('template1');
     
    		$this->oLayout->addModule('menu','menu::left');
    	}
     
    	/* #debutaction#
    	public function _exampleaction(){
    	
    		$oView=new _view('examplemodule::exampleaction');
    		
    		$this->oLayout->add('main',$oView);
    	}
    	#finaction# */
     
     
    	public function _import(){ 
    	$sFilename='/tmp/import.csv';
     
    	$tLine=file($sFilename);
    	//boucle sur le fichier csv
    	foreach($tLine as $i => $sLine){
     
    		if($i==0){
    			//on ignore la premiere ligne si c'est l'entete 
    			continue;
    		}
    		//pour chaque ligne on découpe avec le caractère ";" pour recuperer nos 3 colonnes dans des variables:
    		list($sName,$sLastname,$sClassname)=explode(';',trim($sLine));
     
    		//ensuite on passe au traitement
     
    		//on verifie si l'eleve existe deja
    		$oEleveInDatabase=model_eleve::getInstance()->findByNameAndLastName($sName,$sLastname );
    		if($oEleveInDatabase){
    			$id_eleve=$oEleveInDatabase->id;
    		}else{
    			//l'eleve existe pas : on le cree
    			$oEleve=new row_eleve();
    			$oEleve->prenom=$sName;
    			$oEleve->nom=$sLastname;
    			$oEleve->save();
     
    			//sous mysql et sql server, le champ de l'id va etre mis a jour dans l'objet
    			$id_eleve=$oEleve->id;
    		}
     
    		//on verifie si la classe existe
    		$oClasseInDatabase=model_classe::getInstance()->findByName($sClassname);
    		if($oClasseInDatabase){
    			$id_classe=$oClasseInDatabase->id;
    		}else{
    			//la classe n'existe pas on la cree
    			$oClasse=new row_classe;
    			$oClasse->nom=$sClassname;
    			$oClasse->save();
    		}
     
     
    		//on ajoute le lien entre l'eleve et la classe
    		$oEleveClasse=new row_eleve_classe;
    		$oEleveClasse->eleve_id=$id_eleve;
    		$oEleveClasse->classe_id=$id_classe;
    		$oEleveClasse->save();
     
     
    	}
     
    	}
    }
    et dans mon fichier view.php je suis perdu car je ne sais pas quoi écrire:

    En fait il faudrait un formulaire pour télécharger le fichier sur tmp/
    Et que l'action d'import se fasse dans la foulé.
    Si ensuite, que le fichier reste sur tmp, c'est pas mal. Comme ça on garde une trace de l'import.

    J'ai vu qu'il existe un plugin pour les" form" mais j'avoue ma faiblesse incompétente pour comprendre comment faire.

    Je vous remercie d'avance pour votre aide.
    Cordialement

  4. #4
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Lastname c'est "nom de famille", pour être clair, il aurait fallu utiliser firstname et lastname

    Pour la suite, oui on peut faire une méthode ainsi:
    en se basant sur ce tutoriel: http://mkframework.com/tutoriaux.html#upload

    Ca pourrait donner:

    View:
    view/upload.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <form action="" method="POST" enctype="multipart/form-data">
    Fichier <input type="file" name="importFile" />
     
     
    <input type="submit" value="Charger"/>
     
    </form>
    main.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    public function _import(){ 
     
    		$this->processImport();
     
    		$oView=new _view('importcsv::upload');
     
    		$this->oLayout->add('main',$oView);
    	}
     
    	public function processImport(){
     
    		if(!_root::getRequest()->isPost() ){ //si ce n'est pas une requete POST on ne soumet pas
    			return null;
    		}
     
    		$sColumn='importFile';
    		$oPluginUpload=new plugin_upload($sColumn);
     
    		if($oPluginUpload->isValid()){
    		$sFilename='data/upload/'.$sColumn.'_'.date('Ymdhis');
     
    		$oPluginUpload->saveAs($sFilename);
     
     
    		$tLine=file($sFilename);
    		//boucle sur le fichier csv
    		foreach($tLine as $i => $sLine){
     
    			if($i==0){
    				//on ignore la premiere ligne si c'est l'entete 
    				continue;
    			}
    			//pour chaque ligne on découpe avec le caractère ";" pour recuperer nos 3 colonnes dans des variables:
    			list($sName,$sLastname,$sClassname)=explode(';',trim($sLine));
     
    			//ensuite on passe au traitement
     
    			//on verifie si l'eleve existe deja
    			$oEleveInDatabase=model_eleve::getInstance()->findByNameAndLastName($sName,$sLastname );
    			if($oEleveInDatabase){
    				$id_eleve=$oEleveInDatabase->id;
    			}else{
    				//l'eleve existe pas : on le cree
    				$oEleve=new row_eleve();
    				$oEleve->prenom=$sName;
    				$oEleve->nom=$sLastname;
    				$oEleve->save();
     
    				//sous mysql et sql server, le champ de l'id va etre mis a jour dans l'objet
    				$id_eleve=$oEleve->id;
    			}
     
    			//on verifie si la classe existe
    			$oClasseInDatabase=model_classe::getInstance()->findByName($sClassname);
    			if($oClasseInDatabase){
    				$id_classe=$oClasseInDatabase->id;
    			}else{
    				//la classe n'existe pas on la cree
    				$oClasse=new row_classe;
    				$oClasse->nom=$sClassname;
    				$oClasse->save();
    			}
     
     
    			//on ajoute le lien entre l'eleve et la classe
    			$oEleveClasse=new row_eleve_classe;
    			$oEleveClasse->eleve_id=$id_eleve;
    			$oEleveClasse->classe_id=$id_classe;
    			$oEleveClasse->save();
     
     
    		}
     
    	}
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  5. #5
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Attention: pourquoi avez vous utilisé un module embarqué ? les modules embarqués sont a utiliser dans des cas particulier

    Ici un module "normal" fera tres bien l'affaire

    Et pour le plugin_form, je vous invite à generer un module CRUD, vous pourrez ainsi voir son utilisation dans les vue edit.php et show.php
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  6. #6
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    Ce serait trop beau si ça marchait du premier coup

    Dans le module menu j'ai ajouté un bouton vers "securite/public/index.php?:nav=importcsv::upload"
    $tLink['IMPORTER ELEVES']='importcsv::upload';
    en cliquant dessus j'ai une page blanche avec erreur 500 "...ne fonctionne pas Impossible de traiter cette demande via..."

    Attention: pourquoi avez vous utilisé un module embarqué ?
    Je ne sais pas ce que ça veux dire "embarqué". J'ai pris un fichier dans un autre module pour me servir d'exemple et j'ai copier collé en adaptant au mieux.

    Mon module main.php qui est dans module/importcsv j'ai ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php 
    class module_importcsv extends abstract_moduleembedded{
    	public function before(){
    		$this->oLayout=new _layout('templateAdmin');
     
    		$this->oLayout->addModule('menu','menu::left');
    	}
     
    	public function _index(){
    	    $this->_import();
    	}
     
     
    public function _import(){ 
     
    		$this->processImport();
     
    		$oView=new _view('importcsv::upload');
     
    		$this->oLayout->add('main',$oView);
    	}
     
    	public function processImport(){
     
    		if(!_root::getRequest()->isPost() ){ //si ce n'est pas une requete POST on ne soumet pas
    			return null;
    		}
     
    		$sColumn='importFile';
    		$oPluginUpload=new plugin_upload($sColumn);
     
    		if($oPluginUpload->isValid()){
    		$sFilename='data/upload/'.$sColumn.'_'.date('Ymdhis');
     
    		$oPluginUpload->saveAs($sFilename);
     
     
    		$tLine=file($sFilename);
    		//boucle sur le fichier csv
    		foreach($tLine as $i => $sLine){
     
    			if($i==0){
    				//on ignore la premiere ligne si c'est l'entete 
    				continue;
    			}
    			//pour chaque ligne on découpe avec le caractère ";" pour recuperer nos 3 colonnes dans des variables:
    			list($sName,$sLastname,$sClassname)=explode(';',trim($sLine));
     
    			//ensuite on passe au traitement
     
    			//on verifie si l'eleve existe deja
    			$oEleveInDatabase=model_eleve::getInstance()->findByNameAndLastName($sName,$sLastname );
    			if($oEleveInDatabase){
    				$id_eleve=$oEleveInDatabase->id;
    			}else{
    				//l'eleve existe pas : on le cree
    				$oEleve=new row_eleve();
    				$oEleve->prenom=$sName;
    				$oEleve->nom=$sLastname;
    				$oEleve->save();
     
    				//sous mysql et sql server, le champ de l'id va etre mis a jour dans l'objet
    				$id_eleve=$oEleve->id;
    			}
     
    			//on verifie si la classe existe
    			$oClasseInDatabase=model_classe::getInstance()->findByName($sClassname);
    			if($oClasseInDatabase){
    				$id_classe=$oClasseInDatabase->id;
    			}else{
    				//la classe n'existe pas on la cree
    				$oClasse=new row_classe;
    				$oClasse->nom=$sClassname;
    				$oClasse->save();
    			}
     
     
    			//on ajoute le lien entre l'eleve et la classe
    			$oEleveClasse=new row_eleve_classe;
    			$oEleveClasse->eleve_id=$id_eleve;
    			$oEleveClasse->classe_id=$id_classe;
    			$oEleveClasse->save();
     
     
    		}
     
    	}
     
    }
    ?>
    Puis dans view j'ai un fichier upload.php avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <form action="" method="POST" enctype="multipart/form-data">
    Fichier <input type="file" name="importFile" />
     
     
    <input type="submit" value="Charger"/>
     
    </form>
    Dans /plugin je n'avais pas le plugin_form.php je l'ai installé.
    Et pour le plugin_form, je vous invite à generer un module CRUD, vous pourrez ainsi voir son utilisation dans les vue edit.php et show.php
    Je ne comprend pas. J'en ai plein de module CRUD qui ont été generé au début de la création de l'application.

    En essayant de comprendre avec d'autres modules, j'ai fait plein de test sans pouvoir parvenir à quoi que ce soit d'autre que cette page idiote
    Je suis sur qu'après un bref coup d’œil amusé, vous avez vu le problème.
    Cordialement

  7. #7
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    L'erreur vient du fait que vous avez copié le code d'un module "embarqué"

    Sur le mk: il y a 2 types de modules: les autonomes/normaux et les embarqués
    Les premiers sont appelable par une url de type module::action, les second doivent etre créé et ajouté au sein d'un autre module, par exemple le module googleMap

    Pour regler votre soucis
    1. activer les erreurs sur votre plateforme
    2. modifier le code de votre module

    de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class module_importcsv extends abstract_moduleembedded{
    vers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class module_importcsv extends abstract_module{
    Pour le point 1, il vous faut activer les erreurs en modifiant votre fichier php.ini (je ne sais pas ce que vous utilisez: windows, linux, easyphp, wamp...) ?
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  8. #8
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Pour les erreurs avec cette page "idiote" voir mon point 1

    vous developpez sous windows, linux ?
    qu'utilisez vous comme installation web: easyphp,wamp ?
    Il faut vraiment que vous activiez les erreurs php, sinon le développement va etre très difficile a debuguer
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  9. #9
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    Bonsoir,

    J'ai modifier le module en suivant votre conseil.

    Actuellement l'application est hébergée chez ovh.
    J'ai la flemme de l'importer en local

  10. #10
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Hebergement ovh, donc GNU/Linux je suppose

    En mutualisé, vps ou serveur dédié ? ma question: pouvez-vous modifier le fichier php.ini (sur /etc/php5/apache/php.ini ou assimilé: cela dépend de la distribution utilisée)

    Ou sinon, vous pouvez tentez d'ajouter dans votre fichier public/index.php la ligne suivante pour forcer l'affichage des erreurs (si autorisé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
     
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  11. #11
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    Ovh mutualisé
    j'ai completé mon public/index
    Du coup j'avais une erreur signalé. Une "}" manqué
    J'ai modifié
    Puis
    Erreur

    Erreur dans module/importcsv/main.php
    Pas de méthode _upload() dans le module "importcsv" à charger
    C'est l'appel que j'avais mis dans module menu j'ai changé pour "import" puisque c'est le nom de la public function.
    là j'ai une page blanche sans rien.

  12. #12
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Vous avez bien dans l'url :nav=importcsv::import, c'est bien ça ?

    vous avez modifier le extends de votre classe module_importcsv comme je vous l'ai indiqué ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extends abstract_module
    Vous avez une page qui n'affiche meme pas le formulaire ?

    Avez vous une méthode after qui affiche le layout comme ceci:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public function after(){
    		$this->oLayout->show();
    	}
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  13. #13
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    Il manquait bien la function after()
    J'ai mon formulaire.
    Je reviendrai vers vous après mes tests. Il faut que j'adapte votre proposition de code avec celui de ma base.
    A bientôt

  14. #14
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    pas de soucis
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  15. #15
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    Bonjour
    J'ai adapté, enfin je crois avoir adapté correctement votre exemple à ma base et à mes modèles, mais voilà j'ai une erreur au moment ou je lance le chargement de l'import. voici l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Erreur
    move_uploaded_file(data/upload/importFile_201612170219066179378147a6b739787b4e5ea5db8e0e199736b4.1481980746.csv): failed to open stream: No such file or directory
    #0 [internal function]: exception_error_handler(2, 'move_uploaded_f...', '/home/lyceelam/...', 59, Array)
    #1 /home/lyceelam/www/machinesabois/securite/plugin/plugin_upload.php(59): move_uploaded_file('/tmp/phpKOxjBQ', 'data/upload/imp...')
    #2 /home/lyceelam/www/machinesabois/securite/module/importcsv/main.php(38): plugin_upload->saveAs('data/upload/imp...')
    #3 /home/lyceelam/www/machinesabois/securite/module/importcsv/main.php(19): module_importcsv->processImport()
    #4 /home/lyceelam/www/machinesabois/securite/lib/framework/class_root.php(232): module_importcsv->_import()
    #5 /home/lyceelam/www/machinesabois/securite/public/index.php(57): _root->run()
    #6 {main}
     
    Detail:
    #0 exception_error_handler( , 'move_uploaded_file(data/upload/importFile_201612170219066179378147a6b739787b4e5ea5db8e0e199736b4.1481980746.csv): failed to open stream: No such file or directory' , '/home/lyceelam/www/machinesabois/securite/plugin/plugin_upload.php' , , Array ( [sNewFileName] => data/upload/importFile_20161217021906 ) )
    #1 /home/lyceelam/www/machinesabois/securite/plugin/plugin_upload.php (59)
    move_uploaded_file( '/tmp/phpKOxjBQ' , 'data/upload/importFile_201612170219066179378147a6b739787b4e5ea5db8e0e199736b4.1481980746.csv' )
    #2 /home/lyceelam/www/machinesabois/securite/module/importcsv/main.php (38)
    plugin_upload -> saveAs( 'data/upload/importFile_20161217021906' )
    #3 /home/lyceelam/www/machinesabois/securite/module/importcsv/main.php (19)
    module_importcsv -> processImport( )
    #4 /home/lyceelam/www/machinesabois/securite/lib/framework/class_root.php (232)
    module_importcsv -> _import( )
    #5 /home/lyceelam/www/machinesabois/securite/public/index.php (57)
    _root -> run( )
    #6 {main}
    et mon module importcsv modifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php 
    class module_importcsv extends abstract_module{
    	public function before(){
    		$this->oLayout=new _layout('templateAdmin');
     
    		$this->oLayout->addModule('menu','menu::left');
    	}
    	public function after(){
    		$this->oLayout->show();
    	}
     
    	public function _index(){
    	    $this->_import();
    	}
     
     
    	public function _import(){ 
     
    		$this->processImport();
     
    		$oView=new _view('importcsv::upload');
     
    		$this->oLayout->add('main',$oView);
    	}
     
    	public function processImport(){
     
    		if(!_root::getRequest()->isPost() ){ //si ce n'est pas une requete POST on ne soumet pas
    			return null;
    		}
     
    		$sColumn='importFile';
    		$oPluginUpload=new plugin_upload($sColumn);
     
    		if($oPluginUpload->isValid()){
    		$sFilename='data/upload/'.$sColumn.'_'.date('Ymdhis');
     
    		$oPluginUpload->saveAs($sFilename);
     
     		$tLine=file($sFilename);
    			//boucle sur le fichier csv
    			foreach($tLine as $i => $sLine){
     
    				if($i==0){
    					//on ignore la premiere ligne si c'est l'entete 
    					continue;
    				}
    				//pour chaque ligne on découpe avec le caractère ";" pour recuperer nos 3 colonnes dans des variables:
    				list($sName,$sLastname,$sLogin,$sClassname,$sSession,$sAtelier_id)=explode(';',trim($sLine));
     
    				//ensuite on passe au traitement
     
    				//on verifie si l'eleve existe deja
    				$oEleveInDatabase=model_eleve::getInstance()->findByNameAndLastName($sName,$sLastname );
    				if($oEleveInDatabase){
    					$id_eleve=$oEleveInDatabase->id;
    				}else{
    					//l'eleve existe pas : on le cree
    					$oEleve=new row_eleve();
    					$oEleve->prenom=$sName;
    					$oEleve->nom=$sLastname;
    					$oEleve->login=$sLogin;
    					$oEleve->statut_id=1;
    					$oEleve->save();
     
    					//sous mysql et sql server, le champ de l'id va etre mis a jour dans l'objet
    					$id_eleve=$oEleve->id;
    				}
     
    				//on verifie si la classe existe
    				$oClasseInDatabase=model_classe::getInstance()->findByName($sClassname);
    				if($oClasseInDatabase){
    					$id_classe=$oClasseInDatabase->id;
    				}
    				else
    				{
    					//la classe n'existe pas on la cree
    					$oClasse=new row_classe;
    					$oClasse->nom=$sClassname;
    					$oClasse->session=$sSession;
    					$oClasse->atelier_id=$sAtelier_id;
    					$oClasse->save();
    				}
     
     
    				//on ajoute le lien entre l'eleve et la classe
    				$oClassesUsers=new row_eleve_classe;
    				$oClassesUsers->user_id=$id_eleve;
    				$oClassesUsers->classe_id=$id_classe;
    				$oClassesUsers->save();	 
    			} 
    		}	
    	}
    }
    J'ai pensé que cela pouvez venir des permissions du dossier data/upload il est à 706 en le passant à 707 c'est pareil.

    Autre chose, pour n'afficher que les classes de promotions en cours voici ce que j'ai mis dans le model de classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public function findNotOld(){
    	//pour  n'afficher que les promotions a venir
    $fin_saison="07-31";
    $mois=date("n");
    if ($mois=="10"||$mois=="11"||$mois=="12") {
     $mois=date("n");
    }
    else{
      $mois =date("0n");
    }
    $jour =date("d");
    $date_ref="$mois-$jour";
    $annee= date("Y");
      if ($date_ref <= $fin_saison)
      {
      $annee=$annee-1;
      }
     
    //==========================================
    		return $this->findMany('SELECT * FROM '.$this->sTable.' WHERE session NOT LIKE "%'.$annee.'" ORDER BY nom DESC');
    	}
    Du coup en ce moment il n'y a aucune promo se finissant en 2016. mais il m'affiche les promotions d'avant 2016. comment faire pour que cela affiche celle en cours et à venir seulement.
    LA structure de la table est comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE IF NOT EXISTS `classes` (
      `id` int(11) NOT NULL,
      `nom` varchar(255) DEFAULT NULL,
      `session` varchar(255) DEFAULT NULL,
      `atelier_id` int(11) DEFAULT NULL
    ) ENGINE=MyISAM AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;
     
    --
    -- Contenu de la table `classes`
    --
     
    INSERT INTO `classes` (`id`, `nom`, `session`, `atelier_id`) VALUES
    (26, 'BAC-3-AEA', '2014-2017', 1),
    session étant la promo.

  16. #16
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    d'apres l 'erreur: le repetoire data/upload/ existe ? il est inscriptible?
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  17. #17
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    Oui les droits d’accès sont permis en écriture (propriétaire, groupe et public)chmod 729

  18. #18
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    ptite erreur de ma part: remplacez "data/upload/" par "../data/upload/"
    il faut en effet remonter d'un cran: index.php étant dans le repertoire public
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  19. #19
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    ça ne doit pas être ça car j'ai la même erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Erreur
    file(../data/upload/importFile_20161218120649): failed to open stream: No such file or directory
    #0 [internal function]: exception_error_handler(2, 'file(../data/up...', '/home/lyceelam/...', 40, Array)
    #1 /home/lyceelam/www/machinesabois/securite/module/importcsv/main.php(40): file('../data/upload/...')
    #2 /home/lyceelam/www/machinesabois/securite/module/importcsv/main.php(19): module_importcsv->processImport()
    #3 /home/lyceelam/www/machinesabois/securite/lib/framework/class_root.php(232): module_importcsv->_import()
    #4 /home/lyceelam/www/machinesabois/securite/public/index.php(57): _root->run()
    #5 {main}
     
    Detail:
    #0 exception_error_handler( , 'file(../data/upload/importFile_20161218120649): failed to open stream: No such file or directory' , '/home/lyceelam/www/machinesabois/securite/module/importcsv/main.php' , , Array ( [sColumn] => importFile [oPluginUpload] => plugin_upload Object ( [tFile:plugin_upload:private] => Array ( [name] => test01.csv [type] => text/csv [tmp_name] => /tmp/phpwJYf5u [error] => 0 [size] => 104 ) [sOriginFileName:plugin_upload:private] => test01.csv [sTmpFileName:plugin_upload:private] => /tmp/phpwJYf5u [sNewPath:plugin_upload:private] => ../data/upload/importFile_2016121812064972b757de84a56e7a4b858119cec3f46879076cef.1482016009.csv [sExtension:plugin_upload:private] => csv [bValid:plugin_upload:private] => 1 [salt:plugin_upload:private] => 1EE7a89 ) [sFilename] => ../data/upload/importFile_20161218120649 ) )
    #1 /home/lyceelam/www/machinesabois/securite/module/importcsv/main.php (40)
    file( '../data/upload/importFile_20161218120649' )
    #2 /home/lyceelam/www/machinesabois/securite/module/importcsv/main.php (19)
    module_importcsv -> processImport( )
    #3 /home/lyceelam/www/machinesabois/securite/lib/framework/class_root.php (232)
    module_importcsv -> _import( )
    #4 /home/lyceelam/www/machinesabois/securite/public/index.php (57)
    _root -> run( )
    #5 {main}

  20. #20
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Ce n'est pas la meme erreur, on avance

    Le premier soucis venait de l'ecriture de l'upload, le second vient de la lecture du fichier

    en effet, la methode saveAs du plugin upload ne donne pas le nom "reel" de la sauvegarde: pour des raisons de sécurité une part de "random" est ajouté au nom du fichier, il faut utiliser la méthode getPath() pour avoir le nom final du fichier upload, il faut donc modifier votre code ainsi:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public function processImport(){
     
    		if(!_root::getRequest()->isPost() ){ //si ce n'est pas une requete POST on ne soumet pas
    			return null;
    		}
     
    		$sColumn='importFile';
    		$oPluginUpload=new plugin_upload($sColumn);
     
    		if($oPluginUpload->isValid()){
    		$sFilename='data/upload/'.$sColumn.'_'.date('Ymdhis');
     
    		$oPluginUpload->saveAs($sFilename);
     
     		$tLine=file($oPluginUpload->getPath() );
    il faut faire un file de $oPluginUpload->getPath() à la place de $sFilename
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/02/2014, 01h30
  2. Réponses: 0
    Dernier message: 28/06/2013, 19h10
  3. Réponses: 9
    Dernier message: 07/06/2011, 23h24
  4. Insertion croisée dans deux tables mysql
    Par tiger33 dans le forum Requêtes
    Réponses: 6
    Dernier message: 19/09/2006, 08h55
  5. Jointure de tables sur 2 base MySQL, si poussible??
    Par nerik38 dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/11/2005, 20h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo