Magento: Product options are wrong if order edit in admin and last order article is taken

15. Juli 2015 at 12:48

php code

If you edit an order and take over last article it is possible that the wrong product options are mapped.

The reason is that the wrong options are taken – not the „options“ taken – magento get the „info_buyRequest“-options from the database, but sometimes the „options“ array has the options data that you need.

You can solve this problem with overwriting the „getBuyRequest()“ function in app/code/local/Mage/Sales/Model/Order/Item.php with this php code:

/**
 * Returns formatted buy request - object, holding request received from
 * product view page with keys and options for configured product
 *
 * @return Varien_Object
 */
public function getBuyRequest()
{
    $option = $this->getProductOptionByCode('info_buyRequest');   // this get the wrong options
    $option2 = $this->getProductOptionByCode('options');
    foreach($option2 as $option_tmp) {
        if($option_tmp['option_type'] == 'area'
            || $option_tmp['option_type'] == 'file'
            || $option_tmp['option_type'] == 'field'
            || $option_tmp['option_type'] == 'date'
            || $option_tmp['option_type'] == 'date_time'
            || $option_tmp['option_type'] == 'time'
        ) {
            $option['options'][$option_tmp['option_id']] = $option_tmp['value'];
        } elseif($option_tmp['option_type'] == 'drop_down'
            && $option_tmp['label'] == 'Farbe'
            && $productOptions = $this->getProduct()->getOptions()[$option_tmp['option_id']]->getValues()
        ) {
            foreach($productOptions as $productOption) {
                if($productOption->getData('title') == $option_tmp['value']) {
                    $option['options'][$option_tmp['option_id']] = $productOption->getData('option_type_id');
                }
            }
        } else {
            $option['options'][$option_tmp['option_id']][0] = $option_tmp['option_value'];
        }
    }
    unset($option2, $option_tmp, $productModel, $attr);
    if (!$option) {
        $option = array();
    }
    $buyRequest = new Varien_Object($option);
    $buyRequest->setQty($this->getQtyOrdered() * 1);
    return $buyRequest;
}

 

Please share this article von facebook & google plus or where you want, thank you!

MySQL Query Sammlung / MySQL Query Library

8. April 2015 at 17:34

sql-statement-mysql

Some MySQL Querys which you need by the programming with php / mysql or  magento:

MySQL Update with sub-select: Update a value of an option, e.g. „price“, where option-name is like „optionname“

UPDATE catalog_product_option_type_price t1
SET t1.price='30'
WHERE t1.option_type_id in (SELECT option_type_id FROM catalog_product_option_type_title WHERE `title` like '%optionname%');

Other example with an own table where are not all product_id’s imported and must be updated by sku

UPDATE mypharmacy_stock_statistical_data t2,
(   SELECT entity_id,sku
    FROM catalog_product_entity
) t1
SET t2.product_id = t1.entity_id
WHERE t1.sku=t2.sku

Please share this article von facebook & google plus or where you want, thank you!

Magento: Cancel old orders / Alte Bestellungen stornieren

24. März 2015 at 15:18

php code

Um alte Bestellungen in Magento zu stornieren könnt ihr den folgenden php-code verwenden:

To cancel old orders in Magento, e.g. with state „pending“, „holded“ or „pending_payment“ you can use the following php-code:

    public function autocancelPendingOrders()
    {
        $orderCollection = Mage::getResourceModel('sales/order_collection');
        $orderCollection
            ->addFieldToFilter('state',
                array(
                    array('eq' => 'pending'),
                    array('eq' => 'holded'),
                    array('eq' => 'pending_payment')
                ));
        $orderCollection->addFieldToFilter('created_at', array(
                'lt' =>  new Zend_Db_Expr("DATE_ADD('".now()."', INTERVAL 2 HOUR)")))
            ->getSelect()
            ->order('entity_id')
//            ->limit(20)
            ;
        foreach($orderCollection->getItems() as $order)
        {
            $orderModel = Mage::getModel('sales/order');
            $orderModel->load($order['entity_id']);
            if($orderModel->getState() == 'holded') {
                if(!$orderModel->canUnhold()) {
                    continue;
                } else {
                    $orderModel->unhold();
                    $orderModel->setStatus('new');
                }
            }
            if(!$orderModel->canCancel()) {
                continue;
            }
            $orderModel->cancel();
            $orderModel->setStatus('canceled');
            $orderModel->save();
        }
    }

Change Copyright Year At Footer Of magento

9. Januar 2015 at 10:21

Was asked once by client how to make the copyright year at the footer of Magento site so that it changes automatically every year without doing it manually every year.

