Magento: Fixing error „[unknown object].fireEvent()“

8. Januar 2015 at 10:02

Recently I’ve encountered the following Javascript error in my Magento store:

error: error in [unknown object].fireEvent():
event name: address_country_changed
error message: zipElement.up(…).down(…) is undefined

This error pops out when creating the order from admin panel and entering customer shipping address. It pops out when editing every filed in the address, which is quite annoying.

Regarding to this forum post, this has something to do with defining the zip code as not required filed in the database. Specialists recommend to set zip code as required filed in the database and then setting it as not required on the country basis. But people report that setting so will still not make zip code as optional field.

So I decided to do my own fix. Here it is:

1. Copy the file app\design\adminhtml\default\default\template\directory\js\optional_zip_countries.phtml to your local design-folder like

app\design\adminhtml\default\fly2marsmedia\template\directory\js\optional_zip_countries.phtml

2. Navigate approximately to line 57.

3. Find the function setPostcodeOptional(zipElement, country)

4. Find the following line: zipElement.up(1).down(‚label > span.required‘).hide();

5. Change it to the following code:

var zipElementLabel = zipElement.up(1).down('label > span.required');
 if (zipElementLabel)
 zipElementLabel.hide();

6. Find the following line: zipElement.up(1).down(‚label > span.required‘).show();

7. Change it to the following code:

var zipElementLabel = zipElement.up(1).down('label > span.required');
if (zipElementLabel)
zipElementLabel.show();

Notice that this code repeats two times inside the function, but differs a little bit in „hide()“ and „show()“ calls at the end.

8. Save the file and upload to the server. Page reload might be required.

This helped me fighting the mentioned error in Magento version 1.9.0.1 and other versions.

Please share this article von facebook & google plus or where you want, thank you!

Mit Prototype Ajax Request ausführen wenn Seite geladen über document.ready – dom loaded function

8. Juli 2010 at 20:31

Ihr möchtet in Prototype ein Ajax-Request nach dem vollständigen Laden der Seite abschicken, habt allerdings kein Zugriff auf den Body-Tag?

Der traditionelle Weg ist den Java-Script-Aufruf vor dem schließenden Body-Tag zu setzen, gelegentlich hat man allerdings nicht immer Zugriff auf diesen, z.B. bei dem Aufruf einer Template-File eines CMS, eCommerce-System oder ähnlich.

Bei Prototype ist es möglich das über den Observe zu machen, z.B. so:

<code>Event.observe(window, 'load', function() {
.. do stuff ..
});</code>

Das Problem ist allerdings dass mit dieser Methode der Anwender warten muss bis das komplette Dokument inkl. aller Bilder und anderen Content geladen ist. Erst dann kann er auf der Seite interagieren. Die meisten Benutzer wollen allerdings nicht warten und gleich mit der Interaktion starten.

Hier ist die Prototype implementation des document.ready mit genauer Erläuterung der Funktionalität.

Hier ein kurzes Beispiel:

<script>
document.observe("dom:loaded", function() {
 myFunction();
 });
</script>

Jquery has a handy way of allowing you to do stuff as soon as the document object model for a page has loaded (ie. as soon as the browser has loaded all your markup). I’m currently working on a project that requires Prototype JS, and I had some difficulty finding the equivalent method.. hence this post.

I knew Prototype had evolved somewhat since I’d last used it extensively back in late 2006, and I also suspected they had implemented something similar.. but Google was not forthcoming.

The traditional way to do this (pre jQuery) was to put your javascript directly before the closing body tag. This way the browser is unable to execute it prior to loading the rest of the page. However this is kind of clunky if you are trying to abstract your javascript to a linked file, or would like to keep your behavioral code (javascript) separate to your markup (xhtml).

An alternative is to use the onload event – in Prototype you would use something like

Submit eines Form mit vorheriger JavaScript Abfrage (ja/nein) steuern

26. März 2010 at 15:23

Zwar super simple Sache für jeden der nur ein klein wenig Ahnung von JavaScript hat, aufgrund der Frage eines Freundes wie das geht hier eine kurze Erläuterung. Ausgangssituation ist dass ihr ein Formular (Form-Element) mit einem Input-Submit Button habt. Vor dem absenden des Form möchtet ihr allerdings noch mal den Benutzer fragen ob er das tatsächlich möchte (Ja/Nein-Abfrage).

Das könnt ihr ganz einfach wie folgt umsetzen:

<script language="javascript">function msgBox()
{
  return window.confirm("Wollen Sie wirklich abschicken??");
}
//-->
</script>
<form action="index.php" method="post" name="form1">
<input type="text" name="text1" />
<input type="submit" name="submit1" value="Abschicken" onclick="return msgBox();" />
</form>

Ich hoffe mit diesem simplen Code-Schnippel noch mehr als nur 1 Person geholfen zu haben, deshalb auch die Veröffentlichung hier im Blog!

JQuery Tutorial für Anfänger & HTML5 & CSS3 Tools & Anleitungen

25. März 2010 at 11:51

Bestimmt für den ein oder anderen Einsteiger nützlich, deshalb wollen wir euch die Links nicht vorenthalten.

jQuery Tutorial für Anfänger

22 Handy HTML5 & CSS3 Tools, Resources And Guides

JavaScript Debugging mit Firebug

23. März 2010 at 14:48

Eine ausführliche Anleitung zum Debugging von Java-Script im Firefox findet ihr hier.

Firebug / FirePHP über PHP ansprechen

19. November 2009 at 15:45

firebug

Firebug mit FirePHPCore-Library ansprechen

Mit der folgenden Funktion könnt ihr Firebug mit Hilfe der FirePHPCore ansprechen, dazu ggf. den entsprechenden Pfad zur Library anpassen (bei path to library):

function firebug($array=array(), $error_reporting=true)
{
  if($error_reporting)
error_reporting(E_ALL);
// path to library
require_once PFAD_RELATIV . "/class/Firebug/FirePHP.class.php";
$firephp = FirePHP::getInstance(true);
require_once (PFAD_RELATIV."/class/Firebug/fb.php");
//$firephp->group('Debug Group');
$firephp->dump('dump', $array);
//$firephp->fb($array, 'dump', FirePHP::DUMP);
$firephp->fb($array, 'dump', FirePHP::INFO);
//$firephp->groupEnd();
}

Firebug in ZendFramework ansprechen

Mit der folgenden Funktion könnt ihr Firebug direkt im ZendFramework ansprechen

function firebug($value= '')
{
 $writer = new Zend_Log_Writer_Firebug();
 $logger = new Zend_Log($writer);
 $request = new Zend_Controller_Request_Http();
 $response = new Zend_Controller_Response_Http();
 $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance();
 $channel->setRequest($request);
 $channel->setResponse($response);
 // Start output buffering
 ob_start();
 // Now you can make calls to the logger
 $logger->log($value, Zend_Log::INFO);
 // Flush log data to browser
 $channel->flush();
 $response->sendHeaders();
}

Debug Log Ausgabe in Firebug

<?php
FB::log('Log message');
FB::info('Info message');
FB::warn('Warn message');
FB::error('Error message');
?>

Log Debug Ausgabe in Firebug aus JavaScript

Stack traces

console.trace();

Object Inspection

console.dir(object);

XML Object inspection

console.dirxml(element);

Current Events on the Page

console.dir(window);

With Objects

console.log("The %d item has a value of: %d", fifth, myvalue);

Firebug with Ajax developement

how-to-integrate-firephp-for-ajax-development

Weiter führende Links

Stack traces
console.trace(); 

Object Inspection
console.dir(object)

XML Object inspection
console.dirxml(element)

Google Leitpfaden für Suchmaschinenoptimierung (SEO) – Teil 2

12. November 2009 at 09:25

Teil 2 – der Zusammenfassung der offiziellen Aussagen aus dem Webmaster Zentrale Blog bzw. des Google Verantwortlichen Matt Cutts für den Bereich Suchmaschinenoptimierung (SEO).

Hier geht es zurück zu Teil 1

Wie Zählen Links von Twitter und Facebook?

Google (Matt Cuts) sagt:

„Links von relevanten und wichtigen Websites waren immer eine gute Methode um Traffic und Akzeptanz für eine Website zu erhalten. Wie beurteilst du Links zu einer Website von neuen Plattformen wie Twitter und Facebook?“

Also: meine Standardantwort – und ich spreche übers Ranking in der Websuche – war immer, dass Google alle Links im Grunde gleich behandelt. Wir greifen auf die Tatsache zurück, dass ihr PageRank habt. Dadurch wissen wir, wieviel Reputation eine Website besitzt, und wir berücksichtigen nicht nur die Anzahl der Links zu einer Website. Es spielt eine Rolle wieviel Reputation diese Links haben. Es kommt nicht wirklich darauf an, ob sie von einer .gov- oder .edu-Domain kommen. Das gleiche trifft auch auf Twitter und Facebook zu.

Eine interessante Tatsache gibt es in Bezug auf Twitter und Facebook aber zu beachten. Fangen wir mit Facebook an: Viele der Profile sind nicht öffentlich. Und Google kann nur denjenigen ausgehenden Links PageRank geben, deren Seiten wir erreichen. Wenn euer Profil bei Facebook also vollkommen öffentlich ist, kann Google es crawlen. Dann könnten diese Links PageRank vererben. Wenn wir nicht rankommen, tun sie es wahrscheinlich nicht.

Die meisten Links auf Twitter sind auf nofollow gesetzt. Das führt uns beinahe auch schon zu einer guten Antwort für Twitter. Sie müssen sich nicht so sehr um Spam kümmern und darum, dass Leute versuchen, sie mit allen möglichen Links vollzustopfen.

Also zumindest in der Websuche, unserem organischen Ranking, behandeln wir Links von Twitter und Facebook gleich. Wählt einfach eure Lieblingsplattform oder Website! Wir behandeln sie, genau wie wir Links von WordPress, von .edu- oder .gov-Domains behandeln. Es ist nicht so, dass ein Link von einer .edu-Domain oder ein Link von einer .gov-Domain automatisch mehr zählt. Die spezifische Plattform kann aber sehr wohl Probleme haben. Sei es, dass sie nicht gecrawlt wird, oder dass nofollow die entsprechenden Links davon abhält PageRank zu vererben.

Quelle

Wie stelle ich am besten Content abhängig vom Standort des Users zur Verfügung?

Google (Matt Cuts) sagt:

Also, es gibt viele Missverständnisse über den Unterschied zwischen Cloaking und Geo- oder IP-Delivery.

IP-Delivery gibt den Content abhängig von der IP-Adresse aus. Das klingt logisch, oder?

Cloaking zeigt Usern anderen Content als Googlebot. Cloaking ist also eine Art von IP-Delivery, aber nicht jede IP-Delivery ist Cloaking.

Und eine besondere Art von IP-Delivery, die nicht unter Cloaking fällt, zeigt Usern unterschiedlichen Content in verschiedenen Ländern. Google macht das auch. Wenn ihr Google in Frankreich aufruft, dann leiten wir euch wahrscheinlich zu google.fr. Wenn ihr Google in Deutschland aufruft, dann leiten wir euch wahrscheinlich zu google.de. Wir schauen also auf die IP-Adresse des Users und wir sagen „Wisst ihr was? In Deutschland ist google.de wohl nützlicher für diesen User.“ Was aber wichtig zu verstehen ist, wir haben keine gesonderte Behandlung für Googlebot bei länderabhängiger IP-Delivery. Und genauso wenig solltet ihr gesondert mit Googlebot umgehen. Behandelt ihn nicht wie ein besonderes Land. Macht im Großen und Ganzen nichts anders für Googlebot. Nehmt einfach die IP-Adresse, über die Googlebot gekommen ist, und behandelt sie genauso, wie ihr irgendeinen anderen User von derselben IP-Adresse behandeln würdet. Wir

Es ist kein Cloaking, dem User Content abhängig von der IP-Adresse zu zeigen, da ihr Googlebot nichts anderes zeigt als einem normalen User. Ein User aus den USA und Googlebot aus den USA würden dieselbe Seite erhalten, und demnach ist es kein Cloaking. Macht euch also bei IP-Delivery keine Sorgen in Bezug auf die IP-Adresse eurer User, solange ihr sichstellt, dass ihr denselben Content an User und an Googlebot liefert, dann ist das in keiner Weise problematisch und gilt auch nicht als Verletzung unserer Qualitätsrichtlinien für Webmaster.

Quelle

Google kann jetzt JavaScript-Links finden. Was passiert mit all den gekauften Links, die in JavaScript-Code stecken. Wird Google diese Links von nun an abstrafen?

Google (Matt Cuts) sagt:

wir wissen über alle bekannten Werbe-Netzwerke Bescheid und können sie auch sehr gut handhaben.

2009 strafen wir das noch nicht ab, wir könnten damit aber anfangen, obwohl es meiner Erfahrung nach kein großes Problem ist, denn der größte Anteil davon sind große Werbe-Netzwerke und Dinge, mit denen wir bereits gut umgehen können. Also wie immer:

wenn ihr Textlinks verkauft, stellt sicher, dass diese Links keinen PageRank vererben, und dass sie Suchmaschinen nicht beeinflussen. Es gibt zahlreiche einfache Wege, dies zu bewerkstelligen. Die haben sich nicht geändert seit wir über bezahlte Links reden: die Verwendung von robots.txt, die Verwendung des Nofollow-Attributs, und so weiter.

Quelle

Ist es möglich, davon zu profitieren, falls Content von der eigenen Site gescraped wurde?

Google (Matt Cuts) sagt:

Nun, wenn ihr sicherstellt, dass eure Seiten Links zu euch haben oder die Artikel zu euch linken falls ihr gescraped wurdet, dann kann es passieren, dass der gescrapte Content zu euch verlinkt. Sollte es sich dabei um einen erfolgreichen Scraper oder Spammer handeln, dann können euch
diese Links sogar weiter helfen.
Es gibt Leute, die Scraper wirklich hassen und versuchen, rigoros gegen sie vorzugehen und ihren gesamten Content zu eliminieren und vom Web-Host zu verbannen.
Ich neige eher dazu, mir keine allzu großen Sorgen darüber zu machen, weil in der absoluten Mehrzahl der Fälle, eure Originalseite vorn platziert wird – und nicht der Scraper. Außerdem: Wenn der gescrapte Content eure Links enthält, dann verlinkt er auch auf eure Site. Also im schlimmsten Fall wird es euch nicht wirklich schaden, aber in manchen Ausnahmen kann es euch sogar ein wenig helfen.

Normalerweise braucht ihr euch keine großen Sorgen über Scraper zu machen. Sie haben meist keinen großen Einfluß auf das, was User zu sehen bekommen. Wenn ihr also doch einen Scraper entdeckt, der besser rankt als ihr, dann könnt ihr eine „Digital Millennium Copyright Act“-Anfrage (DMCA request) stellen. Oder aber, falls es sich um einen echten Spammer mit wirren, sinnlosen Texten handelt, könnt ihr natürlich auch einen Spam-Report einschicken – das kann eine andere Möglichkeit sein, gegen diesen Scraper vorzugehen.

Quelle

Wenn eine Site von Google abgestraft wird, warum erhält der Inhaber keine Nachricht in den Google Webmaster-Tools, weshalb die Abstrafung erfolgt ist? Im Moment tappen Webmaster im Dunkeln, wenn es darum geht, die Ursache für eine Abstrafung herauszufinden.

Google (Matt Cuts) sagt:

Also, tatsächlich machen wir das schon. Wenngleich auch nicht für alle Abstrafungen, da es Spammer und Blackhats gibt, die wir nicht informieren möchten. Aber für Dinge wie etwa versteckten Text, falls wir denken, dass eure Site gehackt wurde oder anfällig für Hacker – wir haben sogar darüber nachgedacht, Nachrichten an Leute zu schicken, die möglicherweise alte Google Analytics-Pakete haben.

Wir schicken also einer großen Anzahl von Leuten Warnungen über ihre Site, um zu sagen, Vorsicht, wir mussten eure Site abstrafen, wegen verstecktem Text oder aus anderen Gründen. Wir machen dies nicht für jede einzelne Site und wir machen es nicht für jede einzelne Abstrafung, da es Leute gibt, die einfach sehen wollen, wie weit sie damit kommen, und sobald sie merken, dass sie erwischt wurden, dann fangen sie mit einer anderen Site an.

Wir suchen also nach Wegen, die „good Guys“ wissen zu lassen, wenn es Probleme gibt, ohne dass die „bad Guys“ benachrichtigt werden, aber wir werden wahrscheinlich nie in der Lage sein, jeder einzelnen Person mitzuteilen, dass sie abgestraft wurde. Wir bemühen uns jedoch weiterhin, hier Fortschritte zu machen.

Quelle

Glaubst du, dass Verweise (Erwähnungen von Websites, ohne dass darauf verlinkt wird) eines Tages als Ranking-Signal für die Websuche Verwendung finden werden?

Google (Matt Cuts) sagt:

Darauf habe ich zwei Antworten. Die erste ist, dass ich kein Ranking-Signal ganz ausschliessen will.

Derzeit ist es so, dass viele Webmaster darauf bauen, viele Links zu bekommen. Wenn alles, was sie brauchen, „example.com“ als Text ist, dann können sie das im ganzen Web verteilen, in Foren und Blogs usw. Überall dort, wo User die Möglichkeit haben, Content zu kreieren, würden solche Verweise gesetzt werden.

Wir sind also ein wenig skeptisch, ob wir diese Art von Ranking-Signal verwenden sollten, da das leicht missbraucht werden könnte. Man könnte einfach überall Verweise auf URLs hinterlassen, auch wenn man sie nicht verlinken kann.

Quelle

Ich verwende ein Website-Template (ich bin Anfänger). Das h1-Tag erscheint bei mir nach dem h2-Tag im Code. Kann der Spider damit umgehen?

Google (Matt Cuts) sagt:

Ja – ich würde mir da nicht so viele Gedanken machen. Wir können mit h1- und h2-Tags ganz gut umgehen. Vermeidet die Verwendung von h1 oder h2 für den gesamten Content einer Seite. Ihr könnt euch nicht vorstellen, was Leute alles für Zeug ins Web stellen. Es gab vor einigen Jahren mal eine Studie, die besagte, dass 40 % der Webseiten Syntaxfehler aufweisen.

Wenn jetzt nur ein h1 unter einem h2 steht – also das würde mich nicht beunruhigen.
Es gibt so viele defekte oder unschöne Webseiten sowie Seiten, die gar kein HTML sind. Wir versuchen, diese Seiten dennoch zu verarbeiten, weil es sich trotzdem um gute Informationen handeln kann.

Also, wenn nur die Reihenfolge einiger h1- oder h2-Tags durcheinander ist, würde ich mir darüber keine allzu großen Sorgen machen.

Quelle

Welche Faktoren beeinflussen ein Video in den Universellen Ergebnissen in Google? Ich habe das gleiche Video, eins auf Youtube mit vielen Views, Kommentaren und Bewertungen, dennoch ist das andere mit wenigen Views und keinen Kommentaren dasjenige, das rankt, wie kommt das?

Google (Matt Cuts) sagt:

Also, meine erste Vermutung, ohne Genaueres zu wissen, ist, dass dieses Video evtl. Links von einer sehr angesehenen Site bekommt und daher mehr PageRank hat.
Wir schauen immer noch auf Links; wir schauen immer noch auf PageRank, wann immer wir Dinge ranken. Falls dieses Video Erwähnung auf einer sehr angesehenen Site findet, dann könnte es sein, dass es mehr PageRank hat und daher besser rankt. Es ist seltsam – wenn das eine Video mehr Views, Kommentare und Bewertungen hat, dann bekommt es wohl Empfehlungen von irgendwoher, aber vielleicht war dort ein wirklich guter Link, der auf die andere Site verweist, und diese hier hat nicht so viele Links o. ä.

Quelle

Hat die Position von Keywords in der URL eine erkennbare Auswirkung? Ist zum Beispiel example.com/keyword/London besser als example.com/London/keyword?

Google (Matt Cuts) sagt:

Ehrlich gesagt würde ich mir wegen solcher Details keinen Kopf machen. Es hilft ein wenig, Keywords in der URL zu haben. Es hat keine so große Auswirkung; ihr braucht also eure URLs nicht mit unzähligen Keywords vollzustopfen.

Quelle

Wird Google eines Tages Text in Bildern erkennen?

Google (Matt Cuts) sagt:

Das wäre wirklich eine Menge Arbeit. Ich meine, es ist eine lustige Idee, aber ich glaube nicht, dass ihr bei Google in nächster Zeit darauf zählen solltet.

Quelle

Der Konkurrent eines Kunden hat rund 100 Blogs mit kaum echtem Content erstellt.
Er wird bei Google für alle wichtigen Keywords seiner Branche super gerankt.
Warum kommt man mit dieser Taktik immer noch durch? Ich dachte, das sei eine „Crap Hat“-Taktik?

Google (Matt Cuts) sagt:

„Crap Hat“ ist ein Ausdruck, den Danny Sullivan kürzlich auf einer Konferenz verwendet hat. „Crap Hat“ drückt die Verärgerung darüber aus, wenn jemand nur so spammigen Schund produziert, der keinem was bringt. Laura, schick uns doch einen Spam-Bericht mit Details …

Quelle

Ich habe auf meinem Blog eine „Blogroll“-Seite mit Links zu den Blogs aller meiner Freude. Beeinflusst das die Reputation meines Blogs in Google? Vor kurzem wurde bei einem Freund von mir wegen einer solchen Seite der PageRank von 5 auf 0 herabgesetzt.

Google (Matt Cuts) sagt:

Sicher haben eure Links Einfluss auf eure Reputation. Wenn ihr zu Spam-Seiten verlinkt, also zu Seiten, die wir als Müll ansehen, kann das die Reputation beeinträchtigen. Und wenn ihr Links in der Blogroll verkauft, stellt das sicherlich ein großes Risiko dar. Aber nur weil ein Freund beim PR von 5 auf 0 abgerutscht ist, bedeutet das nicht unbedingt, dass es an der Blogroll lag. Es heißt auch nicht unbedingt, dass wir annehmen, er verkaufe Links. Es könnte ein zeitweiliges Problem
mit der Kanonisierung sein. Deshalb würde ich nicht automatisch annehmen „Oh, das lag also an der Blogroll.“

Quelle

Sie Benötigen Unterstützung bei der Optimierung (SEO) Ihrer Webseite bzw. Optimierung der Inhalte?

Fly2Mars-Media unterstützt Sie bei der Optimierung (SEO) Ihrer Webseite nach den gängigen Google Webmaster Richtlinien, sowie bei der Optimierung der Inhalte. Für ein individuelles Angebot nehmen Sie noch heute Kontakt mit uns auf.

Firebug – Shortcuts

5. November 2009 at 13:55

Firebug ist einer mit der nützlichsten Tools im Bereich Debuggen von Webseiten ((X)HTML, CSS, JavaScript, etc.).

Mit Hilfe der Mouse & Keyboard-Shortcuts lassen sich viele Funktionen aufrufen oder der Aufruf vereinfachen, die wichtigsten Shortscuts findet ihr hier.

Cheet Sheets für Web-Entwickler

28. Oktober 2009 at 09:10

Hier findet ihr ein paar nützliche Cheet-Sheets für Web-Entwickler für HTML, XHTML, CSS, Apache, mod_rewrite, reguläre Ausdrücke, Java-Script, MySQL, Smarty und Jquery.

Debugging im „Opera“ mit „Dragonfly“

15. Oktober 2009 at 13:05

Gerade Webentwickler die von Firefox zu Opera umsteigen vermissen ggf. ein Webmaster-Tool wie das Plugin Firebug.

Als Alternative dazu findet ihr im Opera unter „Extras -> Weiteres -> Entwicklerwergzeuge“ ein Tool Namens „Opera Dragonfly“, welches ähnlich dem Firefox Plugin Firebug, als nützliches Debugging-Tool für Webmaster ist.

Opera Dragonflyer Screenshot 1

Opera Dragonflyer Screenshot 1

Dragon Flyer ScreenShot 2

Dragon Flyer ScreenShot 2

Neben der aufbereiteten (X)HTML, CSS, XML & JavaScripts besteht die Möglichkeit der Debug-Ausgabe, z.B. Debuggen von JavaScript mit Hilfe von Haltepunkten.

In der Kommandozeile ist die direkte Eingabe von Befehlen möglich, wodurch das Testen und Probieren ungemein erleichtert wird.

Anzeigen und Bearbeiten von CSS-Eigenschaften ist ebenso möglich wie die Vorschau des gesamten Seitenlayouts.

Eine Navigation durch den DOM-Baum und die Durchführung von Änderungen klappt ebenfalls wunderbar.

Ähnlich dem Firebug gibt es eine Console, die Fehlermeldungen und sonstige Ausgaben anzeigt und praktische Filtermöglichkeiten zur bereit stellt.

Download Opera Dragonflyer

Englische Einleitung in DragonFlyer