Domainfactory und Magento 2.0 Installation

Domainfactory und Magento 2.0 Installation

Die Installation von Magento 2.0 ist nicht ganz so einfach, wie die bei der ersten Version. Daher gibt es hier eine kurze und knackige Anleitung für Domainfactory Server.

1. Vorbereitung:

Es sollte eine leere DB erstellt werden und ein Verzeichnis für die Dateien existieren.
Die Domain sollte auf dieses Verzeichnis zeigen, was im Grunde Standard für jedes Projekt ist.

2. Magento herunterlade und zu DF hochladen:

Auf der Magentoseite einfach das Paket herunterladen.
Das Paket wird dann zu Domainfactory hochgeladen und per unzip oder tar entpackt.

3. Servereinstellungen:

Die Domain sollte mindestens auf die PHP Version 7.0 gestellt werden. Wählt hier am besten eine FastCGI Version, sollte die Installation nicht durchlaufen und bei einer Prozentzahl stehen bleiben, dann wählt eine andere Versionsnummer mit FastCGI (ich nutze 7.0.13 mit aktiviertem FastCGI).
Zusätzlich müssen folgende Änderungen an der ini vorgenommen werden (PHP.ini editieren):

1
2
3
4
5
6
- allow_url_fopen -> aktivieren
- extension_dir -> auf die PHP Version anpassen (bei mir 7.7): /usr/local/lib/php_modules/7-70STABLE
- memory_limit = 2048M
- max_execution_time = 600000 (muss nicht so extrem hoch sein, aber muss erhöht werden)
Im Textfeld unter "[PHP]" folgenden Eintrag hinzufügen:
  extension = "intl.so"

Dann alles abspeichern.

4. Dateien bearbeiten:

Am besten ihr prüft vor dem Starten der Installation mit dem Befehl „phpinfo()“ ob wirklich die Werte so übernommen sind, sonst bleibt die Installation oft mitten im Prozess stehen.
Die Dateien sollten bereits Extrahiert sein und müssen wie folgt bearbeitet werden:

.htaccess

1
2
    php_value memory_limit 768M
    php_value max_execution_time 18000

2x anpassen auf (IfModule mod_php7.c und IfModule mod_php5.c):

1
2
    php_value memory_limit 2048M
    php_value max_execution_time 600000

Zeile hinzufügen unter:

1
    RewriteEngine on

in:

1
2
    RewriteEngine on
    RewriteBase /

.user.ini

1
2
    memory_limit = 768M
    max_execution_time = 18000

in:

1
2
    memory_limit = 2048M
    max_execution_time = 600000

./setup/src/Magento/Setup/Validator/DbValidator.php

Um den Fehler „Database user does not have enough privileges.“ zu vermeiden, in die Funktion „checkDatabasePrivileges“ ein „return true“ einfügen:

1
2
3
4
    private function checkDatabasePrivileges(\Magento\Framework\DB\Adapter\AdapterInterface $connection, $dbName)
    {
        return true;
        $requiredPrivileges = [

5. Installation:

Nun die Domain aufrufen und die Installation sollte problemlos durchlaufen.

6. Können nach der Installation keine CSS oder JS Dateien gefunden werden im Frontend und Admin oder es erscheinen viele 404 Fehler für fehlende Dateien:

Schritt 1:
CMD Shell Aufrufen und in den Installationspfad springen

Schritt 2:
Sprache muss eventuell angepasst werden. Der folgende Befehl erstellt die nötigen Dateien.

1
/usr/local/bin/php7-70LATEST-CLI bin/magento setup:static-content:deploy de_DE

Bei Problemen im Adminbereich:

1
/usr/local/bin/php7-70LATEST-CLI bin/magento setup:static-content:deploy

Schritt 3:

1
/usr/local/bin/php7-70LATEST-CLI bin/magento indexer:reindex

Schritt 4:

1
2
cd var/cache/
rm -rf *

Schritt 5:
Nun einmal Testen ob die Seite korrekt angezeigt wird.

Schritt 6:
Geht es immer noch nicht dann müssen wir noch die Versionsnummer aus dem Pfad entfernen.

vendor\magento\module-theme\etc\config.xml

1
2
3
4
5
6
7
        <dev>
            <static>
                <sign>1</sign>
            </static>
        </dev>
    </default>
</config>

ändern in:

1
2
3
4
5
6
7
        <dev>
            <static>
                <sign>0</sign>
            </static>
        </dev>
    </default>
</config>

Schritt 7:
in der Shell:

1
/usr/local/bin/php7-70LATEST-CLI bin/magento indexer:reindex

Schritt 8:

1
2
cd var/cache/
rm -rf *

Und noch mal Testen, nun sollte die Versionsnummer aus dem Pfad verschwunden sein.

LAMELLEN, INSEKTENSCHUTZ, ROLLOS, DOPPELROLLOS, MARKISEN, JALOUSIEN – 5% Rabatt Code

Sonnenschutz vom Experten mit einem super Preis-Leistungsverhältnis. Persönlich bin ich von den Produkten von Sonnenschutz-Riese überzeugt und möchte daher einen 5% Gutschein zur Verfügung stellen.

Produkte:
Lamellen, Insektenschutz, Rollos, Doppelrollos, Markisen, Jalousien und Plissees

Gutschein:

1
Rabattcode (im Warenkorb eingeben): riesigsparen

Shop:
www.sonnenschutz-riese.de

Plissee Gutschein über 10% bei Plissee-Riese.de

Ich habe mich länger mit dem Thema Sonnenschutz befasst und habe nahezu alle Fenster mit passenden Plissees ausgestattet. Dabei bin ich bei Plissee-Riese auf einen Dienstleister mit hervorragenden Preis-Leistungsverhältnis gestoßen. Ich kann diesen Anbieter nur empfehlen möchte folgend einen 10% Gutschein zur Verfügung stellen:

1
Rabattcode (im Warenkorb eingeben): RIESIGE10%

Shop: www.plissees-riese.de

Magento Grid show only one page (use group or groupByAttribute)

Verwendet man bei einem Grid group, so wird oft nur eine Seite bzw. ein Eintrag angezeigt. Um alle Einträge angezeigt zu bekommen sowie die Seiten, muss folgende Datei angepasst werden:

lib/Varien/Data/Collection/Db.php

Funktion wie folgt abändern:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public function getSize()
    {
        if (is_null($this->_totalRecords)) {
            $sql = $this->getSelectCountSql();
 
            $result = $this->getConnection()->fetchAll($sql, $this->_bindParams);;
 
            foreach ($result as $row) {
                $this->_totalRecords += reset($row);
            }
 
        }
        return intval($this->_totalRecords);
    }

Magento kein Login im Frontend möglich (2 frontend session cookies)

Wenn das einloggen im Frontend nicht möglich ist und dabei keine Fehlermeldung erscheint, kann das den Grund haben, das es zwei frontend sessions gibt, da die Domain nicht auf „www.“ läuft.

Szenario:
– Kunde geht auf Shop (der ohne www. in der Base-Url konfiguriert ist)
– Loggt sich ein
– schließt den Browser ohne Abmeldung
– öffnet den Browser neu
– versucht sich neu anzumelden und das besagte Problem besteht

Problem:
Magento erstellt zwei Frontend Cookies für „.example.de“ und „example.de“

Lösung:

Konfiguration umstellen:
Admin -> System -> Konfiguration -> Web -> Tab: Sitzungscookie Verwaltung

Dort die „Cookie Lebensdauer“ definieren, dann läuft erst mal die Session nur eine gewisse Zeit und das ist auch eine Sicherheitsfrage.
Unter „Cookie Domain“ die Domain definieren

Ist das Problem dadurch noch nicht gelöst, empfiehlt sich die Basis-URL auf „www.example.de“ umzustellen und in der „Cookie Domain“ „www.example.de“ anzugeben.

Aus SEO-Gründen sollten aber alle „ohne www“ Aufrufe auf „mit www“ umgeleitet werden:

1
2
3
4
5
6
RewriteEngine on
 
# non www to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

.htaccess – Weiterleitung nach Domainumstellung von „ohne www“ auf „mit www“

Mit folgenden Code in der .htaccess werden nach der Umstellung einer Domain von „example.de“ auf „www.example.de“ alle Unterseiten per 301 weitergleitet, so gehen die Platzierungen in den Suchmaschinen nicht verloren und zugleich ist dieser Code für http und https gänig.

1
2
3
4
5
6
RewriteEngine on
 
# non www to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Magento Template Filter in E-Mails, Beschreibung oder CMS-Blöcken

Wir können in E-Mails, CMS-Seiten, CMS-Blöcken und anderen Beschreibungen einfach Magentotypische Platzhalter einbauen. Der Syntax dafür ist super einfach: {{platzhalter argumente…}}.

Dazu folgend ein paar Beispiele:

1
2
3
4
{{store direct_url="marken/jeld-wen.html"}}
{{media_url="wysiwyg/brands/Concept.jpg"}}
{{var customer.email}}
...

Durch folgenden Befehlt werden diese Filter aufgelöst und korrekt dargestellt:

1
echo Mage::helper('cms')->getPageTemplateProcessor()->filter( $_product->getDescription() );

Magento individuelle Versandkosten / Speditionskosten bei Überlänge (Option)

Folgend möchte ich zeigen, wie Sie bei Produkten mit individuellen Produkt-Optionen die Versandkosten dynamisch anpassen. Je nachdem, welche Versandkostenart Sie wählen, muss die entsprechende „Carrier“ PHP angepasst werden. Im Beispiel zeige ich das anhand der Tabelrates.

Schritt 1: Datei kopieren

/app/code/core/Mage/Shipping/Model/Carrier/Tablerate.php
nach
/app/code/local/Mage/Shipping/Model/Carrier/Tablerate.php

Schritt 2: Function erweitern

Achtung, das ist nur ein Beispiel, in meinem Fall enthält das erste Optionsfeld die größe, welche in Abhängigkeit zu den Versandkosten steht. Hinzugefügt wurden nur die Teile, bei denen „Hinzugefügt“ steht.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
    public function collectRates(Mage_Shipping_Model_Rate_Request $request)
    {
        if (!$this->getConfigFlag('active')) {
            return false;
        }
 
        // exclude Virtual products price from Package value if pre-configured
        if (!$this->getConfigFlag('include_virtual_price') && $request->getAllItems()) {
            foreach ($request->getAllItems() as $item) {
                if ($item->getParentItem()) {
                    continue;
                }
                if ($item->getHasChildren() && $item->isShipSeparately()) {
                    foreach ($item->getChildren() as $child) {
                        if ($child->getProduct()->isVirtual()) {
                            $request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
                        }
                    }
                } elseif ($item->getProduct()->isVirtual()) {
                    $request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
                }
            }
        }
 
        ######################################### HINZUGEFÜGT #####################################
        // spezial products for free 
        $setShippingFree = false;
        foreach ($request->getAllItems() as $item) {
            $p = Mage::getModel('catalog/product')->load(  $item->getProduct()->getId()  );
            if ($p->getIsShippingFree()) $setShippingFree = true;
            else {
                $setShippingFree = false;
                break;
            }
        }
 
        ######################################### HINZUGEFÜGT #####################################        
        // spezial price by oversize
        $price = 0;
        if ($request->getAllItems()) {
            foreach ($request->getAllItems() as $item) {
                if ($item->getProduct()->isVirtual() || $item->getParentItem()) {
                    continue;
                }
 
                $value = $item->getOptionByCode('info_buyRequest')->getValue();
                $params = unserialize($value);
                if (isset($params['options'])) {
                    if (!empty($params['options'])) {
                        $counter = 0;
                        foreach($params['options'] as $optionId => $value) {
                            if (!is_numeric($value)) continue;
                            if ($counter>0) continue;
                            $option = $item->getProduct()->getOptionById($optionId);
                            $title = $option->getTitle();
                            if (strpos($title,'cm')!==false) {
                                if ($value>=400 && $price<35) $price = 35;
                                elseif ($value>=320 && $price<25) $price = 25;
                                elseif ($value>=200 && $price<15) $price = 15;
                            } elseif (strpos($title,'mm')!==false) {
                                if ($value>=4000 && $price<35) $price = 35;
                                elseif ($value>=3200 && $price<25) $price = 25;
                                elseif ($value>=2000 && $price<15) $price = 15;
                            }
                            $counter++;
                        }
                    }
                }
            }
        }
 
        if ($price>0) {
            $result = Mage::getModel('shipping/rate_result');
            $method = Mage::getModel('shipping/rate_result_method');
 
            $method->setCarrier('tablerate');
            $method->setCarrierTitle($this->getConfigData('title'));
 
            $method->setMethod('bestway');
            $method->setMethodTitle('Speditionsaufschlag');
 
            $method->setPrice($price);
            $method->setCost($price);
 
            $result->append($method);
            return $result;
        }
 
        // Free shipping by qty
        $freeQty = 0;
        if ($request->getAllItems()) {
            foreach ($request->getAllItems() as $item) {
                if ($item->getProduct()->isVirtual() || $item->getParentItem()) {
                    continue;
                }
 
                if ($item->getHasChildren() && $item->isShipSeparately()) {
                    foreach ($item->getChildren() as $child) {
                        if ($child->getFreeShipping() && !$child->getProduct()->isVirtual()) {
                            $freeQty += $item->getQty() * ($child->getQty() - (is_numeric($child->getFreeShipping()) ? $child->getFreeShipping() : 0));
                        }
                    }
                } elseif ($item->getFreeShipping()) {
                    $freeQty += ($item->getQty() - (is_numeric($item->getFreeShipping()) ? $item->getFreeShipping() : 0));
                }
            }
        }
 
        if (!$request->getConditionName()) {
            $request->setConditionName($this->getConfigData('condition_name') ? $this->getConfigData('condition_name') : $this->_default_condition_name);
        }
 
         // Package weight and qty free shipping
        $oldWeight = $request->getPackageWeight();
        $oldQty = $request->getPackageQty();
 
        $request->setPackageWeight($request->getFreeMethodWeight());
        $request->setPackageQty($oldQty - $freeQty);
 
        $result = Mage::getModel('shipping/rate_result');
        $rate = $this->getRate($request);
 
        $request->setPackageWeight($oldWeight);
        $request->setPackageQty($oldQty);
 
        if (!empty($rate) && $rate['price'] >= 0) {
            $method = Mage::getModel('shipping/rate_result_method');
 
            $method->setCarrier('tablerate');
            $method->setCarrierTitle($this->getConfigData('title'));
 
            $method->setMethod('bestway');
            $method->setMethodTitle($this->getConfigData('name'));
 
            if ($request->getFreeShipping() === true || ($request->getPackageQty() == $freeQty) || $setShippingFree) {
                $shippingPrice = 0;
            } else {
                $shippingPrice = $this->getFinalPriceWithHandlingFee($rate['price']);
            }
 
            $method->setPrice($shippingPrice);
            $method->setCost($rate['cost']);
 
            $result->append($method);
        }
 
        return $result;
    }

Magento installation extension (connect error: unsupported resource type)

Kommt der Fehler „connect error: unsupported resource type“ im Downloader bei der Installation einer Extension kann folgende Datei verändert werden:

downloader/lib/Mage/Archive/Tar.php

1
const FORMAT_PARSE_HEADER = 'a100name/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1type/a100symlink/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix/a12closer';

ändern in:

1
const FORMAT_PARSE_HEADER = 'Z100name/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/Z8checksum/Z1type/Z100symlink/Z6magic/Z2version/Z32uname/Z32gname/Z8devmajor/Z8devminor/Z155prefix/Z12closer';

Magento Extension für Data Upgrades über ein Update Script (z.B. bei Verwendung von git)

Im folgenden Beispiel schreiben wir eine kurze Extension, über die z.B. Kategorien angelegt werden oder CMS-Blöcke erstellt und geändert werden können usw. Dies verwendet man oft bei der Verwendung von git oder zur Bereitstellung von Daten für eigene Extensions.

Schritt 1 – Ordner Anlegen
app/code/local/M28visions/Cmsupdate/
app/code/local/M28visions/Cmsupdate/etc/
app/code/local/M28visions/Cmsupdate/data/
app/code/local/M28visions/Cmsupdate/data/cmsupdate_setup/

Schritt 2 – Dateien Anlegen
app/code/local/M28visions/Cmsupdate/etc/config.xml — enthält immer die Konfiguration einer Extension
app/code/local/M28visions/Cmsupdate/data/cmsupdate_setup/data-upgrade-1.0.0.0-1.0.0.1.php — enthält die update daten

app/etc/modules/M28visions_Cmsupdate.xml — am Ende erstellen, zum Aktivieren der Extension

Schritt 3 – Inhate

config.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <M28visions_Cmsupdate>
            <version>1.0.0.1</version>
        </M28visions_Cmsupdate>
    </modules>
    <global>
        <resources>
            <cmsupdate_setup>
                <setup>
                    <module>M28visions_Cmsupdate</module>
                </setup>
            </cmsupdate_setup>
        </resources>
    </global>
</config>

data-upgrade-1.0.0.0-1.0.0.1.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
/**
 * M28visions DeineTuer data upgrade script
 */
 
$this->startSetup();
 
/* UPDATE CMS BLOCK */
 
$content = '<h3 class="item" style="width:60px;">&nbsp;</h3>
<h3 class="item"><a href="/xxx.html?n1=new10#limit=20&mode=grid&order=price&dir=asc&p=1&cat[]=36&price[min]=63&price[max]=1096&dt_deliverytime[]=607"><img src="{{media url="wysiwyg/content/header_item2.png"}}" alt="" /></a></h3>
<h3 class="item"><a class="variousBox" data-fancybox-type="ajax" href="/opencmsblog?blog_identifier=option_service"><img src="{{media url="wysiwyg/content/header_item3.png"}}" alt="" /></a></h3>
<h3 class="item icon"><a href="https://www.xxx.de/shop/certificate.php?shop_id=4234" target="_blank"><img src="/media/wysiwyg/images/trusted_shop.png" alt="" /></a></h3>';
 
$block = Mage::getModel('cms/block')->load('header_spezials');
$block->setContent($content);
$block->save();
 
$this->endSetup();

M28visions_Cmsupdate.xml:

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<config>
    <modules>
        <M28visions_Cmsupdate>
            <active>true</active>
            <codePool>local</codePool>
        </M28visions_Cmsupdate>
    </modules>
</config>

Posts of Current Category



Facebook: