July 29th, 2010 — by Symfonians recent job offers
Proposed by the Seegno company about 17 hours ago.
Teleworking: no
Place: Portugal, Braga (Portugal)
Hi everyone,
Seegno is a small team, based up north in Portugal. We're looking to meet and hire a talented individual, preferably from Europe.
We have an exceptional work environment, based on trust, competence, results, but above all humor and tolerance. We work with people from all around the world, so we value multi-cultural experiences, as well as an interest and tolerance in other cultures.
The main skills we're looking for are:
- PHP5 + Symfony
- XHTML, CSS, jQuery
- OOP and MVC
- MySQL, PostgreSQL
- Agile development
- Critical thinking, humor, team spirit
While we may allow some teleworking, our focus is in developing the team, and we'd expect most of the work would be at our team space. If you're not close by we'd expect you to relocate. ;) Here's a short video of half the team assembling the office:
http://seegno.com/blog/2010/07/07/building-the-workspace
Feel free to get in contact, through here or our website.
Cheers,
- Jorge
Seegno


July 29th, 2010 — by Symfonians recent job offers
Proposed by the Cibul company about 23 hours ago. Offer will expire on October, 30 2010.
Teleworking: no
Place: Dubai (United Arab Emirates)
We are a start-up and are looking for an additional developer for agile development with Symfony during 2 months from september 2010.
Specifications are ready and the development has started.
We prefer to meet regularly the developer, so it would be great to have someone living in Paris or UAE.
Cibul


July 28th, 2010 — by Lawrence Krubner
This is a follow-up question to "
How can I manually call Remember Me".
I am working on a site right now that allows login via 2 methods:
1.) The standard sfGuardUser plugin signinSuccess.php form.
2.) Login via JanRain RPX, which then redirects to some code that logs the user in, using standard sfGuardUser code.
The normal sfGuardUser login works great, and if I click the "Remember Me" button then I stay logged in forever, which is what I want.
However, I can not get the "Remember Me" to work with JanRain. For instance, if I:
1.) start FireFox.
2.) go to the site.
3.) login via JanRain.
4.) click through a few pages
5.) quit out of FireFox
6.) wait an hour
7.) re-start FireFox
8.) go back to the site
then I am logged out of the site.
I've taken the sample code that JanRain gives and I've modified it to work with Symfony/sfGuardUserPlugin. This works - users are able to log in via JanRain RPX login. Our beta testers have been able to login using their Yahoo accounts, their Twitter accounts, their Facebook accounts, their Google accounts, and their LinkedIn accounts. But the "Remember Me" does not work - no one stays logged in for more than 20 minutes (or rather, 1440 seconds, the PHP session default length, which we are still using on our server).
In app.yml I have:
sf_guard_plugin:
remember_key_expiration_age: 25920000 # 300 days in seconds
remember_cookie_name: myAppRememberMe
This is the code I'm using right now, a modified version of the sample PHP code that JanRain provides:
public function executeRpxLogin() {
$rpxApiKey = 'xxx'; // 'REPLACE_WITH_YOUR_RPX_API_KEY';
if(isset($_POST['token'])) {
/* STEP 1: Extract token POST parameter */
$token = $_POST['token'];
/* STEP 2: Use the token to make the auth_info API call */
$post_data = array('token' => $_POST['token'],
'apiKey' => $rpxApiKey,
'format' => 'json');
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, 'https://rpxnow.com/api/v2/auth_info');
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$raw_json = curl_exec($curl);
curl_close($curl);
/* STEP 3: Parse the JSON auth_info response */
$auth_info = json_decode($raw_json, true);
if ($auth_info['stat'] == 'ok') {
/* STEP 3 Continued: Extract the 'identifier' from the response */
$profile = $auth_info['profile'];
$identifier = $profile['identifier'];
if (isset($profile['photo'])) {
$photo_url = $profile['photo'];
}
if (isset($profile['displayName'])) {
$name = $profile['displayName'];
}
if (isset($profile['email'])) {
$email = $profile['email'];
// facebook uses 'verifiedEmail'
if (!$email) $email = $profile['verifiedEmail'];
}
if (isset($profile['preferredUsername'])) {
$preferredUsername = $profile['preferredUsername'];
}
/* STEP 4: Use the identifier as the unique key to sign the user into your system.
This will depend on your website implementation, and you should add your own
code here.
*/
// does a user with this email exist in our system already?
$user = sfGuardUserPeer::retrieveByUsername($email);
if ( $user instanceof sfGuardUser ) {
$this->getUser()->signin( $user, true ); // TRUE means "remember me"
$this->setFlash('notice', 'You are logged in');
$arrayOfUrlsThisUserHasBeenToOnThisSite = sfRequestHistory::getHistory();
$theIndexInTheArrayOfTheUrlWeProbablyWantToRedirectTo = count($arrayOfUrlsThisUserHasBeenToOnThisSite) - 1;
$theUrlWeProbablyWantToRedirectTo = $arrayOfUrlsThisUserHasBeenToOnThisSite[$theIndexInTheArrayOfTheUrlWeProbablyWantToRedirectTo];
$this->redirect($theUrlWeProbablyWantToRedirectTo);
return sfView::SUCCESS;
}
// we can not match this email address to an existing user, so lets see if we
// can find an account that matches their identifier
$user = sfGuardUserPeer::retrieveByUsername($identifier);
if (get_class($user) == 'sfGuardUser') {
$this->getUser()->signin( $user, true ); // TRUE means "remember me"
$this->setFlash('You are logged in');
$arrayOfUrlsThisUserHasBeenToOnThisSite = sfRequestHistory::getHistory();
$theIndexInTheArrayOfTheUrlWeProbablyWantToRedirectTo = count($arrayOfUrlsThisUserHasBeenToOnThisSite) - 2;
$theUrlWeProbablyWantToRedirectTo = $arrayOfUrlsThisUserHasBeenToOnThisSite[$theIndexInTheArrayOfTheUrlWeProbablyWantToRedirectTo];
$this->redirect($theUrlWeProbablyWantToRedirectTo);
return sfView::SUCCESS;
}
// if neither the email nor the identifier match an existing account, we need to
// create a new account. The identifier is the only thing that is guaranteed to
// both be in an RPX response and which is also guaranteed to be unique, so we have to
// use it, though it will be a very ugly username.
$this->createUserAccountBasedOnRpxResponse($identifier, $email);
/* an error occurred */
} else {
// gracefully handle the error. Hook this into your native error handling system.
$this->setFlash('notice', 'We could not log you in. An error occured: ' . $auth_info['err']['msg']);
}
}
}
Like I said, this works, in the sense that people are able to login in via JanRain. But "Remember Me" does not work. Any thoughts about how to get this working?
UPDATE:
I see these cookies being set:
s_sq
s_cc
s_nr
msc_cookie
_csuid
I do not see the myAppRememberMe cookie getting set.
In theory, this line should trigger the Remember Me code:
$this->getUser()->signin( $user, true ); // TRUE means "remember me"
That 2nd parameter is 'true', which I thought would set the myAppRememberMe, but apparently not.
Perhaps I should set the myAppRememberMe cookie manually?
UPDATE:
myAppRememberMe has a value like this:
ffb25a195b02911111815c6a5c853e75
What code generates this? I'm thinking of imitating this code to force the login.
The firewall at this place seems to be serving requests out over different IP addresses. Does sfGuardUser check the IP? I suppose the different IP addresses might throw it off? But then, that would also be true of normal sfGuardUser logins, which work just fine.
UPDATE:
Interesting. I re-did my experiment:
1.) start FireFox
2.) go to website
3.) login via LinkedIn
4.) get redirected to site
5.) click around, now logged in
6.) quit FireFox
7.) What 15 minutes
8.) start FireFox
9.) go back to site
10.) I am still logged in and, surprisingly, when I look at the cookies, I do see the myAppRememberMe cookie. See the attached screenshot to see what I see.
And yet, when I quit and stay away for 30 minutes, I come back and I'm logged out and the myAppRememberMe cookie is gone.
Could something be erasing it?
July 28th, 2010 — by Lawrence Krubner
Hello!
First of all, sorry for my English. I'm a beginner in Sf, so...
I create a Customer Relationship Management System (as a beginner :D) and I have a problem with relations. There are companies and users in this system.
Some companies have a special flag, they are providers! It means, they can provide some services to 'plain' companies. Therefore I created a many-many relation between companies. In this case when i open the page of a company, I can see a company checkbox list, where I can check off which company is a provider for this company. I made a trick to remove non-provider companies from the list:
$choices = User::getProviders();
$this->widgetSchema['company_list'] = new sfWidgetFormChoice(array('choices' => $choices));
It works perfectly, only providers are shown in the list. BUT! User::getProviders() only returns with those providers where the user and the provider have a relation! It's a but difficult to understand so here is an example:
SUPERADMIN
When superadmin opens the page of XY company, User::getProviders() returns with ALL THE PROVIDERS:
PROV1
PROV2
PROV3
Superadmin check them off, so all three providers are checked.
USER
When a plain user opens the page of XY company, User::getProviders() returns with only one provider:
PROV1
It is checked, because superadmin checked it off. If now user click on save, PROV2, PROV3 relations will be deleted in the background.
How can I solve this? Every user should be able to modify only those relations that are shown in the list. If User::getProviders() doesn't return with PROV2, PROV3, the system shouldn't deal with them.
Thank you so much in advance!
July 27th, 2010 — by Lawrence Krubner
I have an URL that sort of looks like this:
http://www.domain.com/front_dev.php/polls/index
There is a "polls" module, with these 3 folders:
actions
config
templates
Inside the config folder, I have a security.yml file that looks like this:
all:
is_secure: on
results:
is_secure: off
As expected, I can visit polls/results without being logged in, and I can visit polls/index if I log in.
I have a user who can visit polls/results, but when she goes to polls/index she is asked to login, even if she is already logged in. If she goes to another module, such as blogs/article/id/456, then the code recognizes that she is logged in. For instance, on this site, a user has to be logged in to post comments on the blogs, and when she is in the blogs module and logged in, she is invited to post comments - so the software knows that she is logged in.
But when she goes to polls/index, she is asked to log in. Why?
All of this testing was done with the dev controller.
July 27th, 2010 — by Lawrence Krubner
This is a follow-up to the question I just asked. It was suggested that I can use url_for() in yaml files if I load the helper. So I did. But now url_for() is giving me mangled urls.
I'm doing this in app.yml:
urls:
janrain_rpx_login_processing: '<?php echo url_for('user/rpxLogin', true) ?>'
and in the template I call it like this:
<?php echo sfConfig::get('app_urls_janrain_rpx_login_processing') ?>
and I'm getting this:
http://dev.dev.com/dev.phpmodule=user/action=rpxLogin
Any thought why it would mash the URL like that?
And this:
urls:
janrain_rpx_login_processing: '<?php echo url_for('user/rpxLogin') ?>'
gives me this:
/cao_dev.phpmodule=user/action=rpxLogin
Why? Is there a better function to use than url_for()?
July 27th, 2010 — by beberlei
In preparation of the next ORM Beta Release in the next days we already released Doctrine DBAL 2.0.0BETA3 today. Noteworthy changes include:
- BC Break: Changed behaviour of Postgres and Oracle DateTime now without Timezone (TIMESTAMP WITHOUT TIME ZONE instead of TIMESTAMP WITH TIME ZONE) See Ticket DBAL-22 for more details aswell as migration issues for PostgreSQL and Oracle. This will be re-announced for the ORM Beta 3 release, which is affected from this change.
- SQL Loggers can now log execution times of queries DBAL-11
- Several Issue with AutoIncrement Detection in Doctrine\DBAL\Schema
A total of 13 issues on DBAL has been fixed.
Links:
DBAL BETA 3 is not currently compatible with the ORM master, we still have to make some changes. Please wait to use DBAL Beta 3 with ORM until the ORM Beta 3 is released.
July 27th, 2010 — by avalanche123
My last post brought up a lot of questions on the differences between document-oriented and relational databases, possible use cases for each and approaches and gotchas one should remember when dealing with either. I had some thoughts on the subject, but they didn't feel complete, so I decided to do some research. I started out by googling "document -oriented databases vs relational databases", which brought a number of interesting results. After some intense reading and analyzing, I think I have a good enough understanding of the concepts, strengths and weaknesses of different data stores to write and share my findings.
Relational databases were traditionally the most obvious solution for applications that needed to store retrieve/data. With the growth of internet user-base, the number of reads and writes a typical application needed to perform grew rapidly. This led to the need for scaling. Traditional RDBMSs were hard to scale (SQL operation or Transaction spanning multiple nodes doesn't scale well). With solutions like MySQL Cluster and Oracle RAC, this is much less of a problem now, but it wasn't the case for a while, which led to many companies abandoning traditional RDBMSs for "noSQL" data stores.
So when to use a document-oriented database and when to use a relational database. The former is usually much better performing and easier to scale, while doesn't provide ACID compliance and data integrity that the later has by definition. This means that if we choose to use document-oriented database, we get more performance and scalability, but need to keep in mind, database level data integrity, transactions and locks are no longer there and will need to be embedded in the application logic itself, which will affect how we write and structure our code.
In my opinion, document-oriented databases cannot replace relational databases, and vice versa. Instead, they should be used to solve different kinds of problems.
At OpenSky we use both MySQL and MongoDB.
July 27th, 2010 — by Symfonians recent job offers
Proposed by alveos on 2010-07-27. Offer will expire on December, 31 2010.
Teleworking: yes
Budget: 30 à 60 K en fonction expérience
Place: Puteaux (France)
Prestataire de services et éditeur de solutions logicielles packagées innovantes, nous fournissons des prestations clé en main permettant à nos clients (grands groupes) de mettre en place des plates-formes de services métiers afin d'optimiser la communication et le marketing de leurs réseaux (gestion de l'information, interfaçage d'outils décisionnels, conseil). Dans le cadre de notre développement et pour garantir le meilleur niveau de satisfaction à nos clients, nous recrutons 2 développeurs PHP Symfony
Sous la direction d’un directeur technique, vous participez aux développements et à la réalisation des applications, ainsi qu'à la rédaction de la documentation technique associée.
A terme, vous élaborez des cahiers des charges, concevez des spécifications fonctionnelles, développez et faites évoluer nos produits et les applications de nos clients.


July 27th, 2010 — by Lawrence Krubner
Normally, when people login using sfGuardUser plugin code, the code gracefully redirects them to the referrer. For example, if a user wants to see some member directory, but needs to login to do so, they first get bumped to the login screen, then they get sent to the member directory. That is graceful.
Now I'm enabling login via JanRain RPX. I'm looking for ideas about how to imitate the above kind of login. As it stands now, if a user wanta to go to some member directory, and are asked to login, and choose, via JanRain RPX, to use their Yahoo login, then first they go off to JanRain/Yahoo, then they get redirected back to the page where we check the response from Yahoo, and then log them in if the data from Yahoo is valid. The fact that they were going to member directory gets lost in all of that. Right now we just redirect them to the user/home, after login, because we are not sure where else to send them.
Suggestions about better ways to do this?
July 26th, 2010 — by Lawrence Krubner
I'm helping a client integrate a site with JanRain RPX. We want people to stay logged in for awhile.
If the user logs in the normal way, using the signinSuccess.php form that comes with sfGuardUserPlugin. And if people click the RememberMe button, they stay logged in for a long time. I'm trying to figure out how I can trigger "RememberMe" manually.
I'm using this code handling JanRain RPX:
$user = sfGuardUserPeer::retrieveByUsername($email);
if (get_class($user) == 'sfGuardUser') {
$this->getUser()->signin($user);
$this->setFlash('notice', 'You are logged in');
$this->forward('user', 'home');
return sfView::SUCCESS;
}
This code works great, but it does not seem to trigger RememberMe. I need to figure out a way to make that happen.
Basically, I want to set the RememberMe cookie, which seems easy to do from action code, but I assume I can not do this in the action code, since that comes too late in the overall process, yes?
In sfGuardRememberMeFilter.class.php I do not see a cookie being set, so I assume the code that sets the cookie is elsewhere. But where? And what value is used to set this cookie?
July 26th, 2010 — by Lawrence Krubner
A friends sends me a question. He is working on a Symfony 1.0 site, and he has added a validator to a form that allows images to be uploaded. He is restricting the images to jpeg. Some jpeg images are accepted, and others are rejected. He can not figure out why some jpeg images are being rejected, while others are accepted. So how does Symfony 1.0 figure out the mime type? Is this a bug? How could we echo the mime-type to the screen?
July 26th, 2010 — by Joaquín Núñez
Simple widget para symfony con listado de bancos chilenos tomados desde el sitio de la Superintendencia de Bancos e Instituciones Financieras de Chile aka SBIF para los amigos.
Aquí la Lista de Instituciones Fiscalizadas
Descarga [zip] [tar.gz]
Saludos
July 26th, 2010 — by Symfonians Fresh Applications
Competition for Australian schools to create a music video and raise awareness and help combat disparity for Indigenous Australians. Built in Symfony2 and Doctrine2. Please excuse the frameset, domain wasn't under our control :)
Project metrics
-
Development started on July 2010
-
Application released on July 2010
-
Application has been released in 25 days
Homepage: http://songs.generationone.org.au/
Licence informations
This application is closed source


July 25th, 2010 — by Javier Eguiluz
Symfony2 routing management was completely revamped this week with new loaders, methods, and configuration. These new loaders were also added to the Dependency Injection component. In addition, Doctrine bundle fixed several bugs and the internationalization component was added.
Development mailing list
Development highlights
Symfony 2.X branch:
- b828617: [DoctrineBundle] fixed multiple connections via XML
- 1bc973e: [DoctrineBundle] added missing driver options (memory, used by sqlite; charset, used by oci) to the supported configuration options supported by DoctrineBundle
- 7287913: [DoctrineBundle] fixed defect in doctrine:generate:entity where xml extension was added to all mapping types
- e33894a: [DoctrineBundle] fixed issue with doctrine:generate:entity command when no --fields are specified
- 216dc0f: [DoctrineBundle, DoctrineMongoDBBundle] made sure proxy directory is created when DI container is being built
- 93f2d6e: [FrameworkBundle] removed pdo.xml
- e6cbfd7: [Console] changed CommandTester to allow testing Command classes without the need for an Application
- 14cecd5: [Routing] refactored loaders: added supports() and setResolver() methods to LoaderInterface, added a LoaderResolver interface, added a Loader base class, DelegatingLoader, ClosureLoader, and PhpFileLoader, refactored the import mechanism for better flexibility
- 4e3e86c: refactored routing management: now it's possible to disable the default routing, removed the Kernel::registerRoutes() method, added a router entry in (replaces the registerRoutes() method), refactored routing configuration in its own routing.xml file
- 60c6827, dcaf436: [DependencyInjection] refactored loaders: added supports() and setResolver() methods to LoaderInterface, added a LoaderResolver interface, added a Loader base class, DelegatingLoader, ClosureLoader, and PhpFileLoader, refactored the import mechanism for better flexibility
- 3f270f5, ef40118: [FrameworkBundle] added a skeleton for configuration in plain PHP
- bfb081f: [ZendBundle] added Zend\\Translator component
...and many other changes
Development digest: 115 changesets, 12 bugs reported, 1 bug fixed, 1 enhancement suggested, 2 documentation defects reported, and 4 documentation edits.
Documentation
New developers for hire
- Adam Tombleson (rekarnar@gmail.com): Wellington, New Zealand based freelance PHP developer. I've been working with symfony since 1.0.
Plugins
- New plugins
- sfPostgresDoctrinePlugin: extends the sfDoctrinePlugin for Postgres database.
- magmaPlugin: (no description)
- pxWymeditorPlugin: provides a new widget to use WYMeditor (http://www.wymeditor.org/) for textareas in your forms.
- sfGoogleDidYouMeanPlugin: implements easily Google's "did you mean" feature.
- sfRssCalCreatorPlugin: a modified version of rsscalCreator. That is a PHP class that implements the rsscal (RDF) specification of iCal, RFC2445. Only the calendar event component is implemented.
Updated plugins
- sfDependentSelectPlugin: change value of 'key_method' option to 'getId' for propel compatibility, updated README, bugfixes in sfDependentSelectPropelSource and sfWidgetFormPropelDependentSelect, added multiples selects
- sfProjectAnalyserPlugin: analysis of lib class of project, added analysis of symfony extended classes
- sfPhpunitPlugin: base class for doctrine fixtures, add file fixture level to manage just files without defining the database type, fixed _collect_coverage config option
- fpBuildPlugin: fixed total timer issue, fixed bug with quiet option
- sfTrafficCMSPlugin: added autoconfig for setting options on datetime widgets as well as date widgets, improved the navigation menu
- sfDoctrineGuardPlugin: fixed random generator for RememberMe keys
- ExtjsGeneratorPlugin: added missing il8n helper in bottomToolbarSuccess.js.php, added autoLoadStore config option for gridpanel, added addslashes for handler function definition for toolbar buttons, re-enabled formpanel cleaning onSubmitSuccess, updated fieldhelp to work with checkboxes and radio buttons, added a check to not show the help if the plugin is added to an element but no helpText is present
- csDoctrineActAsGeolocatablePlugin: revamped of Geolocatable plugin
- sfErrorNotifierPlugin: refactored version, changed message format, removed test fatal error on init step
- sfImageTransformExtraPlugin: added release notes and version number for 1.0.6 release, fixed fill and style options from off to ~, fixed boolean parameters for resize options, fixed spare brackets, fixed channel url for sfImageTransformPlugin
- sfDoctrineActAsRattablePlugin: fixed strict warning for buildLocalRelation
- sfRedisPlugin: upgraded to latest Predis script, try a mix between sfPager / redis / Doctrine
- sfSphinxPlugin: fixed sort in Doctrine pager
- dsExtDirectPlugin: fixed issue where zero-length tree requests might generate an error
- gbI18nRoutePlugin: code clean up
- sfJqueryReloadedPlugin: updated sfJqueryReloadedPlugin to have the last version of jquery ui that was released for 1.3.2
- sfDbDesignerAlternativePlugin: fixed xsl issues with decimal type and scal
- diemProject:
- fixed issue when dropping medias in admin record page
- added Bulgarian translation
- dmMailTemplate now works with dm_i18n_form = 'embed' parameter
- generator.yml changed thru a symfony dmAdmin:generate --clear=dmMailTemplate
- apostrophePlugin:
- cropping is usable now, at least when constraints are in place
- fixing duplicated slideshow media item selection
- fixed bug with button slot outputting empty markup
- fixed accessibility bug with search partial
- fixed the navigation page titles were not encoding html entities properly when outputting a page title with an ampersand in it
- new aDate::mysql() method takes a PHP timestamp, MySQL datetime or MySQL date (defaulting to now) and returns a MySQL datetime format string suitable for calling setCreatedAt() or similar
- removed remember me button from the signin form because it does not work
- changed the default fck toolbar for sidebar
- aArray::isFlat checks whether an array is a flat array
- fixed a bug with aString.class.php where the ellipses encoded character getting appended to truncated strings was missing the ending semicolon
- updated the aHtml::limitWords to accept the append_ellipses option that aString::limitWord already accepts
- fixed a bug with aMultipleSelect, the javascript was using method that is not available in all browsers
- email obfuscator was generating random GUIDs for the email mailto links
- updated jquery UI to be the last version released to work with jquery 1.3.2
- apostropheBlogPlugin:
- upcoming events query is added unless filtering by date
- permalink displayed in post and event editor now displays the date in the url
- made it easier to override engine settings forms
- updated blog plugin to use jquery ui 1.7.3 by default if it is not set in settings.yml
- published_at now has a default value
- altered formating of dates in event admin
- fixed event admin was using a blog route for removing filters
New symfony powered websites
- RestInBook: (English, and Spanish) Post a remembers or photos to a late's by twitter or via web
They talked about us
July 25th, 2010 — by Symfonians recent job offers
Proposed by marco.sm on 2010-07-25.
Teleworking: yes
Place: Roma, Lazio (Italy)
Cerchiamo urgentemente uno sviluppatore PHP da inserire in un progetto gestito secondo le metodologie agili per una prestigiosa pubblica amministrazione.
Sono richieste esperienza di almeno due anni di sviluppo orientato agli oggetti in PHP in ambiente Linux/Apache e conoscenza almeno iniziale del framework Symfony. Sono gradite esperienza con il DBMS PostgreSQL e con le tecnologie GIS.
Si offre contratto a progetto o a partita iva di due mesi con possibilità di instaurare una collaborazione stabile.
Modalità di lavoro: a distanza con incontri periodici a Roma.
marco.santamaria@gmail.com
3882828388
marco.sm


July 24th, 2010 — by Symfonians recent job offers
Proposed by the RECRUT-INFO company 6 days ago.
Teleworking: no
Budget: Entre 30 et 34Ke brut annuel
Place: Aix-en-Provence (France)
RECRUT-INFO recherche actuellement un Développeur PHP5 Objet / Symfony, ayant entre 1 et 3 ans d'expériences en développement sur ce framework, pour le compte d'une société de E-commerce en plein essor basée à Aix-en-Provence.
Rattaché au Responsable technique, vous évoluerez au sein du pôle internet constitué de 8 personnes et participerez aux projets de développement de la société (Environnement à fort trafic).
Environnement Technique : PHP5 (POO), Symfony / Doctrine, JQuery
Autodidacte ou diplômé en informatique, vous disposez d'une expérience significative en matière de Développement PHP5 sur le framework Symfony. Curieux de nature et cultivé dans le domaine du Web, vous disposez d'un bon relationnel et souhaitez intégrer un environnement convivial où vous pourrez pleinement exprimer votre passion pour la technique.
Une embauche rapide est fortement souhaitée mais la société peut attendre la durée d'un préavis de départ.
Type de Contrat : CDI Temps Plein
Lieu de Travail : Aix-en-Provence (13) (Pas de télétravail possible)
Démarrage : Au plus tôt
Salaire : Entre 30 et 34 Ke
Merci de postuler par mail en transmettant votre CV à candidature@recrut-info.com
RECRUT-INFO


July 24th, 2010 — by SymfonyLab
It happens that we are using symfony for a pretty long time (in fact since it’s beginning) and what is probably more important we always considered PHP as the only “right” language
For the last few months we were extending our horizons and digging into similar to symfony solutions. Obviously first things we paid [...]


July 24th, 2010 — by Latest snippets
Hi coders,
Here's a code block that you can use it in your projects easily. It provides you to show random images.
<?php
$resim1="<img src=1.gif alt=Resim_1>";
$resim2="<img src=2.gif alt=Resim_2>";
$resim3="<img src=3.gif alt=Resim_3>";
$resim4="<img src=4.gif alt=Resim_4>";
$resim=array($resim1,$resim2,$resim3,$resim4);
shuffle ($resim);
echo "<table width=\"445\" height=\"245\" border=\"1\" bordercolor=\"black\">
<tr>
<td>"; echo $resim[0]; "</td>
<td>"; echo $resim[1];"</td>
</tr>
<tr>
<td>"; echo $resim[2];"</td>
<td>"; echo $resim[3];"</td>
</tr>
</table>
";
?>
I hope that you'll like it. I'll also use it in 2 spieler spiele and gute spiele web sites. You can follow them from it.
Best wishes.
July 23rd, 2010 — by Lawrence Krubner
I am getting:
Fatal error: Class 'validators' not found in
/home/dev/cache/aaa/dev/config/modules_mtr_validate_upload.yml.php
on line 14
This is a very simple comment form with just one input, a big textarea. My yaml file:
fields:
caption:
required: Yes
msg: Please provide a caption
myFile:
required: Yes
msg: Please provide a JPEG image file
validators: mtrImageValidator
file: true
mtrImageValidator:
class: sfFileValidator
param:
mime_types:
- 'image/jpeg'
- 'image/pjpeg'
mime_types_error: Only JPEG files are allowed
max_size: 102400
max_size_error: Max size is 10 megabytes
July 23rd, 2010 — by Symfonians Fresh Applications
VoitureLib est un site d'autopartage : il permet aux particulier de mettre en location leur voiture au prix et pour la durée voulue.
Les internautes ont ainsi la possiblité de rentrer en contact avec le propriétaire du véhicule pour effectuer une location.
Homepage: http://www.voiturelib.com
Licence informations
This application is closed source


July 23rd, 2010 — by Symfonians Fresh Applications
Quivaou est un site de Covoiturage en ligne et en temps réel. Il permet aux conducteurs de créer des trajets, et aux passager de rechercher ces trajets pour effectuer un covoiturage.
Quivaou permet également de créer des groupes (Campus, Entreprise, etc.) afin de rassembler un ensemble de trajets vers ou depuis un lieu
Homepage: http://www.quivaou.com
Licence informations
This application is closed source


July 23rd, 2010 — by Symfonians recent job offers
Proposed by the Toyota Industrial Equipment Europe company 7 days ago.
Teleworking: no
Place: Ancenis (France)
Sous la responsabilité du Responsable du SI, vous définissez l'architecture technique du SI en exploitant au mieux les possibilités de l'art en fonction des possibilités techniques mises à votre disposition et assurez la qualité, la pérennité des applications Web.
Diplômé Bac+2/5 en informatique, vous avez acquis une réelle expérience des technologies Web (PHP principalement et J2EE optionnellement) en développement, conception, modélisation et urbanisme (une expérience d'intégration autour de solutions ERP est un véritable plus).
Vous êtes reconnu (e) pour votre ouverture d'esprit, votre sens de l'organisation et vous aimez le travail en équipe. Vous avez une aisance relationnelle et savez animer une réunion.
La maîtrise de l'anglais pour communiquer au quotidien est essentielle.
Toyota Industrial Equipment Europe


July 23rd, 2010 — by Symfonians recent job offers
Proposed by the Toyota Industrial Equipment Europe company 7 days ago.
Teleworking: no
Place: Ancenis (France)
Sous la responsabilité du Chef de projet, à partir des spécifications fonctionnelles, vous analysez, paramétrez et codez les composants logiciels applicatifs dans le respect des normes et des procédures, ainsi que les évolutions souhaitées.
Vous êtes diplômé bac +2/5 en informatique, maitrisez les langages de programmation Web (PHP, J2EE, HTML, JS, SQL), les méthodes, normes et outils de développement.
Vous avez acquis des connaissances en conception, modélisation, et architecture d'application.
L'anglais (TOEIC>800) est indispensable.
Vous avez le sens du service client et avez acquis une expérience des méthodes agiles de développement (scrum, Kanban, ...)
Toyota Industrial Equipment Europe


July 22nd, 2010 — by avalanche123
Hi, my name is Bulat S. (my last name won't make it any easier, but in case you were wondering it's Shakirzyanov), I joined OpenSky in August 2009 (It's been almost a year since then, but it feels like ages). My official title in the company is Hacker, which also says a lot about me (that I don't like corporate titles for one).
The last 6 weeks were truly amazing for me. Not only was I able to learn a new technology, I also managed to contribute back to the community. But let's go over everything step by step.
Building an eCommerce system is not easy, and building a platform is even harder. When it comes to data in eCommerce, there is nothing definite, no real structure you could stick to, and no final requirements. Something as obvious as the "item you add to cart" could be overly complicated when it comes to data.
There is a good example of how to model the database for handling variable product attributes; Magento is one of the most advanced open source eCommerce solutions available today. It uses EAV (Entity Attribute Value), which solves the problem of variable attributes by sacrificing database level integrity and application performance. The amount of queries you need to perform to select one entity will grow with every attribute data type you introduce; however, it still is a viable solution.
A document store on the other hand lets you save two absolutely different documents in the same collection. Because of its schema-less structure it is also possible to add or remove a document's properties after saving - it's a database that adapts to your data structure on the fly.
At OpenSky, we decided to use MongoDB for storage of products and use relational databases for order-related data since MongoDB doesn't support transactions.
So what is the benefit of using MongoDB over MySQL, or any other RDBMS, for storing variable attribute data. Performance. This is the pseudo-query we would have to write to select one product, with id 1, and all of its attributes in a typical EAV model:
SELECT * FROM `product` WHERE id = 1;
SELECT * FROM `product_attributes` = WHERE product_id = 1;
SELECT * FROM `product_values_int` WHERE product_id = 1;
SELECT * FROM `product_values_varchar` WHERE product_id = 1;
SELECT * FROM `product_values_datetime` WHERE product_id = 1;
SELECT * FROM `product_values_text` WHERE product_id = 1;
SELECT * FROM `product_values_float` WHERE product_id = 1;
After the above queries are run, there would be a huge step of data hydration into the product object, which Magento handles quite well, albeit slowly. Contrast this with what we would do in MongoDB:
db.products.find({'_id': '1'});
Not only is the selection simpler, but it also returns a JSON object, which can easily be hydrated into a native PHP object.
And here is how a configurable product could be represented in MongoDB:
{
"_id": ObjectId("4bffd798fdc2120019040000")
"name": "Configurable T-Shirt"
"options": [
{
"name": "small",
"price": 12.99
},
{
"name": "medium",
"price": 15.99
},
{
"name": "large",
"price": 17.99
}
]
}
There is no need for joins, as product options are a collection of embedded objects. Object references (akin foreign key relationships in RDBMSs) are also possible, but they are generally only necessary if you need to access the object independently. For instance, if I needed a page to list all product options across all products, I would probably put options into their own collection and reference them from the product document.
Of course, there are plenty of ORM libraries for MongoDB, which were either hard-to-extract parts of frameworks, not quite ORMs or used the ActiveRecord pattern (which after using DataMapper for quite some time, I wouldn't want to go back to). The very same day I started writing an object document mapper (ODM) to use at OpenSky, Jon Wage (developer for the Doctrine project) released a proof-of-concept MongoDB ODM, which you can find on github. After contacting Jon and giving his library a couple of tries and tests, I decided to use it for OpenSky's products domain layer.
I started to submit patches and unit tests to the project and soon joined the core team for MongoDB ODM. Today, we are past first alpha release of the project, and this is my first post on the Doctrine blog (yay!).
Getting back to our example, this is how the product and embedded option classes for the aforementioned data structure could look:
<?php
// Product.php
/**
* @Document(collection="products")
*/
class Product
{
/**
* @Id
*/
private $id;
/**
* @String
*/
private $name;
/**
* @EmbedMany(targetDocument="Product\Option")
*/
private $options = array();
public function getId()
{
return $this->id;
}
public function setName($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
public function addOption(Product\Option $option)
{
$this->options[] = $option
}
//...
}
And the Product\Option class:
<?php
// Product/Option.php
namespace Product;
/**
* @EmbeddedDocument
*/
class Option
{
/**
* @String
*/
private $name;
/**
* @Float
*/
private $price;
public function setName($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
public function setPrice($price)
{
$this->price = $price;
}
public function getPrice()
{
return $this->price;
}
//...
}
Using the DocumentManager instance, we could easily persist the product with:
<?php
$product = new Product();
$product->setName('Configurable T-Shirt');
$small = new Product\Option();
$small->setName('small');
$small->setPrice(12.99);
$product->addOption($small);
$medium = new Product\Option();
$medium->setName('medium');
$medium->setPrice(15.99);
$product->addOption($medium);
$large = new Product\Option();
$large->setName('large');
$large->setPrice(15.99);
$product->addOption($large);
$documentManager->persist($product);
$documentManager->flush();
MongoDB ODM intelligently uses atomic operators to update data, which makes it really fast. It also supports inheritance (collection-per-class and single-collection inheritances), which is similar to table inheritance design patterns for ORMs. Check out the official Mongo ODM project documentation for more information and examples. Complete instructions on how to setup your DocumentManager instance can be found here.
The above code would store the product object as a document in MongoDB.
There is much more to talk about in terms or technologies, techniques and practices we adopt and use at OpenSky, so this post is definitely not the last one.