Bonjour à tous,
Je soiuhaiterais revenir sur un sujet qui a été fermé, car le sujet n'a plus été traité depuis plus de 3 mois.
Je me relance sur ce projet et j'aimerais arrive à mes fins.
J'ai donc installé CakePHP avec composer, donc voici les commande:
cd /var/www/html
curl -s https://getcomposer.org/installer | php
php composer.phar create-project --prefer-dist cakephp/app sbe
Jusqu'à la, tout fonctionne.
Je dois trouver une solution pour importer des fichier CSV, dans ma base de donnée, soit dans un tableau. Ces données seront affichés par CakePHP.
Je pourrais faire une autre application, uniquement en PHP, ou je pourrais intégré ceci a CakePHP3 (ce que je préfère).
Dans tus les cas, je suis intéressé ar ceci : et ca bloque avec composer.
Simplement, je n'arrive pas à l'installer en tapant cette command
http://csv.thephpleague.com/installation/
sachant que je suis au meme niveau que le fichier composer.phar, soit dans /var/www/html/
/var/www/html/composer.phar*
/var/www/html/sbe/
De la je tape cette commande:
dalco@sbe:/var/www/html$ sudo composer require league/csv:^8.0
[sudo] password for dalco:
sudo: composer: command not found
j'ai aussi taper la meme commande, mais depuis le dossier 'sbe', car c'est là que se trouve mon fichier composer.json
dalco@sbe:/var/www/html/sbe/$ composer require league/csv:^8.0
The program 'composer' is currently not installed. To run 'composer' please ask your administrator to install the package 'composer'
Je suis un peu confu. Es-ce que je dois faire un apt-get install composer? Si oui pourquoi ceci
cd /var/www/html
curl -s https://getcomposer.org/installer | php
php composer.phar create-project --prefer-dist cakephp/app sbe
à fonctionné
Milles mercis pur vos lumières
Pour ton problème avec composer regarde ceci : https://getcomposer.org/doc/00-intro.md#globally
Pour le CSV, as-tu pensé à regarder la fonction PHP "fgetcsv" ?
D'accord, mais es-ce que je pourrais aussi faire?
php composer require league/csv:^8.0
sans faire
mv composer.phar /usr/local/bin/composer
(je n'ai pas le dossier composer, dans /usr/local/bin/)
et je dois bien etre a la racine dans mon application ou il y a composer.json?
soit : /var/www/html/sbe/
ou je dois etre ou il y a compser.phar*
soit : /var/www/html/
le mv te permet de bouger le composer.pahr dans le dossier /usr/local/bin et de le renommer composer, ce qui te permettra d'utiliser directement la commande
composer require ....
Et dans le cas ou tu ne veux pas bouger le composer.phar, tu dois utiliser composer de la manière suivante :
php /path/to/composer.phar require ...
Et oui, tu dois utiliser composer dans le dossier du composer.json
D'accord, merci pour ta réponse rapide.
Simplement, ily a encore un petit truc que je compred pas.
Si j'ai fait ceci pour installer mon application 'sbe'
cd /var/www/html
curl -s https://getcomposer.org/installer | php
php composer.phar create-project --prefer-dist cakephp/app sbe
depuis
/var/www/html/composer.phar
Il m'a ensuite créé un dossier sbe dans
/var/www/html/sbe/
Si je fait ce que tu me propose
php /path/to/composer.phar require league/csv:^8.0
sachant que
/path/to/composer.phar
c'est
/var/www/html/composer.phar
Comment il va savoir que ca concerne 'sbe'?
Merci pour ton aide, ca marche!!! Quoi, j'ai pu installer dans le dossier vendors...
Je me demande maintenant comment l'utiliser.
J'ai lu ce code, que je souhaiterais exploiter pour prendre la main.
http://csv.thephpleague.com/examples/
Importing a CSV into a database table
<?php
use League\Csv\Reader;
//We are going to insert some data into the users table
$sth = $dbh->prepare(
"INSERT INTO users (firstname, lastname, email) VALUES (:firstname, :lastname, :email)"
);
$csv = Reader::createFromPath('/path/to/your/csv/file.csv');
$csv->setOffset(1); //because we don't want to insert the header
$nbInsert = $csv->each(function ($row) use (&$sth) {
//Do not forget to validate your data before inserting it in your database
$sth->bindValue(':firstname', $row[0], PDO::PARAM_STR);
$sth->bindValue(':lastname', $row[1], PDO::PARAM_STR);
$sth->bindValue(':email', $row[2], PDO::PARAM_STR);
return $sth->execute(); //if the function return false then the iteration will stop
});
Ce code, il irait d'un un model ou un controller
Je pensais faire un formulaire pour télécharger le fichier, récupérer le nom du fichier, puis faire appelle a ce code avec le nom du fichier...
Merci
Ce genre de traitement se fera dans le Controller, avant toute chose, oublie pas d'annalyser les données récupérée (ne serait-ce que le temps du développement).
Mais d'après la doc, je serais plus pour utiliser le premier exemple:
Donc, dans ton controller
use League\Csv\Reader;
// Traitement pour stocker le fichier CSV dans un dossier
$csv = Reader::createFromPath('/path/to/your/file.csv');
$datas = $csv->setOffset(1)->fetchAll(); // Si ligne de "header", sinon sans le setOffset(1)
foreach ($datas as $key => $data){
// Sauvegarde de la ligne
}
Bien entendu, je n'ai pas testé, je n'ai jamais utilisé cette bibliothèque.
hello, merci beaucoup! je ne suis plus devant mon pc, nais je vais etudier tout ca rapidement. merci
Hello!
Alors j'ai créé un controller ImportsController avec cake
bin/cake bake all imports
Aussi, ma librairie League/Csv se trouve bien dans ROOT/vendor/League ..
Dans mon controller ImportsController, j'ai ajouté cette ligne, en haut (sous use App\Controller\AppController;)
use League\Csv\Reader;
Puis j'ai ajouté une action
public function import()
{
//debug("Start debug");
$csv = Reader::createFromPath($this->request->webroot . 'csv/test.csv');
$datas = $csv->setOffset(1)->fetchAll(); // Si ligne de "header", sinon sans le setOffset(1)
foreach ($datas as $key => $data){
// Sauvegarde de la ligne
debug($key);
debug($data);
}
}
et j'ai aussi créé une vue sous src/Template/Imports/imports.ctp
J'ai synchroniser le ImportsController juste pour voir et, évidemment ca bug ....
Il semble qu'il ne trouve pas l'image, sauf que si je tape dans mon URL www.monsite.ch/csv/test.csv, j'accède bien à mon fichier.
Je ne sais pas si vous voyez une mauvais manipulation de ma part. Pour le moment, je n'essaye pas d'avoir qulque chose dans view, j'aimerais juste ne pas avoir de message d'erreur et que mes debug affiche quelque chose.
Milles mercis
Bonjour.
Comment as-tu configuré ton virtual host, tu le fais bien pointer dans le dossier webroot de ton application ?
Tu devrais plutôt utiliser la constante WWW_ROOT
pour cibler le dossier webroot.
Ton action se nomme import et tu nommes la vue correspondante imports (soit avec un s
) ?
Salut Larka
Merci pour ton aide
Alors deja, il y avait une erreur. J'ai du ajouté webroor
$csv = Reader::createFromPath($this->request->webroot . 'webroot/csv/test.csv');
Ceci dit, ca n'a rien changé. J'ai donc essayé ce que tu m'a proposé
$csv = Reader::createFromPath(WWW_ROOT. 'csv/test.csv');
ce qui me semble mieux, sauf que j'ai maintenant un access denied (le chemin est juste)
SplFileObject::__construct(/var/www/html/sbe/webroot/csv/test.csv): failed to open stream: Permission denied
je suis un peu surpris car le fichier a la droit en lecture
-rw-rw-r-- 1 dalc dalc 35 Aug 9 16:22 test.csv
et le dossier parent a le droit en lecture pour tout le monde.
Par contre, je ne vois pas ce que tu veux dire exactement concernant la configuration de mon virtual host.
J'ai créé aussi un controller SitesController et ca fonctionne très bien comme par exemple
www.monsite.ch/sbe/Sites/index
www.monsite.ch/sbe/Sites/edit
Par contre, il y a un truc qui m'interpelle.
Mon application se trouve dans
var/www/html/sbe/
mon fichier test.csv se trouve dans
var/www/html/sbe/webroot/csv/
Pour voir mon action index, j'entre dans mon URL
http://sbersrv1.epfl.ch/sbe/Imports/index
et ca fonction. Au passage, ma vue s'appelle bien import.ctp. J'ai mis un s par erreur, dans mon prédédent post.
Par contre si je veux télécharger mon fichier test.csv via mon navigateur je fais
http://sbersrv1.epfl.ch/csv/test.csv
sans le sbe
En résumé, j'ai plus au moins avancé.
ceci fonctionne
public function import()
{
debug("Start debug");
$csv = Reader::createFromPath($this->request->webroot . 'webroot/csv/test.csv');
//$csv = Reader::createFromPath(WWW_ROOT. 'csv/test.csv');
debug($csv);
$datas = $csv->setOffset(0)->fetchAll(); // Si ligne de "header", sinon sans le setOffset(1)
debug($datas);
foreach ($datas as $key => $data){
// Sauvegarde de la ligne
debug($key);
debug($data);
}
}
mais je dois mettre fonctuon test.csv en 777 et j'aimerais éviter ceci. J'aimerais le laisser comme il l'est pas defaut, soit droit de lecture pour tout le monde (-rw-rw-r-- )
Y-a-t-il une raison particuliere pour qu'il ne puisse pas le lire?
J'aimerais bien aussi que ceci fonctionne,
$csv = Reader::createFromPath($this->request->webroot . 'webroot/csv/test.csv');
et je pense que ca se resou dans le fchier routes.php
peut etre à ce niveau
Router::scope('/', function (RouteBuilder $routes) {
mais là, je suis un peu largué :o)