सही प्रपत्र प्राप्त करना


18

मेरे पास एक पृष्ठ है जिसे मैंने उत्पादों को सूचीबद्ध किया है, वह यह है। इसका एक प्रकार का catalog/view.phtmlक्लोन। बस शामिल है app/Mage.php

इस पृष्ठ में मैं का उपयोग करें

Mage::getSingleton('core/session')->getFormKey(); 

लेकिन यह अन्य पेज के फॉर्म से अलग है

मैं क्या गलत कर रहा हूं?

जवाबों:


17

शायद कुछ भी नहीं है क्योंकि प्रपत्र कुंजी, यादृच्छिक है, इसलिए यह है हर बार अलग होने की।

तो इससे कोई फर्क नहीं पड़ना चाहिए, लेकिन सबसे अच्छा अभ्यास, आपको अपने टेम्पलेट में फॉर्म की इनपुट कैसे जोड़ना चाहिए, यह है:

<?php echo $this->getBlockHtml('formkey') ?>

अपडेट: मुझे स्वीकार करना होगा, मैं एक बिंदु में गलत था: फॉर्म कुंजी एक सत्र के दौरान समान रहती है। यदि आपके पास अलग-अलग पृष्ठों पर अलग-अलग फ़ॉर्म कुंजी है, तो यह एक तृतीय पक्ष पूर्ण पृष्ठ कैश के साथ एक समस्या हो सकती है जिसमें कैश में फ़ॉर्म कुंजी (जिसमें यह नहीं होना चाहिए) शामिल है, या प्रपत्र कुंजी ब्लॉक का उपयोग करने वाले कस्टम ब्लॉक के भीतर है कैश। बाद के लिए, मुझे एक समाधान मिला: कैश ब्लॉक जिसमें form_key (यानी डायनामिक कंटेंट) शामिल हैं


यह एक छिपे हुए इनपुट फॉर्म को आउटपुट करने के लिए माना जाता है? लेकिन मैं इसे अपनी समीक्षा पर नहीं डाल सकता। कोई सोच?
विलेन

हां और आपको इसे किसी भी पेज पर किसी भी ब्लॉक में करने में सक्षम होना चाहिए। getBlockHtml() में लागू किया गया है Mage_Core_Block_Abstractऔर formkeyब्लॉक को परिभाषित किया गया हैbase/default/layout/core.xml
फैबियन शेंगलर

मैं इसे एक साफ 1.8 इंस्टाल में भी आउटपुट नहीं दे सकता। लेकिन मैं इसे हार्डकोड करता हूं <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>। इसे ठीक करने के लिए, लेकिन फिर भी निराशा होती है। क्या कोई बेहतर तरीका है।
wlin

3
हर बार फॉर्म की चाबी अलग क्यों होनी चाहिए? यह किसी भी पृष्ठ पर दिए गए सत्र के लिए समान होना चाहिए; यह केवल अलग-अलग सत्रों से भिन्न होना चाहिए।
निक रोलैंडो

मैं मानता हूं कि यह वास्तव में आवश्यक नहीं है लेकिन यह है कि यह Magento में कैसे काम करता है।
फैबियन शेंगलर

8

मुझे पता है कि इस अस्पष्ट प्रश्न का उत्तर नहीं दिया जाना चाहिए। हालाँकि मैं यहाँ एक समान मुद्दे पर चल सकता हूँ, यही मैंने सीखा है:

  • प्रत्येक अनुरोध में form_key अलग नहीं होना चाहिए
  • form_key पूरे सत्र में सुसंगत है
  • एक अलग सत्र को एक अलग form_key बनाना चाहिए (दूसरे ब्राउज़र को आज़माएं)
  • पृष्ठ कैश कभी कभी इस के साथ हस्तक्षेप करता है
  • मेरे साथ यह सभी सत्रों के लिए एक ही (कैश्ड) form_key दिखाने वाले विजेट के परिणामस्वरूप हुआ।
    • मुझे यह "सुविधा" नहीं मिली

लघु उदाहरण के आधार पर मैंने इसलिए नए मॉड्यूल में इस तरह के addtocart चेकआउट कार्रवाई को ओवरराइड किया है:

एप्लिकेशन / कोड / स्थानीय / नाम / चेकआउट / नियंत्रक / CartController.php

<?php
require_once(Mage::getModuleDir('controllers','Mage_Checkout').DS.'CartController.php');

class Name_Checkout_CartController extends Mage_Checkout_CartController
{
    public function addAction()
    {
        $request = $this->getRequest();
        $formKey = Mage::getSingleton('core/session')->getFormKey();
        $request->setParam('form_key', $formKey);
        return parent::addAction();
    }
}

एप्लिकेशन / कोड / स्थानीय / नाम / चेकआउट / etc / config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Name_Checkout>
            <version>0.1.0</version>
        </Name_Checkout>
    </modules>
    <frontend> 
        <routers>
            <checkout> 
                <args>
                    <modules>
                        <name_checkout before="Mage_Checkout">Name_Checkout</name_checkout>
                    </modules>
                </args>
            </checkout>>
        </routers>
    </frontend>
</config>

एप्लिकेशन / etc / मॉड्यूल / Name_Checkout.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Name_Checkout>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Checkout/>
            </depends>
        </Name_Checkout>
    </modules>
</config>

मुझे आशा है कि यह सभी के लिए इसे फिर से बनाने के लिए बड़े पैमाने पर पर्याप्त होगा


+1 के लिए "पृष्ठ CACHE कभी-कभी इसमें हस्तक्षेप करता है"। यह इस बात के लिए है कि मैं इच्छा-सूची में उत्पादों को क्यों नहीं जोड़ सकता। हम वार्निश पृष्ठ कैशिंग का उपयोग कर रहे हैं, और यह प्रपत्र कुंजियों को कैशिंग कर रहा है।
निक रोलैंडो

1

टिप्पणी नहीं कर सकता इसलिए मैं इसके बजाय जवाब दे रहा हूं। नियंत्रक में फ़ॉर्म कुंजी न जोड़ें। यह प्रपत्र कुंजी के सुरक्षा लाभों को अक्षम करता है। यदि आप वार्निश का उपयोग कर रहे हैं तो आप कुंजी जोड़ने के लिए ESI (एज साइड शामिल) का उपयोग कर सकते हैं। काम करने के लिए आपको इसे कुकी में सहेजना होगा।


क्या आप एक उदाहरण प्रदान कर सकते हैं कि फॉर्मके ब्लॉक के लिए आपका ईएसआई निर्देश कैसा दिखेगा?
डार्ककॉब

आपको फीनिक्स मेडी वार्निश कैश एक्सटेंशन से प्राप्त करने में सक्षम होना चाहिए। github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Björn Tantau
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.