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

13 réponses


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'?

Ok karelo, j'avais pas encore lu ton message avant de poster mon précédent

Surtout que je l'ai modifié 5 fois :)

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)