So senden Sie Daten von einer HTML-Vorlage an Controller Magento 2

7

Mein Controller ruft an, aber wie sende ich Daten und rufe Daten ab?

Meine Vorlage:

<!-- ko -->
<tr class="totals fee excl">
    <th class="mark" colspan="1" scope="row" data-bind="text: title"></th>
    <td class="amount">
        <form data-role="save" data-bind="submit:save" method="post">
            <input type="text" name="spendpoints" id="spendpoints"
                   data-bind="text: getValue()" value="20"/>
            <input type="submit" class="submit"/>
        </form>
    </td>
</tr>
<!-- /ko -->

Mein js:

define(
    [
        'Company_Module/js/view/checkout/summary/fee',
        'mage/storage',
        'jquery'
    ],
    function (Component, storage) {
        'use strict';
        return Component.extend({
            /** Your function for ajax call */
            save: function (data) {

                // fullScreenLoader.startLoader();
                storage.post(
                    'custom/spendpoints/index',
                    JSON.stringify(data),
                    true
                ).done(
                    function (response) {
                        /** Do your code here */
                        alert('Success--' + data);

                        // fullScreenLoader.stopLoader();
                    }
                ).fail(
                    function (response) {
                        // fullScreenLoader.stopLoader();
                    }
                );
                // return data;
            },
            /**
             * @override
             */
            isDisplayed: function () {
                return true;
            }
        });
    }
);

Mein Controller:

<?php 
namespace Company\Module\Controller\Spendpoints; 
class Index extends \Magento\Framework\App\Action\Action {
protected $_pageFactory;
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\View\Result\PageFactory $pageFactory,
\Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory
)
{
$this->_pageFactory = $pageFactory;
$this->resultJsonFactory = $resultJsonFactory; 
return parent::__construct($context);
}

public function execute() {
$result = $this->resultJsonFactory->create();
$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/spendpoints.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);
$request = $this->getRequest()->getPostValue();

$logger->info('spendpointsdata'.print_r($request));

$this->_view->loadLayout();
$this->_view->getPage()->getConfig()->getTitle()->set(__(' My Reward Points '));
$this->_view->renderLayout();
} 
}

PS: Ich bin diesem Link gefolgt - https://magento.stackexchange.com/a/175850/55981

Nagendra Kodi
quelle
Versuchen Sie vielleicht $ this-> getRequest () -> getPostValue ();
Nero Phung
ok, lass mich nachsehen
Nagendra Kodi
Ich habe es versucht, aber es hat keinen Sinn gemacht, "1" zurückzugeben
Nagendra Kodi
Senden Sie die richtigen Daten an den Controller? Verwenden Sie console.log in der js-Datei, um die Daten zu überprüfen
Nero Phung
Warum js verwenden? Du willst Ajax? Oder Sie möchten die Informationen im lokalen Speicher speichern, wenn Sie nicht ein einfaches Formular mit Aktion und Post-Methode verwenden
Mohamed El Mrabet

Antworten:

1

Wenn "mein Controller" ein vollständiger Code ist, geben Sie mit der Antwort kein bisschen zurück. Rückgabeanweisung hinzufügen

Injizieren Sie zuerst jsonResponseFactory:

public function __construct(
    .....

    \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory
    ...
) {
   ....
    $this->resultJsonFactory = $resultJsonFactory;

    parent::__construct(
)

Und dann in der Ausführungsmethode:

$result = $this->resultJsonFactory->create();

$result->setData(['data' => $request]);
return $result;  
Bartosz Herba
quelle
Ich möchte Daten in Controller erhalten
Nagendra Kodi
1

Versuche dies

  <?php  
    /** @var \Magento\Framework\UrlInterface $urlInterface */
    $urlInterface = \Magento\Framework\App\ObjectManager::getInstance()->get('Magento\Framework\UrlInterface');
    $url = $urlInterface->getUrl("module/spendpoints/index");
   ?>
    <form action="<?php echo $url; ?>" method="post">
        <input type="text" name="spendpoints" id="spendpoints" value="20"/>
        <input type="submit" class="submit"/>
    </form>

Und in Ihrem Controller versuchen Sie dies

   public function execute() {
      $request = $this->getRequest()->getParams();
      print_r($request);
   } 
Mohamed El Mrabet
quelle
es leitet zu 404 um und fügt URL_TO_CONTROLER zur aktuellen URL hinzu
Nagendra Kodi
Ersetzen Sie URL_TO_CONTROLER durch die URL Ihres Controllers.
Können
Pfad zum Controller - Modul / Ausgabenpunkte / Index
Nagendra Kodi
Siehe jetzt mein Update
Mohamed El Mrabet
das ist .html Datei
Nagendra Kodi
1

Sie können sich das Modul Magento \ Customer ansehen, um ein Beispiel zu sehen, wie dies funktioniert.

\vendor\magento\module-checkout\view\frontend\web\template\authentication.html ist die Knockout-Vorlage.

Der Formularübermittlungs-Handler befindet sich in \vendor\magento\module-checkout\view\frontend\web\js\view\authentication.jsund sieht folgendermaßen aus:

/**
 * Provide login action.
 *
 * @param {HTMLElement} loginForm
 */
login: function (loginForm) {
    var loginData = {},
        formDataArray = $(loginForm).serializeArray();

    formDataArray.forEach(function (entry) {
        loginData[entry.name] = entry.value;
    });

    if ($(loginForm).validation() &&
        $(loginForm).validation('isValid')
    ) {
        fullScreenLoader.startLoader();
        loginAction(loginData, checkoutConfig.checkoutUrl, undefined, messageContainer).always(function () {
            fullScreenLoader.stopLoader();
        });
    }
}

Die loginActionFunktion ist enthalten in : \vendor\magento\module-customer\view\frontend\web\js\action\login.js. Hier ist es:

/**
 * @param {Object} loginData
 * @param {String} redirectUrl
 * @param {*} isGlobal
 * @param {Object} messageContainer
 */
action = function (loginData, redirectUrl, isGlobal, messageContainer) {
    messageContainer = messageContainer || globalMessageList;

    return storage.post(
        'customer/ajax/login',
        JSON.stringify(loginData),
        isGlobal
    ).done(function (response) {
        if (response.errors) {
            messageContainer.addErrorMessage(response);
            callbacks.forEach(function (callback) {
                callback(loginData);
            });
        } else {
            callbacks.forEach(function (callback) {
                callback(loginData);
            });
            customerData.invalidate(['customer']);

            if (redirectUrl) {
                window.location.href = redirectUrl;
            } else if (response.redirectUrl) {
                window.location.href = response.redirectUrl;
            } else {
                location.reload();
            }
        }
    }).fail(function () {
        messageContainer.addErrorMessage({
            'message': 'Could not authenticate. Please try again later'
        });
        callbacks.forEach(function (callback) {
            callback(loginData);
        });
    });
};

Und der Controller, der die Daten empfängt , ist dies: \vendor\magento\module-customer\Controller\Ajax\Login.php:

public function execute()
{
    $credentials = null;
    $httpBadRequestCode = 400;

    /** @var \Magento\Framework\Controller\Result\Raw $resultRaw */
    $resultRaw = $this->resultRawFactory->create();
    try {
        $credentials = $this->helper->jsonDecode($this->getRequest()->getContent());
    } catch (\Exception $e) {
        return $resultRaw->setHttpResponseCode($httpBadRequestCode);
    }
    if (!$credentials || $this->getRequest()->getMethod() !== 'POST' || !$this->getRequest()->isXmlHttpRequest()) {
        return $resultRaw->setHttpResponseCode($httpBadRequestCode);
    }

    $response = [
        'errors' => false,
        'message' => __('Login successful.')
    ];
    try {
        $customer = $this->customerAccountManagement->authenticate(
            $credentials['username'],
            $credentials['password']
        );
        $this->customerSession->setCustomerDataAsLoggedIn($customer);
        $this->customerSession->regenerateId();
        $redirectRoute = $this->getAccountRedirect()->getRedirectCookie();
        if (!$this->getScopeConfig()->getValue('customer/startup/redirect_dashboard') && $redirectRoute) {
            $response['redirectUrl'] = $this->_redirect->success($redirectRoute);
            $this->getAccountRedirect()->clearRedirectCookie();
        }
    } catch (EmailNotConfirmedException $e) {
        $response = [
            'errors' => true,
            'message' => $e->getMessage()
        ];
    } catch (InvalidEmailOrPasswordException $e) {
        $response = [
            'errors' => true,
            'message' => $e->getMessage()
        ];
    } catch (LocalizedException $e) {
        $response = [
            'errors' => true,
            'message' => $e->getMessage()
        ];
    } catch (\Exception $e) {
        $response = [
            'errors' => true,
            'message' => __('Invalid login or password.')
        ];
    }
    /** @var \Magento\Framework\Controller\Result\Json $resultJson */
    $resultJson = $this->resultJsonFactory->create();
    return $resultJson->setData($response);
}

Wenn wir uns diesen Controller ansehen, können wir sehen, dass er $credentials = $this->helper->jsonDecode($this->getRequest()->getContent());zum Abrufen der Anforderungsdaten verwendet wird. Ich schlage vor, dass Sie dies versuchen.

Aaron Allen
quelle