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();

Magento: Datum und Zeit / Date and Time

27. Mai 2014 at 14:48

Bei Operationen mit Datum und Zeit sollten die Klassen Mage_Core_Model_Date oder
Mage_Core_Model_Locale verwendet werden, um Zeitverschiebungen zu berücksichtigen.

Verwendung von now() und date() dafür nicht geeignet.

Beispiele zur Verwendung der Date Funktion in Magento

// get timestamp on server based time
$now = Mage::getModel('core/date')->timestamp(time());
// get server date and time
$now = Mage::getModel('core/date')->date('Y-m-d h:i:s');
// get UTC date and time
$now = Zend_Date::now();
$anyDate = '2011-12-11';
$currentDate = Mage::getModel('core/date')->date('d.m.Y', strtotime($anyDate));
// a more complete example with the im admin panel configured timezone
$datetime = Zend_Date::now();
// admin controls this output through configuration
$datetime->setLocale(Mage::getStoreConfig(
Mage_Core_Model_Locale::XML_PATH_DEFAULT_LOCALE))
->setTimezone(Mage::getStoreConfig(
Mage_Core_Model_Locale::XML_PATH_DEFAULT_TIMEZONE));
echo $datetime->get(Zend_Date::DATETIME_SHORT);
// formated
$date = $datetime->toString("Y-MM-d_H:m:s");

Wie deaktiviert man korrekt Observer-Funktionen OHNE die Core-Module zu verändern?

6. Mai 2014 at 13:14

Schreibt ein eigenes Module, dort in der etc/config.xml ist es möglich über z.b. folgende Zeilen den Aufruf der Methode „initByRequest“ durch das Event controller_action_predispatch zu deaktivieren.

Wichtig dabei folgende Zeile zum deaktivieren des Events: <type>disabled</type>

    <frontend>
        <events>
            <controller_action_predispatch>
                <observers>
                    <log>
                        <class>log/visitor</class>
                        <method>initByRequest</method>
                        <type>disabled</type>
                    </log>
                </observers>
            </controller_action_predispatch>
		</events>
	</frontend>

Warum nicht direkt im core?

Durch saubere Trennung zwischen eigenem (veränderten) und core-code, ist eure Magento-Version weiterhin wartbar,
daher Updates (vor allem Security-Fixes) lassen sich einfacher einspielen.

Mit jeder direkten Änderung am core-code, verschlechtert sich die Wartbarkeit der Magento-Suite.

Wenn euch der Tipp geholfen hat, bitte diesen Artikel auch bei Google+ und Facebook teilen, danke für euren Support!

PHP: Zip Archiv ohne Dateipfad im Zip-File

10. Februar 2014 at 11:19

Ihr wollt mit PHP ein Zip-Archiv erstellen, eine Datei hinzufügen ohne im Zip-File den Pfad zu beinhalten?

So geht’s:

// function getFileNameWithPath() liefert den Pfad zum gewünschten zip-file
$zipFile = $this->getFileNameWithPath().'.zip';
 $zip = new ZipArchive();
 $overwrite = false;
if(file_exists($this->getFileNameWithPath())) {
 $overwrite = true;
 }
if ($zip->open($zipFile, $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE)!==TRUE)
 {
 exit("cannot open <$zipFile>\n");
 }
$zip->addFile($this->getFileNameWithPath(), self::FILE_NAME);
 echo "status:" . $zip->status . "\n";
 $zip->close();

Wenn euch der Tipp geholfen hat, bitte diesen Artikel auch bei Google+ und Facebook teilen, danke für euren Support!

SEO: meta-tags & title ohne double encode

19. Dezember 2013 at 14:56

Werden die Daten für die meta-tags sowie dem title aus einem cms ausgelesen, so kann es passieren das Sonderzeichen (special chars) enthalten sind. Diese sind natürlich nicht erwünscht, z.b. das doppelte Hochkomma („) kann so gar den html-tag „zerstören“.

Die Lösung ist selbstverständlich in php die Funktion htmlspecialchars() .

Doch wird diese nicht mit entsprechenden Parametern ausgeführt, so werden ggf. doppelte encodings vorgenommen so wird aus einem

$einString = „‚Honey‘ & s&uuml;&szlig;e \“Schokolade\““;

ein

&#039;Honey&#039; &amp; s&amp;uuml;&amp;szlig;e &quot;Schokolade&quot;

