Magento: system.xml um weitere Felder erweitern – Daten-Typen

19. Juli 2011 at 15:44

Folgende Typen / Möglichkeiten gibt es in Magento um im Backend Datums-Typen Anzuzeigen (weg über system.xml):

<use_calendar translate="label">
<label>Use JavaScript Calendar</label>
<frontend_type>select</frontend_type>
<source_model>adminhtml/system_config_source_yesno</source_model>
<sort_order>1</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</use_calendar>
<date_fields_order translate="label">
<label>Date Fields Order</label>
<frontend_type>select</frontend_type>
<frontend_model>adminhtml/catalog_form_renderer_config_dateFieldsOrder</frontend_model>
<sort_order>2</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</date_fields_order>
<time_format translate="label">
<label>Time Format</label>
<frontend_type>select</frontend_type>
<source_model>adminhtml/system_config_source_catalog_timeFormat</source_model>
<sort_order>3</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</time_format>
<year_range translate="label comment">
<label>Year Range</label>
<comment>Use four-digit year format.</comment>
<frontend_type>text</frontend_type>
<frontend_model>adminhtml/catalog_form_renderer_config_yearRange</frontend_model>
<sort_order>4</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</year_range>

ZendServer CE: Pear konfigurieren & phpUnit installieren – Debug

19. Juli 2011 at 09:10

Nach der Installation von Zend Server CE ist PEAR erst mal nicht einsatzbereit.
Konfigurieren lässt sich PEAR ganz einfach über den Aufruf der Datei …\ZendServer\bin\go-pear.bat (mit Admin-Rechten ausführen).

Startet die PEAR_ENV.reg (liegt ebenfalls unter …\ZendServer\bin\)!

Danach könnt ihr PHPUnit direkt über PEAR nach installieren, einfach im selben Ordner mit den Kommandos:
pear upgrade pear
pear channel-discover components.ez.no
pear channel-discover pear.phpunit.de
pear channel-discover pear.symfony-project.com

pear install –alldeps phpunit/PHPUnit

Taucht eine Fehlermeldung ähnlich:

Failed to download pear/HTTP_Request2 within preferred state „stable“, latest re
lease is version 2.0.0RC1, stability „beta“, use „channel://pear.php.net/HTTP_Request2-2.0.0RC1“ to install
install failed

so wechselt den Status mit pear config-set preferred_state beta und start die installation erneut!

Taucht ein Fehler ähnlich dem folgenden auf:

C:\Program Files\Zend\ZendServer\bin>pear install pear/XML_RPC2
SECURITY ERROR: Will not write to C:\Users\User\AppData\Local\Temp\pear\cache\
b521f99a31e9c4ca2b11faa4b5f31ef5rest.cacheid as it is symlinked to C:\Users\dani
el\AppData\Local\Temp\pear\cache\b521f99a31e9c4ca2b11faa4b5f31ef5rest.cacheid –
Possible symlink attack
install failed

Löscht einfach den Cache-Ordner! 😉

Vergleich: ZendStudio 8 / Eclipse vs. PhpStorm 2.1

18. Juli 2011 at 18:05

Seit vielen Jahren nutze ich mehr oder weniger zufrieden Eclipse mit entsprechenden Plugins zur PHP & Java-Entwicklung als PHP-IDE. In letzter Zeit bin ich immer unzufriedener mit ZendStudio und Eclipse aufgrund schlechter bis sehr schlechter Performance bei der Suche, Indexierung, SVN-Update, Diffs, eigentlich bei allem ist die Performance von ZendStudio sowie auch Eclipse schlecht.

Im Vergleich ist meine neue Wahl-IDE PhpStorm sehr schnell. Die Ergebnisse bei einer suche sind fast sofort verfügbar, bei ZendStudio/Eclipse können live die abgeschlossenen Such-Prozente hoch gezählt werden …

What ever, hier eine kurze Zusammenfassung der mir aufgefallenen Pro- & Contras (gerne könnt ihr eure Erfahrungen als Kommentar hinterlassen und ich passe ggf. den Artikel an):

ZendStudio / Eclipse

Pro

  • Usability / Benutzeroberfläche ist beliebig skalierbar und wirkt sehr übersichtlich (ggf. auch aufgrund langjähriger Gewohnheit)
  • ZendFramework ist integriert
  • Es gibt diverse Plugins
  • Auch für andere Sprachen wie z.B. Java verwendbar / optimiert (ggf. durch Plugins)
  • Es können beliebig viele Projekte gleichzeitig geöffnet werden
  • SVN Support sehr gut

