THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,

Je rencontre un petit (gros) soucis sur une de mes commandes. J'ai besoin de récuperer le contenu d'une de mes routes (génération de CSV à partir d'une loop), mais le soucis est que absoluteUrl me renvoie (localhost/...) alors que la même méthode ailleurs me renvoie bien le fake dns que j'ai mis en place. Je suppose que c'est lié au fait que je sois dans une commande, mais comment contourner ce problème?

class LogbookCSV extends ContainerAwareCommand
{
    protected function init()
    {
        $container = $this->getContainer();

        $request = new Request();
        $request->setSession(new Session(new MockArraySessionStorage()));

        /** @var RequestStack $requestStack */
        $requestStack = $container->get('request_stack');
        $requestStack->push($request);
    }

    protected function configure()
    {
        $this
            ->setName("subscription:logbook")
            ->setDescription("Generate CSV file with all the bank transfers of the past month then email it");
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln("Starting");
        $output->writeln("Processing Bank Transfer during last month");
        $today = date('m-d-Y');
        $filename = Subscription::LOGBOOK_DIR."logbook-".$today;
        $this->init();
        $url = new URL($this->getContainer());
        echo $url->absoluteUrl('/logbook/csv');
        $csv = file_get_contents($url->absoluteUrl('/logbook/csv'));
        file_put_contents($filename, $csv);
        $output->writeln("Done !");
    }
}

Pourriez-vous m'aider SVP?

Last edited by wisejack (21-04-2017 21:56:39)

Offline


Franchement, un simple wget -q -O toto.csv http://ton_url suffirait pour simplement récupérer les données CSV. Pourquoi écrire une commande Thelia ?


OpenStudio Toulouse

Offline


Parce qu'on voudrait automatiser ce process, de manière a générer le fichier automatiquement grâce à un CRON puis à envoyer le lien lui correspondant par mail à différents gestionnaires. Sans avoir à intervenir manuellement

Offline


En laissant tomber le problème d'url, et la commande, quand je fais un wget sur mon url j'obtiens systematiquement un 403 Forbidden.La même url dans mon navigateur, perfect j'ai ce qu'il me faut, dans mon terminal avec un wget Forbidden.
Mon controller:

class LogbookController extends BaseAdminController
{
    /**
     * @param $period_start
     * @param $period_end
     * @return Response
     */
    public function renderLogbookContentAction($period_start, $period_end)
    {
        $data = $this->renderRaw('logbook_content', [
            "period_start" => $period_start,
            "period_end" => $period_end
        ]);

        return new Response(json_encode(["html" => $data]), 200);
    }

    public function renderLogbookCSVAction()
    {
        $end = date('Y-m-d');
        $start = date("Y-m-d", strtotime('-1 month', strtotime($end)));

        $csv = $this->renderRaw('csv_logbook_content', [
            "period_start" => $start,
            "period_end" => $end
        ]);

        return new Response($csv);
    }

Que puis-je faire?

Offline


Forbidden, ça veut dire que tu n'as sans doute pas ajouté ton adresse locale dans index_dev.php, ou alors que tu as un problème dans ta config réseau...


OpenStudio Toulouse

Offline


J'ai effectué la requête avec index.php et le index_dev.php, même résultat. J'ai désactivé le filtrage IP dans l'index_dev.php, idem, même résultat.
Je craque

Offline


Mais c'est quoi l'erreur exacte renvoyée par wget ?


OpenStudio Toulouse

Offline


$> wget http://local.eshop.com/index.php/logbook/csv
--2017-04-21 17:30:16--  http://local.eshop.com/index.php/logbook/csv
Resolving local.eshop.com (local.eshop.com)... 127.0.0.1
Connecting to local.eshop.com (local.eshop.com)|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 403 Forbidden
2017-04-21 17:30:16 ERROR 403: Forbidden.

Offline


Tu as protégé le site avec un htpasswd.


OpenStudio Toulouse

Offline


Non du tout, j'ai récupéré un zip Thelia classique sur github. Dans mes logs j'ai ça

127.0.0.1 - - [21/Apr/2017:17:37:58 +0200] "GET /index.php/logbook/csv HTTP/1.1" 200 458 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36"
127.0.0.1 - - [21/Apr/2017:17:37:58 +0200] "GET /favicon.ico HTTP/1.1" 200 1450 "http://local.eshop.com/index.php/logbook/csv" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36"



127.0.0.1 - - [21/Apr/2017:17:38:19 +0200] "GET /index.php/logbook/csv HTTP/1.1" 403 4029 "-" "Wget/1.17.1 (linux-gnu)"

Offline


Vérifie la définition de tes routes... (get ? post ? les deux ?)


OpenStudio Toulouse

Offline


Les deux je dirais, je n'ai rien précisé:

 <route id="subscription.logbook.csv" path="/logbook/csv">
        <default key="_controller">Subscription\Controller\LogbookController::renderLogbookCSVAction</default>
    </route>

Offline


et avec wget http://local.eshop.com/logbook/csv (sans le index.php) ça donne quoi ?


OpenStudio Toulouse

Offline


wget http://local.eshop.com/logbook/csv
--2017-04-21 18:42:18--  http://local.eshop.com/logbook/csv
Resolving local.eshop.com (local.eshop.com)... 127.0.0.1
Connecting to local.eshop.com (local.eshop.com)|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2017-04-21 18:42:18 ERROR 404: Not Found.

Ma conf apache

<virtualhost *:80>

	ServerName local.eshop.com
	DocumentRoot "/var/www/eshop/web"

	<Directory "/var/www/eshop/web">
	    	AllowOverride All
        
        	# on apache 2.2 use :
        	#Order allow,deny
        	Allow from all
        	Options -Indexes +FollowSymLinks +SymLinksifOwnerMatch
        	# on apache 2.4 use :
		Require all granted
	</Directory>

	# Custom log file
    Loglevel warn
    ErrorLog /var/log/apache2/eshop.error.log
    CustomLog /var/log/apache2/eshop.log combined

</virtualHost>

Offline


Ha mais oui, ton contrôleur est un contrôleur admin (il étend BaseAdminController), du coup tu dois être connecté au BO pour y accéder.

Fais en un contrôleur front, qui étend BaseFrontController, et ça va rouler !


OpenStudio Toulouse

Offline


Bien vu, merci infiniment

Offline


roadster31 wrote:

Franchement, un simple wget -q -O toto.csv http://ton_url suffirait pour simplement récupérer les données CSV. Pourquoi écrire une commande Thelia ?

Bonjour,
Je reviens sur la demande initiale: j'ai aussi des url localhost dans mes commandes et cela pose problème pour deux raisons:
- ces commandes de mise à jour peuvent durer plusieurs heures, donc je ne peux pas les lancer avec un wget
- une fois terminées, ces commandes envoient un mail, dont les liens et les images sont en localhost

Est-ce que vous auriez une piste ?
Merci

Offline


Bonjour Didier,

A l'install de ton Thélia, normalement tu configures l'url de ton site. A la rigueur je pense que tu peux aussi le configurer par la suite dans le panel admin. Du coup tu peux utiliser ceci pour tes mails:

$siteUrl = ConfigQuery::read('url_site', NULL);

En espérant que ça t'aide.

Offline


Merci wisejack, mais ça ne répond pas à la question. Mon 'url_site' est déjà configurée avec le nom de domaine de mon site et tout fonctionne très bien si j'envoie les mails depuis l'adresse http.
Le problème se pose uniquement en ligne de commande car l'affichage des templates n'utilise pas 'url_site' mais localhost. Je n'ai pas encore trouvé si c'est réglable.
Merci.

Offline


J'ai trouvé la solution: il faut initialiser le contexte de 'router.admin' car c'est ce contexte qui sera utilisé dans la classe Thelia\Tools\URL lors d'une nouvelle instanciation de URL (ce qui a lieu lors de la création du service mailer dans mon cas).

Donc il faut mettre ceci dans la fonction d'initialisation de la commande:

$request = Request::create($this->getBaseUrl());
$requestContext = new RequestContext();
$requestContext->fromRequest($request);
$container->get('router.admin')->setContext($requestContext);