blog.erikkothe.de rund um Magento, TYPO3, CSS, ….

Could not determine temp directory, please specify a cache_dir // Magento

Es wurde viel über den Fehler geschrieben und Quellcodeänderung vorgeschlagen. Aber das muss alles nicht sein.

Bei mir war es definitiv Plesk 10.4.x. Hier wird standardmässig der PHP safe_mode auf On gesetzt. Konnte es auch im Plesk nicht ändern (trotz vorhanden auswahlfeld) habe es dann in der php.ini direkt auf Off gesetzt.

Nun funktioniert Magento auch wieder wie gewohnt.

Share
veröffentlicht unter: Magento, Plesk, Programmierung keine Kommentare

Magento / M2ePro: Preis beim Export von konfigurierbaren Produkten zu Ebay falsch

Mit erschrecken musste ich feststellen das die Preise falsch angezeigt werden, sowohl in der Artikellisting in Magento als auch in Ebay. Dies betraf aber nur die konfigurierbaren Artikel. Nach ein wenig suche habe ich ein Workaround gefunden. Es ist zwar nicht befriedigend, aber muss es ersteinmal tun.

In der Datei Ess/M2ePro/Model/ListingsProductsVariations.php in Zeile 343 habe ich diese Zeile auskommentiert:

$totalPrice += $option->getPrice();

Bis jetzt geht es. Wenn jemand mehr über dieses Problem weiß, einfach schreiben. Habe selber leider überhaupt nichts über das Problem finden können :(

Share
veröffentlicht unter: Ebay, Magento, Programmierung 1 Kommentar

Einzelne Checkbox als Pflichtfeld geht nicht.

Es gibt bis dato wohl Probleme mit Powermail und date2cal. Wenn man eine einzelne Checkbox hat, die dann auch noch ein Pflichtfeld ist, wird diese nicht übermittelt. Das ganze ist aber schnell umgangen und sollte helfen bis es ein Update der Extensions gibt. Einfach diese Zeile im Konstantenfeld des TS eintragen:

plugin.powermail.field.checkboxJS = 0
Share

Wie kann man das “Passwort ändern”-Formular direkt anzeigen lassen?

Wenn man auf der Benutzerkonto Seite ist, kann man direkt auf "Passwort ändern" gehen, aber man kommt nur zu dem allgemeinen Formular und muss erst runterscrollen und das Häckchen bei Passwort ändern setzten. Nicht gerade Benutzerfreundlich gestaltet. Um gleich das Formular anzuzeigen und dort hinzuspringen sind zwei kleine Änderungen zu machen.

Als erstes den Link anpassen, dieser findet man in der Datei *templatepfad*/customer/account/dashboard/info.html. Hier nur ?p=1#p hinzufügen:

<a href="<?php echo $this->getChangePasswordUrl() ?>?p=1#p"><?php echo $this->__('Change Password') ?></a>

Im Template unter *templatepfad*/customer/form/edit.phtml die Zeile

<input type="checkbox" name="change_password" id="change_password" value="1" onclick="setPasswordForm(this.checked)" title="<?php echo $this->__('Change Password') ?>"<?php if($this->getCustomer()->getChangePassword()==1): ?> checked="checked"<?php endif; ?> /> <label for="change_password"><?php echo $this->__('Change Password') ?></label>

mit der Zeile

<input type="checkbox" name="change_password" id="change_password" value="1" onclick="setPasswordForm(this.checked)" title="<?php echo $this->__('Change Password') ?>"<?php if($this->getCustomer()->getChangePassword()==1||$_GET[p]==1): ?> checked="checked"<?php endif; ?> /> <label for="change_password"><?php echo $this->__('Change Password') ?></label>

austauschen. Und hinter dem Fieldset (~Zeile 117) diese Zeilen anfügen, damit das Formular auch als Pflichtfeld gesetzt wird.

<?php 
if($_GET[p]==1) echo "<script language=\"javascript\">$('current_password').up(3).show();$('current_password').addClassName('required-entry');$('password').addClassName('required-entry');$('confirmation').addClassName('required-entry');</script>";
?>

Getestet unter Magento 1.3.2.x

Share

Wie erstelle ich neue Spalten?

In der Kundenübersicht von Magento sieht man schon so einige Details auf den ersten Blick, aber was ist wenn das nicht genug ist?

Wenn man es mal gefunden hat, ist es leicht umgesetzt ;) Die Spalten für die Kundenübersicht werden in der Datei /app/code/core/Mage/Adminhtml/Block/Customer/Grid.php verwaltet. Hierbei müssen zwei Funktionen überschrieben werden. In meinem Beispiel hab ich Kundennummer und Firma den Spalten hinzugefügt. Diese Lösung habe ich unter 1.3.x getestet, ob es auch unter 1.4.x auch so funktioniert habe ich noch nicht überprüft.

