Domanda

Ho bisogno di aggiungere campo di testo personalizzato a "add recensione" sotto forma, ad esempio e-mail.

Ci sono già alcuni fili sul web dove le persone stanno chiedendo la stessa cosa, ma nessuno di loro ha una risposta solida. La maggior parte suggeriscono di Modifica nucleo file direttamente , o eseguire query SQL manuali.

Se si conosce un po 'di plug-in open source che aggiunge tale funzione, oppure è già implementato da qualche parte, si prega di condividere come hai fatto.

Grazie!

È stato utile?

Soluzione

Innanzitutto è necessario rispondere alla domanda che cosa vuoi fare con i nuovi dati. Dovrebbe essere conservato con l'ordine? Dovrebbe essere inviata per e-mail da qualche parte?

Per il momento, mi limiterò a presumo che si desidera memorizzare con l'ordine e visualizzarlo nel backend con i dettagli dell'ordine.

Si dovrà prendersi cura delle seguenti cose:

  1. Aggiungi un attributo per ogni campo di input per l'ordine
  2. Visualizzare il campo di input (s) sul gradino revisione
  3. Assicurarsi che i campi di input sono sottoposti quando l'ordine viene salvato
  4. Imposta i valori inviati nell'ordine
  5. Aggiungi una nuova scheda alla pagina di informazioni ordine nel backend
  6. Visualizza i valori del campo

Consente di passare attraverso uno per uno.
Sto assumendo si sa come creare un modulo di base. Nel codice di esempio, darò per scontato il Namespace_ReviewField modulo.

1. Aggiungere un attributo per ogni campo di input per l'ordine

Per aggiungere l'attributo ordine, creare uno script di installazione con il seguente contenuto, dopo l'aggiunta di una risorsa messa a punto e un numero di versione al modulo:

/* @var $installer Mage_Sales_Model_Resource_Setup */
$installer = Mage::getResourceModel('sales/setup', 'sales_setup');

$installer->startSetup();

$installer->addAttribute('order', 'my_field', array(
    'label' => 'My Field',
    'type' => 'varchar',
    'input' => 'text',
    'required' => false,
));

$installer->endSetup();

2. Visualizzare il campo di input (s) sul gradino revisione

Per visualizzare il campo di immissione nella fase revisione, prima aggiungere un file XML di layout per il modulo:

<frontend>
    <layout>
        <updates>
            <namespace_reviewfieldield>
                <file>namespace/reviewfield.xml</file>
            </namespace_reviewfieldield>
        </updates>
    </layout>
</frontend>

Quindi creare il file di layout XML di base / default / layout / namespace / reviewfield.xml con il seguente contenuto:

<?xml version="1.0"?>
<layout>
    <checkout_onepage_review>
        <reference name="checkout.onepage.review.info.items.after">
            <block type="core/template" name="namespace.reviewField" template="namespace/reviewfield/form.phtml"/>
        </reference>
    </checkout_onepage_review>
</layout>

Infine si crea la base di modello / default / template / namespace / reviewfield / form.phtml

<div class="checkout-agreements">
    <input type="text" name="namespace_reviewfield" id="namespace_reviewfield"/>
    <label for="namespace_reviewfield">Please specify Foo</label>
</div>

3. Assicurarsi che i campi di input sono sottoposti quando l'ordine viene salvato

Ora il campo verrà visualizzato dopo i totali sul gradino recensione. Ma perché il campo non è all'interno di qualsiasi forma, è necessario prendere cura è presentato quando l'ordine viene salvato.
Aggiungere il seguente JavaScript al form.phtml template.

<script type="text/javascript">
    // Add our field to the data submitted by Review.save()
    Review.prototype.save = Review.prototype.save.wrap(function(orig) {
        var form = this.agreementsForm ? this.agreementsForm : payment.form;
        if (form) {
            var myfield = $('namespace_reviewfield');
            form.insert(myfield);
        }
        orig();
    });
</script>

4. Impostare i valori presentate nell'ordine

Ora il valore del campo verrà inviato Magento al momento della presentazione dell'ordine. Solo fino ad ora, non succede nient'altro con esso. È necessario impostare il valore inviato l'ordine. Un buon modo per farlo sta usando un osservatore per l'evento checkout_type_onepage_save_order.

<frontend>
    <events>
        <checkout_type_onepage_save_order>
            <observers>
                <namespace_reviewfield>
                    <type>model</type>
                    <class>namespace_reviewfield/observer</class>
                    <method>checkoutTypeOnepageSaveOrder</method>
                </namespace_reviewfield>
            </observers>
        </checkout_type_onepage_save_order>
    </events>
</frontend>

La classe osservatore in sé è molto semplice:

class NameSpace_ReviewField_Model_Observer
{
    public function checkoutTypeOnepageSaveOrder(Varien_Event_Observer $observer)
    {
        /** @var Mage_Sales_Model_Order $order */
        $param = Mage::app()->getRequest()->getParam('namespace_reviewfield', '');
        $observer->getOrder()->setMyField((string) $param);
    }
}

E che si occupa del lato frontend delle cose.

5. Aggiungere una nuova scheda alla pagina di informazioni ordine nel backend

Purtroppo, non esiste un modo "gentile" per aggiungere contenuti alla pagina di informazioni ordine generale. E 'molto più compatibile per aggiungere una nuova scheda con il nuovo contenuto che si desidera visualizzare. Per fare questo, è necessario prima di aggiungere un file di layout XML adminhtml:

<adminhtml>
    <layout>
        <updates>
            <namespace_reviewfield>
                <file>namespace/reviewfield.xml</file>
            </namespace_reviewfield>
        </updates>
    </layout>
</adminhtml>

La nuova scheda stessa è quindi aggiunto nella dichiarazione di layout XML. Ci sono diversi modi questo può essere fatto, ma vi suggerisco di utilizzare il modo più semplice, probabilmente aggiungendo il seguente codice al file adminhtml / default / layout / namespace / reviewfield.xml

<?xml version="1.0"?>
<layout>
    <adminhtml_sales_order_view>
        <reference name="sales_order_tabs">
            <action method="addTab">
                <name>namespace_reviewfield</name>
                <block>namespace_reviewfield/adminhtml_order_tab_reviewfield</block>
            </action>
        </reference>
    </adminhtml_sales_order_view>
</layout>

6. Visualizzare i valori del campo

Ora avete solo bisogno di creare il blocco che si è specificato nel file XML di layout e di un modello di corrispondenza. La classe di blocco deve implementare Mage_Adminhtml_Block_Widget_Tab_Interface, altrimenti verrà generata un'eccezione "Scheda sbagliato Configurazione".
Ecco un semplice esempio:

class NameSpace_ReviewField_Block_Adminhtml_Order_Tab_Reviewfield
    extends Mage_Adminhtml_Block_Widget
    implements Mage_Adminhtml_Block_Widget_Tab_Interface
{
    protected function _prepareLayout()
    {
        $this->setTemplate('namespace/order/tab/reviewfield.phtml');
    }

    public function getOrder()
    {
        return Mage::registry('current_order');
    }

    public function getTabLabel()
    {
        return $this->__('Review Field');
    }

    public function getTabTitle()
    {
        return $this->getTabLabel();
    }

    public function canShowTab()
    {
        return true;
    }

    public function isHidden()
    {
        return false;
    }
}

La cosa che manca finale è il modello di adminhtml / default / template / namespace / ordine / scheda / reviewfield.phtml . Basta fare in modo si sfuggire correttamente alcun input da parte dell'utente per evitare buchi XSS.

<?php /** @var NameSpace_ReviewField_Block_Adminhtml_Order_Tab_Reviewfield $this */ ?>
<div>
    <?php echo $this->__('The customer entered: %s', $this->escapeHtml($this->getOrder()->getMyField())) ?>
</div>

Spero che ti aiuta lungo la strada per implementare le funzionalità desiderate.

Altri suggerimenti

Lo so che è un vecchio post, ma c'è un problema con il punto 3 . Dovrebbe essere così:

var form = $(this.agreementsForm) ? $(this.agreementsForm) : $(payment.form);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top