Nasazení paypal MetisFW/PayPal a nenalezení potřebné služby

Danny
Člen | 146
+
0
-

Zdravím,
snažím se zprovoznit paypal a postupoval jsem přesně podle toho návodu až jsem došel k tomuto problému

https://forum.nette.org/…tisfw-paypal

kde Davide správně radí ať si tu factory injectneme normálně. Nicméně pokud to udělám dostávám tento error
https://gyazo.com/…dc8b80cbe935

Podle návodu jsem config upravil a předpokládám že není nutné tam registrovat další factory/service toho addonu

extensions:
  payPal: MetisFW\PayPal\DI\PayPalExtension

payPal:
  clientId: AUqne4ywvozUaSQ1THTZYKFr88bhtA0SS_fXBoJTfeSTIasDBWuXLiLcFlfmSXRfL-kZ3Z5shvNrT6rP
  secret: EDGPDc3a65JBBY7-IKkNak7aGTVTvY-NhJgfhptegSML58fWjfp89U7UKNgGk9UI-UEZ-btfaE2sGST1
  currency: EUR
  # optional Payment Experience Profile ID
  # https://developer.paypal.com/docs/api/payment-experience/
  # experienceProfileId: XP-AAAA-BBBB-CCCC-DDDD
  sdkConfig:
    mode: sandbox
    log.Enabled: true
    log.FileName: '%tempDir%/PayPal.log'
    log.LogLevel: DEBUG
    validation.level: log
    cache.enabled: true
    # 'http.CURLOPT_CONNECTTIMEOUT' => 30
    # 'http.headers.PayPal-Partner-Attribution-Id' => '123123123'/

Paypal jsem stáhl přes composer a je uložen v vendor/metisfw/… a moje struktura je App/AdminModule/Presenter/ServicePresenter.php v kterém to momentálně zkouším.

ServicePresenter.php

<?php

namespace AdminModule;

use Nette;
use \MetisFW\Paypal\Payment\SimplePaymentOperation;
use \MetisFW\PayPal\UI\PaymentControl;
use \PayPal\Api\Payment;


class ServicePresenter extends BasePresenter
{

	/** @var \MetisFW\PayPal\Payment\SimplePaymentOperation @inject */
	public $factory;

	public function __construct(SimplePaymentOperation $factory)
	{
		$this->factory = $factory;
	}


	 public function createComponentPayPalPaymentButton()
	 {
	    $operation = $this->factory->create('Coffee', 5);
	    $control = new PaymentControl($operation);

	    //set different template if u want to use own
	    $control->setTemplateFilePath(__DIR__ . './myPayPalButton.latte');

	    //called before redirect to paypal after first api call, which create payment
	    $control->onCheckout[] = function(PaymentControl $control, Payment $created) {
	      //something
	    };

	    //called after successfully completed payment proccess
	    $control->onSuccess[] = function(PaymentControl $control, Payment $paid) {
	      //something
	    };

	    //called when user cancelled payment process
	    $control->onCancel[] = function(PaymentControl $control) {
	      //something
	    };

	    return $control;
	  }
}

Injectnuju ho špatně nebo pouze cesta k Addonu je špatná? Zkouším všechny možnosti a pořád nic. Budu rád za jakoukoliv radu, děkuji moc.

Editoval Danny (20. 5. 2017 10:42)

Danny
Člen | 146
+
0
-

bump

GEpic
Člen | 562
+
+1
-

Tvůj problém je že injectuješ SimplePaymentOperation, ale musíš si injectnout SimplePaymentOperationFactory, pomocí které už si potom objekt třídy SimplePaymentOperation vyrobíš.

A ještě jeden tip, buďto použij @inject anotaci a v tom případě nepotřebuješ konstruktor, nebo použij konstruktor a nepoužívej @inject anotaci. Pokud použiješ konstruktor, tak proměnná $factory nemusí být samozřejmě public.

Editoval GEpic (21. 5. 2017 19:36)

Danny
Člen | 146
+
0
-

Díky moc to byl ten problém, to mi nedošlo :) V pohodě se mi to teď injectnulo díky za připomínky jak k tomu přistupovat.

Ještě je tu jedna věc která mi trochu vrtvá hlavou, nechápu jak includovat tu componentu kterou tím vytvářím, protože pomocí

$operation = $this->factory->create('Coffee', 5);

vytvořím komponentu z továrničky ale jako návratovou hodnotu té komponentu už vracím tento control

$control = new PaymentControl($operation);

Takže pokud si budu v šabloně myPayPalButton.latte includovat

{control payPalPaymentButton}

Tak mi to nebude fungovat (a nefunguje). Hlasí že komponentu to nemůže naleznout.

Nette\InvalidArgumentException
Component with name 'payPalPaymentButton' does not exist
GEpic
Člen | 562
+
+1
-

Toto by mělo být již v šabloně akce presenteru – {control payPalPaymentButton}

A toto bys měl použít pouze tehdy, pokud chceš vykreslit tu komponentu vlastním způsobem – $control->setTemplateFilePath(__DIR__ . './myPayPalButton.latte'); . Dle GitHubu je výchozí šablona toto:

<a href="{$checkoutLink}" n:attr="(expand)$attrs">
  <div>{$text}</div>
</a>

Tedy v šabloně akce presenteru použiješ {control payPalPaymentButton} a vypíše ti to to latte které jsem ti zde poslal, nebo tvé vlastní, které si nadefinuješ ve vlastním latte souboru a přípojíš k té komponentě.

Editoval GEpic (21. 5. 2017 23:51)

Danny
Člen | 146
+
0
-

Díky moc funguje to, moc mi to pomohlo! Snad to pomůže i ostatním :)

leaff
Člen | 10
+
0
-

Ahoj, riešim rovnaký problém:

use Nette;
use \MetisFW\Paypal\Payment\SimplePaymentOperation;
use \MetisFW\PayPal\UI\PaymentControl;
use \PayPal\Api\Payment;

class PayPresenter extends BasePresenter {

    /** @var \MetisFW\PayPal\Payment\SimplePaymentOperationFactory @inject */
	public $factory;


	 public function createComponentPayPalPaymentButton() {
        $operation = $this->factory->create('Credit', $this->amount);
        $control = new PaymentControl($operation);

        //set different template if u want to use own
        $control->setTemplateFilePath(__DIR__ . '/../templates/myPayPalButton.latte');

        //called before redirect to paypal after first api call, which create payment
        $control->onCheckout[] = function(PaymentControl $control, Payment $created) {
            //something
        };

        //called after successfully completed payment proccess
        $control->onSuccess[] = function(PaymentControl $control, Payment $paid) {

        };

        //called when user cancelled payment process
        $control->onCancel[] = function(PaymentControl $control) {
            //something
        };

        return $control;
	 }

v prípade že mam zapnutý DebugMode je to funkčne, ak ho vypnem hodí to error500 a v exception logu je

Nette\InvalidStateException: Property App\AdminModule\Presenters\PayPresenter::$factory has no @var annotation. in /vendor/nette/di/src/DI/Extensions/InjectExtension.php:122

v configu mám

extensions:
	payPal: MetisFW\PayPal\DI\PayPalExtension

čo robím zle?
Ďakujem.

Edit
hmm… tak stačilo premezať cache

Editoval leaff (2. 10. 2017 2:29)