Magento Entwicklung: Unterschied zwischen den Versionen

Aus Vosp.info
Wechseln zu:Navigation, Suche
(nützliche Entwickler Extensions)
(Create Extension Package)
Zeile 453: Zeile 453:
 
= Create Extension Package =
 
= Create Extension Package =
 
* http://www.commercers.com/blog/magento-eigene-erweiterung-erstellen-fur-magento-connect/
 
* http://www.commercers.com/blog/magento-eigene-erweiterung-erstellen-fur-magento-connect/
== invalid or empty login for author #1 ==
+
 
 +
== Authors ==
 +
=== invalid or empty login for author #1 ===
 
  admin panel > System > Magento Connect > Paket erstellung
 
  admin panel > System > Magento Connect > Paket erstellung
  
Zeile 460: Zeile 462:
 
im Reiter "Authors" muss der Benutzername der NAchname vom Magentosystem (unklar ob das magentocommerce oder entwickler system) sein!!!!!
 
im Reiter "Authors" muss der Benutzername der NAchname vom Magentosystem (unklar ob das magentocommerce oder entwickler system) sein!!!!!
  
==  PHP minimum version invalid==
+
 
 +
== Dependencies ==
 +
===  PHP minimum version invalid===
  
 
mit 2 punkten ...  
 
mit 2 punkten ...  
 
'''5.4.0'''
 
'''5.4.0'''
 
 
  
 
= nützliche Entwickler Extensions =
 
= nützliche Entwickler Extensions =

Version vom 15. Juli 2015, 09:48 Uhr

magento extension: anc_image - eine einfache Extension inkl. datenbanktabelle

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)

Beispiel für Backend Grids

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;
?>

allgemein Backendend

 // um in einem template die customer url zu bekommen
 $customer_url = $this->getUrl('adminhtml/customer/edit/', array('id'=>$val));

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

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

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) { 
				...


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 Magentosystem (unklar ob das magentocommerce oder entwickler system) sein!!!!!


Dependencies

PHP minimum version invalid

mit 2 punkten ... 5.4.0

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>