<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUYDRHY5fCp7ImA9WhJUGEQ.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985</id><updated>2012-09-17T16:46:15.824+02:00</updated><category term="ruby" /><category term="linux" /><category term="contest" /><category term="speed" /><category term="postgres" /><category term="reviews" /><category term="office" /><category term="javascript" /><category term="dictionary data" /><category term="joomla" /><category term="webservices" /><category term="ajax" /><category term="security" /><category term="tutorial" /><category term="codeigniter" /><category term="search engine" /><category term="algorythms" /><category term="cobaex" /><category term="newbies" /><category term="applications" /><category term="webtools" /><category term="integration" /><category term="cms" /><category term="zend framework" /><category term="web 2.0" /><category term="licensing" /><category term="coba solutions" /><category term="optimization" /><category term="chat" /><category term="date manipulation" /><category term="performance" /><category term="symfony" /><category term="project management" /><category term="framework" /><category term="yii" /><category term="architecture" /><category term="web 3.0" /><category term="warning" /><category term="ide" /><category term="database" /><category term="reporting" /><category term="linkedphpers" /><title>LinkedPHPers</title><subtitle type="html">LinkedPHPers Group &lt;i&gt;(30k+ Members)&lt;/i&gt; Homepage</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.linkedphpers.org/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/linkedphpers/uuGF" /><feedburner:info uri="linkedphpers/uugf" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CUYDRHY_eip7ImA9WhJUGEQ.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-6125672407444563924</id><published>2012-09-17T16:46:00.001+02:00</published><updated>2012-09-17T16:46:15.842+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-09-17T16:46:15.842+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><category scheme="http://www.blogger.com/atom/ns#" term="coba solutions" /><category scheme="http://www.blogger.com/atom/ns#" term="applications" /><title>Small and Medium Enterperises Project Management (SMEP) part 1 - Why the new methodology ?</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.virtualprojectconsulting.com/wp-content/uploads/2009/12/typicalprojects-300x225.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"&gt;&lt;img border="0" src="http://www.virtualprojectconsulting.com/wp-content/uploads/2009/12/typicalprojects-300x225.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
With this post I would like to start a new article series regarding Project Management best practices for the Small and Medium Enterprises software development projects. The idea to start it is connected with the fact I just finished my 9-year assigment in Polish software house company &lt;a href="http://www.cobasolutions.com/"&gt;COBA Solutions&lt;/a&gt;, decided to move forward and find a new, fully "hired gun" career.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Running COBA for 9 years, being at first the owner, and after 2 years - a co-owner and Chief Software Architect / Project Director allowed me to learn and gain a really strong experience regarding the projects that were implemented for SME's. I managed to complete more then 25 IT projects - including implementation and R'n'D development projects, prepared 3 generations of COBA business software, worked with very various customers coming from very various industries.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Now, having some more time "in between" (I hope it will not be too long :) ) the assigments I decided to share some of my knowledge - especially regarding something I called &lt;b&gt;SMEP (Small and Medium Enterprises Project)&lt;/b&gt; methodology.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
This is maybe not a very strict, new methodology - more something that is a mix of existing formal (PMI/Prince) and agile (SCRUM/eXtreme Programming) methodologies, that allowed COBA to deliver projects to SME's having in mind their needs and specifics, and in the same time was able to be implemented in small software development company, which was COBA Solutions.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
But - getting to the very much beginning...&lt;/div&gt;
&lt;h2 style="text-align: justify;"&gt;
why we needed the new methodology ?&lt;/h2&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
Many PMs can say - why should we reinvent a wheel ? We have number of different IT PM methodologies - such as PMI, Prince, Six Sigma, AcceleratedSAP, SCRUM or eXtreme Programming. Why should we not use any of the above methodologies ?&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
The way I see the PM methodologies is that none of them is a "golden way" to have a&amp;nbsp;successful&amp;nbsp;project. They are more a sets of Best Practices, that should be followed in a project. SMEP was also not intended to be that only true way how the projects were realized. SMEP is again - the set of Best Practices "borrowed" from different methodologies and combined in a way in which we are able to realize projects in a specific&amp;nbsp;environment&amp;nbsp;- small company is realizing a complicated project for another small or medium company.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
The specifics I saw in SME projects was based on a quite simple to explain, but difficult to fullfill requirement. SMEs wishes to have a &lt;b&gt;fixed-price project&lt;/b&gt;, but &lt;b&gt;doesn't have a fully clear view&lt;/b&gt; on what they want or need. They know for sure they need a new IT solution, that will most probably make their business to run better. But they do not have a clue how much that business will be better or how to do it. So they give you e.g. a price request for CRM system, that has contact base, group calendar, sales automation procedures and process automation procedures. While the contact base is clear, group calendar is someway clear (this already can be realized in quite several ways), sales automation can already be a problem (every company is realizing such processes in a different way), but the process automation procedures might be a real "black hole".&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 style="text-align: justify;"&gt;
How can we approach then to the SME projects ?&lt;/h2&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
At such a situation we can offer a company a SCRUM project - but it will be most likely denied, as in the agile projects we do not have the overall budget. In general agile projects are realized in a way "we work until we done - you pay until you believe everything is done". We work on sprints (week or 2 weeks), show a customer what we did, he says whether it's OK or not and we make next sprint... But only at the very end we know how much the project costed.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
As the customer wishes to have the fixed-price - we can also approach using some formal methodology - PMI or Prince. Then we start with a very strict analysis (either customer is delivering us an analysis, which can be used as a fundamentals for the project) and basing on that we can prepare the project scope and&amp;nbsp;appropriate&amp;nbsp;pricing.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
Once we have a large, mature organization such an approach is working OK. However in SMEs it's very rare situation. It's good there if they know, they do not quite know what they need :) In many cases on the customer side we don't have any business analyst that can really understand the outcome from the analysis. They approach to the project in a way that they strongly believe that analysis is good - and they do not need to understand it.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
Unfortunately&amp;nbsp;such thinking leads to very uncomfortable situations - in the best case the customer receives something, that is covering only a part of his needs, in the worse case scenarios - the delivered software (eventhough strictly compliant to the functional specification prepared after project analysis) is&amp;nbsp;completely&amp;nbsp;something different to what customer needs.&lt;/div&gt;
&lt;/div&gt;
&lt;h2 style="text-align: justify;"&gt;
So what is the SMEP ?&lt;/h2&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
SMEP is basically a mix of formal and agile methologies to be able to fullfill the main need of SME's projects: &lt;b&gt;project that is not very detaily described, but has a fixed-price budget&lt;/b&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
SMEP is basically the set of tools I used in COBA Solutions to be able to realize different SME projects in a way they will be successfully on both sides (delivering party and customer) finished.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
The general projects flow basing on SMEP is following:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li style="text-align: justify;"&gt;Project Requirement Specification - not a Functional Specification like in formal methologies&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;Project Pricing - using modified PERT equations and Work Breakdown Structure&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;Project technical realization - using sprints and milestones with customer input each milestone&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;Acceptance tests preparation - on each milestone (in a bit Agile way)&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;Internal tests - using test sprints&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;Acceptance tests - with a customer&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;Formal system acceptation&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;Guarantee service procedures - using almost pure Agile&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;Post-Guarantee service procedures - working in a very similar way to Guarantee Service&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
This set of tools and methods will be in these articles divided in the following:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;SMEP part 2 - Project Analysis and Pricing&lt;/b&gt; - describing how we were doing the analysis and then pricing / budgeting the project&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SMEP part 3 - Project Controlling&lt;/b&gt; - the tools we were using for Project Controlling - Google Spreadsheets for employee timesheets&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SMEP part 4 - Acceptance Test Procedures and the&amp;nbsp;Acceptance&amp;nbsp;Process&lt;/b&gt; - some hints and best practices how to do it, so it will pass :)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SMEP part 5 - Guarantee and Post-Guarantee Service&lt;/b&gt; - using Mantis system, timesheets and hour-packs&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 style="text-align: justify;"&gt;
What do you think ?&lt;/h2&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
Now it's time for at least a little of your input - &lt;b&gt;Would you like to read about something like this ?&lt;/b&gt; Do you think it's worth for me to prepare the next parts of this series ?&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Please add comments&lt;/span&gt;&lt;/b&gt; - to this blog entry, or on LinkedIn... &lt;span style="font-size: large;"&gt;&lt;b&gt;I want to know whether you are interested in such best practices articles or not...&lt;/b&gt;&lt;/span&gt; :)&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
Thanks for any input - both saying I should move on with next articles, and commenting - saying where am I wrong or right on the above :) Your input is really very important for me :)&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-size: x-small;"&gt;&lt;i&gt;Picture source:&amp;nbsp;&lt;a href="http://www.virtualprojectconsulting.com/pmmethodologies/"&gt;http://www.virtualprojectconsulting.com/pmmethodologies/&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/cp6bwiyTFo8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/6125672407444563924/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2012/09/small-and-medium-enterperises-project.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/6125672407444563924?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/6125672407444563924?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/cp6bwiyTFo8/small-and-medium-enterperises-project.html" title="Small and Medium Enterperises Project Management (SMEP) part 1 - Why the new methodology ?" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2012/09/small-and-medium-enterperises-project.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IGQXs5fCp7ImA9WhJVE08.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-7447438305792179559</id><published>2012-08-30T14:23:00.001+02:00</published><updated>2012-08-30T14:25:20.524+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-30T14:25:20.524+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><title>LinkedPHPers just crossed 40k members ! Some cake maybe... ?</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://data.whicdn.com/images/23293044/top-coolest-best-latest-new-fun-gadgets-gifts-pink-elephant-balloon_large.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://data.whicdn.com/images/23293044/top-coolest-best-latest-new-fun-gadgets-gifts-pink-elephant-balloon_large.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
I would like to very proudly announce, that &lt;b&gt;I have just accepted joining 40001 member&lt;/b&gt; in our group - it was&amp;nbsp;&lt;a href="http://my.linkedin.com/pub/hing-chuan-hooi/0/b4/958"&gt;Hing Chuan Hooi&lt;/a&gt; from Malaysia - congratulations :)&lt;br /&gt;
&lt;br /&gt;
In fact we should congratulate to us all - we are already a second-large LinkedIn PHP-related community (for some time we were the first ones - but lost the 1st place against &lt;a href="http://www.linkedin.com/groups?home=&amp;amp;gid=42140&amp;amp;trk=anet_ug_hm"&gt;Php Developers&lt;/a&gt;, currently over 46k members large). The third group I have found however - &lt;a href="http://www.linkedin.com/groups?home=&amp;amp;gid=2195403&amp;amp;trk=anet_ug_hm"&gt;The PHP Developer Network&lt;/a&gt; - is "only" over 11k members large - so we are still on the very top :)&lt;br /&gt;
In the same time our group is known from one, very important value - we managed to keep the discussions clean from jobs ads, which are posted only to the proper place for them (Job Offers). This goal was not very easy (and still it is not) to achieve - we have blocked basically over 2500 members not following rules regarding these job postings. The decision to do that was not easy as I remember - but it proved to be one of the best for this community. Thanks to that we really have a place to exchange the knowledge - not a playground or a next job portal like other groups.&lt;br /&gt;
&lt;br /&gt;
The stats for our group are also quite impressive - just take a look at &lt;a href="http://www.linkedin.com/groups?groupDashboard=&amp;amp;gid=40870"&gt;statistics&lt;/a&gt;&amp;nbsp;provided by LinkedIn. I think it's no use to repeat the data showed in there and I will just stay on the very brief comment - YOU ARE REALLY GREAT !&lt;br /&gt;
&lt;br /&gt;
From my perspective I would like to thank to you all for the great effort and input you put in this group. Thank you also for your trust showed by joining us. I hope you enjoy being with us and sharing your knowledge and experience with other group members.&lt;br /&gt;
Especially I would like to thank to my colleagues - moderators: &lt;a href="http://ar.linkedin.com/in/fernandojaviermartin"&gt;Fernando Javier Martin&lt;/a&gt;, &lt;a href="http://www.linkedin.com/in/sjmckearney"&gt;Scott McKearney&lt;/a&gt; and &lt;a href="http://www.linkedin.com/in/andigutmans"&gt;Andi Gutmans&lt;/a&gt;. Thank you guys for you work you do to keep this group clean and as great as it is. I am more then sure group members shares my thoughts about the great job you do every day.&lt;br /&gt;
&lt;br /&gt;
Again - thanks a lot for all our members and see you on the discussions :)&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://pl.linkedin.com/in/wzielinski"&gt;Wojciech Zieliński&lt;/a&gt;&lt;br /&gt;
LinkedPHPers Founder&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;i&gt;Picture source:&amp;nbsp;&lt;a href="http://weheartit.com/entry/23293044"&gt;http://weheartit.com/entry/23293044&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/3K5TWp-2KDo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/7447438305792179559/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2012/08/linkedphpers-just-crossed-40k-members.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/7447438305792179559?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/7447438305792179559?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/3K5TWp-2KDo/linkedphpers-just-crossed-40k-members.html" title="LinkedPHPers just crossed 40k members ! Some cake maybe... ?" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2012/08/linkedphpers-just-crossed-40k-members.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UDRnY4eSp7ImA9WhdUGUU.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-7833608856044919462</id><published>2011-10-07T13:01:00.000+02:00</published><updated>2011-10-07T13:01:17.831+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-07T13:01:17.831+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="joomla" /><category scheme="http://www.blogger.com/atom/ns#" term="speed" /><category scheme="http://www.blogger.com/atom/ns#" term="cms" /><category scheme="http://www.blogger.com/atom/ns#" term="algorythms" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="optimization" /><category scheme="http://www.blogger.com/atom/ns#" term="coba solutions" /><category scheme="http://www.blogger.com/atom/ns#" term="cobaex" /><title>Functional Cache - high performance on web portals</title><content type="html">&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-2pPbGkY1iao/To7b6vNWdlI/AAAAAAABg00/2LDUmJtT-rc/s1600/final-cms.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://4.bp.blogspot.com/-2pPbGkY1iao/To7b6vNWdlI/AAAAAAABg00/2LDUmJtT-rc/s200/final-cms.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
I would like to share with some idea of a new caching architecture implemented&amp;nbsp;&lt;a href="http://www.cobasolutions.com/business_software/en_cms"&gt;COBAEX CMS&lt;/a&gt; system prepared by a company I manage - &lt;a href="http://www.cobasolutions.com/"&gt;COBA Solutions&lt;/a&gt;. It already proven it really rocks - and I think sharing an idea of how to speed up the page generation mechanisms might be interesting.&lt;/div&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;
But getting to the point - the very first question is&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Why the standard caching mechanisms are not enough ?&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Generally standard caching mechanisms works in a way, that the page that is served by a server is copied either on a client, or on a caching (proxy) servers, and stays there in that way until it is changed. To determine whether the page has been changed or not the server needs to rebuild the page or use some information when it is changed. If the page has not changed - the pre-prepared page or page element is served, in other way - the new version of the page is served (and overwritten in cache).&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Much more about this you can read in nice article by &lt;a href="http://www.garfieldtech.com/blog/caching-tng"&gt;Larry Garfield published on his blog&lt;/a&gt; - so I think there is no need t describe the whole mechanism in details.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
I will maybe focus on the facts why this mechanism is not enough right now. Generally this mechanism focuses only on the page transfer issues. It does not focus on the speed of page generation on the server.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Additionally this mechanism needs a server to prepare a page many times -&amp;nbsp;even though&amp;nbsp;this page might be recreated again and again in the&amp;nbsp;completely&amp;nbsp;same, unmodified form and content.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The question I asked my self was &lt;b&gt;why the server needs to recreate the same page again and again ?&lt;/b&gt;&amp;nbsp;Why the server can't have the copies of this page and serve only an HTML page ?&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The answer was that this is not the way most CMSes are working :) So we decided to change it - and prepare a mechanism, which we called&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Functional Cache&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The word "functional" in this name is quite important. In simple words - we prepared something like a cache, kept on the server, that is rebuilded (pages or page fragments are regenerated) not basing on the page views, but on the actual system functionality. What I mean is that the cache is rebuilded only if a system functionality (e.g. page edition or some dynamic portal functionalities) triggers it - and only the pages that actually changed are rebuilded (cache is rebuilded very much partially).&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
A simple example of such regeneration (based on an actual COBAEX CMS implementation) might be the page&amp;nbsp;&lt;a href="http://www.cobasolutions.com/business_software/en_cms"&gt;http://www.cobasolutions.com/business_software/en_cms&lt;/a&gt;&amp;nbsp;- this page will be regenerated once: somebody will modify the page content, top or bottom menu has been modified. In case of top or left menu - the page will be regenerated only if specific level of this menu has been changed (actually on this page top and left menu is actually the same menu object with different levels - but this is different topic, I think it's not worth getting into details which it is needed in this article).&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Architecture Approach&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Implementing such approach needed the complete revision and redesigning of the whole architecture. The "standard" architecture of CMS systems works in a way, that we have 3 elements:&lt;/div&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li style="text-align: justify;"&gt;an &lt;b&gt;administration panel&lt;/b&gt;, that allows us to modify the pages, manage some specific functionalities etc. which actually stores all the changes in the database mentioned later&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;a &lt;b&gt;database server&lt;/b&gt;, that actually stores how the whole site looks like&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;a &lt;b&gt;page generation system&lt;/b&gt;, that is responsible for creating the pages using some templates (or not :) ) and the database mentioned above&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
In most solutions all these elements stays on a single physical server.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Generally this means &lt;b&gt;the database is some kind of link between the administration panel and actual page&lt;/b&gt;.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
In the architecture that uses the functional cache approach we basically have very similar elements, but used in a different way:&lt;/div&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li style="text-align: justify;"&gt;an &lt;b&gt;administration panel&lt;/b&gt;, that allows us to modify the pages, manage some specific functionalities etc. which actually stores all the changed in the database&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;a &lt;b&gt;database server&lt;/b&gt; that stores how the whole site looks like&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;&lt;b&gt;additional element - the full page generation system&lt;/b&gt; that "compiles" all the pages or page elements basing on the database and templates and saves this to the HTML files. The additional thing that this mechanism is doing is actually publishing the pages on the presentation server mentioned below&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;a &lt;b&gt;presentation server&lt;/b&gt; storing and serving pre-prepared HTML pages, that were "compiled" and published by the page generation system&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
The way it works in most implementations (the larger ones) is that 3 first elements are working on one physical server (that is actually accessed only by site admins - not site users) and the last one is different server (or even standard hosting - as it does not use any sophisticated functionality) accessed by all site users.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The &lt;b&gt;link between the presentation and administration layers is the publishing mechanism&lt;/b&gt; - the mechanism implemented on secured administration server, that actually puts the static HTML files (using FTP, sFTP or SCP) on the presentation server.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The main advantages of this architecture are:&lt;/div&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div style="text-align: justify;"&gt;
&lt;b&gt;increased security&lt;/b&gt; - site users accesses only a copy of the data - the actual data is kept in secret in the servers not&amp;nbsp;accessible&amp;nbsp;by non-authorized people. Generally in case of standard sites the communication between administration and presentation servers is one-directional - administration server can connect presentation server (for publishing purposes), while the presentation server has no access to the administration one. In case of dynamic sites (e.g. community sites) the site users still does not access directly the administration server - they can do it only via presentation one running specific functionality, which orders presentation server to do something on an administration one.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
This also means, that even if somebody will crash the presentation server, the site recreation is only publishing everything from the administration server - and the system is back online with most actual data.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
In some advanced implementation we also have some additional security mechanisms implemented on an administration server side, that actually checks the presentation server in an random intervals, and once anything changes there (without administration server knowledge), administration server automatically publishes whole site again overwriting all the changes made on the&amp;nbsp;presentation&amp;nbsp;side. This means that even if somebody will change our page without our permission - these changes will be seen only till next check - after that the changes will be automatically reverted (and the problem will be automatically reported, the logs will be sent for intrusion detection).&lt;/div&gt;
&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;&lt;b&gt;scallability&lt;/b&gt; - generally the system is fully scallable due to the fact we can have unlimited number of presentation server. What I mean is that we can add new presentation servers and publish the sites to them&amp;nbsp;particularly&amp;nbsp;without changes in the code.&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;&lt;b&gt;"working copies" of the page content&lt;/b&gt; - as we are creating basically the pages on the administration servers, we can use the "working copies" mechanism for publishing multiple pages at one time. What I mean is e.g. we can create a whole new section of the site, that covers many pages and work on them using something that we call "temporary server". On this server we have an additional copy of our site, not accessible by all internet users, on which we can work on a page section, and only after it is fully designed and&amp;nbsp;approved&amp;nbsp;- order the administration server to publish the page on a presentation server. This means we will not get into the situation, that some pages will be updated, some not on a production site.&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;performance - last but&amp;nbsp;definitively&amp;nbsp;not least advantage. I am not sure, if I should in here repeat the whole architecture description, so I will just say, that the site is working in a way, that actually the normal HTML pages are served - so the (presentation) server accessed by site users is basically focused only on file serving, not doing any sophisticated functionality.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Performance tests&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Even though&amp;nbsp;I believe the architecture description shows, that these systems simply must be faster then "standard" CMSes - we decided to make several tests&amp;nbsp;comparing&amp;nbsp;the pages created on Joomla and our system.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The test procedure we followed was to install on the same virtual machine &lt;a href="http://www.joomla.org/"&gt;Joomla&lt;/a&gt; standard installation and our system serving same pages, that were prepared by Joomla team. We used JMeter, restarting the VM before each test - and the results were following:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li style="text-align: justify;"&gt;50 users / 1 second, 10 repeats - both systems failed to serve requests in real time - average request time: Joomla - 10136ms; COBAEX CMS - 1317ms (&lt;b&gt;7,7x faster&lt;/b&gt;); request time for 90% of requests: Joomla - 13653ms; COBAEX CMS - 1730ms (&lt;b&gt;7,89x faster&lt;/b&gt;)&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;50 users / 60 seconds, 10 repeats - COBAEX CMS is serving pages in real time, Joomla still fails to serve requests in real time - average request time: Joomla - 3740ms; COBAEX CMS - 26ms (&lt;b&gt;143,85x faster&lt;/b&gt;); &amp;nbsp;request time for 90% of requests: Joomla - 5914ms; COBAEX CMS - 38ms (&lt;b&gt;155,63x faster&lt;/b&gt;)&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;50 users / 120 seconds, 10 repeats - both systems serves pages in real time - average request time: Joomla - 170ms; COBAEX CMS - 29ms (&lt;b&gt;5,86x faster&lt;/b&gt;); request time for 90% of requests: Joomla - 171ms; COBAEX CMS - 26ms (&lt;b&gt;6,77x faster&lt;/b&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="text-align: justify;"&gt;
These tests shows, that even once the compared system designed in standard architecture is serving the pages in real time - the&amp;nbsp;architecture&amp;nbsp;proposed by &lt;b&gt;COBAEX CMS is still faster - even 5,86 times&lt;/b&gt; in the worst case scenario.&lt;/div&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Implementations&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
This system is not something brand new - this architecture already been proven on several implementations. I think it might be useful to mention them together with a simple description of the advantages for these specific implementations.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-LUrnCl05jIA/To7MclTa-RI/AAAAAAABg0k/ecJZC5MQCgc/s1600/abk.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"&gt;&lt;img border="0" height="155" src="http://3.bp.blogspot.com/-LUrnCl05jIA/To7MclTa-RI/AAAAAAABg0k/ecJZC5MQCgc/s200/abk.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;a href="http://kariera.chodkowska.edu.pl/"&gt;Akademickie Biuro Karier Uczelni Heleny Chodkowskiej&lt;/a&gt; (&lt;i&gt;High School Academic Career Portal&lt;/i&gt;) - the COBAEX CMS system allowed us to create a site, that is very seucure in the matter of user authorization and CV storing. The actual CVs are stored on an administration server, and presentation server is requesting the needed, single CV only once it is needed. This means that once somebody would wish to get e.g. all the CVs from the system - it is hradly possible, as he would have to brake into administration system to get these CVs. Breaking into presentation system will give him no more then one CV.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Also regarding the authorization - this one is made using LDAP servers working directly in the School network, and the access to that servers is allowed only from administration server. This means that the actual user authorization process goes through 3 servers, which makes it quite secure :)&lt;/div&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-sMKzrvdmF1k/To7R-xCSP8I/AAAAAAABg0o/pd5s2XKEg4M/s1600/chodkowska.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"&gt;&lt;img border="0" height="171" src="http://3.bp.blogspot.com/-sMKzrvdmF1k/To7R-xCSP8I/AAAAAAABg0o/pd5s2XKEg4M/s200/chodkowska.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;a href="http://www.chodkowska.edu.pl/"&gt;Uczelnia Heleny Chodkowskiej w Warszawie&lt;/a&gt; (&lt;i&gt;High School Homepage&lt;/i&gt;) - COBAEX CMS system is used for administering a website with 500+ subpages, using subdomains, different news or menus and administered by 20+ users with full user rights management. The 2-server architecture additionally allowed us to put the administration servers in the closed high school network, while the page itself is served using the standard hosting services.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Generally the management system is centralized not only for this site, but also for several other sites - 2 additional schools and academic career portal mentioned before. And this administration is made using single interface and single sign-on system (while the pages are put on several different hosting sites).&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-27YmUFjNmKY/To7UCVuE1NI/AAAAAAABg0s/7LGAoIXWj8o/s1600/twoje-zdanie.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"&gt;&lt;img border="0" height="153" src="http://2.bp.blogspot.com/-27YmUFjNmKY/To7UCVuE1NI/AAAAAAABg0s/7LGAoIXWj8o/s200/twoje-zdanie.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;a href="http://www.twoje-zdanie.pl/"&gt;twoje-zdanie.pl&amp;nbsp;opinion&amp;nbsp;portal&lt;/a&gt; - actually the first implementation of the COBAEX CMS system, that really makes a good use of functional cache mechanisms in scope of performance. The portal allows to add and publish&amp;nbsp;opinions&amp;nbsp;about different companies. This means it stores large number of companies, each having the details page, the&amp;nbsp;opinions&amp;nbsp;lists,&amp;nbsp;opinion&amp;nbsp;details and comments details pages. Once using a "compilation" mechanisms the site is really very fast, even using quite limited resources.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Actually this system was based on a quite old version of this system - the compilation mechanisms we have right now are uncomparable to the ones used on twoje-zdanie.pl - however still this portal rocks in the matter of speed and performance :)&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-_BP1T6ccWeE/To7VGQvuguI/AAAAAAABg0w/sIhONWIyg3Y/s1600/domoklik.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"&gt;&lt;img border="0" height="170" src="http://1.bp.blogspot.com/-_BP1T6ccWeE/To7VGQvuguI/AAAAAAABg0w/sIhONWIyg3Y/s200/domoklik.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;a href="http://www.domoklik.pl/"&gt;Domoklik.pl real estate offers portal&lt;/a&gt; - this is the newest implementation of COBAEX CMS system. The newest version allowed us to create a portal that is actually the&amp;nbsp;fastest&amp;nbsp;one in Poland -&amp;nbsp;even though&amp;nbsp;having the largest number of offers in the database.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The mentioned implementations are of course not all of the COBAEX CMS implementations. I thought however there's no need to mention all of them (especially that some I cannot even say they are ours :) ) and the mentioned ones already shows, that the architecture is proving itself.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Some final words&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
OK - the article got quite long - but I hope still interesting.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
One very important thing&amp;nbsp;regarding&amp;nbsp;the described solution is the fact, that &lt;b&gt;it actually can work in parallel with the&amp;nbsp;existing, commonly used technologies&lt;/b&gt; such as caching proxies, request compression or else. The architecture of functional cache works only on a server side - so there are no problems with adding other, additional optimization methods.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Also the &lt;b&gt;following article describes the general idea - the way how it will be used very much varies on a specific implementation&lt;/b&gt;. What I mean is that e.g. in case of Domoklik we are compiling the parts of the page, not the whole pages. The engine however allows us to add full page compilation, which might get us much faster. At the moment however we decided not to implement that - as even&amp;nbsp;without&amp;nbsp;that we have a portal, that loads in 1,4 sec :)&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/7nxltJ-sLvc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/7833608856044919462/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/10/functional-cache-high-performance-on.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/7833608856044919462?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/7833608856044919462?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/7nxltJ-sLvc/functional-cache-high-performance-on.html" title="Functional Cache - high performance on web portals" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-2pPbGkY1iao/To7b6vNWdlI/AAAAAAABg00/2LDUmJtT-rc/s72-c/final-cms.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/10/functional-cache-high-performance-on.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8GSHgyeip7ImA9WhdUGUw.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-708382986811566569</id><published>2011-10-06T17:10:00.000+02:00</published><updated>2011-10-06T17:10:29.692+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-06T17:10:29.692+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="integration" /><category scheme="http://www.blogger.com/atom/ns#" term="newbies" /><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><category scheme="http://www.blogger.com/atom/ns#" term="webservices" /><title>LinkedPHPers Features Threads - CW 38.2011 and 39.2011</title><content type="html">Last week we were celebrating achieving 30k members in our group - hence I decided to move the Featured Threads post for this week.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;So here we go with the featured threads from 2 weeks back - there were very many very interesting discussions - so I think I will try to divide them into groups by a general topics:&lt;br /&gt;
&lt;br /&gt;
The first group - database design and PHP integration:&lt;br /&gt;
&lt;a href="http://lnkd.in/_mHdRR"&gt;Database Version Control. How you keep track of your database updates?&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://www.linkedin.com/in/federicoulfo"&gt;Federico Ulfo&lt;/a&gt;&amp;nbsp;- a really nice topic, I've been searching for as well. My company some time ago even prepared a tool - maybe for version control issues, but merging changes made to database by different programmers - called &lt;a href="http://www.cobasolutions.com/en_pgcompare"&gt;pgCompare&lt;/a&gt; (for PostgreSQL database) - right now the development is discontinued, but if anybody is interested - please just drop me a line :)&lt;br /&gt;
&lt;a href="http://lnkd.in/AMqx7J"&gt;Need advise for Good Table design to accommodate 20-25 columns&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://in.linkedin.com/in/dipenbaskaran"&gt;Dipen Baskaran&lt;/a&gt;&amp;nbsp;- eventhough &lt;a href="http://ar.linkedin.com/in/fernandojaviermartin"&gt;Fernando&lt;/a&gt; has disagreed this topic is PHP-related - I think it's still interesting for many PHP developers. Most of them uses databases, has to design them - so the answers to this question might be quite interesting to them.&lt;a href="http://draft.blogger.com/"&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The next group - something about integration and APIs:&lt;br /&gt;
&lt;a href="http://lnkd.in/4Wf-_R"&gt;Get Google+ Profile Information using php&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://in.linkedin.com/pub/vijay-gupta/12/602/253"&gt;Vijay Gupta&lt;/a&gt;&amp;nbsp;- a nice article about the newest Google product - some people says a Facebook killer, but I do not agree to them... but this is a completelly different topic :)&lt;br /&gt;
&lt;a href="http://lnkd.in/ahVVeQ"&gt;Any suggestions for music database API?&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://uk.linkedin.com/in/davidfelton"&gt;David Felton&lt;/a&gt;&amp;nbsp;- anyone interested in music ?&lt;br /&gt;
&lt;br /&gt;
Maybe also an integration group - but much more specific, regarding the WebServices&lt;br /&gt;
&lt;a href="http://lnkd.in/9ZafiH"&gt;Any body suggest me SOAP and WSDL tutorial ?&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://in.linkedin.com/in/akkikhambhata"&gt;Ankit Khambhata&lt;/a&gt;&amp;nbsp;- a must-read for any WebServices newcommers :)&lt;br /&gt;
&lt;a href="http://lnkd.in/jbR_yF"&gt;Web Services in PHP&lt;/a&gt; posted by&amp;nbsp;David S.&lt;br /&gt;
&lt;br /&gt;
I wouldn't be myself if I would not feature some threads reagrding the general applications architecture and programming engineering topics:&lt;br /&gt;
&lt;a href="http://lnkd.in/i9X4pe"&gt;You're recommended book on advanced PHP (OOP, Design Patterns, SPL etc.)&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://za.linkedin.com/pub/shaun-morrow/20/bb6/4b8"&gt;Shaun Morrow&lt;/a&gt; - again something for the newbies, but not only - although everybody learns for whole their lives :)&lt;br /&gt;
&lt;a href="http://lnkd.in/Pt2W-V"&gt;AOP - Aspect Oriented Programming : Has anybody used / is using it ?&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://ar.linkedin.com/in/fernandojaviermartin"&gt;Fernando Javier Martin&lt;/a&gt; - some time ago I was quite interested in that - haven't found anything good for PHP, but generally the AOP concept looks really great :)&lt;br /&gt;
&lt;a href="http://lnkd.in/PExwWF"&gt;When is N-Tier architecture preferable over other options?&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://ca.linkedin.com/pub/antonio-camacho-lobeto/12/346/219"&gt;Antonio Camacho-Lobeto&lt;/a&gt;&amp;nbsp;- no comments = no people, that likes the systems architecture issues ?&lt;br /&gt;
&lt;a href="http://lnkd.in/CeCyUT"&gt;What coding standard should I use?&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://ua.linkedin.com/pub/maksym-zaletskyy/3b/293/936"&gt;Maksym Zaletskyy&lt;/a&gt;&amp;nbsp;- something very much missed by very many programmers, but still very needed if you really want to have a maintainable application.&lt;br /&gt;
&lt;a href="http://lnkd.in/KpBa5a"&gt;Register Globals: One of my client sites has this on, and I'm trying to get them to switch it off for the usual reasons. Does anyone know of any good reason it needs to be on for a php script?&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://uk.linkedin.com/in/bobm2010"&gt;Bob Marlow&lt;/a&gt; - maybe a simple question, but allowing to start a nice discussion regarding the need of using this technique (or - in my oppinion - raising the stron argument why it should not be used)&lt;br /&gt;
&lt;a href="http://lnkd.in/v47nCN"&gt;Top 5 mistakes that will compromise security not to make(everything: design, coding, deployment) for a PHP application? Please? You could like make it 15 mistakes not to make. 5 for phases&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://ng.linkedin.com/pub/agaba-akuh/38/586/966"&gt;Agaba Akuh&lt;/a&gt;&amp;nbsp;- 34 comments makes much more then only 5 mistakes how we can get things wrong :)&lt;br /&gt;
&lt;a href="http://lnkd.in/HvcZrN"&gt;PHP trick &amp;amp; tips&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://www.linkedin.com/in/federicoulfo"&gt;Federico Ulfo&lt;/a&gt; - this one should have more comments - c'mon people - share your knowledge :)&lt;br /&gt;
&lt;a href="http://lnkd.in/E8U6sg"&gt;Has anyone written Desktop application using PHP ?&lt;/a&gt; posted by&amp;nbsp;David S. - is PHP a web-only language ? Of course not - check this thread out to see how it can be used on different platforms.&lt;br /&gt;
&lt;br /&gt;
OK - that's it :) I hope you will like these threads much enough to join them and discuss... I really strongly invite you all to do so :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/HpQ8OzfqWWY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/708382986811566569/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/10/linkedphpers-features-threads-cw-382011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/708382986811566569?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/708382986811566569?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/HpQ8OzfqWWY/linkedphpers-features-threads-cw-382011.html" title="LinkedPHPers Features Threads - CW 38.2011 and 39.2011" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/10/linkedphpers-features-threads-cw-382011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQGQ348fip7ImA9WhdUE0o.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-1658621353080500192</id><published>2011-09-30T10:44:00.000+02:00</published><updated>2011-09-30T10:45:22.076+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-30T10:45:22.076+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><title>LinkedPHPers Monthly Newsletter - 10.2011 - 30k Members Achieved !</title><content type="html">&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-kVEoUUONRpE/ToWBNvNrBnI/AAAAAAABg0Y/BEmlakOftcw/s1600/353011aw44uovpq.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="150" src="http://3.bp.blogspot.com/-kVEoUUONRpE/ToWBNvNrBnI/AAAAAAABg0Y/BEmlakOftcw/s200/353011aw44uovpq.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;Image: jscreationzs / FreeDigitalPhotos.net&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Dear LinkedPHPers Fellow Members,&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
This monthly newsletter is a bit earlier, then I was panning to publish, however I suppose we have a nice occasion to publish it at the moment. Just yesterday I have approved several new members, making our group exactly &lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;30 000 members strong&lt;/b&gt;&lt;/span&gt;. I wanted to tell you, how proud am I regarding that fact :)&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
I also would like to thank a lot to you, as well as I would like to say many thanks to the people that helps me running this stunning community - the managers:&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;a href="http://www.linkedin.com/in/sjmckearney"&gt;Scott McKearney&lt;/a&gt; -&amp;nbsp;Engineering/Software Development: Recruiter, Sourcer, Candidate Development&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;a href="http://ar.linkedin.com/in/fernandojaviermartin"&gt;Fernando Javier Martin&lt;/a&gt; -&amp;nbsp;Sr. PHP Developer at Clarin Global - CMD&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;a href="http://www.linkedin.com/in/andigutmans"&gt;Andi Gutmans&lt;/a&gt; -&amp;nbsp;CEO at Zend Technologies&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Really - &lt;b&gt;THANKS A LOT FOR YOUR HARD WORK AND THIS SUCCESS IS YOURS&lt;/b&gt; :) I am pretty sure other group members will share that appreciation as well :)&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Once we gained this very great moment - I suppose in this newsletter I will try to show a bit history of the group.&amp;nbsp;Unfortunately&amp;nbsp;LinkedIn does not provide any nice tools for analysis - so maybe the number of the facts I am able to recover is not very huge, however I will do my best. OK - so here is some quick history timeline review:&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;10.03.2008&lt;/b&gt; - The first group creation&amp;nbsp;announcement&amp;nbsp;(&lt;a href="http://www.linkedin.com/answers/technology/software-development/TCH_SFT/193716-1649357"&gt;using LinkedIn Q&amp;amp;A functionality&lt;/a&gt;) has been posted&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;20.03.2008&lt;/b&gt; - The first 10 members approved on the group&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;24.03.2008&lt;/b&gt; - The LinkedPHPers webpage on Blogspot has been created - &lt;a href="http://www.linkedphpers.org/2008/03/linkedin-group-phpers-started.html"&gt;and the first post announcing joining first&amp;nbsp;135&amp;nbsp;members published&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;01.04.2008&lt;/b&gt; - &lt;a href="http://www.linkedphpers.org/2008/03/crossing-200.html"&gt;Crossing 200 members&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;04.04.2008&lt;/b&gt; - &lt;a href="http://www.linkedphpers.org/2008/04/crossing-300.html"&gt;Crossing 300 members&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;23.07.2008&lt;/b&gt; - &lt;a href="http://www.linkedphpers.org/2008/07/vacation-sunny-days-and-crossing-1000.html"&gt;Crossing 1200 members&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;30.07.2008&lt;/b&gt; - LinkedIn still does not have a nice newsletter functionality - hence &lt;a href="http://www.linkedphpers.org/2008/07/linkedphpers-problems-of-newsletter-and.html"&gt;I have created Google Groups also for the LinkedPHPers community&lt;/a&gt; - however this has been discontinued, as it was not the most popular feature for&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;19.02.2009&lt;/b&gt; - &lt;a href="http://www.linkedphpers.org/2009/02/crossing-5000-no-5200-already.html"&gt;Crossing 5200 members&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;03.03.2009&lt;/b&gt; - The &lt;a href="http://www.linkedphpers.org/2009/03/webapplications-part-1-framework-vs.html"&gt;first article from WebApplications series&lt;/a&gt; published on the webdesk blogspot site (that blog is to be later merged with LinkedPHPers homepage)&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;09.04.2009&lt;/b&gt; - &lt;a href="http://www.linkedphpers.org/2009/04/webdesk-blog-entries-import-summer.html"&gt;The webdesk blog merged with LinkedPHPers homepage blog site&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;i&gt;The blog has been "sleeping" for some time, until the reactivation, however the group was growing, keeping the first place among all other PHP-related communities on LinkedIn.&lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;12.03.2011&lt;/b&gt; - &lt;a href="http://www.linkedphpers.org/2011/03/blog-reactivation-polish-entries-will.html"&gt;The blog reactivation&lt;/a&gt; - I planned to make it multilingual even - starting also with my native langugae entries - there actually were several entries in&amp;nbsp;Polish, but I decided to abandon that idea and removed all non-English entries from the site&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;26.07.2011&lt;/b&gt; - &lt;a href="http://www.linkedphpers.org/2011/07/linkedphpers-blog-update.html"&gt;LinkedPHPers blog gains an "official" LinkedPHPers domain&lt;/a&gt; - and it available as right now under www.linkedphpers.org address&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;26.07.2011&lt;/b&gt; - &lt;a href="http://www.linkedphpers.org/2011/07/linkedphpers-featured-threads-cw-292011.html"&gt;The first article&lt;/a&gt; from the LinkedPHPers Weekly Featured Threads published&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;04.08.2011&lt;/b&gt; - &lt;a href="http://www.linkedphpers.org/2011/08/working-with-dates-using-php-tutorial.html"&gt;The first members-authored article published&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;05.09.2011&lt;/b&gt; - &lt;a href="http://www.linkedphpers.org/2011/09/linkedphpers-monthly-newsletter-092011.html"&gt;First LinkedPHPers Montlhy newsletter published&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
These are the dates I managed to recover - mostly using this blogsite. However there are several other, quite important points in the group history - which I can recover from LinkedIn.&amp;nbsp;Unfortunately&amp;nbsp;at the moment LI does not provide actual thread dates - so I will just try to mention them without very accurate timing:&lt;/div&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li style="text-align: justify;"&gt;3 months ago &lt;a href="http://lnkd.in/bZAcAd"&gt;I have invited everyone&lt;/a&gt;, that would like to publish on our page - to send me the articles. We had also quite long and active conversation on how the group webpage should look like - many people raised nice ideas on new functionalities, much extending the possibilities of Blogger engine hat is currently used on this page. Unfortunatelly the only person since now, that actually did not finished on the ideas was &lt;a href="http://www.linkedin.com/in/manzwebdesigns"&gt;Bud Manz&lt;/a&gt; (many thanks to you Bud), which published his articles in here.&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;1 month ago &lt;a href="http://lnkd.in/hWQ3zP"&gt;I have created&lt;/a&gt; a &lt;a href="http://www.facebook.com/pages/LinkedPHPers/121726194580178"&gt;Facebook fanpage&lt;/a&gt; for our community -&amp;nbsp;unfortunately&amp;nbsp;still not very popular - we have only 12 friends on there - however I still have faith, that it will not be like the Google Groups before :)&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;Also 1 month ago &lt;a href="http://lnkd.in/ysHRxh"&gt;a thread regarding the Google Plus&lt;/a&gt; connections has been created - and I have seen this was bit more popular, hence not that popular I expected it will be :) I hope it however still will change :)&lt;/li&gt;
&lt;li&gt;&lt;div style="text-align: justify;"&gt;
In the same time&lt;a href="http://lnkd.in/whS3kh"&gt; I asked all of us to propose a group logo&lt;/a&gt; - as we still use the standard PHP logo :) I tried to modify it marging the LinkedIn logo (the "in" part) with the PHP logo - however LinkedIn was not very happy about that and they even blocked the whole group for several days, until I changed it... I do not quite understand why they were so upset on that - but it's their right to do that :)&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
However hence we are really large group already - I would like to call again for a group logo proposals - I suppose we should have one :)&lt;/div&gt;
&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;I would like also to mention that our group since about a month allows people to promote their applications and gain any comments on that - the way it can be done not violating the group rules you can check out in &lt;a href="http://lnkd.in/ARt2Gr"&gt;this thread&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Of course once having such a general, historical post it would be bad not to mention the &lt;a href="http://lnkd.in/PMa22u"&gt;"fight" we, as group managers and moderators having with recruiters, that wishes to post their jobs among the professional discussions&lt;/a&gt;. You can read a bit more about that on &lt;a href="http://lnkd.in/PMa22u"&gt;this thread&lt;/a&gt; - so in here I would just like to say - &lt;b&gt;WE ARE WINNING ALL THE TIME&lt;/b&gt; :) You can see that on the comments to the mentioned thread - and I must admit I am very proud of all the appreciation words and the fact, the group is I suppose the only one among other PHP-related groups, that manages to deal with job or promotion spam on the discussions board. Here also many thanks to Fernando, that has actually created a very nice text&amp;nbsp;regarding&amp;nbsp;the &lt;a href="http://www.linkedphpers.org/p/linkedphpers-group-rules.html"&gt;rules&lt;/a&gt; - very straight forward and clear, understandable by most people :)&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
So - summarizing - &lt;b&gt;thanks to all the active members of this group &lt;/b&gt;for making this community so nice and professional, &lt;b&gt;thanks to all the managers and moderators &lt;/b&gt;for helping me in managing this group, &lt;b&gt;thanks to all the people that joined this group&lt;/b&gt; and trusted the group will be a good place for them :)&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;THANKS A LOT AND WE ARE COUNTING ON NEXT MEMBERS&lt;/b&gt; - I hope soon we will be celebrating a 40k-50k-100k-200k-1M members ? :)&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/cSDeiNFE-Os" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/1658621353080500192/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/09/linkedphpers-monthly-newsletter-102011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/1658621353080500192?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/1658621353080500192?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/cSDeiNFE-Os/linkedphpers-monthly-newsletter-102011.html" title="LinkedPHPers Monthly Newsletter - 10.2011 - 30k Members Achieved !" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-kVEoUUONRpE/ToWBNvNrBnI/AAAAAAABg0Y/BEmlakOftcw/s72-c/353011aw44uovpq.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/09/linkedphpers-monthly-newsletter-102011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIGQXwzfSp7ImA9WhdVFUQ.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-2818979745737099449</id><published>2011-09-21T11:31:00.000+02:00</published><updated>2011-09-21T11:32:00.285+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-21T11:32:00.285+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="symfony" /><category scheme="http://www.blogger.com/atom/ns#" term="yii" /><category scheme="http://www.blogger.com/atom/ns#" term="reviews" /><category scheme="http://www.blogger.com/atom/ns#" term="newbies" /><category scheme="http://www.blogger.com/atom/ns#" term="framework" /><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="zend framework" /><category scheme="http://www.blogger.com/atom/ns#" term="codeigniter" /><title>PHP Frameworks for Web Portals and Web Applications</title><content type="html">&lt;div style="text-align: justify;"&gt;
About a month ago I have started the discussion polls regarding the best framework choices for &lt;a href="http://lnkd.in/V2asfU"&gt;Web Portals&lt;/a&gt; and &lt;a href="http://lnkd.in/aCxaxg"&gt;Web Applications&lt;/a&gt;. In this post I would like to summarize the results of these polls.&lt;/div&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;
Starting from the Web Portals - &amp;nbsp;I have received 10 replies, suggesting generally 5 frameworks. The detailed results were:&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.symfony-project.org/"&gt;Symfony&lt;/a&gt; - 2 votes&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.yiiframework.com/"&gt;Yii&lt;/a&gt; - &lt;b&gt;5 votes&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://framework.zend.com/"&gt;Zend Framework&lt;/a&gt; - 3 votes&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drupal.org/"&gt;Drupal&lt;/a&gt; - 1 vote&lt;/li&gt;
&lt;li&gt;&lt;a href="http://codeigniter.com/"&gt;CodeIgniter&lt;/a&gt; - 2 votes&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The total number of votes is larger then the number of replies, hence some members has suggested more then 1 framework. However in here we can see that Yii has won this survey, while other frameworks are much in the same, second position. Quite suprising is only 1 vote for Drupal - which some time ago was quite popular.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
In case of Web Applications the choice is more interesting. The number of replies (stating the frameworks) was a bit larger and covered 14 group members. The detailed results were:&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://framework.zend.com/"&gt;Zend Framework&lt;/a&gt;&amp;nbsp;- &lt;b&gt;6 votes&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.symfony-project.org/"&gt;Symfony&lt;/a&gt;&amp;nbsp;- 4 votes&lt;/li&gt;
&lt;li&gt;&lt;a href="http://codeigniter.com/"&gt;CodeIgniter&lt;/a&gt;&amp;nbsp;- 5 votes&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cakephp.org/"&gt;CakePHP&lt;/a&gt; - 2 votes&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.yiiframework.com/"&gt;Yii&lt;/a&gt; - 2 votes&lt;/li&gt;
&lt;li&gt;&lt;a href="http://flourishlib.com/"&gt;flourishlib&lt;/a&gt; - 1 vote&lt;/li&gt;
&lt;li&gt;Dedicated, self-developed framework - 3 votes&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
What is also interesting from this poll is the fact that the people, that has raised they use their own framework - they use Zend Framework as the basics (it was in fact including me :) ). I can see also, that there are only few people, that during web applications development uses only 1 framework - most people chooses the frameworks basing on the actual need - which in one side is quite good approach, however it might be difficult hence they do not specialize in any of the frameworks used.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Some general thoughts about this surveys are quite interesting:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li style="text-align: justify;"&gt;Yii is quite popular, however might be difficult to use for Web Applications. However &lt;b&gt;if you want to create a website - Yii might be the best choice&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;div style="text-align: justify;"&gt;
If you want a &lt;b&gt;framework for web applications or something that will be a good basis for developing your own framework - choose Zend Framework&lt;/b&gt;. This framework looks to be also the most universal one.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The second universal framework you should look for is Symfony - this framework has also been stated by one of the responders as good choice for developing an own frameowrk basing on this one.&lt;/div&gt;
&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;Older frameworks such as Drupal or CakePHP looses the market.&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;If you want to create real good web application - create your own framework :)&lt;/li&gt;
&lt;/ol&gt;
&lt;div style="text-align: justify;"&gt;
OK - that's it for now. I hope you might have any thoughts / suggestions on that - please state them in the apropriate discussion :)&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/Rv1ltzQRaA0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/2818979745737099449/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/09/php-frameworks-for-web-portals-and-web.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/2818979745737099449?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/2818979745737099449?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/Rv1ltzQRaA0/php-frameworks-for-web-portals-and-web.html" title="PHP Frameworks for Web Portals and Web Applications" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/09/php-frameworks-for-web-portals-and-web.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcNRX87eip7ImA9WhdVFUw.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-1461108337566973533</id><published>2011-09-20T11:10:00.000+02:00</published><updated>2011-09-20T11:14:54.102+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-20T11:14:54.102+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="ide" /><category scheme="http://www.blogger.com/atom/ns#" term="integration" /><category scheme="http://www.blogger.com/atom/ns#" term="newbies" /><category scheme="http://www.blogger.com/atom/ns#" term="framework" /><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><title>LinkedPHPers Featured Threads - CW 36.2011 and 37.2011</title><content type="html">Last week I missed the LinkedPHPers Featured Threads post - so here is the list of all the threads for last 2 weeks - 36 and 37 calendar week of 2011.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;The very first one - started and mentioned by &lt;a href="http://ar.linkedin.com/in/fernandojaviermartin"&gt;Fernando Javier Martin&lt;/a&gt;:&amp;nbsp;&lt;a href="http://lnkd.in/mZg-EN"&gt;Semantic Versioning - Worth Implementing!&lt;/a&gt; - a nice tool/technique, worth checking and maybe implementing in your projects.&lt;br /&gt;
&lt;br /&gt;
Also 3 posts for newbies - showing up where to start and what to learn to become a really good programmer:&lt;br /&gt;
&lt;a href="http://lnkd.in/zAS7mk"&gt;If any body could help me with what skills a Developer in Mobile App. should have? A must have &amp;amp; preferred skills if you could tell. Thanks!&lt;/a&gt; started by&amp;nbsp;&lt;a href="http://in.linkedin.com/pub/axita-mehta/1a/431/118"&gt;AXITA MEHTA&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://lnkd.in/B_B8s8"&gt;What are the best Video tutorial for learning PHP? How did you learn PHP?&lt;/a&gt; started by&amp;nbsp;&lt;a href="http://www.linkedin.com/in/tonyhoban"&gt;Tony Hoban&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://lnkd.in/BmpYTE"&gt;Which is best book for learning PHP from novice to ninja even when I have the intermediate knowledge of HTML, CSS, JavaScript, MySQL etc????&lt;/a&gt; started by&amp;nbsp;&lt;a href="http://pk.linkedin.com/in/ashffaq"&gt;Muhammad Ashfaq&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
We have also several nice threads regarding the frameworks and framework comparisons:&lt;br /&gt;
&lt;a href="http://lnkd.in/tqjNAi"&gt;How is Kohana PHP Framework ?? which one is better - Yii or Kohana ?&lt;/a&gt; started by&amp;nbsp;&lt;a href="http://ae.linkedin.com/pub/vimal-saifudin/14/331/201"&gt;Vimal Saifudin&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://lnkd.in/g9BsfP"&gt;Provide feedback on Yii and Zend framework&lt;/a&gt; started by&amp;nbsp;&lt;a href="http://www.linkedin.com/in/balajimadana"&gt;Balaji J. Madana&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://lnkd.in/q-6fCZ"&gt;Dear Colleagues, Need some advice, We need to develop an e-library system and wondering what should we use, Zend or CodeIgniter? Kindly let me know of your suggestions.&lt;/a&gt; started by&amp;nbsp;&lt;a href="http://in.linkedin.com/in/arundgupta"&gt;Arun Gupta&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
A nice threads, both started by&amp;nbsp;&lt;a href="http://cz.linkedin.com/in/tesarek"&gt;Jakub Tesárek&lt;/a&gt;&amp;nbsp;and regarding the PHP integration with different programming languages or technologies:&lt;br /&gt;
&lt;a href="http://lnkd.in/f7b93Z"&gt;Calling Java classes from PHP&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://lnkd.in/f7b93Z"&gt;Calling Java and .NET classes from PHP.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
As we are still on different technologies - a call for comparison of PHP and Ruby - &lt;a href="http://lnkd.in/sp_N4x"&gt;"Ruby vs PHP" what do you think?&lt;/a&gt; started by&amp;nbsp;&lt;a href="http://www.linkedin.com/in/federicoulfo"&gt;Federico Ulfo&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
And the last, but not least ones - a bit maybe "uncategorized":&lt;br /&gt;
&lt;a href="http://lnkd.in/c54iWB"&gt;Do PHP developers prefer to use IDEs or text editors?&lt;/a&gt; started by&amp;nbsp;&lt;a href="http://www.linkedin.com/in/aogail"&gt;Abdelrahman Al-Ogail&lt;/a&gt;&amp;nbsp;- a nice overview on different IDEs and editors used by our group members - a must read by all the people looking how to make their work a bit better :)&lt;br /&gt;
&lt;a href="http://lnkd.in/WN8kV9"&gt;What are your thoughts on Windows 8? Since it uses web technologies (JS, HTML, etc) for app creation, how do you see PHP fitting in?&lt;/a&gt; started by&amp;nbsp;&lt;a href="http://ca.linkedin.com/pub/eric-shelley/28/6b2/b12"&gt;Eric Shelley&lt;/a&gt;&amp;nbsp;- some thoughts about the future of our language in the upcoming Windows 8 operating system.&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/9XSmlDK4Org" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/1461108337566973533/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/09/linkedphpers-featured-threads-cw-362011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/1461108337566973533?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/1461108337566973533?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/9XSmlDK4Org/linkedphpers-featured-threads-cw-362011.html" title="LinkedPHPers Featured Threads - CW 36.2011 and 37.2011" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/09/linkedphpers-featured-threads-cw-362011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8DQHw-fyp7ImA9WhdWEkQ.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-5515266466659058677</id><published>2011-09-06T09:06:00.000+02:00</published><updated>2011-09-06T09:24:31.257+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-06T09:24:31.257+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="newbies" /><category scheme="http://www.blogger.com/atom/ns#" term="framework" /><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>LinkedPHPers Featured Threads - CW 35.2011</title><content type="html">Here is a list of interesting, featured threads posted on Calendar Week 35 - between 28.08 and 04.09&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;For a start - one thread trying to analyze our how our language is popular in different countries (trying to repeat the success of this thread ?) - the one posted by&amp;nbsp;&lt;a href="http://au.linkedin.com/in/ethanho"&gt;Ethan Boon Liat HO&lt;/a&gt;:&amp;nbsp;&lt;a href="http://lnkd.in/d3rQuw"&gt;How is PHP job and reputation fairing in your country? How is PHP mainly used by clients?&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Also we have a bit similar one -&amp;nbsp;&lt;a href="http://lnkd.in/XCPHa3"&gt;What advantages come with utilizing open source languages rather than other, sometimes more popular, languages?&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://www.linkedin.com/pub/alyssa-fenwick/16/a72/359"&gt;Alyssa Fenwick&lt;/a&gt;&amp;nbsp;and regarding the popularity of languages such as PHP against "commercial" languages such as Java or .NET.&lt;br /&gt;
&lt;br /&gt;
A very nice thread, regarding some technical things on PHP started by&amp;nbsp;&lt;a href="http://ar.linkedin.com/in/fernandojaviermartin"&gt;Fernando Javier Martin&lt;/a&gt; -&amp;nbsp;&lt;a href="http://lnkd.in/_RaSDh"&gt;Top 10 Wrong Ideas About PHP That You Should Get Right&lt;/a&gt; - pretty active thread, might be very useful for newbies, but definitely not only...&lt;br /&gt;
&lt;br /&gt;
Although we are a group of PHP language, I suppose however there are only quite few of us that does not use database - that is why the&amp;nbsp;&lt;a href="http://lnkd.in/AJ6W6D"&gt;is it possible to use 2 tables in a single query situated in 2 databases? please suggest&lt;/a&gt; thread started by &lt;a href="http://in.linkedin.com/in/tonmoytewary"&gt;Tonmoy Tewary&lt;/a&gt; can be also interesting for most of all.&lt;br /&gt;
Staying on the database topic I would like also to mention thread mostly for all the people working on a bit old databases - maybe creating a new UIs for them -&amp;nbsp;&lt;a href="http://lnkd.in/JuASPU"&gt;How to read data from DBF file?&lt;/a&gt; started by&amp;nbsp;&lt;a href="http://pl.linkedin.com/in/niziol"&gt;Krzysztof Niziol&lt;/a&gt;.&lt;br /&gt;
And the last, but not least from database, but also application testing -&amp;nbsp;&lt;a href="http://lnkd.in/ScKVTw"&gt;Database tests with PHPUnit and PHPUnit_Extensions_Database_TestCase don't work (regarding to automate setup an teardown of the database fixture)&lt;/a&gt; started by&amp;nbsp;&lt;a href="http://de.linkedin.com/pub/jens-sieckmann/3a/53/135"&gt;Jens Sieckmann&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
From an application testing area there is also one thread started personally by&amp;nbsp;&lt;a href="http://pl.linkedin.com/in/wzielinski"&gt;me&lt;/a&gt;&amp;nbsp;- but I suppose once we will have more opinions it will be useful for everybody developing websites and applications -&amp;nbsp;&lt;a href="http://lnkd.in/-RXtAp"&gt;Automated back-box test tool - any recommendations ?&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Regarding frameworks - we have also a nice thread for framework selection for a specific purpose (maybe only too simply described) -&amp;nbsp;&lt;a href="http://lnkd.in/7bpYAP"&gt;What is the best frame work for linkedin like site, but not so big?&lt;/a&gt; started by&amp;nbsp;&lt;a href="http://in.linkedin.com/pub/asha-angel/21/354/926"&gt;Asha Angel&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I would also not be myself if I would not have mentioned a thread covering systems architecture issues -&amp;nbsp;&lt;a href="http://lnkd.in/t-nd_Z"&gt;When architecting your MVC apps, where are you putting your business logic?&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://www.linkedin.com/in/keithdaulton"&gt;Keith Daulton&lt;/a&gt;. I think promoting the best practices for programming, also by asking such questions and checking out the opinions is more then welcome.&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/ZIHqj0aMGEA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/5515266466659058677/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/09/linkedphpers-featured-threads-cw-352011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/5515266466659058677?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/5515266466659058677?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/ZIHqj0aMGEA/linkedphpers-featured-threads-cw-352011.html" title="LinkedPHPers Featured Threads - CW 35.2011" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/09/linkedphpers-featured-threads-cw-352011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04DQ308fyp7ImA9WhdWEk4.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-5770851273361800069</id><published>2011-09-05T00:28:00.000+02:00</published><updated>2011-09-05T16:12:52.377+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-05T16:12:52.377+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><title>LinkedPHPers Monthly Newsletter - 09.2011</title><content type="html">Dear LinkedPHPers Fellow Members,&lt;br /&gt;
&lt;br /&gt;
This monthly newsletter is the first for the monthly newsletters series I would like to start and continue in the future. The general idea is to try to present you some short summary what happened on our group in the last month, some nice topics started on this time, as well as some organizational information.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;So - first of all - some statistics. On the day I am writing this text (04.09.2011) we are 29 254 members strong (I just accepted 13 new members in our group :) ), which makes us the largest PHP-related group in LinkedIn. The other PHP-related groups I have found on LinkedIn are significantly smaller - PHP developers with 22,8k members and few other 2-5k members. Such stats also makes us one of the largest, technically-focused groups on the whole LinkedIn - and a nice community generally in the Internet :)&lt;br /&gt;
&lt;br /&gt;
What I find the key of our success is the famous, and quite &lt;a href="http://lnkd.in/PMa22u"&gt;much discussed&lt;/a&gt;, &lt;a href="http://www.linkedphpers.org/p/linkedphpers-group-rules.html"&gt;strict rules&lt;/a&gt; regarding the spam on our group - and most of all the fact, that the job offerings has to go to the place they should be posted to, not to discussions. However till this moments there were number of people, that did not wanted to understand that, or thought we will not see them breaking the rules. They were wrong - and now they are removed and blocked from the group - all 1084 of them...&lt;br /&gt;
&lt;br /&gt;
Nevertheless you can see we are closing to 30k members. I hope we will be able to get to this number still this month - especially that we have grown to the current number in 3 years (the very first member,&amp;nbsp;&lt;a href="http://uk.linkedin.com/pub/stephanie-david/7/25b/88b"&gt;Stephanie David&lt;/a&gt; has joined us 20.03.2008). Of course the group dynamics was changing over a time - unfortunately LinkedIn does not provide a tools, that would allow me to check out the whole time dynamics, and doing it manually is quite a difficult task. As far as I have checked the last month 2017 new members has joined our group (and not yet removed :) ) which means we are growing average over 65 members a day. So as I said - gaining 30k on 09.2011 is even more then possible.&lt;br /&gt;
&lt;br /&gt;
The group is not only large, but really active one. As I counted we have over 80 interesting threads started only last month, commented 544 times, which gives us average over 6 comments per each thread started. The &lt;a href="http://lnkd.in/WvynQn"&gt;most commented discussion&lt;/a&gt; was actually started a bit earlier then 08.2011 - but it's still active with 144 comments.&lt;br /&gt;
&lt;br /&gt;
Basically on 08.2011 I have also started to make our group blog a bit more active - you can see &lt;a href="http://www.linkedphpers.org/2011_08_01_archive.html"&gt;7 articles posted only on August&lt;/a&gt; and including the Weekly Featured Threads series, a &lt;a href="http://www.linkedphpers.org/2011/08/webapplications-part-4-dictionary-data.html"&gt;new article about WebApplications focusing on dictionary data&lt;/a&gt;, and 2 nice articles written by &lt;a href="http://www.linkedin.com/in/manzwebdesigns"&gt;Bud Manz&lt;/a&gt;. Several &lt;a href="http://lnkd.in/bZAcAd"&gt;other group fellows also promised a new articles&lt;/a&gt; - I will not point out the names in here, but I would like however to take this opportunity to remind them about that :)&lt;br /&gt;
&lt;br /&gt;
From the organizational point of view I have started also several additional initiatives regarding our group - which are:&lt;br /&gt;
- &lt;a href="http://www.facebook.com/pages/LinkedPHPers/121726194580178"&gt;our Facebook fanpage&lt;/a&gt; - please, if you have a FB account - &lt;a href="http://www.facebook.com/pages/LinkedPHPers/121726194580178"&gt;join us and like us&lt;/a&gt; there as well and tell us about it on &lt;a href="http://lnkd.in/hWQ3zP"&gt;this thread&lt;/a&gt; :)&lt;br /&gt;
- a Google Plus circles initiative - present yourself on &lt;a href="http://lnkd.in/ysHRxh"&gt;this thread&lt;/a&gt; and join with other LinkedPHPers on G+ :)&lt;br /&gt;
- a thread for promoting members scripts and systems - &lt;a href="http://lnkd.in/ARt2Gr"&gt;see this thread&lt;/a&gt;&lt;br /&gt;
- a new logo for our group - as you can see we still use the "standard" PHP logo on our group. I would like to really invite anyone to raise their proposals for our logo - you can do it in &lt;a href="http://lnkd.in/whS3kh"&gt;this thread&lt;/a&gt; on our group...&lt;br /&gt;
&lt;br /&gt;
OK - that would be all for this newsletter - to be honest, it already grown a bit larger, then I expected once starting writing it :) But I still hope you like it, as well as an idea of receiving such newsletter once a month :)&lt;br /&gt;
&lt;br /&gt;
Of course if you have any suggestions or thoughts on what I could also include in such correspondence - please feel free to let me know :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/3bhiFYa2ox4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/5770851273361800069/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/09/linkedphpers-monthly-newsletter-092011.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/5770851273361800069?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/5770851273361800069?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/3bhiFYa2ox4/linkedphpers-monthly-newsletter-092011.html" title="LinkedPHPers Monthly Newsletter - 09.2011" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/09/linkedphpers-monthly-newsletter-092011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMFQXo-fSp7ImA9WhdXGEQ.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-839223271987438929</id><published>2011-09-01T17:52:00.000+02:00</published><updated>2011-09-01T17:53:30.455+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-01T17:53:30.455+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="licensing" /><category scheme="http://www.blogger.com/atom/ns#" term="algorythms" /><category scheme="http://www.blogger.com/atom/ns#" term="warning" /><category scheme="http://www.blogger.com/atom/ns#" term="reporting" /><title>LinkedPHPers Featured Threads - CW 34.2011</title><content type="html">The most interesting and nice threads started on CW 34.2011 on LinkedPHPers group - here they are:&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;For the start - a nice thread or a poll regarding the licenses developers likes the most:&lt;br /&gt;
&lt;div&gt;
&lt;a href="http://lnkd.in/SSvDub"&gt;Which Open Source License?&lt;/a&gt;&amp;nbsp;posted by&amp;nbsp;Murat Fatih Cetinkaya&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The next ones I liked very much are connected with reporting from the web applications created in PHP:&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://lnkd.in/Yq3VCM"&gt;Which PHP framework to choose when developing Reports?&lt;/a&gt; - posted by&amp;nbsp;&lt;a href="http://pk.linkedin.com/in/salmankhwaja"&gt;Salman, Khwaja Muhammad&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://lnkd.in/RQePjX"&gt;I wanna ask ... what are the best practices, methods, steps, special software, thirdy parties or whatever else about creating or generating written reports from mysql tables using php mainly&lt;/a&gt; posted by &lt;a href="http://mx.linkedin.com/pub/hector-rojas/29/4b3/487"&gt;Hector Rojas&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
My company created a tool for reporting from different datasources, but as far as I know many people are facing the problem with finding a good, suitable reporting solution for their applications. These threads might be really helpful for them...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Also the very nice thread from "the riddles" series - something that worked before, and suddenly stopped working without any code changes :) I must admit never faced such a situation by myself (but my programmers many times says that the did not change anything, but it stopped working without any reason :) ) but this one proves, that there actually are such situations:&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://lnkd.in/sC8a4g"&gt;I had a piece of code that was working fine in the morning, but was intermittently problematic in the afternoon. Here's what happened&lt;/a&gt;. posted by&amp;nbsp;&lt;a href="http://www.linkedin.com/pub/david-brumbaugh/2/127/627"&gt;David Brumbaugh&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
So all PMs and Team Leaders - before start saying, it impossible that something worked and then stopped - check this one out :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
And the last, but a great one. Maybe there is no too much content in there - however such warnings are really very welcome on our group:&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://lnkd.in/28MZUX"&gt;Major bug found in PHP 5.3.7&lt;/a&gt; posted by&amp;nbsp;&lt;a href="http://www.linkedin.com/pub/tyler-bell/39/67b/137"&gt;Tyler Bell&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
By the way - if you found this useful, you stopped the migration because of that information - let the people know about this - at least "liking" this discussion. Person that took his time to report that will know, that time was not lost :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/dntXPzB6oL4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/839223271987438929/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/09/linkedphpers-featured-threads-cw-342011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/839223271987438929?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/839223271987438929?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/dntXPzB6oL4/linkedphpers-featured-threads-cw-342011.html" title="LinkedPHPers Featured Threads - CW 34.2011" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/09/linkedphpers-featured-threads-cw-342011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IBQHk-eCp7ImA9WhdXEUw.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-2403453979757685145</id><published>2011-08-23T16:58:00.000+02:00</published><updated>2011-08-23T16:59:11.750+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-23T16:59:11.750+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="newbies" /><category scheme="http://www.blogger.com/atom/ns#" term="algorythms" /><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><title>LinkedPHPers Featured Threads - CW 33.2011</title><content type="html">The next portion of interesting threads posted on Calendar Week 33 - 15.08 - 21.08&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;This week we had several, maybe quite in-detail, but interesting questions or comments about the language and algorythms - here they are:&lt;br /&gt;
&lt;a href="http://lnkd.in/VbeRMj"&gt;Tip'o'the day: on-the-fly PHP objects&lt;/a&gt; - started by&amp;nbsp;&lt;a href="http://ca.linkedin.com/in/nicolasbouliane"&gt;Nicolas Bouliane&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://lnkd.in/ddpT8x"&gt;Interview Puzzles&lt;/a&gt; - started by&amp;nbsp;&lt;a href="http://in.linkedin.com/pub/gaurav-khanna/2b/249/13"&gt;Gaurav Khanna&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://lnkd.in/mpM-JS"&gt;Anyone can change the value of two variable without using third variable. For example a=20, b=25. when echo show a=25 and b=20 . It is very interesting.&lt;/a&gt; - started by&amp;nbsp;&lt;a href="http://in.linkedin.com/pub/pradip-sharma/20/bb2/aa5"&gt;Pradip Sharma&lt;/a&gt;&lt;br /&gt;
I think it's really worth to take a look, maybe try to resolve these problems by yourself. Nice brain excercise - especially for new programmers, while the experienced ones sometimes should take them as well :)&lt;br /&gt;
&lt;br /&gt;
We had also a nice discussion regarding the general programming best practices - especially one of the software development technique called Test-Driven-Development - take a look how it can be implemented in PHP on thread started by &lt;a href="http://co.linkedin.com/pub/cesar-reyes/31/981/a49"&gt;Cesar Reyes&lt;/a&gt; and called&amp;nbsp;&lt;a href="http://lnkd.in/jAj3wF"&gt;What about TDD ??&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
And the last, but not least featured one - regarding what's upcoming and how do you like it -&amp;nbsp;&lt;a href="http://lnkd.in/ZZyGik"&gt;What new feature in PHP 5.4 is most important to you?&lt;/a&gt; started by&amp;nbsp;&lt;a href="http://uk.linkedin.com/in/g4egk"&gt;Greg Knapp&lt;/a&gt;. Not many people yet expressed their feelings about the question asked - but maybe this thread will develop and some of our suggestions will be taken under consideration of PHP developers :)&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/TqaMkqd78hU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/2403453979757685145/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/08/linkedphpers-featured-threads-cw-332011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/2403453979757685145?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/2403453979757685145?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/TqaMkqd78hU/linkedphpers-featured-threads-cw-332011.html" title="LinkedPHPers Featured Threads - CW 33.2011" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/08/linkedphpers-featured-threads-cw-332011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYMQHk5fSp7ImA9WhdQFU4.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-4839094387186373252</id><published>2011-08-16T14:52:00.000+02:00</published><updated>2011-08-16T23:29:41.725+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-16T23:29:41.725+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="dictionary data" /><category scheme="http://www.blogger.com/atom/ns#" term="framework" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="cobaex" /><category scheme="http://www.blogger.com/atom/ns#" term="applications" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>WebApplications - part 4 - dictionary data</title><content type="html">&lt;div style="text-align: justify;"&gt;
The last article from the &lt;a href="http://www.linkedphpers.org/search/label/cobaex"&gt;WebApplications&lt;/a&gt; series was &lt;a href="http://www.linkedphpers.org/2009/05/webapplications-part-3-user-and-data.html"&gt;published really long time ago&lt;/a&gt;. Since then blog has been "promoted" to main &lt;a href="http://www.linkedin.com/groups?about=&amp;amp;gid=40870"&gt;LinkedPHPers&lt;/a&gt; group webpage, several other articles were published.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
But still this series was quite popular - so I think it's worth to continue it - right now describing some thoughts and our approach to &lt;b&gt;dictionary data&lt;/b&gt;, that was actually used on &lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX platform&lt;/a&gt;. The approach we use has proved itself in many customer implementations (hence &lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX&lt;/a&gt; is on the market already since 2009) and I think sharing our experience will be valuable.&lt;/div&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;
So - first of all the general question:&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;What actually is the dictionary data ?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
In most solutions I know, I used and I implemented the dictionary data was used in case of simple, single-field data. This data was accessible mostly on drop-downs as single or multiple choice elements.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Generally this approach is correct, however I do not think that dictionary data is only a single-value, unconnected data. We have extended the idea of dictionary data into multi-value and tree-type data. This means the dictionary may consist not only single field, but also multiple fields, as well as data may be organized in an hierarchical model. I know this might look like we have someway "downgraded" simple, basic objects &amp;nbsp;into dictionary data. Or there might be many questions (in fact asked by our new programmers quite frequently) when should they use the business objects, and when they should use the dictionary data ? The answer is in fact quite simple - we should use the dictionary data once the objects (as we do not deal only with single fields) has no functionality.This means that once the object does not have any methods implemented - then it should be a dictionary data.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;But getting to some real-life examples...&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
One of the most used example for dictionary data is gender selection. We basically have 3 selections accessible (male/female/not specified - in fact the last one may be represented by NULL value) - and nothing more. This way this is quite simple and can be easily accomplished by standard dictionary data.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
However let's go to just a little more complex situation - the city selection. In many systems this can be done by a single-value dictionary data. However we should remember, that it could be much easier if the city is connected to the region, then the region - to the country. In standard dictionary data we already get to the problem - hence in most cases we cannot link different dictionaries to each other. So in most cases we should create a new object for that - but generally the object will not deliver any business functionality.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
So here the most advanced dictionary data comes with a help - as we can link different dictionary data between themselves. We can have several fields with foreign keys to other tables, that stores different dictionary data (in the example we have 3 dictionary data sets: &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;city[ID, name, regionID]&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;region[ID, name, countryID]&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;country[ID, name]&lt;/span&gt;).&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The next problem is the data, that should be organized in a hierarchy. The example for that might be the device types in a &lt;a href="http://www.cobasolutions.com/business_software/en_service"&gt;service CRM applications&lt;/a&gt;. Here we have a single table with a data, but we will need at least 2 fields (+unique ID): data itself (a name or sth) and a field, that will reference to the parent object in the same data dictionary table - let's call it &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;devicetype[ID, name, parentID]&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
At the moment we have covered mostly all initial type of dictionary data, now let's go to a real complex example: we have devices that has specific types (stored in hierarchy), which types are provided in different countries. Additionally we have 2 types of device archives - the archived because the device is obsolete or archived because the device has manufacture problems.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;So let's try to model this using our dictionary data types...&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
We need following tables:&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;city[ID, name, regionID] &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;- linked dictionary data&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;region[ID, name, countryID] &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;- linked dictionary data&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;country[ID, name] &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;- simple dictionary data&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;archivetype[ID, name] &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;- simple dictionary data&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;devicetype[ID, name, parentID, countryID, archivetypeID] &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;- treetype, multivalue, linked dictionary data&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The model generally uses only the types we specified. No additional methods are needed - everything covered by these methods :)&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;And now the real thing - standardized management...&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Here we are coming to the real thing about storing everything in dictionary data. The reason why I propose you to make something like dictionary data as a standard is the way you manage it. Generally the dictionary data is something, that should have a centralized management, that should not be created by normal users, or even if it is needed - the dictionaries should not for sure be managed (I mean updated or deleted) by normal users. This is something, that is uploaded on the system production start, and then updated only if needed by an administrator.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
So this is the next thing, that distinguishes dictionaries from the standard user data (transactional data). The fact that it is administered by administrators - not standard users.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
And if the dictionary data has been someway standardized - we can create the standard interface and a standard development way to do that. Of course the ways of creating that part is very many - I will focus on our approach implemented in &lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX&lt;/a&gt;.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;How do we create a new dictionary data in COBAEX ?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Generally &lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX&lt;/a&gt; is based on a very object model, in which most objects are inherited from specific system classes. We have the class also for dictionary data - called &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;BIN_LIB_Dict&lt;/span&gt;, from which all the dictionary data inherits.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
This class is covering not standard functions or implements all the things described above. It delivers also standardized interface, which is basically generated basing on PHP classes. It means, that to create a dictionary data the only things we need to do are:&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
1. Create appropriate tables in the database&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
2. Create a class - a sample of such a class for device types (hierarchical type, without these archivetypes or limitation for country):&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: left;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;class APP_SVM_LIB_Dict_DeviceType extends BIN_LIB_Dict&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;protected $_uniqueValues = false;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;protected $_formStructure_parentname = '[DICT1::APP_SVM_LIB_Dict_DeviceType]';&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;protected $_formOrder_parentname = 200;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
and that's it !&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
What is then behind ? The standardized interface is created, and also once we will use this dictionary data field in our application - the appropriate control will be created as well.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Of course we can play around with fields, adding the additional fields or other dictdata links we need... But I wanted to show the most simple way to create the dictionary data - please also find below a picture of a standardized UI for different data types.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-wEUHGhs_sbk/Tkpkw_Jj6mI/AAAAAAABedM/xXerOyzXrqY/s1600/dictionary_data.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="116" src="http://2.bp.blogspot.com/-wEUHGhs_sbk/Tkpkw_Jj6mI/AAAAAAABedM/xXerOyzXrqY/s320/dictionary_data.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
You can of course create different datatypes - with data validation already implemented - please find below an example of different dictionary data type - service emails (a bit more complex, with multi-value data):&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;class APP_SVM_MDL_Dict_ServiceEmails extends BIN_LIB_Dict {&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;protected $_formStructure_value = '[EMAIL]';&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;protected $_formRequired_value = true;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;protected $_formStructure_name = '[TEXT::OBJECTNAME]';&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;protected $_formOrder_name = 10;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;protected $_formWidth_name = 250;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Few words of summary&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
I hope you like the approach I presented. I know this is very much on a high level - of anybody is interested in more details - just state you questions in the &lt;a href="http://lnkd.in/dSXdXH"&gt;LinkedPHPers thread&lt;/a&gt; or in the comments :)&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
What I plan to describe next ? Maybe a completely new way of inheriting ? Called OBJECT VARIANTS ? The completely new way of object inheritance - but working together with standard inheritance :)&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;i&gt;Note: All the techniques that were described in the article are implemented in the &lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX Environment&lt;/a&gt; created by &lt;a href="http://www.cobasolutions.com/en_start"&gt;COBA Solutions Sp. z o.o.&lt;/a&gt; and &lt;a href="http://pl.linkedin.com/in/wzielinski"&gt;I am&lt;/a&gt; fully elligible to describe them here as the CEO of COBA Solutions. If you wish to learn more about COBA Solutions, COBAEX platform, projects completed using this platform or standard product delivered using this environment - &lt;a href="http://pl.linkedin.com/in/wzielinski"&gt;contact me directly&lt;/a&gt; or send an email on &lt;a href="mailto:info@cobasolutions.com"&gt;info@cobasolutions.com&lt;/a&gt;.&lt;/i&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/z-AEojfmxZc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/4839094387186373252/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/08/webapplications-part-4-dictionary-data.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/4839094387186373252?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/4839094387186373252?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/z-AEojfmxZc/webapplications-part-4-dictionary-data.html" title="WebApplications - part 4 - dictionary data" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-wEUHGhs_sbk/Tkpkw_Jj6mI/AAAAAAABedM/xXerOyzXrqY/s72-c/dictionary_data.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/08/webapplications-part-4-dictionary-data.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4EQXo8eip7ImA9WhdQFEQ.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-9114861661637122463</id><published>2011-08-15T21:07:00.000+02:00</published><updated>2011-08-16T13:41:40.472+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-16T13:41:40.472+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="applications" /><title>LinkedPHPers Featured Threads - CW 32.2011</title><content type="html">The very next portion of featured threads, that were popular or interesting in &lt;b&gt;Calendar Week 32 - 08-14.08&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;a href="http://lnkd.in/kvWmMy"&gt;How good is PHP-GTK for desktop applications?&lt;/a&gt;&lt;br /&gt;
Something about creating the dekstop applications using our favourite programming language :) A nice problem posted by&amp;nbsp;&lt;a href="http://in.linkedin.com/pub/pooja-sarvaiye/2a/38/259"&gt;Pooja Sarvaiye&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/py8Whp"&gt;Question for the day – what is the best out put format for API? i.e. text, xml or etc? I would love to know…&lt;/a&gt;&lt;br /&gt;
A nice thread of APIs - for anyone wishing to make a scallable and open for other systems applications. I must admit I generally like the application-related threads - mostly becouse I work on PHP applications as well - therefore this one started by&amp;nbsp;&lt;a href="http://www.linkedin.com/pub/mark-kumar-photographer/22/552/701"&gt;Mark Kumar&lt;/a&gt; was one of my favourutes this week...&lt;br /&gt;
&lt;br /&gt;
I have to admit this week the amount of new discussions was not the largest one. However I would like to promote several discussions started directly by me, regarding some general group things. They mostly concerns:&lt;br /&gt;
- Group Promotion - on &lt;a href="http://lnkd.in/hWQ3zP"&gt;Facebook&lt;/a&gt; (&lt;a href="http://www.facebook.com/pages/LinkedPHPers/121726194580178"&gt;our fanpage&lt;/a&gt;) and &lt;a href="http://lnkd.in/ysHRxh"&gt;Google+&lt;/a&gt; (contact sharing)&lt;br /&gt;
- Group Recognition - &lt;a href="http://lnkd.in/whS3kh"&gt;an invitation for creating a logo for our group&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I would like also to invite you sharng your thoughts and knowledge on 2 discussions started by me:&lt;br /&gt;
&lt;a href="http://lnkd.in/V2asfU"&gt;SURVEY - PHP Framework for Web Portal&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://lnkd.in/aCxaxg"&gt;SURVEY - PHP Framework for Business Applications&lt;/a&gt;&lt;br /&gt;
Once we will have larger number of oppinions - I will try also to summarize the results on some article, which I believe will be quite interesting for both the newbies, as well as experienced group members :)&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/SqtLdA97sM4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/9114861661637122463/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/08/linkedphpers-featured-threads-cw-322011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/9114861661637122463?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/9114861661637122463?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/SqtLdA97sM4/linkedphpers-featured-threads-cw-322011.html" title="LinkedPHPers Featured Threads - CW 32.2011" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/08/linkedphpers-featured-threads-cw-322011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIHSHsyeyp7ImA9WhdRGUs.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-1098443205956176175</id><published>2011-08-10T09:15:00.000+02:00</published><updated>2011-08-10T09:15:39.593+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-10T09:15:39.593+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="newbies" /><category scheme="http://www.blogger.com/atom/ns#" term="framework" /><category scheme="http://www.blogger.com/atom/ns#" term="contest" /><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>LinkedPHPers Featured Threads - CW 31.2011</title><content type="html">OK - the next pack of featured threads for Weekly Featured Posts series - &lt;b&gt;Calendar Week 31 - 1-7.08&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Several threads suggested me by &lt;a href="http://ar.linkedin.com/in/fernandojaviermartin"&gt;Fernando Javier Martin&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/GgWuUC"&gt;What would be the best and most secure option to store customers' personal information and credit card details in a log in system?&lt;/a&gt;&lt;br /&gt;
Thread started by&lt;a href="http://uk.linkedin.com/in/dmanca"&gt;&amp;nbsp;Daniele Manca&lt;/a&gt; about some security/legal issues during e-commerce applications development. Nice comments - including the one made by&amp;nbsp;&lt;a href="http://uk.linkedin.com/in/romansmalinovskis"&gt;Romans Malinovskis&lt;/a&gt;&amp;nbsp;with very nice information about the legal aspects of this issue.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/G69EPK"&gt;Why does the PHP Singleton Design Pattern get a bad rap?&lt;/a&gt;&lt;br /&gt;
Design patterns is something every goof programmer should be familiar with. Unfortunatelly also in my own experience this does not look so nice. So all the discussions regarding this, just like the one started by&amp;nbsp;&lt;a href="http://www.linkedin.com/pub/nick-routsong/25/a3b/558"&gt;Nick Routsong&lt;/a&gt; are my favourites :) Let's spread the word about the good programming techniques !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And now several of my own choices:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/tfbGXk"&gt;Any recommendations on books for beginners? Located in the USA.&lt;/a&gt;&lt;br /&gt;
A very common question started by&amp;nbsp;&lt;a href="http://www.linkedin.com/in/stephensellers"&gt;Stephen Sellers&lt;/a&gt;. Might be very interesting for all the newbies, which are represented quite strongly in the group.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/6DvYb9"&gt;I Need suggestion to choose Framework to develop a very high Traffic web ERP Application On PHP with Oracle....... Also need suggestion if I should go for a framework for this or not??&lt;/a&gt;&lt;br /&gt;
Questions like the one asked by&amp;nbsp;&lt;a href="http://in.linkedin.com/in/dharm0306"&gt;Dharmendra Sharma&lt;/a&gt; also is quite common - generally people asks about the frameworks they can use for their work. The thing I like with this question is the fact, that&amp;nbsp;Dharmendra mentioned the case, he needs to use the framework for. And having this - we really might give any reasonable information :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I would like to point out also several interesting discussions regarding some riddles for PHP programmers - it's really nice place to start for all people wishing to make themsleves a better programmers:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/Xx-abH"&gt;Any one can predict the answer for following code snippet ? It is very interesting &lt;!--?php echo (int) ( (0.1+0.7) * 10 ); ?--&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/XMxAmk"&gt;Next Riddle.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Thanks for them,&amp;nbsp;&lt;a href="http://in.linkedin.com/in/jayeshambali"&gt;Jayesh&lt;/a&gt; and&amp;nbsp;&lt;a href="http://uk.linkedin.com/in/romansmalinovskis"&gt;Romans&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
OK - that's it for this week. I also would like to ancourage anyone that would like to give me their suggestions - just send me a message with a thread you thing might be interesting, and if it is - I will for sure publish it in the next post of this series :)&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/mZ1jZIOBLu8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/1098443205956176175/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/08/linkedphpers-featured-threads-cw-312011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/1098443205956176175?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/1098443205956176175?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/mZ1jZIOBLu8/linkedphpers-featured-threads-cw-312011.html" title="LinkedPHPers Featured Threads - CW 31.2011" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/08/linkedphpers-featured-threads-cw-312011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IGRHY8cCp7ImA9WhdRFEs.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-1799855438048095231</id><published>2011-08-04T04:22:00.000+02:00</published><updated>2011-08-04T14:38:45.878+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-04T14:38:45.878+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="date manipulation" /><category scheme="http://www.blogger.com/atom/ns#" term="newbies" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorial" /><title>Working with Dates using PHP</title><content type="html">This is a copy of the tutorial that I wrote on SlashDot that gives a brief overview of how to manipulate dates using PHP. This example comes from a script that I wrote for a customer who wanted to expire downloads and clean up the directory tree based on the number of days that passed since the download was requested.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
This script is called by a cron job at midnight every day.&amp;nbsp;To do this, I created a MySQL table in their database called “downloads” that is used to keep track of the dates and other information that was gathered at the time of the user’s request. But, since that is another topic for another day, I will refrain from discussing the sign-up form and database structure. At the top of the script, I put in the include for the file that contains my MySQL connection class. As you will see in later code, this class has a method (doSQL()) that returns an array that contains the number of records in the 1st (0th) element and the resource that holds the data requested in the 2nd (1st) element…&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;tt&gt;&amp;lt;?php require './MySQL.php'; ?&amp;gt;&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
… then I set the appropriate directory that contains the downloads and retrieve the content resource into a variable for parsing…&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;tt&gt;$dir  = './downloads';&lt;br /&gt;
&lt;br /&gt;
$dir_content = scandir($dir);&lt;/tt&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
…then I set the timezone to my locale and create a variable ($myDate) that contains the current date in a format that can be used in MySQL…&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;tt&gt;$myTZ = 'America/Detroit';&lt;br /&gt;
&lt;br /&gt;
$myNewTZ = new DateTimeZone($myTZ);&lt;br /&gt;
&lt;br /&gt;
$Date = date_create(date("Y-m-d H:i:s"));&lt;br /&gt;
&lt;br /&gt;
date_timezone_set ($Date, $myNewTZ);&lt;br /&gt;
&lt;br /&gt;
$myDate = date_format($Date, "Y-m-d H:i:s");&lt;/tt&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Once this is accomplished, I convert the date into the julian date format by parsing out the date into an array that contain the Month, Day and Year and storing it in a variable ($julian_date)…&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;tt&gt;$Date_Array = date_parse($myDate);&lt;br /&gt;
&lt;br /&gt;
$julian_date = gregoriantojd($Date_Array["month"], $Date_Array["day"], $Date_Array["year"]);&lt;/tt&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Then I loop through the entire directory structure looking for the julian date of the date of download.  The directory tree is ./downloads/$julian_date/[user_email]/[filename.zip].&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;tt&gt;$db = &amp;amp;new MySQL();&lt;br /&gt;
&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;$email = 'you@youremail.com';&lt;br /&gt;
&lt;br /&gt;
$failed_subject = 'Expired Downloads Procedure failed!';&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$found_subject = 'Expired Downloads';&lt;br /&gt;
&lt;br /&gt;
$message = '';&lt;br /&gt;
&lt;br /&gt;
$filename = '/&lt;your_filename.zip&gt;';&lt;br /&gt;
&lt;br /&gt;
foreach($dir_content as $key =&amp;gt; $content) {&lt;br /&gt;
&lt;br /&gt;
if($julian_date - $content &amp;gt; 30 &amp;amp;&amp;amp; $content !== '.' &amp;amp;&amp;amp; $content !== '..') {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$SQL = "select `download_id`, `download_dir`, `user_name`, `email` from `downloads` where `download_dir` like '%" . $content . "%';";&lt;/your_filename.zip&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt; $pArray = @$db-&amp;gt;doSQL($SQL);&lt;br /&gt;
&lt;br /&gt;
$res = $pArray{0};&lt;br /&gt;
&lt;br /&gt;
$cnt = $pArray{1};&lt;br /&gt;
&lt;br /&gt;
if($cnt &amp;gt; 0) {&lt;br /&gt;
&lt;br /&gt;
while($row = mysql_fetch_array($res)) {&lt;br /&gt;
&lt;br /&gt;
if(!removeResource($row['download_dir'] . $filename)) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print("Delete unsuccessful. $message\n");&lt;br /&gt;
&lt;br /&gt;
} else {&lt;br /&gt;
&lt;br /&gt;
$message .= 'User: ' . $row['user_name'] . ' (' . $row['email'] . ') ' . $row['download_dir'] . "\n";&lt;br /&gt;
&lt;br /&gt;
rmdir($row['download_dir']);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
rmdir('./downloads/' . $content);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!empty($message)) {&lt;br /&gt;
&lt;br /&gt;
mail($email, $found_subject, $message);&lt;br /&gt;
&lt;br /&gt;
}&lt;/tt&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
When the process encounters a difference of 30 days or more, it calls a user function (removeResource) that I reaped (among other pieces of this script) from the web that removes the download and the directory structure under the downloads directory that held them. (I don’t know where I got the function from and google doesn’t retrieve it. If anyone knows where it is from, let me know and I will gladly give credit!)&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;tt&gt;function removeResource( $_target ) {&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;//file?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if( is_file($_target) ) {&lt;br /&gt;
&lt;br /&gt;
echo $_target . ' (file)&lt;br /&gt;
';&lt;br /&gt;
&lt;br /&gt;
if( is_writable($_target) ) {&lt;br /&gt;
&lt;br /&gt;
if( @unlink($_target) ) {&lt;br /&gt;
&lt;br /&gt;
return true;&lt;br /&gt;
&lt;br /&gt;
} else {&lt;br /&gt;
&lt;br /&gt;
mail($email, $failed_subject, $message);&lt;br /&gt;
&lt;br /&gt;
die("File delete unsuccessful. $message\n");&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;return false;&lt;br /&gt;
&lt;br /&gt;
}&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;//dir?&lt;br /&gt;
&lt;br /&gt;
if( is_dir($_target) ) {&lt;br /&gt;
&lt;br /&gt;
echo $_target . ' (dir)&lt;br /&gt;
';&lt;br /&gt;
&lt;br /&gt;
if( is_writeable($_target) ) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
foreach( new DirectoryIterator($_target) as $_res ) {&lt;br /&gt;
&lt;br /&gt;
if( $_res-&amp;gt;isDot() ) {&lt;br /&gt;
&lt;br /&gt;
unset($_res);&lt;br /&gt;
&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
}&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;if( $_res-&amp;gt;isFile() ) {&lt;br /&gt;
&lt;br /&gt;
removeResource( $_res-&amp;gt;getPathName() );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} elseif( $_res-&amp;gt;isDir() ) {&lt;br /&gt;
&lt;br /&gt;
removeResource( $_res-&amp;gt;getRealPath() );&lt;br /&gt;
&lt;br /&gt;
}&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;unset($_res);&lt;br /&gt;
&lt;br /&gt;
}&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;if( @rmdir($_target) ) {&lt;br /&gt;
&lt;br /&gt;
return true;&lt;br /&gt;
&lt;br /&gt;
} else {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
die("Directory delete unsuccessful.");&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
} else {&lt;br /&gt;
&lt;br /&gt;
die("$_target is not writable.");&lt;br /&gt;
&lt;br /&gt;
}&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;return false;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;/tt&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
That concludes my tutorial on working with dates using PHP.&lt;br /&gt;
&lt;br /&gt;
Come and check out my website found at &lt;a href="http://www.blogger.com/" rel="nofollow"&gt;http://www.manzwebdesigns.com/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Thanks for taking the time out of your day to read my post!&lt;br /&gt;
&lt;br /&gt;
Bud Manz&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/hmY0kXULW40" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/1799855438048095231/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/08/working-with-dates-using-php-tutorial.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/1799855438048095231?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/1799855438048095231?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/hmY0kXULW40/working-with-dates-using-php-tutorial.html" title="Working with Dates using PHP" /><author><name>Bud Manz</name><uri>http://www.blogger.com/profile/00829643103134753539</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-GpnhfAPGv8k/Tj-8R0sgBXI/AAAAAAAAAAw/nIb8IpjQBnc/s220/Bud_Manz.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/08/working-with-dates-using-php-tutorial.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEENSXY7eyp7ImA9WhdRFEk.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-1378536553503237228</id><published>2011-08-03T22:46:00.000+02:00</published><updated>2011-08-04T09:24:58.803+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-04T09:24:58.803+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="newbies" /><category scheme="http://www.blogger.com/atom/ns#" term="ajax" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorial" /><title>Dynamic Page Content Replacement using AJAX and PHP Tutorial</title><content type="html">&lt;div style="text-align: left;"&gt;In this tutorial, I will show you how to use PHP and jQuery to dynamically change webpage content.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;/div&gt;&lt;em&gt;All this code should be done in the &amp;lt;HEAD&amp;gt; portion of your index page:&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
Include the various javascript files needed:&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;script type="text/javascript" src="jquery-1.3.2.min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: left;"&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;script type="text/javascript" src="jquery.history.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
Create a PHP multi-dimensional array of all pages:&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$pages = Array(&lt;/span&gt;&lt;br /&gt;
&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;Array(page =&amp;gt; ‘main.php’, title =&amp;gt; ‘Home’, hash =&amp;gt; ‘main’),&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;Array(page =&amp;gt; ‘portfolio.php’, title =&amp;gt; ‘Portfolio’, hash =&amp;gt; ‘portfolio’),&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;Array(page =&amp;gt; ‘templates.php’, title =&amp;gt; ‘Templates’, hash =&amp;gt; ‘templates’),&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;Array(page =&amp;gt; ‘price.php’, title =&amp;gt; ‘Pricing’, hash =&amp;gt; ‘price’),&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;Array(page =&amp;gt; ‘contact.php’, title =&amp;gt; ‘Contact Us’, hash =&amp;gt; ‘contact’),&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;Array(page =&amp;gt; ‘policy.php’, title =&amp;gt; ‘Privacy Policy’, hash =&amp;gt; ‘policy’)&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;);&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: left;"&gt;Since PHP is pre-processed at the server, we can use the array created above to populate a javascript associative array:&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// [CDATA[&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;var pages = [&lt;/span&gt;&lt;br /&gt;
&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;?php&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$i = 0;           // count variable&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$end = "' },\n";   // variable for the end of the array variable&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$page_count = count($pages); // number of pages for the site&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;foreach ($pages as $page) {  // Iterate through the PHP array&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;if ($i++ == $page_count) {      // current page is last page,&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 90px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$end = "' }\n";       //   close the array.&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;echo "\t\t{ title: '{$page['title']}’, hash: ‘” . $page['hash'] . $end;           // output the array values for the javascript array&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;];&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// ]]&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;script type=”text/javascript”&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// &amp;lt;!–&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// PageLoad function&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// This function is called when:&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// 1. after calling $.historyInit();&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// 2. after calling $.historyLoad();&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// 3. after pushing “Go Back” button of a browser&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;function pageload(hash) {&lt;/span&gt;&lt;br /&gt;
&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// hash contains a value, let’s use it.&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;if(hash) {&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// restore ajax loaded state&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// Load data from the server and place the returned HTML into&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;//   the matched element.&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$(“#art-content”).load(hash + “.php?noheader=false”,&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;null,&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;contentLoaded);  // javascript function contentLoaded() function is called&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;cur_hash = hash;&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;} else {   // otherwise, load the home page&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// start page&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$(“#art-content”).load(“main.php?noheader=false”,&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;null,&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;contentLoaded);&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;cur_hash = ‘main’;&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;?php&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$page['page'] = ‘main.php’;&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$(document).ready(function(){&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// After the DOM is done loading,&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// Initialize history plugin.&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// The callback is called at once by present location.hash.&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$.historyInit(pageload);&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// set onlick event for buttons&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$(“a[rel='history']“).click(linkClick);&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;});&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;function contentLoaded() {&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// for each page, make any links that go to that page&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// use the hash-mark href instead and have rel=’history’&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// so that they use the jquery history plugin to process&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// and load their content through ajax instead of a link&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$(function() {&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$.each(pages, function(i, val) {&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 90px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$(‘a[href=' + val['hash'] + ‘.php]’)&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 120px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;.attr(‘rel’, ‘history’)&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 120px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;.attr(‘href’, ‘#’ + val['hash'])&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 120px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;.click(linkClick);&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 90px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;});&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;});&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;if(cur_hash) {&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 90px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;cur_hash = cur_hash.replace(/^.*#/, ”);&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 90px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$(“a[rel='history']“).removeClass(‘active’);&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 90px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$(‘#l_’ + cur_hash).addClass(‘active’);&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 60px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;var cur_hash;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;function linkClick() {&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;cur_hash = this.href;&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;cur_hash = cur_hash.replace(/^.*#/, ”);&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// moves to a new page.&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// pageload is called at once.&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$.historyLoad(cur_hash);&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;$(‘#link’).attr(‘href’).valueOf() = cur_hash;&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;return false;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;// –&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: left;"&gt;For more info on the jQuery  Library, visit their website at &lt;a href="http://jquery.com/"&gt;http://jquery.com/&lt;/a&gt;.&lt;/div&gt;Now for the html part…&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: left;"&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;ul class="art-menu"&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;
&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;/*construct the menu from the item array built in the head section */&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;foreach ($pages as $item) {&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;echo “&amp;lt;li&amp;gt;&amp;lt;a id=\”l_{$item['hash']}\” href=\”{$item['page']}\”&amp;gt;&amp;lt;span class=\”l\”&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=\”r\”&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=\”t\”&amp;gt;{$item['title']}&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;\n”;&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;a href=”http://events.manzwebdesigns.com/” title=”Opens in new window” target=”_blank&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;span class=”l”&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=”r”&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;MWD Events&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="padding-left: 30px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;div class=”art-content”&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;!—jQuery code dumps the requested content here –&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/dXfMwNX8X-c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/1378536553503237228/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/08/dynamic-page-content-replacement-using.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/1378536553503237228?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/1378536553503237228?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/dXfMwNX8X-c/dynamic-page-content-replacement-using.html" title="Dynamic Page Content Replacement using AJAX and PHP Tutorial" /><author><name>Bud Manz</name><uri>http://www.blogger.com/profile/00829643103134753539</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-GpnhfAPGv8k/Tj-8R0sgBXI/AAAAAAAAAAw/nIb8IpjQBnc/s220/Bud_Manz.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/08/dynamic-page-content-replacement-using.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIMSX06cCp7ImA9WhdRGUs.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-3446873283247234250</id><published>2011-08-01T15:00:00.000+02:00</published><updated>2011-08-10T09:16:28.318+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-10T09:16:28.318+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="chat" /><title>LinkedPHPers Featured Posts - CW 30.2011</title><content type="html">The next post from the Weekly Featured Posts series - &lt;strong&gt;Calendar Week 30 - 25-31.07&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://lnkd.in/WvynQn"&gt;Where are located the best PHP developers?&lt;/a&gt;&lt;br /&gt;
Thread mentioned in &lt;a href="http://www.linkedphpers.org/2011/07/linkedphpers-featured-threads-cw-292011.html"&gt;previous entry&lt;/a&gt;, started by &lt;a href="http://www.linkedin.com/pub/federico-ulfo/24/183/35a"&gt;Federico Ulfo&lt;/a&gt;, staying on top with almost 100 comments (94 at the moment). Not very much technical - but still interesting :)&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/xHvs-B"&gt;how do i add live chat in my website?&lt;/a&gt;&lt;br /&gt;
Created by &lt;a href="http://pk.linkedin.com/pub/shahid-islam/35/731/509"&gt;Shahid Islam&lt;/a&gt;, might be interesting, as some kind of cookbook, or maybe more a resource&amp;nbsp;center for anyone wishing to create more responsive websites :)&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/UHwA4p"&gt;Do you think it is necessary for the developers to concentrate only on coding?&lt;/a&gt;&lt;br /&gt;
Thread created by &lt;a href="http://in.linkedin.com/pub/bedashree-chakraborty/26/325/923"&gt;Bedashree Chakraborty&lt;/a&gt; covering a bit broader topic then only programming. As I mentioned before - as a Project Manager I like posts regarding HR and management stuff.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/zUb_uZ"&gt;Equivalents in PHP for Application and Session events?&lt;/a&gt;&lt;br /&gt;
Thread started by &lt;a href="http://in.linkedin.com/pub/prahlad-yeri/16/a53/243"&gt;Prahlad Yeri&lt;/a&gt;, a person, that moved from the .NET hell into PHP heaven :) If you are also ready to start real programming, not playing around with .NET or other technologies - this thread might be one of the places you should start from :)&lt;br /&gt;
&lt;br /&gt;
Well - the last week was not so active, then &lt;a href="http://www.linkedphpers.org/2011/07/linkedphpers-featured-threads-cw-292011.html"&gt;previous one&lt;/a&gt;. I hope however the mentioned posts will be interesting - of course if I missed anything - just let me know :)&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/Sqm4YBRnlYY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/3446873283247234250/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/08/linkedphpers-featured-posts-cw-302011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/3446873283247234250?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/3446873283247234250?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/Sqm4YBRnlYY/linkedphpers-featured-posts-cw-302011.html" title="LinkedPHPers Featured Posts - CW 30.2011" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/08/linkedphpers-featured-posts-cw-302011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEGQno_eSp7ImA9WhdRGUs.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-5674753093410792564</id><published>2011-07-26T22:08:00.000+02:00</published><updated>2011-08-10T09:17:03.441+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-10T09:17:03.441+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="newbies" /><category scheme="http://www.blogger.com/atom/ns#" term="framework" /><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><title>LinkedPHPers Featured Threads - CW 29.2011</title><content type="html">&lt;div&gt;
With this post I will start a series of the posts, in which I would like to mention the most interesting (IMHO) threads that appeared on LinkedPHPers group. The order of the posts is not important - this just a listing of threads I really like and think they have quite nice discussion inside :)&lt;br /&gt;
I will do my best to do it in a weekly basis - so here we go with &lt;b&gt;Calendar Week 29 - 11-17.07&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://lnkd.in/d5aSwG"&gt;Any advice for a college student learning PHP?&lt;/a&gt;&lt;br /&gt;
Thread created by&amp;nbsp;&lt;a href="http://www.linkedin.com/in/chazgarrett"&gt;Charles Garrett&lt;/a&gt;&amp;nbsp;thread, in which I like the approach of a student that is really eager to get knowledge, that his/her new manager will be really interested in. As a employer I frequently meet students and graduates, that thinks that after studies they know everything, and expect me to be very proud of them. They do not care what I need - they only care what they think I will need. This thread makes me thinking positive, that there really are people, that thinks different :)&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/cXsSBt"&gt;Can someone tell me which is the advantage of using CakePHP compared with using Dreamweaver appling MVC pattern?&lt;/a&gt;&lt;br /&gt;
Discussion start by&amp;nbsp;&lt;a href="http://ar.linkedin.com/in/agmoreno"&gt;Manuel Agustin Moreno Marchese&lt;/a&gt;&amp;nbsp;with quite nice comparisons of these 2 programming techniques. I find it interesting also&amp;nbsp;because&amp;nbsp;it's promoting programming in a correct way - using design patterns, which is still not very common among PHP programmers.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/WvynQn"&gt;Where are located the best PHP developers?&lt;/a&gt;&lt;br /&gt;
This one has been started quite a long time ago by&amp;nbsp;&lt;a href="http://www.linkedin.com/pub/federico-ulfo/24/183/35a"&gt;Federico Ulfo&lt;/a&gt;&amp;nbsp;and it's staying in most active discussions all the time. With over 70 comments it's quite interesting how people likes their countries and regions - but also can be a good source if someone is considering the offshore programming :)&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/dWiuGz"&gt;Incentive for coders - how to track and manage ?? Please advise......&lt;/a&gt;&lt;br /&gt;
This thread started by&amp;nbsp;&lt;a href="http://uk.linkedin.com/in/anilvithani"&gt;Anil Vithani&lt;/a&gt;&amp;nbsp;interests me as a CEO of programming company. Eventhough it's not very active, hence the question is very interesting - and to be honest I hope that promoting this discussion in here might result with more answers, which I will be interested in as well :)&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lnkd.in/eJzRBr"&gt;I am considering to build application on Zend Framework, or we build our own Framework. Before jump into it, need you advise from good and bad points. Thanks for sharing.&lt;/a&gt;&lt;br /&gt;
Very frequent question, maybe a bit detailed regarding the specific framework asked by&amp;nbsp;&lt;a href="http://my.linkedin.com/in/ylchung"&gt;William Chung&lt;/a&gt;. Generally I heard many people asking themselves a question whether I will use some standard framework, or should I write one from the scratch. There are also ideas, that we will use specific framework, then we miss something about it, then we modify it, but we practically loose the possibility to upgrade the framework, or we have really much work with it. We can of course avoid it by using some specific techniques (some of them I described in this blog -&amp;nbsp;&lt;a href="http://www.linkedphpers.org/2009/04/webapplications-part-2-standard.html"&gt;WebApplications – part 2 – standard, customization, development…&lt;/a&gt;&amp;nbsp;article) - but they are not commonly used.&lt;br /&gt;
Generally - next time once you have such a problem - get back to this discussion - it might really help you in making a good decission :)&lt;br /&gt;
&lt;br /&gt;
OK - that would be all for this time. I hope you will like this series - if you think I should continue it, please let me know on LinkedIn commenting the update. Also any voices of criticism as always are very welcome :)&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/sP_u0OIWiMw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/5674753093410792564/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/07/linkedphpers-featured-threads-cw-292011.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/5674753093410792564?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/5674753093410792564?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/sP_u0OIWiMw/linkedphpers-featured-threads-cw-292011.html" title="LinkedPHPers Featured Threads - CW 29.2011" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/07/linkedphpers-featured-threads-cw-292011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQDQnY5cCp7ImA9WhdRFEg.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-8872830732986772748</id><published>2011-07-26T13:21:00.000+02:00</published><updated>2011-08-04T13:12:53.828+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-04T13:12:53.828+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><title>LinkedPHPers blog update</title><content type="html">As you might have noticed this blog has earned a new domain - it is currently available under www.linkedphpers.org. Of course the old address - linkedphpers.blogspot.com is still available however the main address that I would like to use for this blog is the new one.&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;For everyone that might not understand, why this domain has been selected for this blog - a few words of explanation. The blog itself has been created as a homepage for the &lt;a href="http://www.linkedin.com/groups/LinkedPHPers-Largest-PHP-Group-40870"&gt;LinkedIn PHP-related group LinkedPHPers&lt;/a&gt;. As the group grown into the largest PHP-related LinkedIn community, in last several weeks/months I have proposed to create a homepage for the group, as LinkedIn functionality is no longer enough for all the knowledge group&amp;nbsp;members&amp;nbsp;would like to share. The very first idea was to create a multi-functional community site - and the idea is still valid, however I think we should rather start with something a bit smaller as this blogsite - if you want to read more about this idea evaluation, &lt;a href="http://lnkd.in/iMzWMB"&gt;check out this thread&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;So here is the blogsite, for publishing the articles on which I would like to invite any of the LinkedPHPers group members. On &lt;a href="http://lnkd.in/bZAcAd"&gt;this thread&lt;/a&gt; I can see many people are interested in publishing and sharing knowledge - now it is the time and place to do that :)&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: right;"&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;Join the authors on this blog and publish your thoughts, ideas and share your knowledge.&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.linkedphpers.org/p/faq.html"&gt;&lt;b&gt;How to join the blog authors ?&lt;/b&gt; Here is all information you might need :)&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/t5eh9BGqQGI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/8872830732986772748/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/07/linkedphpers-blog-update.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/8872830732986772748?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/8872830732986772748?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/t5eh9BGqQGI/linkedphpers-blog-update.html" title="LinkedPHPers blog update" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/07/linkedphpers-blog-update.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMEQXs6eip7ImA9WhdRFEg.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-9220904723248235185</id><published>2011-03-12T12:41:00.000+01:00</published><updated>2011-08-04T13:13:20.512+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-04T13:13:20.512+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><title>Blog reactivation - Polish entries will be also published</title><content type="html">I know this blog has been "asleep" for quite a long time - however I would like to reactivate it.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
The very first reason for that is that the LinkedPHPers group has grown to the real large PHP community (more then 23 000 members and counting - the second large LinkedIn PHP-related group has only 14k members). We have already 2 moderators, that are doing a real great job - I would like to take this opportunity to thank them for that - thats &lt;a href="http://www.linkedin.com/in/sjmckearney"&gt;Scott McKearney&lt;/a&gt; and &lt;a href="http://www.linkedin.com/in/fernandojaviermartin"&gt;Fernando Javier Martin&lt;/a&gt;. They are really doing a great job with keeping the group clean and ordered, so we basically have no jobs or promotions in Discussions board - &lt;b&gt;thank you guys&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
But the blog, as it basically was before, will not cover only the LinkedPHPers group. I am going to publish here some additional views and thoughts about the interesting (IMHO) new web solutions, as well as some articles reagrding various web application development. I started some time ago with the series Web Applications, where I described several methods used in my companies flagship product - COBAEX. Of course, the produc itself has quite grown, as well as we developed quite a few additional applications working in COBAEX environment. I will continue describing them on this blog.&lt;br /&gt;
&lt;br /&gt;
But the largest change, that will happen is that I will start also publishing articles in my native language - Polish. However bcouse I understand this blog is read by many international people as well - to help them finding the articles in English only - I will prefix topics written in Polish by [PL] - so you will be able to easily distinguish the article language.&lt;br /&gt;
&lt;br /&gt;
I can assure you that I will do my best to post new messages and articles here as frequently as I will be able. My first goal is at least 1 article per week - and I am very optimistic that it will happen :) But how the reality will be - the time will show.&lt;br /&gt;
I really encourage you however to check out what's new - I promise you will find here more and more interesting information :)&lt;br /&gt;
&lt;br /&gt;
Wojtek Zielinski&lt;br /&gt;
LinkedPHPers Founder&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/9qLvugFgztM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/9220904723248235185/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2011/03/blog-reactivation-polish-entries-will.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/9220904723248235185?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/9220904723248235185?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/9qLvugFgztM/blog-reactivation-polish-entries-will.html" title="Blog reactivation - Polish entries will be also published" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2011/03/blog-reactivation-polish-entries-will.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ACQHwyeSp7ImA9WhdQFEQ.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-22962101364481908</id><published>2009-05-21T10:08:00.000+02:00</published><updated>2011-08-16T15:02:41.291+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-16T15:02:41.291+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="zend framework" /><category scheme="http://www.blogger.com/atom/ns#" term="cobaex" /><category scheme="http://www.blogger.com/atom/ns#" term="applications" /><category scheme="http://www.blogger.com/atom/ns#" term="postgres" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>WebApplications – part 3 – user and data access rights</title><content type="html">&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;After publishing the last article I thought there can be quite a discussion about that topics. Surprisingly – I noticed quite nice popularity connected with long time of single pageview (which makes me thinking someone has read it &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;), but no discussion at all. This might mean one of 2 things: either nobody liked it and thought it’s so poor, that not worth commenting, or everything was so clear, that no further comments are needed &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br /&gt;
Nevertheless to make myself feel better I will try to think about that fact in the second category &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt; And I will get to next promised topic – which is user rights and data access rights.&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;The general idea is I suppose quite simple – to provide specific users access to the functionalities they need and data they are eligible to see. From my perspective this goal can be achieved using 2 mechanisms:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ol start="1" style="margin-top: 0cm;" type="1"&gt;
&lt;li class="MsoNormal" style="mso-list: l2 level1 lfo2;"&gt;&lt;span lang="EN-US"&gt;Functionality access mechanism (&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;FAR&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; –      &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;i&gt;Functionality Access Rights&lt;/i&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;) – which means that we will allow or disallow      user to run specific functionality or process.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal" style="mso-list: l2 level1 lfo2;"&gt;&lt;span lang="EN-US"&gt;Data access mechanism (&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;DAR&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; – &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;i&gt;Data Access      Rights&lt;/i&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;) – which means that we will allows or disallow user to make      specific action on a specific data record/object. By action I mean standard      actions such as: select (view), update, delete; as well as some object      specific actions – e.g. changing the object status (if the object has the      status field).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;The main difference between FAR and DAR rights is the fact, that FAR rights applies to all objects user has access to, while DAR rights applies to one, single object. This means, that in scope of DAR user might be able to do specific operation on a specific object, while on another object he will not be able to do this operation. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Technically both mechanisms might (but do not have to) be completely disconnected and independent. From the business point of view however in most cases they will be dependent of themselves. That is why I have mentioned FARs above DARs – and wanted to show in this way the superiority of FARs above DARs. The reason why I see it in that way I can present on an example of specific object modification. This right should be implemented on a FAR – that user has the right to modify specific (e.g. invoice) object.&lt;br /&gt;
However once he tries to modify the object – the DAR mechanism first will check, if he’s able to access and modify the specific, named object.&lt;br /&gt;
But let’s look from another point of view – once the user has no FAR specific object modification right. Then even though user will have DAR access and modification right for a specific, named object – he will not be able to run the modification procedure, because FAR mechanism will block it.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;The above example might suggest that FAR and DAR mechanisms should rather be connected from a technical point of view. The reason why I suppose it’s not the best idea is the fact, that not always we might want to implement both mechanisms for all the object sets (object classes) in the system. Some objects might (from a business point of view) be needed to be accessed by every system user, while the insert/update/delete rights are row-independent (user has possibility to insert/update/delete object from the set or not – no matter which object it is). Then it is completely enough to implement these view/insert/update/delete rights on a FAR level.&lt;br /&gt;
Concluding this – I must say, that I do not recommend implementing the DAR rights everywhere it is possible. On the contrary – I recommend DAR mechanisms only where it is really needed. The reason is the fact, that DAR rights are really resource-consuming and lowers the performance – which I will describe a bit later…&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Functionality Access Rights (FAR) – more details&lt;/b&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Let me now focus a bit more on a FAR mechanisms.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Generally, as mentioned before these mechanisms are “protecting” access to specific functionalities. In COBAEX we are basing these mechanisms on following objects/processes:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"&gt;
&lt;span lang="EN-US"&gt;-&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;User right assignments – generally keeps the connection between specific FAR and user group/profile. This might work in several, different modes:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 72pt; mso-list: l0 level2 lfo1; text-indent: -18pt;"&gt;
&lt;span lang="EN-US" style="font-family: 'Courier New';"&gt;o&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;With object name (the classname for specific business object) and the binary value of rights: 0 – no right at all; 1 – select (view); 2 – insert (create new object of that type/class); 4 – update (modify the object); 8 – delete; 16 – extend (some kind of special modify right – which allows user to modify object, but only in the scope of filling the empty fields and connecting new objects – the second thing might be also protected by another FAR assignment).&lt;br /&gt;
The rights set can be easily extended for specific objects – e.g. in document-type objects right 32 might be creation of a follow-up document.&lt;br /&gt;
The byte-type right allows to put in the single number more then only 1 right – e.g. right value 17 will mean, that user is able to view and extend the object, while the right value 49 will add also creating follow-up document (while the user will not be allowed to e.g. delete object – no matter how the DAR rights will say).&lt;br /&gt;
System allows specifying different rights for different user roles in scope of specific object – e.g. different rights for object creator, different for object owner, different for object processor, and different for any other user.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 72pt; mso-list: l0 level2 lfo1; text-indent: -18pt;"&gt;
&lt;span lang="EN-US" style="font-family: 'Courier New';"&gt;o&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;With controller/action – which basically protects access to specific screen or functionality, which are specified on a controller/action basis.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"&gt;
&lt;span lang="EN-US"&gt;-&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;User groups/profiles – these are named profiles, that can be assigned to specific user. These profiles has specific rights assigned, and once assigned to a user (one or more profiles) – the FARs from  these profiles are summed.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;The system checks the rights in fully automatic and transparent mode. This means, that basic business object, as well as basic controller (in &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://framework.zend.com/manual/en/zend.controller.dispatcher.html"&gt;preDispatch()&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; – see &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://framework.zend.com/"&gt;Zend Framework&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; documentation) has the FAR check implemented.&lt;br /&gt;
This in most cases is a value, but might lead to some confusions:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ol start="1" style="margin-top: 0cm;" type="1"&gt;
&lt;li class="MsoNormal" style="mso-list: l3 level1 lfo3;"&gt;&lt;span lang="EN-US"&gt;The fact, that an application programmer      will forget to add appropriate right to the user once he will create a new      business object or controller extending standard classes. Then he will not      be able to understand (at first look) why he cannot work on it – only      after checking application debug logs, he will see, that the user rights      does not allow user to access or run specific functionality.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal" style="mso-list: l3 level1 lfo3;"&gt;&lt;span lang="EN-US"&gt;Once we have the FAR mechanism based on a      database, we cannot check these rights once we are not connected to the      DB. Lack of DB connection might have different sources – starting from the      fact we logon to the DB using our actual application user, ending with      some technical problem. But – especially once we have a technical problem      – we’d rather inform our user about that. Of course – we can prepare error      pages completely unconnected with standard &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; controllers – but this      is not very clean solution.&lt;br /&gt;
That is why it is possible to specify some FARs on an INI file – which      will be loaded before the DB rights will be acquired. These rights (in      most cases – the select/view (1) rights for controller/action) will be      loaded for user session – no matter then the user is or is not logged in.      They are some kind of “guest user” rights – allowing e.g. showing him a      logon screen, running the AJAX logon procedure or showing the error      screen.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;From a maintenance point of view FARs are grouped into the profiles, which in turn can be assigned (one or more) to a user. The rights from these profiles are summed – not only in the scope of items number, but also in the scope of value. This means, that once a user is assigned with 2 profiles, that has the same FAR right, but with different values – the logical sum of these rights is implemented – e.g. the right values are 3 (select and insert) and 17 (select and extend) – the user gets 19 (select, insert and extend).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Data Access Rights (DAR) – more details&lt;/span&gt;&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;These rights protects the specific data. This means they should rather be implemented on a data access level rather than on an application level.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;&lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; implements DAR rights directly on a database level. Object sets, that are protected by DAR mechanisms (not all – only the selected ones) are accessed not by a database table, but by special view. This view, from the application point of view is named and works completely like a table – application can select, insert and update on it. But once application is selecting the data, or trying to perform specific operation on a record – the view checks which records will be returned, as well as whether the operation can or cannot be performed by a specific (logged-in) user. The view also returns the value of actual user rights for specific object for the logged-in user.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;The way database view “knows” which user is logged in can be determined in 2 ways:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ol start="1" style="margin-top: 0cm;" type="1"&gt;
&lt;li class="MsoNormal" style="mso-list: l1 level1 lfo4;"&gt;&lt;span lang="EN-US"&gt;Database logon is performed using the      database user connected with application (business) user – meaning that      every application user is accessing the database with different DB user      (not like in most web applications I’ve seen – DB is accessed always by a      “superuser” and the whole data access check is in fact done on an      application level). Then once running an SQL command (e.g. SELECT on our      view) the DB knows which user is executing the command and can act in      appropriate way&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal" style="mso-list: l1 level1 lfo4;"&gt;&lt;span lang="EN-US"&gt;The data limitation and rights selection      is performed on an application level – not recommended, but sometimes      needed way. There are situations (mostly once we have our application in a      public hosted environment) where we cannot create DB users freely. Then      the view returns all the records for all currently logged-in users, and      application itself limits the query (by adding appropriate WHERE clause)      only to user, that is performing the query.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;In fact, from the application point of view both ways are programmed in the same way – because the WHERE clause is always appended. The most important difference is the fact, that in the first situation the view itself is resulting less records (because only the records for the executing user) and in the second situation, the view is returning more records, which are limited by WHERE.&lt;br /&gt;
From the performance point of view the overhead is not very large – but the real difference is on the security point of view. Once having different DB users, even if someone will logon directly to the DB using his username/password – selecting on a view will still result only with records he’s able to see from an application. In the second situation once the user will access the DB (or hack the application, using e.g. SQL injection, injecting something like “…OR 1” to avoid WHERE clause limiting the records from a view) – he will get access to all the data accessible by all currently logged-in users.&lt;br /&gt;
Besides the first solution has another added value, which is the fact, that database CAN be accessed bypassing the application, using some third-party solutions with actual username/password – and the data access rights will be still in place.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Now – the next question is actually how the inserts and updates can be done on a view. Many people does not know (or remember) the fact, that view can not only implement a &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://www.postgresql.org/docs/8.3/interactive/sql-createrule.html"&gt;rule on SELECT&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; (which specifies what will actually be returned by a view), but also on INSERT, UPDATE and DELETE. &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://www.postgresql.org/docs/8.3/interactive/sql-createrule.html"&gt;These rules&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; can do specific operations once trying to do these tasks on a view – especially can check the appropriate DARs and allow or deny the operation. And that’s it - simple, isn’t it &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt; ?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Now I suppose it’s also quite clear, why I was recommending, that only selected object sets should be protected by DARs. Since the DAR-protected objects are always accessed by views, which can be quite complicated (especially with Organizational Model implemented – see below) – the performance of these objects is really much lower, then the simple, table-accessed objects.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Automatic DARs assignment – the Organizational Model&lt;/b&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Basically I could finish this chapter on the above – however basing on an experience gained during creating pre-COBAEX web applications I found one more issue regarding data access rights. This issue was how to provide a user an easy, quick and functional way to assign the user rights.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;In the previous systems we delivered special screen, that allowed user to determine the user rights – that the user was able to specify, which profiles what operations will be able to do on a specific, named object. On default the system was either denying the object to all, or allowing the object to all the users. To make is a bit easier – we added a “Private” field for an object – private objects were denied to anyone unless it was defined differently by a user on an object, while other objects were shown to anyone (again unless user has denied object for specific users, profiles or groups).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;This approach was however still quite time-consuming – user had to specify the rights in a proper way for almost every single object. Therefore at the end of the day it appeared that users were not using these rights in an common way.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;We have came to the understanding, that there must be some mechanism, that will assign the data access rights in an automatic, but in the same time semi-intelligent way. The solution was the Organizational Model.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;The Organizational Model allows system administrator to implement the company organizational structure (with divisions / departments / locations etc.) and assign actual users to the actual levels. Then, on each and every level system administrator can define, basing on a user role in a specific level (e.g. division manager/standard user – byte-type roles) what operations for the objects created on this level or levels below a user can perform – e.g. user that has manager role in a Sales department can do anything with objects, that are in sales, public sales, and corporate sales divisions, while the standard user from the same division (level) can only view documents, that were created by other users.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;The whole mechanisms is based on a current object owner. The current object owner can be different, depending on a business purpose of specific object – it might be either a creator, an owner or processor. The current object owner can be also dependent on a current object status.&lt;br /&gt;
Nevertheless every object has some owner on a specific point of time. And depending on this owner and to which level of Organizational Model this owner is assigned to – the object rights are implemented for other users.&lt;br /&gt;
To make the mechanism more flexible system allows user to be assigned to more than one Organizational Model level. Also there is additional mechanism, that allows user to share objects implemented. I will however skip these 2 functionalities (for now at least – if someone would like to learn more about them – please let me know), as they are not the core of Organizational Model and will only complicate the whole topic.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Final words ?&lt;/b&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Well – again – I hope it was not too messy and too complicated. Again – on purpose I was not focusing on technical details, as I find this article rather as the architecture concept. And I hope you don’t mind that &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;You can also see right now, that I stopped going to different solutions, then the one that is implemented in &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;. The reason for that is the fact, that in fact there are now complete solutions for these purposes. Of course – there is &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://framework.zend.com/manual/en/zend.acl.html"&gt;Zend_Acl&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;, there are for sure some other classes or class sets – but most of all are more a prototypes, on which you can build the actual user or data access solutions. In fact the solutions built in COBAEX are very loosely based on &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://framework.zend.com/manual/en/zend.acl.html"&gt;Zend_Acl&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; – but the mechanism is really very extended &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;The next article – &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;dictionary data&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; – not only simple, but complex, connected and hierarchical &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt; I hope you will also like it…&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang="EN-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang="EN-US"&gt;&lt;i&gt;Note: All the techniques that were described in the article are implemented in the&amp;nbsp;&lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX Environment&lt;/a&gt;&amp;nbsp;created by&amp;nbsp;&lt;a href="http://www.cobasolutions.com/en_start"&gt;COBA Solutions Sp. z o.o.&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://pl.linkedin.com/in/wzielinski"&gt;I am&lt;/a&gt;&amp;nbsp;fully elligible to describe them here as the CEO of COBA Solutions. If you wish to learn more about COBA Solutions, COBAEX platform, projects completed using this platform or standard product delivered using this environment -&amp;nbsp;&lt;a href="http://pl.linkedin.com/in/wzielinski"&gt;contact me directly&lt;/a&gt;&amp;nbsp;or send an email on&amp;nbsp;&lt;a href="mailto:info@cobasolutions.com"&gt;info@cobasolutions.com&lt;/a&gt;.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/JZjdS4uj0OE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/22962101364481908/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2009/05/webapplications-part-3-user-and-data.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/22962101364481908?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/22962101364481908?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/JZjdS4uj0OE/webapplications-part-3-user-and-data.html" title="WebApplications – part 3 – user and data access rights" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2009/05/webapplications-part-3-user-and-data.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ADQnYzfCp7ImA9WhdQFEQ.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-8897302940803841553</id><published>2009-04-27T00:50:00.000+02:00</published><updated>2011-08-16T15:02:53.884+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-16T15:02:53.884+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="zend framework" /><category scheme="http://www.blogger.com/atom/ns#" term="cobaex" /><category scheme="http://www.blogger.com/atom/ns#" term="applications" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>WebApplications – part 2 – standard, customization, development…</title><content type="html">&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Yes – I know – it’s been a while from last article. But here it is &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;/div&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;First of all – I would like to come back a little to the &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://linkedphpers.blogspot.com/2009/03/webapplications-part-1-framework-vs.html"&gt;last article&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;, where I tried to compare framework and environment. I had some feedback from there and I got to a very nice keypoint or definition of these 2 terms:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Framework is a set of libraries, that we can use to create an application.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Environment is a set of ready-to-use processes and objects.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;This of course means also, that an environment is something on a higher business level, then a framework – with all its pros and cons &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;And I suppose such a summarization can close the discussion or the topic – at least for now &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Getting back to the core topic of this article – what can we name a &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;standard&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;, a &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;customization&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; and &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;development&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; in business web applications. I will also try to present these 3 levels of customer-specific implementation on an example of &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX environment&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;But&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: 18px; font-weight: bold;"&gt;...starting from the theory…&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Every business application has some functionality it delivers once installed. For CRM application it can be a customer base, customer history etc., for CMS application it can be webpage creating, menu editing etc. This functionality can be called a &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;STANDARD&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; functionality.&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Different functionalities can be also configured in a different ways – e.g. once we have a CRM application we can configure the customer base in a way that on a customer creation form we can see specific fields, while other fields (that exists in a database) will be hidden – hence the customer will not use them (only at the moment, or ever); in CMS application we have to configure base portal address/domain, templates for different pages or text, that will e displayed on a newly-created page, which actual content was not filled. These tasks, that are able to be performed by system administrator from a system UI or in the configuration files can be called as &lt;/span&gt;&lt;span lang="EN-US"&gt;CONFIGURATION&lt;/span&gt;&lt;span lang="EN-US"&gt; tasks – but I would still put them into system STANDARD, rather then any other implementation levels.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;In most system implementations however the standard functionality is not enough. Companies has their specific needs, processes and desires. They can be e.g. a completely new field on a CRM system or implementation of advanced graphical design (different then standard templates) in their CMS-managed webpage.&lt;br /&gt;
The first level, on which we can try to achieve these goals is system &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;CUSTOMIZATION&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;. What do I understand saying customization ? That we need to touch the code, but not on a programming level. We can configure the system – but not from a UI, even not on a config files, but e.g. modifying database table contents – changing the dictionary data, configuration tables. Generally the base difference between standard configuration and customization is the person (and his/her level of knowledge) which is doing it. Standard configuration can be done by a system administrator following the manuals and guidelines delivered with a  product. Customization should be done by a qualified consultant, that has knowledge of system design, architecture and can (with full responsibility and understanding what is he doing) modify the customization tables, dictionary data etc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;But sometimes it comes to a situation, that customization is not allowing us to fulfill the requirements. Then it comes to a &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;DEVELOPMENT&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; – means that the programmer has to sit and develop (program directly in the sourcecodes) the missing functionality or the extend the existing one.&lt;br /&gt;
Here we come again to the point – how to distinguish customizing from development. My point of view is again – by the person (qualifications and access needed) which is doing the job. While system administrator is doing the configuration, consultant is doing the customizating – the development is done by a pure programmer. The person that knows the programming language, knows the system (or specific part ofit) in a very detailed level.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Now&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: 18px; font-weight: bold;"&gt;...maybe let’s get to a little practice…&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;In this first sentence let me maybe warn you – I will not be going into the real programming details &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt; I want these articles (all of them – not only this or the previous one) to be more theoretical, presenting the way of thinking, rather a cookbooks with sources you can copy’n’paste to your application. Also – because I will be showing the practice on an example of COBAEX – the real sourcecodes would still not give you much – as you would need the whole environments to give them a try &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt; Of course – if you like it – you are stringly invited t become COBA partner – just send an email mentioning that to &lt;a href="mailto:info@cobasolutions.com"&gt;info@cobasolutions.com&lt;/a&gt; and we’ll discuss it further (…yes – I know you will probably see that as very hard marketing – please forgive me that &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;OK – but getting to the point. The theory is nice, but the real problem comes once you want to move to practice. By the word of &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;i&gt;Practice&lt;/i&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; I will try to present several ways of creating mechanisms, that helps application configuration, customizations and developments.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Starting from &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;configuration&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;(standard level &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;I suppose it can be done in 2 general ways:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"&gt;
&lt;span lang="EN-US"&gt;-&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;Configuration from INI/.conf files&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"&gt;
&lt;span lang="EN-US"&gt;-&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;Configuration that is kept in the database&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;I know, you can also create configurations in some .inc files – but please allow me to skip that. I suppose that such a solution is not only “ugly” but most of all – very PHP-specific. And we have to remember, that a person that is doing the configuration job – the system administrator – can not only be not a PHP gooru – he might not know PHP at all. And that is his right – he’s a system admin – and once you will ask him about TCP/IP protocol frames, firewall rules, financial system administration aspects – he will most likely answer you. But he do not have to know programming language – even if his system was written in it.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;So – I suppose the configuration files should be in one of 2 standards – INI files once we think (or even know) our application will be in most cases used in Windows environment, or .conf once we know the environment will be most likely *NIX.  What if we do not know that ? Well – I would recommend doing what we did in COBAEX – use the INI file standard. Why ? Becouse still more people (sysadmins included) knows the &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;i&gt;only proper operating system&lt;/i&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;, then Linux &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;But why do we need the INI file, if we can put the config to the DB ? Well – the answer is very simple – our application has to know how to connect to that DB. And putting it into the code is really now a very god idea &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Somebody might now ask – if we still need to use the INI file, what for we keep anything from a configuration in a DB ? My approach is the following – once we want to give the sysadmin any UI for configuration manipulation – the DB-stored settings will be much easier to create such an interface. It’s much easier to modify the configuration records in the DB, then to maintain the flat file. So I distinguish the INI file config parameters from the DB config settings by the decision which parameters will be updated from a UI, and which will need sysadmin to use some vi or text editor to change. Some hint on that decision might be analyzing, which parameters are more, and which are less often changed – the less often changed might stay in config file, more often changed will be easier to change them from UI.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;In &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; in fact we have approached to that case in a way, that:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"&gt;
&lt;span lang="EN-US"&gt;-&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;In INI files we have parameters such as database access (also not full – as COBAEX might connect to the DB using the logon username/password – but the IP address and port are still needed), some basic rights (so the application will know which screens are available for non-logged users – such as logon screen or AJAX logon procedure) and the information of file search paths (system is using modified &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://framework.zend.com/"&gt;Zend Framework&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://framework.zend.com/manual/en/zend.loader.autoloader.html"&gt;autoloader functionality&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;, that is checking the libraries in the paths, that were specified in the search paths). Generally INI files (as we have not only one of them – INI files can be specified in every application that is installed in EX environment)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"&gt;
&lt;span lang="EN-US"&gt;-&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;In DB we have all other parameters, that are needed once the user will login to the application. We do not need to distinguish the parameters from the changing frequency, as the UI for application config parameters management is generic – so we do not need to create new interfaces or forms for every parameter, that is in DB.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Customization&lt;/span&gt;&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;As said before – the customization is still some kind of a configuration, but done by a different person – a consultant. We can also call it some kind of &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;i&gt;extended configuration&lt;/i&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;However the customization results will also be a bit different, then a standard configurations. What I mean are the business results - while the &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;configuration is more to adopt the application to the specific technical needs&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; (modifying the IP addresses, database access options, maybe some performance tuning), the &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;customization changes will focus on a business processes&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;. So it is something like &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;&lt;i&gt;business process configuration&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;The very first example of customization in COBAEX that comes to my mind is status flow. Generally we have a status flow mechanism as some standard process, that is using the database tables (different PostgreSQL inherited tables for different status fields or flows) to create various statuses, the flow options (to which status you can change from a current one, and to which you cannot) and optionally the additional actions that should be performed once the status change occurs. Such a status flow you can configure from a database level (by adding/updating specific records) without touching the sourcecode. And this configuration will influence the system business functionality, and should be done by a consultant – person that knows the system from a processes point of view.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Development&lt;/span&gt;&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Well – this one should be easy. A development is everything more the customization &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;But in the real world it is not so nice. The problem I faced at least several times was to do the modification in a way, that I will not crush anything, that was created in a standard or customization level.&lt;br /&gt;
Also the problem comes once you want to create an application or system, that will be modified by different people (your partners or the internal team of a company you implemented system for), but in the meantime they wish to have the guarantee service for the system you prepared.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Well – not one of the real strength of COBAEX comes. We have created the architecture that is completely supporting the actions I said about in the previous paragraph. Here it is how it works:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;We have 3 levels of architecture:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"&gt;
&lt;span lang="EN-US"&gt;-&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;BIN – where the environemt resides – the users interface, user and data access rights, basic processes (such as mentioned status flow) etc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"&gt;
&lt;span lang="EN-US"&gt;-&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;APP – where the applications resides (such as CRM or CMS etc.)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"&gt;
&lt;span lang="EN-US"&gt;-&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;CST – something that is most interesting for us now – the level on which you can do the customziations and development without touching the actual sourcecodes of BIN and APP&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;And the idea is quite simple – on CST level you can create any class you want – including the class that will extend various class from BIN or APP. Now – once the system will run and use the &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://framework.zend.com/manual/en/zend.loader.autoloader.html"&gt;Zend Autoload&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; functionality – it will automatically first check whether specific class is extended on a CST level or not. If it is – the extending class will “overload” the original one.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;The same situation we have with database tables – but here the situation is even more simple. &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://www.postgresql.org/"&gt;PostgreSQL database server&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; we are using is delivering a very nice functionality called &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://www.postgresql.org/docs/8.3/interactive/ddl-inherit.html"&gt;table inheritance&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;. This functionality (in very short &lt;span class="Apple-style-span" style="font-family: Wingdings;"&gt;J&lt;/span&gt;) allows you to create a table, that will inherit from other table. The fields in a new table will be the same as the fields from the parent one, with a possibility to extend the number of fields in a child table. But the real great thing is not that – but the fact, that once you will try to do a simple “SELECT * FROM PARENT” on a parent table – you will get all the records from a parent table, and all the records from a  child one (like if we do a UNION between them).&lt;br /&gt;
What does it mean for us ? Let’s get back to the status flow example – it means we can inherit from a status profile (defined status flow) and add a new status on a child table without modifying the original (parent existing on a BIN or APP level) one.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Basically these functionalities allows us to create both the customizations and developments without touching (or even access to) original codes. It means, that once we will physically delete the CST changes and developments – we will get back to standard (defined on a BIN and APP levels) functionality.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Some final words… (?)&lt;/b&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Well – to be honest it is very hard for me to summarize everything I wrote above. One of the people that commented my previous article said, that it is real mess, I am repeating what I said before and I cannot focus and make some points in a clear and ordered way. I suppose if Part 1 was messy – then it will be hard to find a words to classify this one &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;I still however home it will help somebody and it brings some good points and values &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;And for the final words – I suppose I will just mention a phrase, that I use once I describe a customer what are standard, customization and development (in most cases – in a situation once a customer asks “is it possible in an application to…”):&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;“&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;&lt;i&gt;we have everything you need on standard, the impossible things we can do on customizing, for miracle – we need to do some development&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;”&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Please stay tuned – the next article I plan will be about user rights and data access rights – and the while business security stuff &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;i&gt;Note: All the techniques that were described in the article are implemented in the&amp;nbsp;&lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX Environment&lt;/a&gt;&amp;nbsp;created by&amp;nbsp;&lt;a href="http://www.cobasolutions.com/en_start"&gt;COBA Solutions Sp. z o.o.&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://pl.linkedin.com/in/wzielinski"&gt;I am&lt;/a&gt;&amp;nbsp;fully elligible to describe them here as the CEO of COBA Solutions. If you wish to learn more about COBA Solutions, COBAEX platform, projects completed using this platform or standard product delivered using this environment -&amp;nbsp;&lt;a href="http://pl.linkedin.com/in/wzielinski"&gt;contact me directly&lt;/a&gt;&amp;nbsp;or send an email on&amp;nbsp;&lt;a href="mailto:info@cobasolutions.com"&gt;info@cobasolutions.com&lt;/a&gt;.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/kDp0tgvzDsw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/8897302940803841553/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2009/04/webapplications-part-2-standard.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/8897302940803841553?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/8897302940803841553?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/kDp0tgvzDsw/webapplications-part-2-standard.html" title="WebApplications – part 2 – standard, customization, development…" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.linkedphpers.org/2009/04/webapplications-part-2-standard.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMNR3wyfSp7ImA9WhdRFEg.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-3806252249608818367</id><published>2009-04-09T23:42:00.000+02:00</published><updated>2011-08-04T13:14:56.295+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-04T13:14:56.295+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><title>WebDesk blog entries import - summer cleanups :)</title><content type="html">Summer comes to my country, it's almost Easter - the blogs should be cleaned as well :)&lt;br /&gt;
&lt;div&gt;I decided, that I will close the blog I was working on under webdesk.blogspot.com address. However it would be a pity to get rid of all articles I made up there. So I decided that I will simply import them to this blog - I hope you don't mind :)&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/Pkp3qP8AH0s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/3806252249608818367/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2009/04/webdesk-blog-entries-import-summer.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/3806252249608818367?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/3806252249608818367?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/Pkp3qP8AH0s/webdesk-blog-entries-import-summer.html" title="WebDesk blog entries import - summer cleanups :)" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2009/04/webdesk-blog-entries-import-summer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AMRXY4fCp7ImA9WhdQFEQ.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-2727632487835130340</id><published>2009-03-03T12:59:00.000+01:00</published><updated>2011-08-16T15:03:04.834+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-16T15:03:04.834+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="framework" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="zend framework" /><category scheme="http://www.blogger.com/atom/ns#" term="cobaex" /><category scheme="http://www.blogger.com/atom/ns#" term="applications" /><title>WebApplications – part 1 – Framework vs. Environment</title><content type="html">&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;I would like to start some kind of series of articles regarding the Web applications and the ways of designing and developing such.&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;In this first part I would like to focus on some terminology. I will also try to focus on main differences between standard &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Framework&lt;/span&gt;, that we all I suppose know (at least one – such as &lt;a href="http://framework.zend.com/"&gt;Zend Framework&lt;/a&gt;, &lt;a href="http://www.symfony-project.org/"&gt;Symfony&lt;/a&gt; or others) and something that I call &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Environment&lt;/span&gt;. So – what are the differences ?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;However before I will start comparison some of you might start asking yourself, what solutions I based my thoughts on ?&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Well – the framework I know in a best way is &lt;a href="http://framework.zend.com/"&gt;Zend Framework&lt;/a&gt; – which I believe is one of the best for web application building. Yes, I know there’s been many “fights” in the scope of “&lt;span class="Apple-style-span" style="font-style: italic;"&gt;which framework is the best ?&lt;/span&gt;”. None won, some lost (that were really bad &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;). But at the end most people, that took part in these discussions agreed – everything depends on the usage. And I agree with that – everything depends on a usage, on an application we have to design and develop. As far as I read – in this “category” there were 2 leaders – &lt;a href="http://www.symfony-project.org/"&gt;Symfony&lt;/a&gt; and &lt;a href="http://framework.zend.com/"&gt;ZF&lt;/a&gt;. Symfony I do no know and did not used – so I will focus on ZF &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Regarding the environment – in this case I must admit I do not know any full-scale environments written entirely in PHP beside of an environment created by my company &lt;a href="http://www.cobasolutions.com/en_start"&gt;COBA Solutions&lt;/a&gt; – &lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX&lt;/a&gt;. So therefore I will focus on the functionality delivered by this environment – and I hope I will not be crucified, as this might be seen as marketing &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;OK – but what is the main difference between &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Framework &lt;/span&gt;and &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Environment&lt;/span&gt;. I suppose we can distinguish at least several of them:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;
&lt;span lang="EN-US"&gt;Area of usage&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;I suppose the most important one. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;We can use framework to build almost everything. Of course, as mentioned above, some frameworks are designated for webpages, some for web applications, others are for Web 2.0 sites (community, social etc.). However even if you will take a framework, that is targeted for applications, you will still be able to create a website basing on it – the best example might be ZF. You can easily create a website using it (in fact – there are plenty of websites using this framework), but if you will compare it to other, specifically targeted for websites, you will see that ZF is more complicated and creating a simple website using ZF is quite difficult and time consuming.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;In case of an environment the situation is a little bit different. Environment (such as COBAEX) gives you already database schema, UI and many other features and mechanisms designed and developed in scope of application building. Using it to create a website will simply not work. However you can make use of an environment for administration panel for the website – but you will still need to create a full-scale website by your own, or at least use a ready-to-use CMS application that has been created in the environment (an example – &lt;a href="http://www.cobasolutions.com/business_software"&gt;COBAEX CMS&lt;/a&gt;).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;So – summarizing – framework area of usage is much more broad, then in case of an environment, which is targeted for applications itself. So the environment is more specialized then framework – which has both pros and cons mentioned below.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;
&lt;span lang="EN-US"&gt;Sourcecodes&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Most frameworks are delivered in open source. This means, that every developer that is using a framework is able to change even the standards of the framework according to his needs. At first sight it looks great – “I can do whatever I want”. But on the second thought – think about the support. Which simply does not exist on the professional level for the open source projects. Why ? Because it is impossible to give the support for enormous amounts of variants of the code – modified in an unpredicted way by different developers.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;In case of closed source – maintained and supported by team or organization – the full-scope professional support is possible. Mostly because there will be no unpredicted and unknown modifications.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;I know – now I can start a real war, where on one side I will have open source evangelizers, and on other – companies. Both sides will for sure have their arguments, which will be for sure true. But this is not my point.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;I suppose the key in this area is again the area of usage. Most companies can agree with semi-professional (opensourcers – please do not take it personally &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;span lang="EN-US"&gt;)&amp;nbsp; support in scope of their webpages. But in scope of applications, especially business-critical ones – the full-scale professional support is essential. So in this area – again I suppose the first place is for environments – which has at least parts of the code closed.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;
&lt;span lang="EN-US"&gt;Standardization&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Here we are facing more the way the frameworks are designed. In most cases I see lack of inter-standardization of frameworks. What I mean is the fact, that most frameworks are indeed standardized in scope of this specific framework. However once we will try to integrate 2 applications created in 2 different frameworks – we are stepping into minefield. Because standards delivered in frameworks has nothing in common with enterprise level standards like SOA etc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;So – again getting back to the area of usage and solutions. Once we have a single webpage – the integration and compatibility with other backend applications is very limited – because there’s no need for anything more. In scope of application the situation is different – application should be integrated with other solutions working in a company in much larger areas.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Regarding the transparency of a code – also the decision should be made basing on the complexity of business processes used in the solution. In case of a webpage – these processes are rather uncomplicated and easy – so the possible areas of bugs are less time-consuming to find. In case of applications, the processes are far more complicated and complex – which means the possible bugs will be much harder to target and remove. And in this case clean, standardized code will be a high advantage and will bring a real value in scope of service actions.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Strict standardization however has 2 sides - a good and a bad one:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"&gt;
&lt;span lang="EN-US"&gt;-&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;From the good side – the code and solution itself is created in more proper, “clean” way&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"&gt;
&lt;span lang="EN-US"&gt;-&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;From the bad side – standardization is limiting the possibilities&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Someone might now say “&lt;span class="Apple-style-span" style="font-style: italic;"&gt;let’s find a compromise&lt;/span&gt;”. But I suppose there can be no compromise for every area of usage. We have to decide, what we want to do – and then decide whether we can agree on a high standardization to deliver a clean, proper and integrated solution, but created according to some rules that has been prepared by the environment manufacturer, or we can agree on a low standardization in the level of interconnection, having more possibilities, but loosing easy integration possibilities and effective support for unclean code.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;
&lt;span lang="EN-US"&gt;Summarizing – key points&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;To summarize I would like to try to specify some key points, that will help you to choose whether to choose an environment, or a framework for your project.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;I suppose the very first, most important question you should have an answer to is “&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;what for I need a framework or an environment ?&lt;/span&gt;&lt;/span&gt;”.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Once the answer is: “&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;I will be creating a standalone or low-integrated (e.g. only contact forms posted to internal CRM solution) website from the scratch, without using any standard CMS from the market&lt;/span&gt;&lt;/span&gt;” – choose a framework. It will give you high flexibility, the project will be rather small and on the low complexity.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;Once the answer is: “&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;I will be creating a web application, that will automate specific business processes and will be integrated with back-end company applications&lt;/span&gt;&lt;/span&gt;” – choose the environment. You will achieve a standardized solution with full-scale professional support automating the processes according to industry best practices.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="EN-US"&gt;I hope the above article will be useful for you. Please do not hesitiate to place a comments with your thoughts and suggestions. I will really value every (even very critical) thoughts about your attitude to things presented.&lt;br /&gt;
Also stay tuned for the next parts of this series – which I plan to be: &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;WebApplications – part 2 – standard, configuration, development…&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;Note: All the techniques that were described in the article are implemented in the&amp;nbsp;&lt;a href="http://www.cobasolutions.com/software_development"&gt;COBAEX Environment&lt;/a&gt;&amp;nbsp;created by&amp;nbsp;&lt;a href="http://www.cobasolutions.com/en_start"&gt;COBA Solutions Sp. z o.o.&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://pl.linkedin.com/in/wzielinski"&gt;I am&lt;/a&gt;&amp;nbsp;fully elligible to describe them here as the CEO of COBA Solutions. If you wish to learn more about COBA Solutions, COBAEX platform, projects completed using this platform or standard product delivered using this environment -&amp;nbsp;&lt;a href="http://pl.linkedin.com/in/wzielinski"&gt;contact me directly&lt;/a&gt;&amp;nbsp;or send an email on&amp;nbsp;&lt;a href="mailto:info@cobasolutions.com"&gt;info@cobasolutions.com&lt;/a&gt;.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/TjNvQwxtaFA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/2727632487835130340/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2009/03/webapplications-part-1-framework-vs.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/2727632487835130340?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/2727632487835130340?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/TjNvQwxtaFA/webapplications-part-1-framework-vs.html" title="WebApplications – part 1 – Framework vs. Environment" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.linkedphpers.org/2009/03/webapplications-part-1-framework-vs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEICRng6cSp7ImA9WhdRFEg.&quot;"><id>tag:blogger.com,1999:blog-7634820055071733985.post-3422934538615372433</id><published>2009-02-19T17:29:00.000+01:00</published><updated>2011-08-04T13:16:07.619+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-04T13:16:07.619+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers" /><title>Crossing 5000... No, 5200+ already !!!</title><content type="html">Well - I know - it's been a while since the last article.&lt;br /&gt;
&lt;div&gt;However I must admit I have plenty of work last days (months) and hardly finding time even for group administration - but in this manner I think I manage.&lt;/div&gt;&lt;div&gt;Several days ago I noticed we have crossed 5000 (!!!) users in our group. And then I decided to post an article... But again - no time, no time and again no time :)&lt;/div&gt;&lt;div&gt;So once I found a time (really - just a several days after) we already have 5248 (current state).&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;So - I produdly announce - WE CROSSED 5000 and growing !!!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Regarding some recent changes in administration - as you can notice, something that distinguishes our group from the other is lack of job ads. And that was in fact an idea from the beginning - if you go to some of the first postings on this blog you can read, that I always wanted this group to be a knowledge sharing, professional group.&lt;/div&gt;&lt;div&gt;During the time I was posting infos about these rules, deleting job ad forums, asking headhunters not to post jobs in here... And most of them understood and having no problems... Not all of them unfortunatelly. And that is why currently I am not only deleting the discussions, but also &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;job ad posting people are removed and blocked from rejoining the group&lt;/span&gt;. However there are not many of them luckily - since I started this strategy only 7 people were blocked. So I must admit, that this problem is not large at the moment :)&lt;/div&gt;&lt;div&gt;But (as always) I am very open for your suggestions regarding the group... If you think I can do something to improve the group, to make it better for you - please let me know - either by LinkedIn or in the comments in this post. &lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;The group is FOR US ALL.... :)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Thanks again&lt;/span&gt; for joining the group and building the largest PHP place in LinkedIn. The fact we are the largest is thanks to you :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Wojciech Zielinski&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/linkedphpers/uuGF/~4/5kIV07QEsZs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.linkedphpers.org/feeds/3422934538615372433/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.linkedphpers.org/2009/02/crossing-5000-no-5200-already.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/3422934538615372433?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7634820055071733985/posts/default/3422934538615372433?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/linkedphpers/uuGF/~3/5kIV07QEsZs/crossing-5000-no-5200-already.html" title="Crossing 5000... No, 5200+ already !!!" /><author><name>Wojciech Zieliński</name><uri>https://plus.google.com/101200413745278717662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-ud9H4BN5w7o/AAAAAAAAAAI/AAAAAAAB4NU/EhrKQdtbuHU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.linkedphpers.org/2009/02/crossing-5000-no-5200-already.html</feedburner:origLink></entry></feed>
