Magento – Warning: simplexml_load_string() – parser error

If you see this warning, when opening category of your Magento-Shop …

… Of course you could check the XML-Updates in the file:
app/code/core/Mage/Core/Model/Layout/Update.php

The solution

…might be simple.

The reason can be special characters. For example: The &

For that, just exchange the “&”-Sign in your category (title) by the correct HTML-sign “&”

Magento filter collection – nested AND- and OR-clauses

The other day, if was looking (and searching the web) if there was a method in Magento, with which you can easily filter a collection, in which the AND-clause for an attribute filter is within the OR-clause. In the beginning I thought this problem is quite trivial, but I finally had to realize that there is no easy way to archive that. Seanbreeden posted a solution that worked but I wanted to apply filter generated in a loop, so I had to extend that.

So in this post, I want to summarize the approach and share my learnings:

The problem:

Filter a collection (for instance the product collection) by various attributes in the following way:

Simple as this nested mySql-Query, the solution in Magento is not that easy. In contrast to the query, in which the AND and OR are the other way around.

The solution:

Filter the collection with AND and OR nested the other way around, using addAttributeToFIlter(…) in Magento and then exchange AND and OR again in the where clause using string-operations.

1. Filter the collection

Get the product collection:

Use the following filter:

That will give a mySyl query that would look like that:

…so in the next step, we have to edit the where-clause programmatically.

2. Exchanging the AND and OR-Conditions in the mySQL-query

use the following code, to do that:

Note that the variable $oldWhereCond is not used and it’s just for debugging. Talking about that, you could also add the following in the end, to debug the query and check the where-condition of the query:

2. Optional: Apply other filters

Now you can also apply other filters, for example:

Note that these are added to the query with an AND-Condition, so the would query (simplified) would look like that:

3. Thats’s it

Now you can play around with the loaded products (for example in a foreach-loop):

Summary:

Though I don’t really like the solution (because I think it’s very awkward, that there is no pre-built easier method in Magento), this solution is quite reliable and it works.

If you know an easier way to filter the collection, please let me know in the comments.

Die richtigen Dateirechte für Magento-Installationen (Permissions for Magento)

Wiedermal ist die Antwort auf die Frage nach den richtigen Dateirechten für Magento: “Es kommt drauf an”.

Worauf kommt es an? Auf den Server-Benutzer, also den Benutzer, der die Magento-Installation ausführt, anders ausgedrückt, der Apache-Benutzer (der deswegen auch in Datei der apache2.conf oder httpd.conf definiert ist). Dieser “www-user” muss nämlich in der Lage sein, alle benötigten Dateien auszuführen, bzw. alle sonstigen Dateien zu lesen und in gewissen Verzeichnissen zu schreiben (z.B. im Media-Ordner)

Folgender Artikel gibt ein paar Details: http://magento.stackexchange.com/questions/36543/403-error-while-installing-magento-is-the-install-guide-correct

Folgende Vorgehensweise würde ich empfehlen:

Magento empfiehlt folgende Datei-Berechtigungen:

Übersetzt in Befehle im Terminal (diese einfach in die Shell eingeben)

Sollte das aber nicht funktionieren, was man schnell daran erkennt, dass der Shop nicht erreichbar ist, so ist der www-user höchstwahrscheinlich nicht der “Owner”, d.h. es müssen außer dem Besitzer auch andere Gruppen Berechtigungen für die Magento-Dateien und -Verzeichnisse haben. Also muss man diesen Fall genauer prüfen.

Wenn man es allerdings eilig hat, oder in der Entwicklung ist und später sowieso nochmals die Rechte verändern muss, kann man dies allerdings umgehen, indem man folgende Rechtevergabe wählt:

Shell-Befehle:

Ich hoffe, das hilft euch ein Stück weiter.

 

Magento Downloader: Invalid login credentials

Das Problem:

man möchte sich in Magento unter System –> Magento Connect –> Magento Connect Manager einloggen, gibt den richtigen Benutzernamen und das Passwort ein.

Aber es taucht eine leere weiße Seite auf mit der Meldung “Invalid login credentials” (weiter nichts)

Lösung:

Im Verzeichnis downloader, die Datei connect.cfg löschen oder umbenennen.

Dann sollte der Login wieder funktionieren.

Magento: Produktexport und -Import aller Produkte auf Datenbankbasis

In diesem Post wird erklärt, wie man eine vollständige Migration aller Produkte von einem Magento-Shop in einen anderen durchführt.

Es werden dabei die relevanten Datenbanktabellen aus der einen Magento-Datenbank exportiert und in die andere wiederum importiert, damit folgende Informationen übertragen werden:

  • Attribut-Struktur
  • Attribut-Sets
  • Produkte
  • Attribute der Produkte

