Magento Entwicklung: Unterschied zwischen den Versionen
F (Diskussion | Beiträge) (→Controller ableiten (rewrite)) |
V (Diskussion | Beiträge) (→allgemein Backendend) |
||
(32 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 7: | Zeile 7: | ||
== globale Funktionsaufrufe == | == globale Funktionsaufrufe == | ||
+ | === Cache Löschen === | ||
+ | <source lang="php"> | ||
+ | Mage::app()->cleanCache(); | ||
+ | </source> | ||
=== eingeloggt === | === eingeloggt === | ||
<source lang="php"> | <source lang="php"> | ||
Zeile 27: | Zeile 31: | ||
$post_get_array = Mage::app()->getRequest(); | $post_get_array = Mage::app()->getRequest(); | ||
+ | |||
+ | /** | ||
+ | * aktuelle url | ||
+ | */ | ||
+ | Mage::helper('core/url')->getCurrentUrl(); | ||
+ | </source> | ||
+ | |||
+ | ==== Session ==== | ||
+ | <source lang="php"> | ||
/** | /** | ||
* hole aktuelle Session | * hole aktuelle Session | ||
Zeile 32: | Zeile 45: | ||
$session = Mage::getSingleton('checkout/session'); | $session = Mage::getSingleton('checkout/session'); | ||
− | // was in die session schreiben | + | // was in die session schreiben mit den magischen Funktionen |
Mage::getSingleton('checkout/session')->setName('Value'); | Mage::getSingleton('checkout/session')->setName('Value'); | ||
+ | Mage::getSingleton('checkout/session')->set<Variablenname>('Value'); | ||
− | // was aus der session holen | + | // was aus der session holen mit den magischen Funktionen |
Mage::getSingleton('checkout/session')->getName('Value'); | Mage::getSingleton('checkout/session')->getName('Value'); | ||
+ | Mage::getSingleton('checkout/session')->get<Variablenname>('Value'); | ||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
+ | |||
=== Model === | === Model === | ||
* http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/using_collections_in_magento | * http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/using_collections_in_magento | ||
Zeile 74: | Zeile 86: | ||
$quote = Mage::getSingleton('checkout/session')->getQuote(); | $quote = Mage::getSingleton('checkout/session')->getQuote(); | ||
+ | // Mage::registry('product'); | ||
if (Mage::registry('current_product')) { | if (Mage::registry('current_product')) { | ||
$this->_product = Mage::registry('current_product'); | $this->_product = Mage::registry('current_product'); | ||
Zeile 124: | Zeile 137: | ||
* [http://www.codesprint.de/blog/magento-statischen-block-ausgeben/ Magento: Statischen Block ausgeben] | * [http://www.codesprint.de/blog/magento-statischen-block-ausgeben/ Magento: Statischen Block ausgeben] | ||
+ | === Templates === | ||
+ | ==== aufrufe aus phtml heraus ==== | ||
+ | <source lang="php"> | ||
+ | <!-- wenn der Block der selbe ist --> | ||
+ | <?php echo $this->setTemplate('path/to/template.phtml')->toHtml(); ?> | ||
+ | |||
+ | <!-- wenn es ein anderer Block ist --> | ||
+ | <?php echo $this->getLayout()->getBlockSingleton('kuerzel_extension/block')->setTemplate('path/to/template.phtml')->toHtml(); ?> | ||
+ | <!-- wenn daten übergeben werden sollen (magische setter methode) --> | ||
+ | <?php echo $this->setTemplate('path/to/template.phtml')->setVariable($value)->toHtml(); ?> | ||
+ | <?php echo $this->getLayout()->getBlockSingleton('kuerzel_extension/block')->setTemplate('path/to/template.phtml')->setVariable($value)->toHtml(); ?> | ||
+ | </source> | ||
+ | |||
+ | '''path/to/template.phtml''' | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | $value = $this->getVariable(); | ||
+ | echo $value; | ||
+ | ?> | ||
+ | </source> | ||
+ | |||
+ | * links | ||
+ | ** http://stackoverflow.com/questions/9019515/setting-model-as-template-data-attribute-for-child-block | ||
---- | ---- | ||
Zeile 131: | Zeile 167: | ||
// um in einem template die customer url zu bekommen | // um in einem template die customer url zu bekommen | ||
$customer_url = $this->getUrl('adminhtml/customer/edit/', array('id'=>$val)); | $customer_url = $this->getUrl('adminhtml/customer/edit/', array('id'=>$val)); | ||
− | </source> | + | </source> |
+ | |||
+ | === Links === | ||
+ | * https://gauss-development.com/blog/adding-custom-category-attributes-magento - Kategorie um Attribut erweitern | ||
+ | |||
== allgemein Frontend == | == allgemein Frontend == | ||
+ | == nicht eingeloggt > registrieren > und wieder zurück zum Ursprung == | ||
+ | <source lang="php"> | ||
+ | if (Mage::getSingleton('customer/session')->isLoggedIn()) { | ||
+ | // der eigentliche code | ||
+ | } else { | ||
+ | Mage::getSingleton('customer/session')->setBeforeAuthUrl(Mage::helper('core/url')->getCurrentUrl()); | ||
+ | Mage::app()->getFrontController()->getResponse()->setRedirect( Mage::getUrl('customer/account/create', array('_secure' => true))); | ||
+ | } | ||
+ | </source> | ||
=== Links === | === Links === | ||
* http://www.matthias-zeis.com/archiv/wie-man-menu-mein-benutzerkonto-von-magento-anpasst | * http://www.matthias-zeis.com/archiv/wie-man-menu-mein-benutzerkonto-von-magento-anpasst | ||
Zeile 276: | Zeile 325: | ||
= Extension Entwicklung = | = Extension Entwicklung = | ||
* [[magento extension: anc_image]] - eine einfache Extension inkl. datenbanktabelle | * [[magento extension: anc_image]] - eine einfache Extension inkl. datenbanktabelle | ||
+ | |||
+ | == ein neue individuelle Produkt Options Typ == | ||
+ | AncBlancoextension.git | ||
+ | branch: anc_blancoextension_eingabetyp | ||
+ | commit: 7bc7d3901916160385d2588762c49feeb95b5f53 | ||
== Controller ableiten (rewrite) == | == Controller ableiten (rewrite) == | ||
+ | |||
+ | AncBlancoextension.git | ||
+ | branch: rewrite_Mage_Checkout_CartController | ||
+ | commit f5c385be1b6bd6c54530c99e0ff6d0aebd5e4353 initial (nur der Controller wurde abgeleitet, noch nichts mit design) | ||
'''Beispiel: es soll die /checkout/cart/configure Funktion überschrieben werden!''' | '''Beispiel: es soll die /checkout/cart/configure Funktion überschrieben werden!''' | ||
Zeile 323: | Zeile 381: | ||
</frontend> | </frontend> | ||
</config> | </config> | ||
+ | </source> | ||
+ | |||
+ | * '''app/code/local/<Namespace>/<Module>/controllers/CartController.php''' | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | |||
+ | include_once("Mage/Checkout/controllers/CartController.php"); // wenn hier nicht included wird, gibts ne fehlermeldung | ||
+ | |||
+ | class <Namespace>_<Module>_CartController extends Mage_Checkout_CartController | ||
+ | { | ||
+ | |||
+ | /** | ||
+ | * Action to reconfigure cart item | ||
+ | */ | ||
+ | public function configureAction() | ||
+ | { | ||
+ | D::li('<Namespace>_<Module>_CartController::configureAction()',1,1); // wäre ne Ausgabe die erscheinen sollte | ||
+ | parent::configureAction(); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
</source> | </source> | ||
Zeile 329: | Zeile 409: | ||
* Links | * Links | ||
** http://www.fly2mars-media.de/seoblog/magento/magento-core-controller-uberschreiben-101066/ | ** http://www.fly2mars-media.de/seoblog/magento/magento-core-controller-uberschreiben-101066/ | ||
+ | |||
+ | == Magento Adminhtml Controller (extends Mage_Adminhtml_Controller_Action) aufrufen über $_Post und $_Get == | ||
+ | |||
+ | === Get === | ||
+ | Erzeugt wird eine Url mit Secret Key | ||
+ | $URL = $this->getUrl('image/adminhtml_administrator/uploadImage', array()); | ||
+ | |||
+ | === Post=== | ||
+ | Erzeugt wird eine Url mit Form Key über die Session | ||
+ | 'form_key' = Mage::getSingleton('core/session')->getFormKey(); | ||
+ | |||
+ | |||
+ | == Magento Adminhtml Controller (extends Mage_Adminhtml_Controller_Action) mit jQuery /Dropzone.js aufrufen == | ||
+ | |||
+ | test.phtml | ||
+ | <source lang='javascript' > | ||
+ | <script type="text/javascript"> | ||
+ | jQuery(document).ready(function($) { | ||
+ | Anc_Image_Type.droppableFile( | ||
+ | jQuery(" #<?php echo $dropzone_id; ?>"), | ||
+ | null, | ||
+ | "<?php echo $urlUploadImage; ?>", | ||
+ | jQuery(" #<?php echo $ancnote_id; ?>"), | ||
+ | "<?php echo $this->getUrl('image/adminhtml_administrator/simpleowngallery', array()) ?> ul.gallery", | ||
+ | "<?php echo $formkey?>" | ||
+ | ); | ||
+ | }); | ||
+ | </script> | ||
+ | </source> | ||
+ | |||
+ | Über params kann z.B. der form_key für magento übergeben werden | ||
+ | <source lang='javascript' > | ||
+ | param_dropzone_element.dropzone({ | ||
+ | url: param_url_upload, | ||
+ | paramName: "file", // The name that will be used to transfer the file | ||
+ | maxFiles: 1, | ||
+ | params: { form_key : param_secure }, | ||
+ | processing: function(file) { | ||
+ | ... | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | </source> | ||
+ | == observer== | ||
+ | Funktion die die Observer events aufruft | ||
+ | Mage.php | ||
+ | <source lang="php"> | ||
+ | public static function dispatchEvent($name, array $data = array()) | ||
+ | { | ||
+ | // D::ulli('observer: '.$name); | ||
+ | Varien_Profiler::start('DISPATCH EVENT:'.$name); | ||
+ | $result = self::app()->dispatchEvent($name, $data); | ||
+ | Varien_Profiler::stop('DISPATCH EVENT:'.$name); | ||
+ | return $result; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | * https://www.nicksays.co.uk/magento-events-cheat-sheet-1-9/ Liste von alles Events | ||
+ | |||
+ | = Create Extension Package = | ||
+ | * [http://www.commercers.com/blog/magento-eigene-erweiterung-erstellen-fur-magento-connect/ Magento – Eigene Erweiterung erstellen für Magento Connect] | ||
+ | |||
+ | == Authors == | ||
+ | === invalid or empty login for author #1 === | ||
+ | admin panel > System > Magento Connect > Paket erstellung | ||
+ | |||
+ | * beim speichern kommt immer wieder ''Invalid or empty login for author #1'' | ||
+ | |||
+ | im Reiter "Authors" muss der Benutzername der NAchname vom [https://www.magentocommerce.com/ magentocommerce] sein!!!!! | ||
+ | |||
+ | |||
+ | == Dependencies == | ||
+ | === PHP minimum version invalid=== | ||
+ | |||
+ | mit 2 punkten ... | ||
+ | '''5.4.0''' | ||
+ | |||
+ | |||
+ | == Inhalte == | ||
+ | Wichtig: die Pfade fangen immer erst im jeweiligen Unterordner an, | ||
+ | zB app/code/community darf nicht im Pfad enthalten sein wenn Magento Community module ausgewählt wurde, | ||
+ | es gibt keine Fehlermeldung, Dateien werden aber auch nicht hinzugefügt | ||
+ | |||
+ | |||
+ | * '''Magento Community module''' file dies bezieht sich auf den Ordner app/code/community | ||
+ | ** Anc/Pricespercustomer/ | ||
+ | *** Rekursiv Verzeichnis | ||
+ | |||
+ | * '''Magento User Interface (layouts, templates)''' dies bezieht sich auf den Ordner app/design | ||
+ | ** adminhtml/default/default/layout/anc/pricespercustomer.xml | ||
+ | *** Datei | ||
+ | ** adminhtml/default/default/template/anc/pricespercustomer/ | ||
+ | *** Rekursiv Verzeichnis | ||
+ | |||
+ | * '''Magento Global Configuration''' dies bezieht sich auf den Ordner app/etc | ||
+ | ** modules/Anc_Pricespercustomer.xml | ||
+ | *** Datei | ||
+ | |||
+ | * '''Magento Locale language file''' dies bezieht sich auf den Ordner app/locale | ||
+ | ** de_DE/anc/pricepercustomer.csv | ||
+ | *** Datei | ||
+ | |||
+ | = nützliche Entwickler Extensions = | ||
+ | == Layout: unremove == | ||
+ | so was wie | ||
+ | <source lang="xml"> | ||
+ | <remove name="right"/> | ||
+ | </source> | ||
+ | rückgängig machen | ||
+ | |||
+ | ganz einfach mit | ||
+ | |||
+ | <source lang="xml"> | ||
+ | <x-unremove name="right" /> | ||
+ | </source> | ||
+ | * http://alanstorm.com/magento_layout_unremove_in_local_xml | ||
+ | ** http://www.magentocommerce.com/magento-connect/layout-unremove.html | ||
+ | ** http://connect20.magentocommerce.com/community/Layout_Unremove | ||
= Fehler = | = Fehler = |
Aktuelle Version vom 13. Dezember 2016, 14:42 Uhr
magento extension: anc_image - eine einfache Extension inkl. datenbanktabelle
Inhaltsverzeichnis
- 1 Entwicklung
- 2 Extension Entwicklung
- 2.1 ein neue individuelle Produkt Options Typ
- 2.2 Controller ableiten (rewrite)
- 2.3 Magento Adminhtml Controller (extends Mage_Adminhtml_Controller_Action) aufrufen über $_Post und $_Get
- 2.4 Magento Adminhtml Controller (extends Mage_Adminhtml_Controller_Action) mit jQuery /Dropzone.js aufrufen
- 2.5 observer
- 3 Create Extension Package
- 4 nützliche Entwickler Extensions
- 5 Fehler
Entwicklung
globale Funktionsaufrufe
Cache Löschen
Mage::app()->cleanCache();
eingeloggt
if(Mage::getSingleton('customer/session')->isLoggedIn()) {
$customer_id = Mage::getSingleton('customer/session')->getCustomer()->getId();
} else if(Mage::app()->getStore()->isAdmin()) {
$admin_id = Mage::getSingleton('admin/session')->getUser()->getId();
}
anderes
dieses sind allgemeine Funktionsaufrufe, die nahe zu überall (oder Kontex bezogen) aufgerufen werden können
/**
* hole _POST und _GET Variablen
*/
$post_get_array = Mage::app()->getRequest();
/**
* aktuelle url
*/
Mage::helper('core/url')->getCurrentUrl();
Session
/**
* hole aktuelle Session
*/
$session = Mage::getSingleton('checkout/session');
// was in die session schreiben mit den magischen Funktionen
Mage::getSingleton('checkout/session')->setName('Value');
Mage::getSingleton('checkout/session')->set<Variablenname>('Value');
// was aus der session holen mit den magischen Funktionen
Mage::getSingleton('checkout/session')->getName('Value');
Mage::getSingleton('checkout/session')->get<Variablenname>('Value');
Model
/**
* product laden - achtung er lädt wirklich jedes mal neu, auf jeden fall chachen
*/
$product = Mage::getModel("catalog/product");
$product = $product->load($param_id);
$product_data = $product->getData();
// ein model laden, welches nicht über id identifiziert wird, sprich andere tabellenspalte (Achtung, auch wenn mehrere ergibt nur eins zurück )
$ncimages = Mage::getModel('kürzel_modulename/modeltabelleklasse')->load($value, 'tabellenspaltenname');
// zeige max() eines query
$quote = Mage::getSingleton('checkout/session')->getQuote();
$collection = Mage::getModel('sales/quote_item')->getCollection();
$string_sql = $collection->getSelect()->reset(Zend_Db_Select::COLUMNS)->columns('max(item_id) as last_item_id')
->where("quote_id = ".$quote->getId());
$lastItemId = $collection->getData();
D::s($collection->getData(), '$maxItemId: '.$lastItemId[0]['last_item_id']);
Frontend: Warenkorb
/**
* hole aktuellen Quote (Angebot)
*/
$quote = Mage::getSingleton('checkout/session')->getQuote();
// Mage::registry('product');
if (Mage::registry('current_product')) {
$this->_product = Mage::registry('current_product');
} else {
$this->_product = Mage::getSingleton('catalog/product');
}
/**
* wenn mensch ein Posten im Warenkorb bearbeitet, kann sich über die Url=/checkout/cart/configure/id/751/ (_GET) die aktuelle Item ID geholt werden
*/
$getParamId = Mage::app()->getRequest()->getParam('id')
backend
// ist mensch admin
Mage::app()->getStore()->isAdmin();
$admin_id = Mage::getSingleton('admin/session')->getUser()->getId();
Backend Tables (Grid)
Block .... schnipsel
{{block type=”catalog/product_list” category_id=”[Ihre Kategorie ID]” template=”catalog/product/list.phtml”}}
Statische Blöcke
Admin Panel >> CMS > Statische Blöcke >> Neuer Block
- interner Bezeichner: wichtig_dieser_wird_benutzt_um_im_Code_drauf_zuzugreifen
- Status: aktiviert
- der rest nach Belieben
<?php echo $this->getLayout()->createBlock('cms/block')->setBlockId('wichtig_dieser_wird_benutzt_um_im_Code_drauf_zuzugreifen')->toHTML(); ?>
<!-- es kann natürlich auch die ID genommen werden, ist aber wohl ja eher unpraktisch -->
<?php echo $this->getLayout()->createBlock('cms/block')->setBlockId('10')->toHTML(); ?>
Quelle
Templates
aufrufe aus phtml heraus
<!-- wenn der Block der selbe ist -->
<?php echo $this->setTemplate('path/to/template.phtml')->toHtml(); ?>
<!-- wenn es ein anderer Block ist -->
<?php echo $this->getLayout()->getBlockSingleton('kuerzel_extension/block')->setTemplate('path/to/template.phtml')->toHtml(); ?>
<!-- wenn daten übergeben werden sollen (magische setter methode) -->
<?php echo $this->setTemplate('path/to/template.phtml')->setVariable($value)->toHtml(); ?>
<?php echo $this->getLayout()->getBlockSingleton('kuerzel_extension/block')->setTemplate('path/to/template.phtml')->setVariable($value)->toHtml(); ?>
path/to/template.phtml
<?php
$value = $this->getVariable();
echo $value;
?>
- links
allgemein Backendend
// um in einem template die customer url zu bekommen
$customer_url = $this->getUrl('adminhtml/customer/edit/', array('id'=>$val));
Links
- https://gauss-development.com/blog/adding-custom-category-attributes-magento - Kategorie um Attribut erweitern
allgemein Frontend
nicht eingeloggt > registrieren > und wieder zurück zum Ursprung
if (Mage::getSingleton('customer/session')->isLoggedIn()) {
// der eigentliche code
} else {
Mage::getSingleton('customer/session')->setBeforeAuthUrl(Mage::helper('core/url')->getCurrentUrl());
Mage::app()->getFrontController()->getResponse()->setRedirect( Mage::getUrl('customer/account/create', array('_secure' => true)));
}
Links
jquery
local.xml
<block type="page/html_head" name="head" as="head">
...
<action method="addJs"><script>scripts/jquery-1.6.min.js</script></action>
<action method="addJs"><script>scripts/blogrammierer.js</script></action>
</block>
scripts/blogrammierer.js
$.noConflict();
jQuery(document).ready(function($) {
// Hier der eigentliche Jquery-Quellcode
});
Unterkategorien einer Kategorie inklusive Bilder und Beschreibung anzeigen
1. Statischen Block anlegen (Backend > CMS > Statische Blöcke >> Neuer Block)
- Blocktitel: subcategory_listing_full
- Interner Bezeichner: subcategory_listing_full
- Status: Aktiviert
- Inhalt (WYSIWYG Editor ausschalten): eine der folgenden Aufrufe eingen
<!-- nur typo und template: er nimmt die Kategorie die (per url) aufgerufen wird -->
{{block type="catalog/navigation"template="catalog/navigation/subcategory_listing_full.phtml"}}
<!-- parameter category_id: er nimmt die Kategorie Id als Grundlage und ignoriert die Url -->
{{block type="catalog/navigation" category_id="8" template="catalog/navigation/subcategory_listing_full.phtml"}}
<!-- zusätzlich falls nur der Name ohne Bilder und Beschreibung angezeigt werden soll -->
{{block type="catalog/navigation" category_id="8" only_name="1" template="catalog/navigation/subcategory_listing_full.phtml"}}
2. folgende Datei anlegen
app/design/frontend/<<OWNDESIGN>>/default/template/catalog/navigation/subcategory_listing_full.phtml
<div id="categories" class="listing">
<?php
$_maincategorylisting = $this->getCurrentCategory();
$layer = Mage::getSingleton('catalog/layer');
/**
* category_id="X" im Blockaufruf angegeben wurde, dann nimm diese Kategorie als Grundlage
* {{block type="catalog/navigation" category_id="8" template="catalog/navigation/subcategory_listing_full.phtml"}}
*/
if($this->getCategoryId()) {
$paramCategory = Mage::getModel('catalog/category')->load($this->getCategoryId());
$this->setCurrentCategory($paramCategory);
$layer->setCurrentCategory($paramCategory);
}
$_categories = $this->getCurrentChildCategories();
$_helper = $this->helper('catalog/output');
?>
<?php if(count($_categories)):?>
<?php foreach ($_categories as $_category):?>
<?php if($_category->getIsActive()): ?>
<?php
$cur_category=Mage::getModel('catalog/category')->load($_category->getId());
$layer->setCurrentCategory($cur_category);
$catName = $this->getCurrentCategory()->getName();
?>
<?php if(!$this->getOnlyName() && $_imageUrl=$this->getCurrentCategory()->getImageUrl()):?>
<div class="category-image"><a href="<?php echo $this->getCategoryUrl($_category)?>"><img src="<?php echo $_imageUrl?>" height="188"></a></div>
<?php endif;?>
<div class="category-name"><a href="<?php echo $this->getCategoryUrl($_category)?>"> <?php echo $_category->getName()?></a></div>
<?php if(!$this->getOnlyName() && $_description=$this->getCurrentCategory()->getDescription()): ?>
<div class="category-description"><?php echo $_helper->categoryAttribute($_category, $_description, 'description') ?></div>
<?php endif; ?>
<?php endif; ?>
<?php endforeach?>
<?php
if($this->getCategoryId()) {
$this->setCurrentCategory($_maincategorylisting);
}
$layer->setCurrentCategory($_maincategorylisting);
?>
<?php endif;?>
</div>
3. statischen Block einbinden
- zb
- über CMS > Seiten
- oder CMS > Statische Blöcke >> Footer Links
- oder über eine spezielle Kategorie Katalog > Kategorien verwalten >> spezielle Kategorie > Anzeige Einstellungen >> CMS Block
Quellen
- How do I pass variables via blocks (such as the list blocks)?
- Magento – Artikel auf der Startseite anzeigen
- Magento: Custom Category Images Listing Block Tutorial
- Subcategories (Unterkategorien) als Bilder im Content-Bereich
interessante Links
Blog-Hints aktivieren
Admin > System > Konfiguration > Entwickleroptionen > obenlinks "Aktueller Konfig.-Bereich" > Main Website
- Debug
- Vorlagen Pfadhinweise: Ja
- Blocknamen zu Hinweisen hinzufügen: Ja
Magento-Themes einfacher erstellen und modifizieren
cd Magento18/
cp -r app/design/frontend/base/default app/design/frontend/default/my_theme
cd app/design/frontend/default/my_theme
find -type f -exec rename -n 's/$/-disabled/' '{}' ';' # simulation
find -type f -exec rename 's/$/-disabled/' '{}' ';'
cd ../../../../../../Magento18/
cp -r skin/frontend/base/default/ skin/frontend/default/my_theme/
cd skin/frontend/default/my_theme/
find -type f -exec rename -n 's/$/-disabled/' '{}' ';' # simulation
find -type f -exec rename 's/$/-disabled/' '{}' ';'
cp app/design/frontend/default/my_theme/template/catalog/product/view.phtml-disabled app/design/frontend/default/my_theme/template/catalog/product/view.phtml
Extension Entwicklung
- magento extension: anc_image - eine einfache Extension inkl. datenbanktabelle
ein neue individuelle Produkt Options Typ
AncBlancoextension.git branch: anc_blancoextension_eingabetyp commit: 7bc7d3901916160385d2588762c49feeb95b5f53
Controller ableiten (rewrite)
AncBlancoextension.git branch: rewrite_Mage_Checkout_CartController commit f5c385be1b6bd6c54530c99e0ff6d0aebd5e4353 initial (nur der Controller wurde abgeleitet, noch nichts mit design)
Beispiel: es soll die /checkout/cart/configure Funktion überschrieben werden!
neue Extension: <Namespace>/<Module>
- app/etc/modules/<Namespace>_<Module>.xml
<?xml version="1.0"?>
<config>
<modules>
<<Namespace>_<Module>>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Core />
<Mage_Catalog />
</depends>
</<Namespace>_<Module>>
</modules>
</config>
- app/code/local/<Namespace>/<Module>/etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<<Namespace>_<Module>>
<version>0.1.1</version>
</<Namespace>_<Module>>
</modules>
<frontend>
<routers>
<checkout>
<args>
<modules>
<<Namespace>_<Module> before="Mage_Checkout"><Namespace>_<Module></<Namespace>_<Module>>
</modules>
</args>
</checkout>
</routers>
</frontend>
</config>
- app/code/local/<Namespace>/<Module>/controllers/CartController.php
<?php
include_once("Mage/Checkout/controllers/CartController.php"); // wenn hier nicht included wird, gibts ne fehlermeldung
class <Namespace>_<Module>_CartController extends Mage_Checkout_CartController
{
/**
* Action to reconfigure cart item
*/
public function configureAction()
{
D::li('<Namespace>_<Module>_CartController::configureAction()',1,1); // wäre ne Ausgabe die erscheinen sollte
parent::configureAction();
}
}
Magento Adminhtml Controller (extends Mage_Adminhtml_Controller_Action) aufrufen über $_Post und $_Get
Get
Erzeugt wird eine Url mit Secret Key
$URL = $this->getUrl('image/adminhtml_administrator/uploadImage', array());
Post
Erzeugt wird eine Url mit Form Key über die Session
'form_key' = Mage::getSingleton('core/session')->getFormKey();
Magento Adminhtml Controller (extends Mage_Adminhtml_Controller_Action) mit jQuery /Dropzone.js aufrufen
test.phtml
<script type="text/javascript">
jQuery(document).ready(function($) {
Anc_Image_Type.droppableFile(
jQuery(" #<?php echo $dropzone_id; ?>"),
null,
"<?php echo $urlUploadImage; ?>",
jQuery(" #<?php echo $ancnote_id; ?>"),
"<?php echo $this->getUrl('image/adminhtml_administrator/simpleowngallery', array()) ?> ul.gallery",
"<?php echo $formkey?>"
);
});
</script>
Über params kann z.B. der form_key für magento übergeben werden
param_dropzone_element.dropzone({
url: param_url_upload,
paramName: "file", // The name that will be used to transfer the file
maxFiles: 1,
params: { form_key : param_secure },
processing: function(file) {
...
observer
Funktion die die Observer events aufruft Mage.php
public static function dispatchEvent($name, array $data = array())
{
// D::ulli('observer: '.$name);
Varien_Profiler::start('DISPATCH EVENT:'.$name);
$result = self::app()->dispatchEvent($name, $data);
Varien_Profiler::stop('DISPATCH EVENT:'.$name);
return $result;
}
- https://www.nicksays.co.uk/magento-events-cheat-sheet-1-9/ Liste von alles Events
Create Extension Package
Authors
invalid or empty login for author #1
admin panel > System > Magento Connect > Paket erstellung
- beim speichern kommt immer wieder Invalid or empty login for author #1
im Reiter "Authors" muss der Benutzername der NAchname vom magentocommerce sein!!!!!
Dependencies
PHP minimum version invalid
mit 2 punkten ... 5.4.0
Inhalte
Wichtig: die Pfade fangen immer erst im jeweiligen Unterordner an, zB app/code/community darf nicht im Pfad enthalten sein wenn Magento Community module ausgewählt wurde, es gibt keine Fehlermeldung, Dateien werden aber auch nicht hinzugefügt
- Magento Community module file dies bezieht sich auf den Ordner app/code/community
- Anc/Pricespercustomer/
- Rekursiv Verzeichnis
- Anc/Pricespercustomer/
- Magento User Interface (layouts, templates) dies bezieht sich auf den Ordner app/design
- adminhtml/default/default/layout/anc/pricespercustomer.xml
- Datei
- adminhtml/default/default/template/anc/pricespercustomer/
- Rekursiv Verzeichnis
- adminhtml/default/default/layout/anc/pricespercustomer.xml
- Magento Global Configuration dies bezieht sich auf den Ordner app/etc
- modules/Anc_Pricespercustomer.xml
- Datei
- modules/Anc_Pricespercustomer.xml
- Magento Locale language file dies bezieht sich auf den Ordner app/locale
- de_DE/anc/pricepercustomer.csv
- Datei
- de_DE/anc/pricepercustomer.csv
nützliche Entwickler Extensions
Layout: unremove
so was wie
<remove name="right"/>
rückgängig machen
ganz einfach mit
<x-unremove name="right" />
Fehler
var/log/exception.log: exception 'Mage_Core_Exception' with message 'Ungültiger Blocktyp: Mage_***_***_Block_Adminhtml_Catalog_Product_Edit_Tab_Options_Type_***' in ../app/Mage.php:595
mögliche Probleme:
- fehlende Layout Konfiguration
- app/code/local/Anc/Site/etc/config.xml
<config>
<global>
<blocks>
<anc_site>
<class>Anc_Site_Block</class>
</anc_site>
</blocks>
</global>
</config>