Magento: Add custom column in admin grid with own data & filter

29. August 2014 at 13:18

How to create a custom grid filter with a new column with own data (not from collection) and filter this data?

First Step

Enhance the grid, for example extends the Mage_Adminhtml_Block_Catalog_Category_Tab_Product

overwrite the  _prepareColumns() methode with new column

      $this->addColumn('price_yesno', array(
            'header'    => Mage::helper('catalog')->__('Price exist'),
            'sortable'  => true,
            'width'     => '60',
            'index'     => 'price',
            'type'      => 'options',
            'align'     => 'center',
            'renderer'  => 'Fly2mars_Catalog_Block_Adminhtml_Category_Renderer_Hasprice',
            'editable'  => 0,
            'options' => array('1' => 'Yes', '0' => 'No'),
            'filter_condition_callback' => array($this, '_filterHasPrice')
        ));
return Mage_Adminhtml_Block_Widget_Grid::_prepareColumns();

And add in the same class the following callback methode

    protected function _filterHasPrice($collection, $column)
    {
        $value = $column->getFilter()->getValue();
        $collection = $this->getCollection();
        if($value == 1) {
            $collection->addFieldToFilter('price', array('notnull' => true));
        } else {
            $collection->addFieldToFilter('price', array('null' => true));
        }
        return $this;
    }

Second Step

You need the renderer, for this example you add in the file Fly2mars_Catalog_Block_Adminhtml_Category_Renderer_Hasprice

class Fly2mars_Catalog_Block_Adminhtml_Category_Renderer_Hasprice
    extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
{
    /**
     * Check if product has price
     *
     * @param   Varien_Object
     * @return  string
     */
    protected function _getValue(Varien_Object $row)
    {
        if($row->getData('price') != '') {
            return 'Yes';
        }
        return 'No';
    }
}

that’s it.

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

GD Star Rating
loading...
GD Star Rating
loading...

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();
GD Star Rating
loading...
GD Star Rating
loading...

Google & SEO: HTTPS als Ranking-Signal

7. August 2014 at 11:24

Google-logo-wikipedia

Google sagt offiziell dass sie ein HTTPS überall Netz wollen und seit geraumer Zeit HTTPS als Ranking-Signal verwenden, daher Webseiten mit HTTPS werden bei der Positionierung von Suchergebnissen besser behandelt als HTTP_Seiten.

Daher sollte aus SEO-Gesichtspunkten (und ggf. für eine bessere Sicherheit) dieWebseiten alle nur noch im HTTPS-Modus laufen.

BTW: Die SSL-Sicherheit einer Webseite kann geprüft werden über die Webseite https://www.ssllabs.com/ssltest/
Quelle (Google Webmaster Blog):

http://googlewebmastercentral-de.blogspot.de/2014/08/https-als-ranking-signal.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+blogspot/vIRG+(Webmaster-Zentrale+Blog)

GD Star Rating
loading...
GD Star Rating
loading...

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");
GD Star Rating
loading...
GD Star Rating
loading...

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!

GD Star Rating
loading...
GD Star Rating
loading...

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.

 

GD Star Rating
loading...
GD Star Rating
loading...

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?

GD Star Rating
loading...
GD Star Rating
loading...

PHP Call-Back-Funktionen verwenden

11. Februar 2014 at 17:14

Kennt ihr Call-Back-Funktionen? Z.b. wenn es heißt Daten neu zu formatieren, z.b. in einer Attribute-Liste, dann sind Call-Back-Funktionen echt nützlich. Warum auch immer werden Callback-Funktion nicht so oft benutzt wie es sinnvoll wäre, aus diesem Grund ein kurzes Blog-Post zu der Thematik.

So geht’s:

$callback = '_test' . uc_words($attributeCode, '');
 if (method_exists($this, $callback)) {
 $entry = $this->$callback($attribute);
 if (!empty($entry)) {
 $data[$attributeCode] = $entry;
 }
 }
 protected function _testColor($attributeCode)
 {
 // do something
 //return data
 $return $data[$attributeCode] = array(
 'value' => 'attribute value'
 );
 return $data;
 }

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

GD Star Rating
loading...
GD Star Rating
loading...

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!

GD Star Rating
loading...
GD Star Rating
loading...

MySQL: Doppelte Datensätze finden

6. Februar 2014 at 17:44

Ihr müsste doppelte Datensätze innerhalb einer MySQL-Tabelle finden?

Das folgende SQL-Query hilft euch dabei (in spalte 1 werden doppelte Datensätze gesucht):

<code>SELECT COUNT(*) AS COUNT, spalte1, spalte2 FROM tabelle
GROUP BY spalte1 HAVING COUNT(*)>1;
</code>

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

GD Star Rating
loading...
GD Star Rating
loading...