Thursday, October 23, 2008

Remove index.php from urls in Seagull with mod_rewrite

To make Seagulls urls even more SEO friendly, you can "remove" index.php from them. It could be done relatively easily with Apache`s mod_rewrite module.

Example of functionality:

http://www.example.com/index.php/default/maintenance/
=>
http://www.example.com/default/maintenance/

Apache configuration

You need to enable mod_rewrite module first. Then you have to make decision where to keep your rewrite rules. Options are : global httpd.conf, virtualhost or .htaccess files. I dont suggest .htaccess files as apache should check them for every request, and with higher load you dont want it. I keep rules in virtualhost files. Lets see an example:

/etc/apache2/sites-available/www.example.com

<virtualhost *>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/example.com/www
ServerName www.example.com
<Directory /var/www/example.com/www>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ index.php/$1 [L]
</Directory>
# RewriteLog /var/log/apache2/example.com-rewrite

ErrorLog /var/log/apache2/example.com-error_log
CustomLog /var/log/apache2/example.com-access_log common
</virtualhost>

The rewrite rules are set on same directory as document root.

For each request:
- check if the requested url is an existing file
RewriteCond %{REQUEST_FILENAME} !-f

- If its not a file, prepend index.php.
RewriteRule ^(.*)$ index.php/$1 [L]

Save config file & reload apache in order to use newly set up rules

You can test if the rewrite rules function properly by simply typing in few in your browser without index.php.

Seagull configuration

Next step is to change how Seagull generates links because we dont want index.php in our links any more. You have to edit Seagull config file located in <install_dir>/var/www.example.com.conf.php , and set frontScriptName to an empty string:

$conf['site']['frontScriptName'] = '';


You can find out more about this at:
Seagull Wiki

Monday, September 8, 2008

Move made, Ubuntu hardy heron installed

Finally switched from Win XP to Ubuntu, and got around with it. It was a long delayed step because most of my stuff worked nicely with Win Xp, but lets admit other OS`s handle better scripting :) OS install went fine, and the core system was in place really soon. Had some hard times with downloading medibuntu packages, but mostly because of my ISP i guess.

Most of my dev environment up and running, with minor fixes.

ZendStudio for Eclipse produced some nice error message when it was trying to build a Seagull based project but there is a RC of editor (ZendStudioForEclipse-6_0_1_1RC1) that has fixed cause of it.

Have set up apache for my existing vhosts for apache2, mysql. Made Navicat running trough wine along with Safari. Havent had problems with wine, no freezes. But firefox 3 produces really strange behaviours like 100% CPU usage, and show big apetite for memory, could be caused by firebug tho.

What still remains to be done is getting IE browsers running for testing purposes, trough ies4linux . Should install some Photoshop as well, hope that there are no problems with it.

More or less everything is working in order, and can use my existing data from ntfs partitions.

Interested to see how we will get along :)

Tuesday, June 24, 2008

jQuery form plugin data manipulation

jQuery form plugin is a great piece of code, and if you are working with ajax forms its your best friend. The basic usage of it is excellently explained of their site.

It happens from time to time that you have to serialize/create some values into a hidden form field and extract the data on the server side. I came up with a solution to avoid this unnecessary serialization/deserialization.

You can provide your custom code in beforeSubmit callback. It works like this:

beforeSubmit: function(formData, jqForm, options) {
jqForm.find('select[@name=listItems]')
.children()
.each(function(){
formData.push({
name: 'aListItems['+$(this).attr('value')+']',
value: $(this).text()
});
});
}


This code snippet would find a select field named 'listItems' within the posted form and convert all of its options into an array that gets posted to server side (and there easily accessible trough $_POST from PHP).

formData parameter of beforeSubmit callback is an JS array that contains all the fields of the form, and as it is passed by reference you can add your custom fields to it, and form plugin will see them as parts of the form. jqForm parameter is a reference to jQuery ajaxForm object, so you can use it to extract data.

This solution should work for any type of data manipulation before the form submit.

Saturday, June 14, 2008

Moving select options with jQuery

I wanted to move select options up/down on a click of a button. The following jQuery snippet does exactly that, if you want to put in some moveby variable (delta) execute this stuff within a for loop

#UPDATE My implementation was valid ages & jQueries ago, thanks to imants.horsts for updated solution

$.fn.moveSelectedUp = function() {
var selectedOptions = $(this).selectedOptions();
var prev = $(selectedOptions).first().prev();
$(selectedOptions).insertBefore(prev);
}

$.fn.moveSelectedTop = function() {
var selectedOptions = $(this).selectedOptions();
var first = $(this).children("option").not(":selected").first();
$(selectedOptions).insertBefore(first);
}

$.fn.moveSelectedBottom = function() {
var selectedOptions = $(this).selectedOptions();
var last = $(this).children("option").not(":selected").last();
$(selectedOptions).insertAfter(last);
}


This solution is tested in FF3 & IE6/7, should work elsewhere as well

Thursday, June 12, 2008

My Grandmother

My Grandmother (aged 83) today gave me a call. Nothing special, from her mobile phone (she prefers large letters, and better display because she sends SMS`s daily). The interesting thing is the she saw the german army occupying Serbia from her workplace, the time when only few of them had radios and tv sets (with sometimes watchable single demo channel) were a rarity. She called to alert me on a new virus on the Internet?! I wonder about what is left for us to see

Saturday, June 7, 2008

indexOf function JavaScript arrays & IE6/7

Here is a hidden gem : Javascript in IE6 & IE7 DOESNT support Array.indexOf function

So if you are getting some "unknown property or method", open the script debugger (a joke for itself :)) and it hangs on a line with call to indexOf dont despare here is the fix (even better joke that is comes from Mozilla :)

add Array.indexOf for IE6 & IE7

Wednesday, June 4, 2008

JSON embedded HTML in TBODY

This is a short one but really odd.

Scenario:

Have a table with tbody element, have an ajax provider that dynamically generates rows for this tbody, pretty simple.

Ajax request (jquery), expecting JSON result with embedded HTML in an array. If there is comment in HTML, jQuery produces unexpected behaviour (strip some unnecessary tags like tr`s, td`s which is really really ugly). Solution is to remove comments from HTML that you plan to deliver this way.
The optimistic programmer thinks the hidden traps are found, but IE6 produces 'unknown error on line 11' with code

$('#id_of_tbody').html(ajax_response);

After some desperation found out that according to msdn some elements are read-only for IE, among them tbody (nice DYNAMIC Object Model), so .innerHTML is not usable, my guess is that jQuery`s .html() function uses it in background.

The solution is

$('#id_of_tbody').empty().append(ajax_response);


What a nice day to be a programmer :) My mother told me I should be a fisherman, but they have to wake up early (and protest on the streets against high prices of fuel)...

Monday, May 26, 2008

Seagull Vote module

Just a few toughts about coming Vote module for Seagull

- handle various voting capabilityes of Seagull php framework.
- support/accept votes from users || other modules
- every voting can be executed within different context like grouping by module ('cms','publisher',... )
- support for implentation of custom voting strategies
- ip && user based logging of votes
- a basic voting algorithms (OptionSelect and Bayersian avarage ratings)
- blocks for displaying voting results (support for jQuery)
- voting results retrieval trough XMLHttpRequest calls (template based results)

Currently I am almost finished with DAO part and Voting strategies, thinking about JSON like configuration parameters for voting strategies. But back to work :)

Tuesday, April 29, 2008

jQuery UI tabs and jMap with Seagull

Today I came accross a weird problem while tried to put together a pimped-up profile page with jQuery tabs and a google map inside one of tabs.

jMap is a jQuery plugin for handling Google Maps.

UI is user interface plugin for jQuery which among others handles tabbed controlls.

Problem :
If you embed a jMap map inside a UI tab the map wont be rendered correctly (it isnt centered correctly, some sections of map wont be loaded). When you place the div containing the map out of the tab it loads just fine. Obviously jQuery magic goes wrong somewhere, as the map is functioning correctly, you have controlls and if you move it around it loads some (not all visible) sections so it must be some width/height/padding/margin but I wasnt able to debug what is going on in the background, too much things happen at once.

Solution:
It DOES matter in which order you set up jQuery objects. First you have to set up the map, then set up UI Tabs and it works like a charm.

The code should be something like this (if you wander about {} enclosed stuff which are not JSON notation, its how you can reference php variables in JS with Flexy in Seagull):

{scriptOpen:h}
$(document).ready(function(){
$('#map').jmap('init', {
mapCenter:[{aGeoCodes[longitude]},{aGeoCodes[latitude]}],
mapZoom: 15,
mapShowjMapIcon: false
});
$('#map').jmap("addMarker", {pointLatLng:[{aGeoCodes[longitude]},{aGeoCodes[latitude]}]});
$("#tabbedProfile > ul").tabs();
});
{scriptClose:h}


Hope this helps to someone suffering from same (d)effect to save a bit of debugging.

Thursday, April 17, 2008

Seagull CMS first impression

Today I gave a Segaull CMS module (1.3) a try. Was interested about its features, and what benefit it has over Publisher module, which is a bit aged cms solution for SGL, and is it ready for production use without any tweaking.

CMS beats Publisher in almost every aspect (faster, smarter,more configurable), so it could be a solid solution if you dont need multilingual support (although it could be around the corner, but I dont know how far the corner is :). Publisher has multilingual support on the other hand.

CMS supports: types & attributes of content (nice feature), versioning (although I couldnt figure out how can I select the version of the published content, but maybe that is my bad). Give the wiki a try for more details.

Found a small bug in category management (images for TreeView are not referenced correctly) nothing serious, another one in navigation (add a page that is link to content, save and try to edit it, it doesnt fill the edit form correctly) more serious a bit, but there is workaround, fill everything again on edit :).

It has some really nice AJAX interface, so things are kept simple yet usable.

The next step will be to use CMS functionality to store user generated content like CV-s etc, interested in how it could be used along with other modules, but I am sure that it will perform well.

Only few things are there that are making me to stick with Publisher:
- the code comes obfuscated with community version, and sooner or later I will need some customization (though that can be done by extending cms classes),
- multilingual support (most of sites done are not english on my side), lack of it is showstopper atm
- still have some environments with php4 installed, and CMS requires 5.2, but if I make serious threats to root on host he will upgrade for sure, as all such upgrades have to be done sooner or later as php4 is not supported any more, and I am the root...

So Demian and Julien did a great job as CMS module is getting mature CMS solution. Cant wait to see how it develops further.

Friday, March 28, 2008

Milestone achieved finally...

After some heavy coding finally put together a Seagull based Feeder module`s first milestone (will publish it soon somewhere), it is working on RSS atm, but soon it will evolve to other feeds as well. It has autoUpdate where updateable feeds are ordered by bayesian rating, with limits etc. It maps discovered Items to a generic Content class, so it will be a great content provider. I am really excited about it, and cant wait to see it in production which is yet to come. Next steps include caching, and a bit refactoring, as the project evolves. It should be a news aggregator service, with some fresh ideas, but basics should be done first :)

Zend Neon Impressions

Hopefully found my next php IDE. I have just installed Zend Studio For Eclipse. So here are the first impressions. I wanted to move over to Eclipse for a while now, but got used to ZDE which is decent IDE, but its HTML/CSS support is bellow poor. First impressions are great, easy install, a little headache (more about reasons, and thanks for help), but finally I can debug my Seagull installs from IDE directly (a bit slowly though). Now I have to get used to new keyboard shortcuts but nevermind (I delete all the time instead of duplicate, what is rather annoying :). Eclipse has rather large coding language base, and well supported plugins and together with Zend Eclipse is a great thing to have.