Vorsicht: Diese Methode wurde nicht für Multi-Shops geprüft. Ebenso wenig wurde getestet, ob diese Art der Datenmigration auch reibungslos funktioniert, wenn individuelle Produktoptionen angelegt sind. Außerdem funktioniert dieser Import-Export nur, wenn es sich um eine neue Magento-Datenbank handelt, in der die Produkte importiert werden sollen.

Für schon bestehende Shops mit vorhandenen Artikeln ist die Datenmigration etwas anspruchsvoller, weil die Attribute dann an das jeweilige Attributset angepasst werden müssen.

  1. Folgende Tabellen müssen aus der alten Datenbank exportiert werden. Dies geht am einfachsten via PhpMyAdmin oder einem Programm wie Sequel Pro:
    •  Tabellen beginnend mit “eav_attribute” (6 Tabellen)
      • eav_attribute
      • eav_attribute_group
      • eav_attribute_label
      • eav_attribute_option
      • eav_attribute_option_value
      • eav_attribute_set
    • Die Tabelle “eav_entity_attribute”
    • Alle Tabellen beginnend mit “catalog_product” (dies sind insgesamt über 60 an der Zahl. Die Anzahl kann variieren, je nach dem ob flat-Tables verwendet werden.)
    • Die Tabelle “catalog_eav_attribute”
    • Falls die Bestände (für Lagerverwaltung) übertragen werden sollen: Alle Tabellen, die mit “cataloginventory” beginnen. (5 Tabellen)

    Insgesamt müssen also ca. 70 Tabellen exportiert werden

  2. Als nächstes müssen diese dann in die neue Datenbank (ebenfalls über ein Hilfsprogramm oder auch über die Shell) importiert werden.

Und schon ist die Migration erledigt!

Per Wget Dateien von FTP auf Server kopieren.

Will man per FTP Dateien oder Verzeichnisse direkt von einem Server auf den anderen kopieren, eignet sich am besten wget, weil dies oft auf einem Linux-Server zur Verfügung steht (z.B. bei einem managed Server).

Wie man das macht?

1.) per SSH auf dem Server einloggen, auf dem die Dateien kopiert werden sollen.

2.) Folgendes in die Shell eingeben:

Das -r  steht für recurively, d.h. alle darunterliegenden Verzeichnisse und Dateien werden nun kopiert.

Wohin wird das ganze kopiert? Im Verzeichnis, wo man sich gerade auf dem Server befindet. Von da aus kann man die Ordner/Dateien wieder an den gewünschten Zielort kopieren.

Magento: Default-Werte für System-Konfiguration in eigenem Modul

Hier ein kleiner nützlicher Code, den ihr für das Setzen von Default-Werten von Magento-Konfigurationsvariablen gebrauchen könnt. D.h. wenn in der Datei systems.xml Felder definiert sind, die vorgefertigte Werte haben sollen.

Dies muss in der Datei config.xml definiert werden. Folgend ein Beispiel:

Ganz einfach 😉

mod_rewrite (Apache2-Server)

Dieser Artikel widmet sich dem Thema mod_rewrite, zu dem vielleicht bei dem ein oder anderen hin und wieder die selben Fragen auftauchen.

Was ist “mod rewrite” oder mod_rewrite?

Erstens: mod_rewrite ist eine Einstellung des Apache-Servers. D.h. mod_rewrite ist entweder an (enabled) oder aus (disabled).

Zweitens: Wenn mod_rewrite an ist, so können URLs umgeleitet werden. D.h. die folgende URL …

 

… wird durch die Einstellungen von mod_rewrite umgeformt zu:

Wie stelle ich fest, ob mod_rewrite aktiv ist?

Ganz einfach: Erstelle eine leere php-Datei mit dem Inhalt:

Rufe diese auf dem Browser auf und suche mit der Suchfunktion des Browsers nach “mod_rewrite”. Wenn du einen Eintrag findest, wie im Screenshot dargestellt, so ist mod_rewrite an.

mod_rewrite_enabled_phpinfoEine andere Möglichkeit ist, einfach in der Shell den Befehl php -info einzugeben und dann zu schauen, ob mod_rewrite unter der Rubrik “Loaded Modules” auftaucht.

Wie aktiviere ich mod_rewrite, wenn es nicht aktiv ist?

Ich möchte hier zwei Möglichkeiten vorstellen, mod_rewrite zu aktivieren. (Es gibt noch eine dritte, sehr einfache Variante, die manchmal am Effektivsten ist: Nämlich einfach den Hoster anzufragen, ob er mod_rewrite aktivieren kann. Manchmal ist dies auch nötig, denn bei bestimmten Hostern sind die Rechte für die Apache-Cofing-Datei beschränkt und man hat gar keine andere Möglichkeit)

