Frage

Ich bin ratlos über Folgendes:

Ich erstelle einen benutzerdefinierten Storefinder, der Adressen eines 3. Typs in der Klasse Mage_Customer_Model_Address_Abstract verwendet:

z:

class Mage_Customer_Model_Address_Abstract extends Mage_Core_Model_Abstract
{
    /**
     * Possible customer address types
     */
    const TYPE_BILLING  = 'billing';
    const TYPE_SHIPPING = 'shipping';
    // add a 3rd 
    const TYPE_STOREFINDER = 'storefinder';

Ich bin mir jedoch nicht sicher, wie genau das gemacht werden kann, da es auch ein eav-Attribut erfordert:

enter image description here

Ich möchte, dass diese Option nur im Admin-Backend verfügbar ist, indem sie mit einem Kontrollkästchen angezeigt wird - hier ist ein kurzer Photoshop:

the way it should look in the customer/address

  • die Datei, die für dieses Kontrollkästchen dupliziert und bearbeitet und dann in ein Modul eingefügt werden soll, lautet: design/adminhtml/default/default/customer/tab/addresses.phtml

        <span class="address-type-line">
            <input type="checkbox"  <?php if ($this->isReadonly()):?> disabled="disabled"<?php endif;?> value="<?php echo $_address->getId() ?>" id="address_item_storefinder<?php echo $_address->getId() ?>" name="account[storefinder]" title="<?php echo Mage::helper('customer')->__('Set as Storefinder Address') ?>"<?php if($_address->getId()==$customer->getStorefinderAddress()): ?> checked="checked"<?php endif; ?>/>
            &nbsp;<label for="address_item_storefinder<?php echo $_address->getId() ?>"><?php echo Mage::helper('customer')->__('Default Storefinder Address') ?></label>
        </span>
    

Ich habe einen Frontend-Seitenblock erstellt, der dann alle Kundenadressen des Typs erfassen soll 'storefinder' und zeigen Sie sie auf einer Google-Karte an.

-> definiere die Funktion $ customer-> getStorefinderAddress () - vielleicht so etwas gemacht:

/**
 * Get default customer storefinder address
 *
 * @return Mage_Customer_Model_Address
 */
 public function getStorefinderAddress()
 {
    $addresses = Mage::getResourceModel('customer/address_collection');
    foreach ($addresses as $address) {
      if($address->getAddressType() == 'storefinder') {
         $storefinderaddresses[] = $address;
      }
    }
    return $storefinderaddresses;
 }

Ich muss wissen, wie es geht:

-> definieren Sie einen 3. Adresstyp und wissen Sie, ob der function getStorefinderAddress() arbeiten Sie daran, diese Adressen mithilfe von abzufragen:

$address->getAddressType() == 'storefinder'

-> speichern Sie den Wert des hinzugefügten Kontrollkästchens in der Datenbank aus der Kundenadresse bearbeiten im adminhtml


Alternativ:

Ich habe mir eine alternative Möglichkeit überlegt, wenn das Hinzufügen eines 3. Adresstyps zu komplex ist:

  • fügen Sie der Kunden- / Adresstabelle eine INT-Spalte hinzu, in der einfach wahr / falsch (0/1) für das Kontrollkästchenfeld in der Kunden- / Registerkarte / Adressen gespeichert wird.phtml

    ...
    
    ->addColumn( // Alter table to add column
    
        $installer->getTable('customer/address'), // get the customer address modules table
    
        'in_storefinder', // column name
    
        array( // column info
            'type'      => Varien_Db_Ddl_Table::TYPE_INTEGER,
            'length'    => null,
            'unsigned'  => true,
            'nullable'  => true,
            'default'   => '0',
            'comment'   => ' added by the Storefinder',
        )
     );
     $installer->endSetup();
    

Jede Hilfe wäre sehr dankbar.

War es hilfreich?

Lösung

Zunächst möchte ich sagen, dass die address_type wird nicht für Kundenadressen verwendet.Es wird nur für Angebots- und Bestelladressen verwendet, daher ist es nicht erforderlich, dies zu verwenden, um Ihren eigenen Adresstyp zu kennzeichnen.
wenn Sie nur Ihre Filialfinder-Adressen abrufen müssen, habe ich eine Idee, aber später dazu.
Zuerst müssen Sie ein neues Modul erstellen, um Ihren neuen Adresstyp zu verarbeiten, um den Kerncode nicht zu ändern.
Nennen wir dieses Modul StackExchange_Storefinder.
Sie benötigen die folgenden Dateien:

app/etc/modules/StackExchange_Storefinder.xml - die Deklarationsdatei:

<?xml version="1.0"?>
<config>
    <modules>
        <StackExchange_Storefinder>
            <codePool>local</codePool>
            <active>true</active>
            <depends>
                <Mage_Customer />
                <Mage_Adminhtml />
            </depends>
        </StackExchange_Storefinder>
    </modules>
</config>

app/code/local/StackExchange_Storefinder/etc/config.xml - die Konfigurationsdatei

<?xml version="1.0"?>
<config>
    <modules>
        <StackExchange_Storefinder>
            <version>1.0.0</version>
        </StackExchange_Storefinder>
    </modules>
    <global>
        <resources>
            <stackexchange_storefinder_setup>
                <setup>
                    <module>StackExchange_Storefinder</module>
                    <class>Mage_Customer_Model_Resource_Setup</class>
                </setup>
            </stackexchange_storefinder_setup>
        </resources>
        <models>
            <stackexchange_storefinder>
                <class>StackExchange_Storefinder_Model</class>
            </stackexchange_storefinder>
        </models>
        <helpers>
            <stackexchange_storefinder>
                <class>StackExchange_Storefinder_Helper</class>
            </stackexchange_storefinder>
        </helpers>
        <blocks>
            <stackexchange_storefinder>
                <class>StackExchange_Storefinder_Block</class>
            </stackexchange_storefinder>
            <adminhtml>
                <rewrite>
                    <customer_edit_tab_addresses>Stackexchange_Storefinder_Block_Adminhtml_Customer_Edit_Tab_Addresses</customer_edit_tab_addresses>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>
    <adminhtml>
        <events>
            <adminhtml_customer_prepare_save>
                <observers>
                    <stackexchange_storefinder>
                        <class>stackexchange_storefinder/adminhtml_observer</class>
                        <method>checkStoreFinderAddress</method>
                    </stackexchange_storefinder>
                </observers>
            </adminhtml_customer_prepare_save>
        </events>
    </adminhtml>

</config>

app/code/local/StackExchange/Storefinder/sql/stackexchange_storefinder_setup/install-1.0.0.php - das Installationsskript, das ein neues Kundenattribut hinzufügt, um die Filialfinder-Adress-ID zu speichern (genau wie Abrechnung und Versand).

<?php
/** @var Mage_Customer_Model_Resource_Setup $this */
$this->addAttribute(
    'customer',
    'default_store_finder_id',
    array(
        'type'               => 'int',
        'label'              => 'Default Store Finder Address',
        'input'              => 'text',
        'backend'            => 'stackexchange_storefinder/customer_attribute_backend_storefinder',
        'required'           => false,
        'sort_order'         => 82,
        'visible'            => false,
    )
);

app/code/local/StackExchange/Storefinder/Model/Customer/Attribute/Backend/Storefinder.php - das Backend-Modell des Store Finder-Attributs:

<?php
class StackExchange_Storefinder_Model_Customer_Attribute_Backend_Storefinder extends Mage_Eav_Model_Entity_Attribute_Backend_Abstract
{
    public function beforeSave($object)
    {
        $helper = $this->_getHelper();
        $defaultStoreFinder = $helper->getDefaultStorefinder($object);
        if (is_null($defaultStoreFinder)) {
            $object->setData('default_store_finder_id', null);
        }
    }
    public function afterSave($object)
    {
        if ($defaultStoreFinder = $this->_getHelper()->getDefaultStorefinder($object))
        {
            $addressId = false;
            /**
             * post_index set in customer save action for address
             * this is $_POST array index for address
             */
            foreach ($object->getAddresses() as $address) {
                if ($address->getPostIndex() == $defaultStoreFinder) {
                    $addressId = $address->getId();
                }
            }
            if ($addressId) {
                $object->setDefaultStoreFinderId($addressId);
                $this->getAttribute()->getEntity()
                    ->saveAttribute($object, $this->getAttribute()->getAttributeCode());
            }
        }
    }

    /**
     * @return StackExchange_Storefinder_Helper_Address
     */
    protected function _getHelper()
    {
        return Mage::helper('stackexchange_storefinder/address');
    }
}

app/code/local/StackExchange/Storefinder/Helper/Address.php - ein Helfer, damit Sie das Kundenmodell nicht umschreiben:

<?php
class StackExchange_Storefinder_Helper_Address extends Mage_Core_Helper_Abstract
{
    public function getDefaultStorefinder(Mage_Customer_Model_Customer $customer)
    {
        return $customer->getData('default_store_finder_id');
    }
    public function getDefaultStorefinderAddress(Mage_Customer_Model_Customer $customer)
    {
        return $customer->getPrimaryAddress($customer->getData('default_store_finder_id'));
    }
}

app/code/local/StackExchange/Storefinder/Block/Adminhtml/Customer/Edit/Tab/Addresses.php - schreiben Sie den Admin-Adressblock neu, um das neue Optionsfeld hinzuzufügen

<?php
class Stackexchange_Storefinder_Block_Adminhtml_Customer_Edit_Tab_Addresses
    extends Mage_Adminhtml_Block_Customer_Edit_Tab_Addresses
{
    public function __construct()
    {
        parent::__construct();
        $this->setTemplate('stackexchange_storefinder/tab/addresses.phtml');
    }
}

app/design/adminhtml/default/default/template/stackexchange_storefinder/tab/addresses.phtml - die neue Adress-Admin-Vorlage.Wie die Standardeinstellung, jedoch mit einem zusätzlichen Optionsfeld. Ich habe das in einem Kern geschrieben, weil es zu groß ist, um es hier einzufügen

app/code/local/StackExchange/Storefinder/Model/Adminhtml/Observer.php - ein Beobachter für das Kundenspeicherereignis, damit das neue Adressflag erkannt wird:

<?php
class StackExchange_Storefinder_Model_Adminhtml_Observer
{
    public function checkStoreFinderAddress($observer)
    {
        /** @var Mage_Customer_Model_Customer $customer */
        $customer = $observer->getCustomer();
        /** @var Mage_Core_Controller_Request_Http $request */
        $request = $observer->getRequest();
        $data = $request->getPost();
        if (isset($data['account']['default_storefinder'])) {
            $customer->setData('default_store_finder_id', $data['account']['default_storefinder']);
        }
    }
}

app/code/local/StackExchange/Storefinder/Helper/Data.php - das Modul Standard-Helfer.Ich bin mir nicht sicher, ob dies erforderlich ist.

<?php
class StackExchange_Storefinder_Helper_Data extends Mage_Core_Helper_Abstract
{

}

Wenn Sie fertig sind, löschen Sie den Cache.

Um nun alle Adressen zu erhalten, für die dieses neue Flag gesetzt ist, müssen Sie zuerst alle Kunden abrufen und den Wert von ermitteln $customer->getDefaultStoreFinderId() und dann holen Sie sich die Adressensammlung, in der sich die ID in den oben gesammelten Werten befindet.

Aber aus meiner Sicht ist das eine ganz andere Frage.Überprüfen Sie zunächst, ob Sie mit dem obigen Code einen dritten Adresstyp hinzufügen können.

[BEARBEITEN]

Um alle Adressen zu erhalten, die als Filialfinder markiert sind, müssen Sie Folgendes tun:

$customerCollection = Mage::getModel('customer/customer')->getCollection()
     ->addAttributeToSelect('default_store_finder_id');
$addressIds = array();
foreach ($customerCollection as $customer) {
    $addressId = $customer->getDefaultStoreFinderId();
    if ($addressId) {
        $addressIds[] = $addressId;
    }
}

if (count($addressIds)) {
    $addresses = Mage::getModel('customer/address')->getCollection()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('entity_id', array('in' => $addressIds));
    //do what you need with $addresses.
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top