protected function _prepareCollection()
{
$collection = Mage::getResourceModel('customer/customer_collection')
->addNameToSelect()
->addAttributeToSelect('email')
->addAttributeToSelect('created_at')
->addAttributeToSelect('group_id')
->addAttributeToSelect('kundennummer') // Muss ergänzt werden, damit die Daten auch ausgegeben werden
->addAttributeToSelect('company')
->joinAttribute('billing_postcode', 'customer_address/postcode', 'default_billing', null, 'left')
->joinAttribute('billing_city', 'customer_address/city', 'default_billing', null, 'left')
->joinAttribute('billing_telephone', 'customer_address/telephone', 'default_billing', null, 'left')
->joinAttribute('billing_region', 'customer_address/region', 'default_billing', null, 'left')
->joinAttribute('billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left');

$this->setCollection($collection);

return parent::_prepareCollection();
}

und

protected function _prepareColumns()
{
/* ... */

$this->addColumn('kundennummer', array(
'header' => 'Kundennummer', // Spaltenüberschrift
'width' => '150', // Breite der Spalte
'index' => 'kundennummer'
));

$this->addColumn('company', array(
'header' => 'Firma', // Spaltenüberschrift
'width' => '150', // Breite der Spalte
'index' => 'company'
));

/* ... */

return parent::_prepareColumns();
}
Share

Warum funktioniert scriptmerger bzw. minify nicht unter TYPO3 4.4?

Da ich immer darauf aus bin, die Seiten schlank und schnell zu halten, benutze ich verschiedene Extensions - eine davon ist scriptmerger. Aber unter TYPO3 4.4 geht diese Extension bzw. minify nicht auf anhieb. Das liegt an der Art wie TYPO3 nun die CSS und JS Dateien einbindet, diese bekommen standartmässig noch ein Parameter mitgegeben (?+Zahl). Dieses Problem ist aber schnell gelöst, einfach diese Zeile in der Datei typo3conf/localconf.php ergänzen:

$TYPO3_CONF_VARS['FE']['versionNumberInFilename'] = '';

Update: Unter http://forge.typo3.org/projects/extension-scriptmerger/repository findet man wie von Stefan Galinski angemerkt eine gefixte Version.

Share

Wie entferne ich das “border”-Attribute aus dem img-Tag?

Um einen sauberen XHTML Code zubekommen ist es zwingend erforderlich das das border-Attribute aus dem img-Tag rausgenommen wird. Das setzt TYPO3 leider standardmässig rein. Aber mit einer Zeile im Setupteil des Templates kann man diesen Fehler beheben:


config.disableImgBorderAttr = 1

Nun kann weiter validiert werden ;)

Share

Wie bekomme ich unter eID Zugriff auf cObj?

Viele Forenbeiträge musste ich durchforsten um eine passende Lösung dafür zu finden. An dieser Stelle vielen Dank an die fleissigen Schreiber in diversen Foren!

Bei meinem speziellen Problem wollte ich Bilder passend zuschneiden. Dafür wollte ich die Funktion "getImgResource" benutzen. Um diese Funktion aber zur Verfügung zu haben, muss einiges in dem Skript hinzugefügt werden. An erster Stelle steht, die passenden Dateien zu laden:

require_once(PATH_t3lib . 'class.t3lib_page.php');
require_once(PATH_tslib . 'class.tslib_pibase.php');
require_once(PATH_tslib . 'class.tslib_content.php');
require_once(PATH_t3lib . 'class.t3lib_stdgraphic.php');
require_once(PATH_tslib . 'class.tslib_gifbuilder.php');

Danach müssen die erforderlichen Instanzen erstellt werden:

$classTemp = t3lib_div::makeInstanceClassName('tslib_fe');
$GLOBALS['TSFE'] = new $classTemp($TYPO3_CONF_VARS, $page, 0, true);
$GLOBALS['TSFE']->tmpl = t3lib_div::makeInstance('t3lib_tstemplate');
$GLOBALS['TSFE']->tmpl->init();
$GLOBALS['TSFE']->sys_page = t3lib_div::makeInstance('t3lib_pageSelect');
$GLOBALS['TSFE']->rootLine = $GLOBALS['TSFE']->sys_page->getRootLine(intval(4));
$GLOBALS['TSFE']->getConfigArray();

Der wichtigste Schritt, das cObj erstellen:

$mycObj = new tslib_cObj();

Nun hat man unter "$mycObj" Zugriff auf deren Methoden. Wie z.B. "$mycObj->getImgResource()"

Wenn jemand eine kürzere Lösung parat hat? Beiträge sind gerne erwünscht!

Share

Wo bekomme ich Hilfe, wenn ich die Transaktionsmails bearbeiten will?

Es gibt einige Variablen die man von Haus aus benutzen kann. Um diese zu benutzen muss man zwei geschweifte Klammern zum öffnen und schliessen benutzen. Eine Liste möglicher Werte findet Ihr unter:
http://www.magentocommerce.com/wiki/modules_reference/english/mage_adminhtml/system_email_template/index

Um mehr Flexibilität zu bekommen, kann man auch seine eigenes E-Mail Template erstellen. Eine kleine Einführung ist unter http://nicholas.piasecki.name/blog/2009/10/creating-sane-plain-text-sales-transactional-e-mails-in-magento/ zu finden.

Wer in die E-Mails noch andere Daten vom Benutzer anzeigen lassen möchte findet hier Hilfe: http://snippi.net/magento-get-load-customer-object-based-customer-email Dort ist leider die E-Mail statisch hinterlegt hier hilft eine kleiner Ergänzung weiter:

$_order = $this->getOrder();
$customer->loadByEmail($_order->getCustomerEmail());

Share

Probleme mit Submenü bei TypoGento?

Heute bin ich über das Problem gestolpert das bei TypoGento das Menü auf der TYPO3 Seite nicht richtig angezeigt wird. Wenn man auf ein Produkt klickt, dann wird nur noch die oberste Ebene des Menüs angezeigt. Nach ein wenig Analyse der URLs die erzeugt werden und Nachforschungen im Quelltext habe ich eine Lösung dafür gefunden. Sie ist ziemlich simpel, da nur die Parameter in der URL nicht passend ausgewertet werden. Man muss nur in der Datei class.tx_fbmagento_navigation.php im Ordner EXT:fb_magento/lib die Funktion _parseNodes anpassen.

Alt:

protected function _parseNodes($nodes) {
    	foreach($nodes as $node) {
			if ($node->getId() ==  intval($this->_get['shop']['id']) || ($node->getChildren() && $this->_parseNodes($node->getChildren()))) {
    				$node->setAct(true);
    				return true;
    }
}

Neu:

protected function _parseNodes($nodes) {
    	foreach($nodes as $node) {
    		if(isset($this->_get['shop']['category'])){
			if ($node->getId() ==  intval($this->_get['shop']['category']) || ($node->getChildren() && $this->_parseNodes($node->getChildren()))) {
    				$node->setAct(true);
    				return true;
	    		}
		}else{
			if ($node->getId() ==  intval($this->_get['shop']['id']) || ($node->getChildren() && $this->_parseNodes($node->getChildren()))) {
    				$node->setAct(true);
    				return true;
	    		}
		}
    	}
    }

Share
asdf