Das ist nicht unbedingt erwünscht. Daher lieber wie folgt aufrufen

echo htmlspecialchars($string, ENT_QUOTES, "UTF-8", false)";

und ihr erhaltet als Ausgabe

&#039;honey&#039; &amp; s&uuml;&szlig;e &quot;Schokolade&quot;<br>

Wenn euch der Tipp geholfen hat, bitte diesen Artikel auch bei Google+ und Facebook teilen, danke für euren Support!

Eigene Plugins in PHPStorm einbinden – z.b. den Magento Cache über PHPStorm löschen

3. Dezember 2013 at 13:30

php code

In PHPStorm ist es möglich eigene Menüpunkte anzulegen und für diese(n) Befehle zu hinterlegen.

Ein nützlich Beispiel ist z.b. den Shell-Code für das löschen des Magento-Caches zu hinterlegen.

So geht’s:

  1. In PHP-Storm im Menü „File/Einstellungen“ wählen.
  2. Unter „external tools“ (einfach danach suchen) könnt ihr ein neuen Eintrag hinzufügen,
    z.b.: alias clear-magento-cache=“rm -Rf var/cache/mage–*“
  3. Im Menü unter „Tools -> Magento -> Clear Magento Cache“ findet ihr nun den entsprechenden Eintrag

Das war’s schon.

Wenn euch der Tipp geholfen hat, bitte diesen Artikel auch bei Google+ und Facebook teilen, danke für euren Support!

 

Get Price from Database

6. November 2013 at 17:34
  1. eav_entity_type ——> See catalog_product’s Id (10)
  2. SELECT * FROM `eav_attribute` WHERE `attribute_code` = ‘price’
  3. Get attribute_id where entity_type_id=’10’ (69)
  4. SELECT * FROM `catalog_product_entity_decimal` WHERE `attribute_id` = ‘69’
  5. The value you get is the Price of the Product Whose Id correspond entity_id

Magento: Change Attribute Type – Select to Multiselect

13. September 2013 at 17:51

Ihr möchtet den Attribute Type von Select auf Multiselect ändern?

so geht’s

$installer = $this;
$this->startSetup();
//$installer->updateAttribute('catalog_product', 'attributename', array('type' => 'varchar', 'input' => 'multiselect'));
$entityTypeId = $installer->getEntityTypeId('catalog_product', 'attributename');
$idAttributeOldSelect = $this->getAttribute($entityTypeId, 'attributename', 'attribute_id');
$installer->updateAttribute($entityTypeId, $idAttributeOldSelect, array(
    'frontend_input' => 'multiselect',
    'backend_type' => 'varchar'
));
$this->endSetup();

Magento Problem:catalog/product_collection wird mit falscher Store-ID-Flat-Table geladen – hier die Lösung

24. Juli 2013 at 14:00

Solltet ihr in Magento die Collection „catalog/product_collection“ in einer Schleife laden wollen und jeweils die store-id ändern, so erhaltet ihr eine falsche flat-table zurück (immer die des ersten geladenen stores.

Die Lösung: Vorher auf dem ResourceSingleton jeweils noch mal explizit mit setStoreId die ID des aktuellen stores setzen, hier der Quellcode dazu:

        Mage::getResourceSingleton("catalog/product_flat")->setStoreId($store->getId());
        $products = Mage::getResourceModel("catalog/product_collection")
            ->setStoreId($store->getId())
            ->addStoreFilter($store->getId());

War der Tipp für euch hilfreich?
Dann gibt ihn doch ein +1 oder like bzw. teilt diesen Artikel bei Google+ oder Facebook!

Danke für euren Support!

In Magento die final erzeugte config.xml ausgeben / Get full merged config.xml in magento

28. Mai 2013 at 15:21

Die einzelnen Module enthalten jeweils diverse config.xml-Dateien. Diese werden final von Magento zu einer einzigen config-xml-datei zusammen gefügt. Diese könnt ihr euch mit folgendem PHP-Code ausgeben lassen:

Mage::log(Mage::app()->getConfig()->getNode()->asNiceXml(), Zend_Log::DEBUG, "config-xml.log");

War der Tipp für euch hilfreich?
Dann gibt ihn doch ein +1 oder like bzw. teilt diesen Artikel bei Google+ oder Facebook!

Danke für euren Support!