1. Die schnelle Variante, mod_rewrite zu aktivieren:

Gebe in der Shell von Linux einfach folgenden Befehl ein:

Dann musst Du noch den Apache-Server neustarten:

Falls dann in der Shell folgendes auftreten sollte …

… versuche es mit Möglichkeit 2:

2. mod_rewrite in apache-Config-Datei anschalten

Das ist etwas kniffliger: zuerst musst du die Datei apache2.config finden, was allerdings sehr einfach über folgenden Shell-Befehl geht:

Hierdurch findest du Einträge wie:

Dann gibst du folgenden Befehl ein:

Und du solltest als Ausgabe sehen, wo die HTTPD_ROOT-Directory ist und wie das SERVER_CONFIG_FILE heißt:

nun weißt du, wie der Pfad zur Datei lautet und kannst diese mit beispielsweise nano (oder alternativ auch per FTP) editieren:

Folgende Zeile muss in der Datei enthalten sein:

Nun muss nur noch der Apache-Server neu gestartet werden …

Und mod_rewrite sollte aktiviert sein.

 

 

 

Git Repository lokal erstellen und dann auf den Server uploaden (Mac)

Einführung und Grundlegendes Git:

  • Git-Repositories sind nichts anderes als (versteckte) Dateien mit dem Namen “.git”
  • In diesen werden der Stand und die Veränderung (Deltas) des jeweiligen Ordners gespeichert. Normalerweise liegt die “.git”-Datei in dem Projektordner.
  • Im Terminal kann man zum Projektordner navigieren. Wenn das Repsoitory angelegt ist, findet man mit dem Befehl
    ls -a -l
    alle Dateien, auch die versteckten, d.h. hier kann man einfach herausfinden, ob “.git” existiert.
  • Commit bedeutet, dass die Änderungen in dem lokalen Repository gespeichert werden.
  • Push bedeutet, dass die Änderungen vom lokalen Repository in das Repository des Servers hochgeladen werden

Starte das Git Repository (git init):

  • Mache eine Sicherungskopie des Projektordners. (Das beruhigt, falls du bedenken hast, dass du irgendetwas kaputt machen könntest)
  • Navigiere in den Projektordner, zu dem ein Repository angelegt werden soll und gebe folgenden Befehl ein:
    git init
    Dadurch wird ein leeres Repository angelegt.
  • Nun kannst du Dateien zu diesem Repository hinzufügen:
    git add <filename>
    Falls du alle Dateien im Projektordner hinzufügen möchtest:
    git add *
    Je nach Größe des Projektordners kann das ein Weilchen dauern.

Änderungen lokal speichern (commit):

  • Jetzt kannst Du Änderungen in dein lokales Git “commiten”, d.h. dass die Änderungen, die du als letztes Durchgeführt hast, auch im Repository gespeichert werden:
    git commit -m "First Commit"

Repository auf dem Server starten:

  • Um ein Repository auf dem Server zu speichern, musst du als erstes das erstelle Git-Repository auf den Server hochladen. Hierfür benötigst du als erstes eine Kopie der Datei “.git”, die du lokal am besten über das Terminal erstellst. Falls Du immer noch im Projektordner bist, gebe ins Terminal folgenden Befehl ein:
    git clone --bare .git projectname.git
  • Als nächstes lädst du diesen auf den Server hoch. Das geht auch im Terminal mit dem Befehl scp (siehe auch: Dateien per ssh von Mac auf Server kopieren):
  • Der Vollständigkeit halber, kannst du nun das lokal-kopierte Git-Repository entweder im Finde oder aber direkt über das Terminal löschen:
    rm -rf projectname.git
  • Nun musst Du dem lokalen Repository mitteilen, dass ein “Remote-Repository” irgendwo da draußen ist, mit es es die Änderungen abgleich soll. Das geht per ssh und über den Befehl git remote:

Änderungen vom lokalen ins Server-Repository hochladen (push)

  • Wenn Du alles so gemacht hast, wie oben beschrieben, kannst Du nun die Änderungen in das Server-Repository hochladen. Das nennt man “Push”:
    git push origin master

ssh – Dateien kopieren mit dem Terminal auf dem Mac (SCP)

ssh dateien kopiern mac – Wie kann man Dateien per SSH vom Server auf den eigenen, lokalen Mac kopieren?

Auf dem Mac muss das Terminal geöffnet werden, auf den Server per SSH einloggen und dann:

<port> Port (normalerweise 22)

<user> SSH-Benutzer

<host> SSH-Hostname (Server)

/path/to/filename.txt –> Pfad zum Dateinamen

path/to/local/directory –> Pfad zum lokalen Server

Beispiel: Eine MySQL-Backup-Datei vom Server (www.meinserver.com) in einen neuen Ordner auf dem Desktop kopieren: