úterý 22. března 2011

jQuery a doplněk Firefoxu?

Ano, jde to... Není to těžké narvat jQuery do doplňku Firefoxu a ukážu vám jak.
Tuto funkcionalitu jsem řešil s jQuery 1.5.1 a Firefoxem 3.6.15.
Nebudu sem rozepisovat jak se dělá celý doplněk Firefoxu, k tomu vám pomůžou jiné weby jako například How to develop a Firefox extension nebo přímo i XUL School Tutorial.

Celý kouzlo je v tom, že nelze nahrát jQuery před zavoláním spouštěcí metody v JavaScriptu, protože pak nastává kolize s Firefoxem a může se stát, že zmizí tlačítka v toolbaru nebo dokonce zmizí i jiný doplněk.

Soubor knihovny jQuery nahrajte do složky chrome/content/
Ve vašem hlavním JavaScriptovém souboru doplňku chrome/content/nazev.souboru.js použijte metodu spouštění. Tento kousek kódu vložte nebo zeměňte za starý na konci souboru:
window.addEventListener("load", function(e) {
  mujDoplnek.onLoad(e);
}, false);

Celý základní kód JavaScriptu s načtením jQuery by mohl vypadat například takto:

var mujDoplnek= function () {
var prefManager = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
var jQuery;

return {
  init : function () {
    gBrowser.addEventListener("load", function () {
      var autoRun = prefManager.getBoolPref("extensions.mujdoplnek.autorun");
      if (autoRun) {
        mujDoplnek.run();
      }
    }, false);
  },

  run : function () {
    mujDoplnek.jQuery = mujDoplnek.onLoad(content.window.event);
    mujDoplnek.start();

    // zde lze použít volání jQuery jak jsme zvyklí
    // například mujDoplnek.jQuery("div").slideUp(250);
  },

  onLoad : function(e){
    return mujDoplnek.loadjQuery(content.window);
  },

  loadjQuery: function(wnd){
    var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Components.interfaces.mozIJSSubScriptLoader);
    loader.loadSubScript("chrome://mujdoplnek/content/jquery-1.5.1.js", wnd);
    var jQuery = wnd.jQuery.noConflict(true); // důležité nastavení, aby nenastala kolize s jinou knihovnou nebo s jiným JavasCriptem na stránkách
    return jQuery;
  },

  start : function(){
    // zde také lze použít volání jQuery jak jsme zvyklí
    // například mujDoplnek.jQuery("div").slideDown(250);

    alert(mujDoplnek.jQuery("div").length);
  }

};
}();
window.addEventListener("load", function(e) {
  mujDoplnek.onLoad(e);
}, false);

Neříkám, že je to dokonalé, spoustu věcí tam bude třeba ještě odchytat, ale postupem času to tady upravím do dokonalosti :-)

čtvrtek 10. března 2011

Jak restartovat více služeb najednou

Restart všech služeb Courier na linuxu:
find /etc/init.d/ | grep courier | while read line; do $line restart; done

sobota 5. března 2011

Hlášky.net

Rozhodl jsem se přeprogramovat můj web Hlášky.net. Hlášky, které jsou teď, jsou nedodělané a v podstatě amatérsky naprogramované, tím myslím, že jsou napůl objektové a hlavně JavaScripty, které jsem tam použil bych dnes psal daleko líp. Tak přece jenom za ty tři roky, když jsem je dělal, jsem se naučil víc než dost k tomu, abych dokázal napsat něco lepšího.

Nepočítám s tím, že bych web dostal nějak do vysokých návštěvností, ale zkusil jsem web jen trochu propojit s Facebookem a návštěvnost na něm se po pár kliknutí na tlačítko "Líbí se mi" v podstatě zdvojnásobila. Dnes je to cca 120 unikátních IP adres za den, což mě nutí web předělat a dotáhnout. Pravda je, že propojení na Facebook je dnes slušnej základ reklamy zdarma. A co si budeme povídat, lidi spíš kliknou na odkaz na zdi FB než na odkaz reklamy někde jinde.

A teď k samotnému programováni nových hlášek. V podstatě teď ani ještě nevím jakou funkčnost tam chci mít, nechci kopírovat Lamer.cz, ale takovému tomu základu jako hodnocení, komentáře apod. se stejně nevyhnu.
Jediný co vím je, že celej web chci postavit na bázi Ajaxu, což může být trochu problém, pokud bych nedělal klasické odkazy ale jen načítání obsahu do elementů. Bez pevných odkazů si neškrtnu ani moc na Googlu ve výsledcích hledání. Vymyslel jsem proto systém, který tak trochu využívá Facebook, ale jen já ho budu využívat naplno a přesněji. Pro nové hlášky jsem si vybral php framework CodeIgniter a javascriptový framework jQuery.

Takže úkol č.1 je:
Vytvořit funkcionalitu, která při kliknutí na odkaz změní adresu URL v prohlížeči, ale nerefreshne stránku. Ovšem samozřejmě, že chci změněnou adresu nějak získat a vyvolat. Toho docílím jen jednoduchým JavaScriptem a Ajaxem, který mi pošle změněnou adresu na server, od kterého obdržím zpět potřebnou stránku či jiný response. Cíl je daleko složitější než se zdá. Prozradím jen, že změnu adresy bez obnovení stránky jsem docílil voláním adresy se znakem #, který odkazuje vždy na element na stránce, takže Vám posune stránku na pozici elementu, který má parametr pojmenovaný jedinečným výrazem za znakem # v URL. Ale posunování taky nechci, tak musím jen dávat pozor, aby se nějaký element nejmenoval stejně jako část odkazu za znakem #. Samozřejmě, že nemohu poslat Ajaxem na server požadavek s tímto znakem, protože to CodeIgniter neskousne (standartně). Další problém byl, že když někdo obnoví adresu například http://hlasky.net/#/neco/dalsiho, tak mu to musí načíst kompletně vše kde se původně nacházel. Prostě stejná funkce obnovení stránky jako u jiných webu. Toto jsem také ošetřil. V podstatě celý tohle mám napsaný a provázaný s php frameworkem tak, že pro něj se nic nezměnilo a funguje stejně jako bez JavaScriptu, tedy zejména bez Ajaxu, což byl cíl. Chybí mi ošetřit ještě jednu maličkost, ale víceméně úkol č.1 ovládá celý nějakých 120 řádků v jQuery a čistého JavaScriptu + drobné úpravy na straně serveru.

Základ mám tedy hotový a teď už pomalu přecházím na samotný vývoj celého webu, momentálně mám hotovou jazykovou mutaci a napojení na šablonovací parser CodeIgniteru, takže už generuji menu s odkazy co mi načítají obsah bez refreshe stránky, ale se změnou URL v prohlížeči :-) Pokračovat budu snad zase během dnešního večera.
 
]]>