Solution one about Template Change and PHP

Copy the file app/design/frontend/default/default/template/page/html/footer.phtml
to your them-folder e.g. app/design/frontend/default/fly2marsmedia/template/page/html/footer.phtml
and open this file in your editor.

Change the

<address><?php echo $this->getCopyright() ?></address>

to

<address>&copy; <?php echo Mage::getModel('core/date')->date('Y') . ' ' . $this->getCopyright() ?></address>

Then
1) Log in to your Magento admin panel

2) Navigate to system > configuration > General > Design.

3) Click to expand the Footer section

4) Inside the Copyright text field remove the „&copy 2014“ part, this first part is changed automatically!

Solution Two about Magento-Admin-Panel configuration and javascript

1) Log in to your Magento admin panel

2) Navigate to system > configuration > General > Design.

3) Click to expand the Footer section

4) Inside the Copyright text field replace the @copy; YYYY with

&copy; <script type="text/javascript">
var d = new Date();
document.write(d.getFullYear())
</script>

Please share this article von facebook & google plus or where you want, thank you!

notepad+ per tastatur steuern – notepad+ cheat sheet

8. Januar 2015 at 15:02

Legende

← → ↑ ↓ Pfeiltasten
Umschalttaste (shift)
Strg Steuerungstaste (Ctlr)
Alt Alt-Taste
Pos1 Pos1-Taste Nummernblock
Ende Ende-Taste Nummernblock
Einfg Einfügetaste (Überschreibmodus)
Entf Entfernen-Taste (Del)
Rücktaste (backspace)
Tabulatortaste
Entertaste (Return)
Bild↑ Bildtaste Nummernblock
Bild↓ Bildtaste Nummernblock
F1-F12 Funktionstasten 1-12
A-Z normale Zeichentasten

Navigation

ein Zeichen nach rechts
ein Zeichen nach links
eine Zeile nach oben
eine Zeile nach unten
Strg + → ein Wort nach rechts
Strg + ← ein Wort nach links
Ende an das Zeilenende springen
Pos1 an den Zeilenanfang springen
Strg + Ende an das Dokumentenende springen
Strg + Pos1 an den Dokumentenanfang springen
Strg + ↑ eine Zeile nach oben scrollen
Strg + ↓ eine Zeile nach unten scrollen
Bild↑ eine Seite nach oben scrollen
Bild↓ eine Seite nach unten scrollen
Strg + G öffnet Gehe zu Dialog

Auswählen (selektieren)

⇑ + → Zeichen nach Cursor selektieren
⇑ + ← Zeichen vor Cursor selektieren
Strg + ⇑ + → bis zum Wortende selektieren
Strg + ⇑ + ← bis zum Wortanfang selektieren
⇑ + Ende bis Zeilenende selektieren
⇑ + Pos1 bis Zeilenanfang selektieren
Strg + ⇑ + Pos1 bis Dokumentenanfang selektieren
Strg + ⇑ + Pos1 bis Dokumentenende selektieren
Strg + A alles selektieren
Alt + C + ←↑↓→ Spaltenmodus

Löschen

Entf Zeichen nach Cursor löschen
Zeichen vor Cursor löschen
Strg + ⇐ bis Wortanfang löschen
Strg + Entf bis zum Wortende (nächstes Wort) löschen
Strg + ⇑ + ⇐ bis zum Zeilenanfang löschen
Strg + ⇑ + Entf bis zum Zeilenende löschen
Strg + L aktuelle Zeile löschen
⇑ + ⇐ löscht Auswahl
Entf löscht Auswahl
löscht Auswahl und fügt neue Zeile ein

Suchen und Ersetzen

Strg + F Suchdialog öffnen
Strg + H Ersetzungsdialog öffnen
Strg + ⇑ + F in Dateien finden
Strg + Alt + I inkrementelle Suche starten
F3 nächstes Vorkommen finden
⇑ + F3 vorheriges Vorkommen finden
Strg + F3 Auswählen und nächstes Vorkommen finden
Strg + ⇑ + F3 Auswählen und vorheriges Vorkommen finden
Strg + Alt + F3 Wort am Cursor suchen
Strg + Alt + ⇑ + F3 Wort am Cursor rückwärts suchen
Strg + F2 Lesezeichen setzen/löschen
F2 zum nächsten Lesezeichen springen
⇑ + F2 zum vorherigen Lesezeichen springen
F7 ins Suchergebnisfenster wechseln
F4 zum nächsten Suchergebnis springen
⇑ + F4 zum vorherigen Suchergebnis springen
Strg + B zugehörige Klammer suchen

Textbearbeitung

Strg + I trennt Zeile am sichbaren rechten Rand
Strg + J verbindet selektierte Zeilen
Teilt Zeile am Cursor oder erzeugt neue Zeile
Einfg aktivieren/deaktivieren Überschreibmodus
Selektion einrücken
⇑ + ⇥ Selektion ausrücken
Strg + ⇑ + T Aktuelle Zeile kopieren
Strg + C Auswahl kopieren
Strg + X Auswahl ausschneiden
Strg + V Clipboard-Inhalt einfügen
Strg + Z Rückgängig
Strg + Y Wiederholen
Strg + ⇑ + ↑ Zeile nach oben schieben
Strg + ⇑ + ↓ Zeile nach unten schieben
Strg + T Aktuelle Zeile mit nächster Zeile vertauschen
Strg + U Wandelt Auswahl in Kleinbuchstaben
Strg + ⇑ + U Wandelt Auswahl in Großbuchstaben
Strg + ↵ Wort autovervollständigen
Strg + Leerzeichen Autovervollständigen (Liste)

Dateioperationen

Strg + N Neues Dokument
Strg + O Datei öffnen
Strg + S aktuelle Datei speichern
Strg + Alt + S Speichern unter (aktuelle Datei)
Strg + ⇑ + S alle Dateien speichern
Strg + W Datei schließen
Strg + T zum nächsten Reiter wechseln
Strg + ⇑ + T zum vorherigen Reiter wechseln

Makro und Ausführen

Strg + ⇑ + R Makroaufzeichnung starten/stoppen
Strg + ⇑ + P Marko starten
F5 Ausführen

Please share this article von facebook & google plus or where you want, thank you!

Magento: Fixing error „[unknown object].fireEvent()“

8. Januar 2015 at 10:02

Recently I’ve encountered the following Javascript error in my Magento store:

error: error in [unknown object].fireEvent():
event name: address_country_changed
error message: zipElement.up(…).down(…) is undefined

This error pops out when creating the order from admin panel and entering customer shipping address. It pops out when editing every filed in the address, which is quite annoying.

Regarding to this forum post, this has something to do with defining the zip code as not required filed in the database. Specialists recommend to set zip code as required filed in the database and then setting it as not required on the country basis. But people report that setting so will still not make zip code as optional field.

So I decided to do my own fix. Here it is:

1. Copy the file app\design\adminhtml\default\default\template\directory\js\optional_zip_countries.phtml to your local design-folder like

app\design\adminhtml\default\fly2marsmedia\template\directory\js\optional_zip_countries.phtml

2. Navigate approximately to line 57.

3. Find the function setPostcodeOptional(zipElement, country)

4. Find the following line: zipElement.up(1).down(‚label > span.required‘).hide();

5. Change it to the following code:

var zipElementLabel = zipElement.up(1).down('label > span.required');
 if (zipElementLabel)
 zipElementLabel.hide();

6. Find the following line: zipElement.up(1).down(‚label > span.required‘).show();

7. Change it to the following code:

var zipElementLabel = zipElement.up(1).down('label > span.required');
if (zipElementLabel)
zipElementLabel.show();

Notice that this code repeats two times inside the function, but differs a little bit in „hide()“ and „show()“ calls at the end.

8. Save the file and upload to the server. Page reload might be required.

This helped me fighting the mentioned error in Magento version 1.9.0.1 and other versions.

Please share this article von facebook & google plus or where you want, thank you!

Magento Warenkorb Daten im Header / Warenkorb auslesen – Magento: get cart data

6. Januar 2015 at 14:58
Den Warenkorb von Magento kann man wie folgt auslesen:
<?php
      $_countHelper = $this->helper('checkout/cart')->getSummaryCount();  //get total items in cart
      $_totalHelper = $this->helper('checkout/cart')->getQuote()->getGrandTotal(); //get total price
      if($count==0)
      {
        echo $this->__('<a href="/checkout/cart" class="cartgo">(0 ITEMS)</a>',$count);
      }
      if($count==1)
      {
        echo $this->__('<a href="/checkout/cart" class="cartgo">(1 ITEM)</a>',$count);
      }
      if($count>1)
      {
        echo $this->__('<a href="/checkout/cart" class="cartgo">(%s ITMES)</a>',$count);
      }
      echo $this->__('', $this->helper('core')->formatPrice($total, false));
    ?>

Please share this article von facebook & google plus or where you want, thank you!

Magento: convert single select attribute to multiselect

7. August 2014 at 17:24

Add in your entity-model following functions:

    /**
     * Get a text for option value
     *
     * @param string $value
     * @return string|false
     */
    public function getOptionText($value)
    {
        $options = $this->getAllOptions();
        foreach ($options as $option) {
            if ($option['value'] == $value) {
                return $option['label'];
            }
        }
        return false;
    }
    public function getFlatColums()
    {
        $columns = array();
        $columns[$this->getAttribute()->getAttributeCode()] = array(
            'type'      => 'VARCHAR',
            'unsigned'  => false,
            'is_null'   => true,
            'default'   => null,
            'extra'     => null
        );
        return $columns;
    }
    /**
     * Retrieve Indexes for Flat
     *
     * @return array
     */
    public function getFlatIndexes()
    {
        $indexes = array();
        $index = 'IDX_' . strtoupper($this->getAttribute()->getAttributeCode());
        $indexes[$index] = array(
            'type'      => 'index',
            'fields'    => array($this->getAttribute()->getAttributeCode())
        );
        return $indexes;
    }
    /**
     * Retrieve Select for update Attribute value in flat table
     *
     * @param   int $store
     * @return  Varien_Db_Select|null
     */
    public function getFlatUpdateSelect($store)
    {
        return Mage::getResourceModel('eav/entity_attribute_option')
            ->getFlatUpdateSelect($this->getAttribute(), $store, false);
    }

Now the setup script to convert 2 attributes

$this->startSetup();
$installer = $this;
$attributes = array(array('name' => 'ENTER_ATTRIBUTE_KEY_HERE', 'attribute_id' => ''),  // enter the attribute_key for ENTER_ATTRIBUTE_KEY_HERE
                    array('name' => 'ENTER_ATTRIBUTE_KEY_HERE', 'attribute_id' => '')
            );
$productEntityTypeId = Mage::getModel('catalog/product')->getResource()->getTypeId();
foreach($attributes as $id => $value) {
    $attributeId = $installer->getAttributeId($productEntityTypeId, $value['name']);
    $attributes[$id]['attribute_id'] = $attributeId;
    $installer->updateAttribute($productEntityTypeId, $attributeId, array(
        'frontend_input' => 'multiselect',
        'backend_type' => 'varchar',
        'backend_model' => 'eav/entity_attribute_backend_array'
    ));
}
foreach($attributes as $id => $attributeData) {
    // now copy attribute values from old attribute to new
    $sql = 'INSERT INTO ' . $this->getTable('catalog_product_entity_varchar') . '(entity_type_id, attribute_id, store_id, entity_id, value)
            SELECT entity_type_id, attribute_id, store_id, entity_id, value
            FROM ' . $this->getTable('catalog_product_entity_int')
            . ' WHERE attribute_id = ' . $attributeData['attribute_id'] . ';';
    $installer->run($sql);
    // delete values from old attribute (you must do this)
    $sql = 'DELETE FROM ' . $this->getTable('catalog_product_entity_int')
        . ' WHERE entity_type_id = 4 and attribute_id = ' . $attributeData['attribute_id'] . ';';
    $installer->run($sql);
}
$this->endSetup();

Linux Konsolen Befehle in Windows verwenden

22. April 2014 at 15:29

Eine Möglichkeit Linux-Tools/-Programme direkt unter Windows ohne eigene Linux-Installation laufen zu lassen bietet z.b. das Windows-Programm Cygwin entwickelt von Red Hat. Als gute Ergänzung empfehle ich das Windows-Programm MSYS.

Linux Befehle unter Windows – Alternativen

Für einige Linux-Befahle wie z.b. echo, Umleitung von Ausgaben sowie cat gibt es in der Windows Shell (cmd.exe) Alternativen.

Umleitung des Ausgab-Streams

type befehl1 > text.txt

Pipeline

Identisch mit dem Aufruf unter Linux:

cmd1 | cmd2

cat

asdf

set –x oder set +x

Die Befehle schalten den Debug Modus ein oder aus. In Windows geht das mit echo on und echo off.

Dev/null

/dev/null aus Linux entspricht dem Device nul in Windows.

 

SEO: Die Bedeutung des Canonical-Tag – sinnvoll oder falsch verwendet?

13. Februar 2014 at 18:31

Ständig fällt in Bezug auf „unique Links“ das Wort „Canonical-Tag wurde gesetzt“ … toll, aber das Problem ist damit nicht gelöst.

Warum?

– Der Canonical-Tag ist nur ein Verweis auf das Original
– Link Juicy geht weiterhin komplett verloren
– Die Original-Seite erhält nicht den Link-Power den sie bekommen würde wenn es nur die eine Seite gebe (oder die doppelte per 301 auf diese geht)

Wie ist eure Meinung dazu?