Contra

  • Performance (Suche, Compare, etc. ist sehr langsam)
  • Speicherverbrauch (sehr hoch, gerne schnappt sich die IDE mal über 1GB an Arbeitsspeicher)
  • Das Beenden der IDE dauert teilweise bis zu 5 Minuten (sehr langsame History-Kompression)

PhpStorm

Pro

  • Performance (Suche, Compare, etc. ist sehr schnell)
  • Speicherverbrauch sehr niedrig (bei Bedarf kann so gar durch einen klick der aktuell reservierte Speicher auf Null gesetzt werden)

Contra

  • Prozesse lassen sich nicht gut beenden, z.b. „scanning files“ lässt sich zwar „Abbrechen“, allerdings läuft der Prozess beliebig lange weiter
  • Es kann nur ein Projekt gleichzeitig geöffnet werden
  • Tastenkürzel sind teilweise nicht Standard-Kürzel (z.b. Tab schließen nicht STRG + W, etc.)
    Es können zwar Layouts gewählt werden, z.b. „Eclipse-Layout“, allerdings sind auch dann nicht alle oder die richtigen Eclipse-Tastenkürzel zu nutzen (Bug ?)
  • Der Compare-Editor ist unübersichtlich, alle geänderten Dateien werden in einer Liste angezeigt, Ordner lassen sich nicht zusammenfassen (browsen), bei größeren Projekten sehr unübersichtlich
  • Bei einem Compare mit einem anderen Branche lassen sich angezeigte Änderungen nicht über dem Compare-Editor übernehmen, Read-Only – wo ist da der Sinn?
  • SVN Support, primär die Funktionalität & Usability nicht so detailiert wie in Eclipse/ZendStudio

Update 25.07.11:

Mein erstes Resumé nach einer Woche Umstieg von Eclipse/ZendStudio zu PhpStorm ist ein wenig ernüchternd.
PhpStorm punktet weiterhin ganz klar im Bereich der Performance, dadurch effektiveres Arbeiten (Eclipse/ZendStudio ist leider wirklich sehr sehr langsam). Die Usability in PhpStorm ist im Gegensatz zu Eclipse eher schlecht bzw. unausgereift oder nicht klar überdacht. Oft wird sich nicht an gesetzte Oberflächen-Standards gehalten, bei Tastenkürzel funktionieren ebenfalls keine Standard-Kürzel. Einige Eingabe oder Ausgabemasken sind schlecht gestaltet, da muss dringend noch nach gebessert werden.  Aufgrund der besseren Performance bereue ich den Umstieg allerdings nicht, an die Benutzeroberfläche muss ich mich noch gewöhnen und hoffe dass die Usability bei zukünftigen Updates verbessert wird.

ZendFramework: Datenbankabfrage / SQL Abfrage mit ZendFramework & Magento

15. Juli 2011 at 14:38

Mit dem folgenden Code-Schnippsel könnt ihr einfach eine sql-abfrage über zend in magento starten.

More information: framework.zend.com/manual/de/zend.db.select.html

$table = array('table_name);
$selectCol = array('table_id' , 'col_two');
$where = 'col_two >= ?';  // ? wird ersetzt mit zweitem wert in der where bedingung
$order = '';
$connection = Mage::getSingleton('core/resource')->getConnection('core_read');
$select = $connection->select()
->from($table, $selectCol)
->where($where, $this->lastExportDate)
->order($order);
echo $select->__toString();  // die komplette sql-abfrage ausgeben lassen
$result = $connection->fetchAll($select);

 

 

Magento: Category & Store Group & Store View über Setup Script anlegen

29. Juni 2011 at 11:12

magento ecommerce logo

Der folgende Script zeigt wie automatisiert über ein PHP-Setup-Script in Magento eine Category angelegt werden kann, welche dann als Default-Category einer neuen Store-Group zugewiesen wird, welche samt einer neuen Store-View angelegt wird.

$installer = $this;
$installer->startSetup();
				$data = array(
								'name' 							=> 'New Category',
								'url_key'    				=> 'root', //'de',
				      	'description' 			=> 'test category',
				      	'meta_description' 	=> 'test category',
								'meta_keywords'			=> 'categories_meta',
								'display_mode'      => Mage_Catalog_Model_Category::DM_PRODUCT,
								'default_sort_by'   => Mage::getModel("catalog/category")->getDefaultSortBy(),
				      	'available_sort_by' => Mage::getModel("catalog/category")->getDefaultSortBy(),
				      	'is_active'					=> 1,
						    'is_anchor'         => 0,
						    'include_in_menu'   => 0,
						    'parent_id'         => 1,
						    'path'              => 1, //Mage::getModel("catalog/category")->load(1)->getPath(),
						    'attribute_set_id'  => Mage::getModel("catalog/category")->getDefaultAttributeSetId(),
								'display_mode'	=> array( '0' => 'show_products'),
								'custom_design_apply' => 1
				        );
				Mage::app()->getStore()->load(0);
				$cat = Mage::getModel('catalog/category');
				$cat->addData($data);
				$parentId = Mage_Catalog_Model_Category::TREE_ROOT_ID;
			  $parentCategory = Mage::getModel('catalog/category')->load($parentId);
			  $cat->setPath($parentCategory->getPath());
			//	$cat->setStoreId(Mage::app()->getStore()->getId());
				$cat->setStoreId(0);
				$cat->setAttributeSetId($cat->getDefaultAttributeSetId());
				try {
				    $cat->save();
				    $newCategoryId = $cat->getId();
				} catch (Exception $e) {
				    Mage::logException($e->getMessage());
				    return;
				}
			}
		if($newCategoryId != '') {
			$groupModel = Mage::getModel('core/store_group');
	    $group = array(
	        'website_id' => 1,
	        'name' => 'New Store Gropu',
	        'root_category_id' => $newCategoryId,
	    );
	    $groupModel->setData($group);
	    $groupModel->setId(null);
	    $groupModel->save();
	    Mage::dispatchEvent('store_group_save', array('group' => $groupModel));
	    $storeModel = Mage::getModel('core/store');
	    $store = array(
	        'group_id' => $groupModel->getId(),
	        'name' => 'New Store',
	        'code' => 'new_store',
	        'is_active' => 1,
	        'sort_order' => 2,
	    );
	    $storeModel->setData($store);
	    $storeModel->setId(null);
	    $eventName = 'store_add';
	    $groupModel = Mage::getModel('core/store_group')->load($storeModel->getGroupId());
	    $storeModel->setWebsiteId($groupModel->getWebsiteId());
	    $storeModel->save();
	    Mage::app()->reinitStores(); // or Mage::app()->getConfig()->reinit();
	    Mage::dispatchEvent($eventName, array('store'=>$storeModel));
		}
$installer->endSetup();
$installer->installEntities();
$installer = $this;
$installer->startSetup(); 

$mobileCategory = Mage::getModel(‚catalog/category‘)->getCollection()
->addAttributeToSelect(‚id‘)
->addAttributeToFilter(’name‘, ‚mobile‘)
->addAttributeToSort(‚id‘, ‚ASC‘)
->distinct(true)
->load();

$mobileCategoryId = “;
if(count($mobileCategory) > 0) {
foreach ($mobileCategory as $value) {
$mobileCategoryId = $value->getId();
}
} else {
$data = array(
’name‘                             => ‚Mobile‘,
‚url_key‘                    => ‚root‘, //’de‘,
‚description‘             => ‚test category‘,
‚meta_description‘     => ‚test category‘,
‚meta_keywords‘            => ‚categories_meta‘,
‚display_mode‘      => Mage_Catalog_Model_Category::DM_PRODUCT,
‚default_sort_by‘   => Mage::getModel(„catalog/category“)->getDefaultSortBy(),
‚available_sort_by‘ => Mage::getModel(„catalog/category“)->getDefaultSortBy(),
‚is_active‘                    => 1,
‚is_anchor‘         => 0,
‚include_in_menu‘   => 0,
‚parent_id‘         => 1,
‚path‘              => 1, //Mage::getModel(„catalog/category“)->load(1)->getPath(),
‚attribute_set_id‘  => Mage::getModel(„catalog/category“)->getDefaultAttributeSetId(),
‚mdm_display_mode‘    => array( ‚0‘ => ’show_products‘),
‚custom_design_apply‘ => 1
);

Mage::app()->getStore()->load(0);
$cat = Mage::getModel(‚catalog/category‘);
$cat->addData($data);
$parentId = Mage_Catalog_Model_Category::TREE_ROOT_ID;
$parentCategory = Mage::getModel(‚catalog/category‘)->load($parentId);
$cat->setPath($parentCategory->getPath());
//    $cat->setStoreId(Mage::app()->getStore()->getId());
$cat->setStoreId(0);
$cat->setAttributeSetId($cat->getDefaultAttributeSetId());

try {
$cat->save();
$mobileCategoryId = $cat->getId();

} catch (Exception $e) {
Mage::logException($e->getMessage());
return;
}
}

if($mobileCategoryId != “) {
$groupModel = Mage::getModel(‚core/store_group‘);
$group = array(
‚website_id‘ => 1,
’name‘ => ‚Mobile‘,
‚root_category_id‘ => $mobileCategoryId, // 119

);

$groupModel->setData($group);
$groupModel->setId(null);
$groupModel->save();

Mage::dispatchEvent(’store_group_save‘, array(‚group‘ => $groupModel));

$storeModel = Mage::getModel(‚core/store‘);

$store = array(
‚group_id‘ => $groupModel->getId(),
’name‘ => ‚Mobile‘,
‚code‘ => ‚mobile‘,
‚is_active‘ => 1,
’sort_order‘ => 2,
);
$storeModel->setData($store);
$storeModel->setId(null);
$eventName = ’store_add‘;

$groupModel = Mage::getModel(‚core/store_group‘)->load($storeModel->getGroupId());
$storeModel->setWebsiteId($groupModel->getWebsiteId());
$storeModel->save();

Mage::app()->reinitStores(); // or Mage::app()->getConfig()->reinit();

Mage::dispatchEvent($eventName, array(’store’=>$storeModel));
}

$installer->endSetup();
$installer->installEntities();

Magento: Per PHP Setup Script neue Store View anlegen

28. Juni 2011 at 11:01

Per PHP Script eine neue Store View über z.B. Setup-Install-Script anlegen?
So geht’s:

$storeModel = Mage::getModel('core/store');
 $store = array(
 'group_id' => 1,
 'name' => 'New Store Name',
 'code' => 'store_xy',
 'is_active' => 1,
 'sort_order' => 2,
 );
 $storeModel->setData($store);
 $storeModel->setId(null);
 $eventName = 'store_add';
 $groupModel = Mage::getModel('core/store_group')->load($storeModel->getGroupId());
 $storeModel->setWebsiteId($groupModel->getWebsiteId());
 $storeModel->save();
 Mage::app()->reinitStores(); // or Mage::app()->getConfig()->reinit();
 Mage::dispatchEvent($eventName, array('store'=>$storeModel));

Linux: Nano Editor – Befehle / Tastenkürzel

23. Juni 2011 at 14:21

Mein Lieblingseditor unter Linux in der Bash ist ganz klar VI.
Leider kann es vorkommen das dieser z.b. über Putty mit falsch oder schlecht konfigurierter Bash/SSH dieser nicht genutzt werden kann da z.B. die Pfeiltasten nicht benutzbar sind … *sigh* (wer eine Lösung dafür hat, bitte mal in den Kommentaren posten).

What ever, eine gute Alternative ist z.B. Nano, dazu hier die wichtigsten Tastenkürzel:

Tastenkombination Erklärung
STRG + G / F1 Hilfe öffen
STRG + X / F2 Nano Schließen/Beenden
STRG + O / F3 Speichern
STRG + W / F6 Suchen nach einem String oder Regulären Ausdruck
STRG + K / F9 Zeile ausschneiden und in die Zwischenablage legen
STRG + U / F10 Zwischenablage einfügen
STRG + C / F11 Position des Cursors anzeigen
ALT + T Alles unter dem Cursor ausschneiden
ALT + M Maussupport aktivieren oder deaktivieren

Firefox: User Agent Switcher (mobile & SEO)

22. Juni 2011 at 09:53

Für Webentwickler ist es oft nützlich den User-Agent (Client / Browser / Device) zu ändern, um die Webseite auf anderen Geräten oder für z.b. Google Bot zu evaluieren. Da in der Regel nicht von alle möglichen Geräten (iPhone, Android, iPad, etc.) zum testen verfügbar sind und auch der Google-Bot nicht mal eben im Büro sitzt, sind entsprechende Emulatoren von Vorteil.

Eine gute Variante ist das User Agent Switcher Plugin für Firefox.

Nach der Installation kann bequem über ein Menü der gewünschte Client gewählt werden.

user-agent-switcher-firefox-plugin

Anonymus droht der GEMA aufgrund youTube

20. Juni 2011 at 12:33

Der Unmut über die teilweise mafiösen Machenschaften der GEMA und den derzeit geplatzten Verhandlungen zwischen youTube und der Gema sorgen immer mehr für Unmut bei Internet-Benutzern.

Die GEMA ist nie im Jahr 2011 bzw. Internet-Zeitalter angekommen und möchte weiterhin an ihrem undurchschaubaren, veralteten und nicht in der Realität für Verbraucher finanzierbarem Zahlungsmodell fest halten.

Die Hackergruppierung namenes Anonymus hat jetzt ein Drohvideo gegenüber der GEMA online gestellt, welches ihr hier sehen könnt:

Der Inhalt des Videos:

Sehr geehrte Gesellschaft für musikalische Aufführungs- und mechanische Vervielfältigungsrechte (GEMA),
Wir sind Anonymous. Wir beobachten mit Sorge eure überhöhten Forderungen bezüglich urheberrechtlich geschützem Material auf Youtube und anderen Plattformen dieser Art.
Das Resultat ist vielen YouTube-Nutzern hierzulande sicherlich bekannt. Beim Klick auf ein entsprechendes Musikvideo ist nur die Meldung „Leider ist dieses Video […] in Deutschland nicht verfügbar, da die GEMA die Verlagsrechte hieran nicht eingeräumt hat.“ zu lesen.
Anonymous empfindet dieses Vorgehen als eine Einschränkung des freien Informations flusses.
Sie weigern sich offenbar massiv dem Google-Unternehmen die nötigen Rechte einzuräumen, um bestimmte Musik- und Filmtitel in Deutschland zeigen zu dürfen.
Ihren überzogenen Forderungen kann und wird das Unternehmen Google nicht zustimmen können, da es nicht die benötigten Werbeeinnahmen generieren kann.
Wir haben keine Probleme damit, dass sie versuchen den Plattenfirmen und Künstlern einen Gewinn zu verschaffen. Dabei stehen sie sich aber selbst im Weg und dadurch auch den Künstlern.
Musiker brauchen YouTube Videos, das wissen mittlerweise sogar schon die Plattenfirmen.
Denn dies ist eine kostenlose Promotion auf die kein Musiker freiwillig verzichten möchte.
Wenn sich dieses Verhalten nich ändert, sehen wir uns gezwungen, weitere Maßnahmen einzuleiten.
Auch werden wir schon jetzt gewisse Tools verbreiten, mit denen wir es ermöglichen , dass auch gesperrte Video’s von den Nutzern angesehen werden können.
Der Link dazu befindet sich in der Beschreibung des Videos.
Dadurch möchten wir erreichen, dass mit Google eine schnelle Einigung stattfindet.

We are Anonymous.
We are Legion.
We do not forgive.
We do not forget.
Expect us!

Magento: Artikel filtern nach bestimten Parametern

17. Juni 2011 at 10:49

Artikel könnt ihr wie folgt nach bestimmten Parametern filtern. Folgendes Beispiel zeigt die Filterung anhand des Preises aus bestimmten Unterkategorien:

<?php
$model = Mage::getModel('catalog/product');     // Direktzugriff auf Produkt als Methode
$collection = $model -> getCollection();    //Zugrif auf Eigenschaft
$collection -> addAttributeToSelect('name');    //Attributaktivierung - Name
//$collection  -> load();                      //Zeigt alle Artikel
$collection -> addFieldToFilter('price',array('from'=>'0','to'=>'40')); //Filtert alle Artikel von 0 bis 40€.
$collection -> getSelect();
$collection -> setOrder('price', 'ASC');
?>
<ul><?php foreach($collection as $product) : ?>
 <li>
 <?php echo $product ->getPrice(); echo "&euro; - "; ?>
 <?php echo $product ->getName(); echo " - ";?>
 <?php echo $product ->getColor(); echo " ";?>
 </li>
<?php  endforeach; ?>
</ul>