<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' 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'><id>tag:blogger.com,1999:blog-7634820055071733985</id><updated>2026-07-24T08:05:29.208+02:00</updated><category term="linkedphpers"/><category term="architecture"/><category term="project management"/><category term="applications"/><category term="framework"/><category term="newbies"/><category term="zend framework"/><category term="database"/><category term="webtools"/><category term="reviews"/><category term="cobaex"/><category term="algorythms"/><category term="coba solutions"/><category term="project plan"/><category term="waterfall"/><category term="excel"/><category term="office"/><category term="template"/><category term="tutorial"/><category term="web 2.0"/><category term="cms"/><category term="contest"/><category term="cost"/><category term="estimations"/><category term="howto"/><category term="integration"/><category term="optimization"/><category term="portfolio management"/><category term="postgres"/><category term="security"/><category term="web 3.0"/><category term="AbstractFactoryInterface"/><category term="ServiceManager"/><category term="accountability"/><category term="agile"/><category term="ajax"/><category term="chat"/><category term="codeigniter"/><category term="date manipulation"/><category term="dictionary data"/><category term="factory"/><category term="ide"/><category term="javascript"/><category term="joomla"/><category term="lazy loading"/><category term="licensing"/><category term="linux"/><category term="performance"/><category term="pmo"/><category term="problem"/><category term="raci"/><category term="reporting"/><category term="responsibility"/><category term="risk"/><category term="ruby"/><category term="schedule"/><category term="search engine"/><category term="solution"/><category term="speed"/><category term="symfony"/><category term="warning"/><category term="webservices"/><category term="yii"/><title type='text'>LinkedPHPers</title><subtitle type='html'>LinkedPHPers Group &lt;i&gt;(55k+ 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='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><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'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>53</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7634820055071733985.post-4546541783572834638</id><published>2019-03-26T11:50:00.000+01:00</published><updated>2019-03-26T11:50:43.921+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="accountability"/><category scheme="http://www.blogger.com/atom/ns#" term="agile"/><category scheme="http://www.blogger.com/atom/ns#" term="portfolio management"/><category scheme="http://www.blogger.com/atom/ns#" term="project management"/><category scheme="http://www.blogger.com/atom/ns#" term="project plan"/><category scheme="http://www.blogger.com/atom/ns#" term="raci"/><category scheme="http://www.blogger.com/atom/ns#" term="responsibility"/><category scheme="http://www.blogger.com/atom/ns#" term="waterfall"/><title type='text'>RACI - magical 4 letters helping to get things done in a project</title><content type='html'>&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFSKOz-Li1QX0thz69Hj2MTdGtxACIstS2g9c4bK66AZILrxCSqbhKesxpwPw4Le5lRPZojTq_SusMInyBzZly12LXxErgBSNXpppeA7B3xaF-05gCa7QUppKgJv7G_lub8KhMbuM_JR8/s1600/csm_raci-matrix-risiko-projektmanagement_6cc05049ad.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;924&quot; data-original-width=&quot;900&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFSKOz-Li1QX0thz69Hj2MTdGtxACIstS2g9c4bK66AZILrxCSqbhKesxpwPw4Le5lRPZojTq_SusMInyBzZly12LXxErgBSNXpppeA7B3xaF-05gCa7QUppKgJv7G_lub8KhMbuM_JR8/s400/csm_raci-matrix-risiko-projektmanagement_6cc05049ad.jpg&quot; width=&quot;388&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;Source:&lt;br /&gt;&lt;a href=&quot;https://www.kayenta.de/training-seminar/artikel/raci-matrix-im-projektmanagement.html&quot;&gt;https://www.kayenta.de/training-seminar/artikel/raci-matrix-im-projektmanagement.html&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Last articles were accompanied with Excel templates - today I will prepare a bit smaller one, without Excel template.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
While I believe the RACI itself is very well known, numerous times I&#39;ve seen people using it in a strange ways. I think therefore bringing up what these letters means accompanied with some rules on how to use them might be helpful.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So, let&#39;s start from &lt;b&gt;the meaning of &lt;span style=&quot;color: red;&quot;&gt;RACI&lt;/span&gt;&lt;/b&gt; - four letters that specifies role of various people within a task or decision.&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;R&lt;/span&gt;esponsible&lt;/b&gt; - means the &lt;b&gt;person &lt;/b&gt;which &lt;b&gt;directly does the task&lt;/b&gt;.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;A&lt;/span&gt;ccountable&lt;/b&gt; - means the &lt;b&gt;person &lt;/b&gt;that is &lt;b&gt;responsible for assuring the task is done&lt;/b&gt;. In most cases I actually use even simpler approach - a person whose &lt;i&gt;a*s&lt;/i&gt; will be kicked if the task is not done - so the one that should monitor if &lt;span style=&quot;color: red;&quot;&gt;R&lt;/span&gt;esponsible is doing the task and will complete the task within agreed constraints.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;C&lt;/span&gt;onsult&lt;/b&gt; - the &lt;b&gt;person (or people)&lt;/b&gt; that should be consulted on the task or decision. It is important that &lt;b&gt;by saying &quot;consulted&quot; we assume this person has empowerment&lt;/b&gt; to have impact on how the task needs to be done or what decision is to be made. The voice of this person is important - and we cannot ignore it.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;I&lt;/span&gt;nform&lt;/b&gt; - the &lt;b&gt;person (or people)&lt;/b&gt; that &lt;b&gt;should be informed either that the task has been completed or the decision has been made&lt;/b&gt;. The key difference between &lt;span style=&quot;color: red;&quot;&gt;I&lt;/span&gt;nform and &lt;span style=&quot;color: red;&quot;&gt;C&lt;/span&gt;onsult is that people set as &lt;span style=&quot;color: red;&quot;&gt;I&lt;/span&gt;nform does not have empowerment to influence the task or decision. They only need to know once it is done - but their voice does not need to be taken under consideration during task completion or within decision making process.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
And the main rule that will help you be successful is to follow how many people can be attached to each of these categories within specific task or decision. You might have already noticed that in case of &lt;span style=&quot;color: red;&quot;&gt;R&lt;/span&gt;esponsible and &lt;span style=&quot;color: red;&quot;&gt;A&lt;/span&gt;ccountable I was writing only about Person, while for &lt;span style=&quot;color: red;&quot;&gt;C&lt;/span&gt;onsult and &lt;span style=&quot;color: red;&quot;&gt;I&lt;/span&gt;nform I mentioned also in brackets People. And that was done in purpose - since Responsible and Accountable are actually a drivers of the task or decision (in many cases that might be one person, but not necessary and always), Consult are the people supporting and Inform are in most cases people dependent of the task or decision.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Therefore to avoid &quot;split responsibility&quot; and the situation of two people pointing fingers on each other in scope who should have done the task or who was accountable for the decision and consequences you have to &lt;b&gt;avoid having more that one person within any of &lt;span style=&quot;color: red;&quot;&gt;R&lt;/span&gt;esponsible or &lt;span style=&quot;color: red;&quot;&gt;A&lt;/span&gt;ccountable categories&lt;/b&gt;. I know you might say, it is impossible, since the task needs to be done by more than one person (and therefore you need to have more people within &lt;span style=&quot;color: red;&quot;&gt;R&lt;/span&gt;esponsible) - but this means the task should be split into smaller pieces - and such split should be continued until you will be able to attach only one person within &lt;span style=&quot;color: red;&quot;&gt;R&lt;/span&gt;esponsible and &lt;span style=&quot;color: red;&quot;&gt;A&lt;/span&gt;ccountable roles.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
In case of &lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;C&lt;/span&gt;onsult and &lt;span style=&quot;color: red;&quot;&gt;I&lt;/span&gt;nform - here you actually can have any number of people you want&lt;/b&gt;. These people as I mentioned before either supports or depends on the task or decision - therefore they are not the drivers. However please mind always a fact that the more people are mentioned in &lt;span style=&quot;color: red;&quot;&gt;C&lt;/span&gt;onsult - the more people needs to be contacted and actively provide their feedback on the task or decision. Also the more people you add to &lt;span style=&quot;color: red;&quot;&gt;I&lt;/span&gt;nform - the more people needs to be reached after the task is completed (or decision made). Actually you might notice that the more people are mentioned as &lt;span style=&quot;color: red;&quot;&gt;I&lt;/span&gt;nform - the more important task or decision is - hence the more other tasks/decisions are dependent on this particular one.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So generally even if &lt;span style=&quot;color: red;&quot;&gt;C&lt;/span&gt;onsult and &lt;span style=&quot;color: red;&quot;&gt;I&lt;/span&gt;nform are sometimes treated as &lt;i&gt;&quot;less important&quot;&lt;/i&gt; - they are not. Extending number of parties involved in task extends the time needed to complete it, while the more parties involved in decision making process - the harder to have a consensus. At the same time number of parties attached to &lt;span style=&quot;color: red;&quot;&gt;I&lt;/span&gt;nform sets the importance of the task or decision.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I hope above guidelines will help you using RACI a bit more effectively and with more understanding than I&#39;ve seen quite several times. I know that confronting the above with e.g. project documentation you have might feel I am going into too low level. I have also seen many documents where instead of people in RACI I&#39;ve seen whole teams. The question however is how helpful such documents are ? Do they really help in solving who should be doing and who should monitor the tasks ? Or in whose area is specific decision ?&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I know &lt;b&gt;splitting the tasks into chunks small enough to assign them to single person is not an easy task. But believe me - this effort is paying off&lt;/b&gt;. And I strongly encourage you to do so - as for me, it helped me to rescue not one project in ma career 🙂&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Please leave the comment what do you think. Would love to have some discussion 🙂&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.linkedphpers.org/feeds/4546541783572834638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.linkedphpers.org/2019/03/raci-magical-4-letters-helping-to-get.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/4546541783572834638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/4546541783572834638'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2019/03/raci-magical-4-letters-helping-to-get.html' title='RACI - magical 4 letters helping to get things done in a project'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFSKOz-Li1QX0thz69Hj2MTdGtxACIstS2g9c4bK66AZILrxCSqbhKesxpwPw4Le5lRPZojTq_SusMInyBzZly12LXxErgBSNXpppeA7B3xaF-05gCa7QUppKgJv7G_lub8KhMbuM_JR8/s72-c/csm_raci-matrix-risiko-projektmanagement_6cc05049ad.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7634820055071733985.post-1524195487485094138</id><published>2018-01-15T01:39:00.002+01:00</published><updated>2018-01-15T01:39:34.763+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cost"/><category scheme="http://www.blogger.com/atom/ns#" term="estimations"/><category scheme="http://www.blogger.com/atom/ns#" term="excel"/><category scheme="http://www.blogger.com/atom/ns#" term="project management"/><category scheme="http://www.blogger.com/atom/ns#" term="project plan"/><category scheme="http://www.blogger.com/atom/ns#" term="schedule"/><category scheme="http://www.blogger.com/atom/ns#" term="template"/><category scheme="http://www.blogger.com/atom/ns#" term="waterfall"/><title type='text'>Project Management with Excel - Workload, Schedule and Resource Sharing</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitmomQyoAlOkvxAxRrEaLHwbsf6JwU2BQ-M7HPMg0Syp1tcId9ijqq3nhcyAR8V8QM3XjzzvVWnP0j7xUEcAfi97z8Jgzsj91ZycZOtJulXsoklwop-FxdoDjImG8EUZ10n70Z5uxgJQM/s1600/resource+conflict.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;365&quot; data-original-width=&quot;365&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitmomQyoAlOkvxAxRrEaLHwbsf6JwU2BQ-M7HPMg0Syp1tcId9ijqq3nhcyAR8V8QM3XjzzvVWnP0j7xUEcAfi97z8Jgzsj91ZycZOtJulXsoklwop-FxdoDjImG8EUZ10n70Z5uxgJQM/s200/resource+conflict.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The title should actually be turned around - since workload and schedule are quite easy once we do not share resources, but they are tied to our project only. The difficulties starts when you need a &lt;b&gt;resource, that is not exclusively yours&lt;/b&gt; - not only that you need to fight for it, but after you succeed that, you need to take under consideration that &lt;b&gt;estimated workload and schedule are different things&lt;/b&gt;... And that is actually what I would like to elaborate in this article.&lt;/div&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The series as you might have noted is called Project Management with Excel - and indeed, an appropriate Excel amount will appear - but let&#39;s start from&lt;/div&gt;
&lt;h2&gt;
a little bit of theory...&lt;/h2&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
In the &lt;a href=&quot;http://www.linkedphpers.org/2017/10/project-management-with-excel-workload.html&quot; target=&quot;_blank&quot;&gt;previous article&lt;/a&gt; you could have read about my version of PERT equation that I hope can help you in estimating workload for your tasks better, more accurate, but most of all - more predictable. These estimations you could actually easily use then to make your own project plan - maybe again using &lt;a href=&quot;http://www.linkedphpers.org/2017/05/project-management-with-excel-template.html&quot; target=&quot;_blank&quot;&gt;my template for project plan described in the first article&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
And if your team are only members that has been assigned to your project and they do nothing more for other parts of the organisation - you can easily use the estimated workload values in your schedule. The only place you could be mistaken there is the fact these people will have some vacation leaves, sick-leaves or so - but in scope of first problem it should be fairly easy solved by leave calendar (which I actually plan to describe in some next articles), while the second is already risk responding.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The real &quot;fun&quot; starts when your &lt;b&gt;team member is not assigned only to your project&lt;/b&gt; - you need to share him/her with someone else. Then eventhough you have calculated basing on his data that the task will take 3 workdays, the real amount of days he will be doing that is dependent on how much of his time he will dedicate to your project. That is why the &lt;b&gt;first step in here is to agree with him, his line manager or the person you share him with what is the amount of time he is assigned&lt;/b&gt; to your project. I normally try to get the percentage of assignment of resource to my project, which allows me to know that in the specific period of time this person will be working for me, no one else.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The need for that is quite simple - if a person is assigned to me for 50% and estimated the work for 3 days - he/she will effectively to that in no less than 6 - since he will work only halftime for me.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Why am I saying &quot;&lt;b&gt;&lt;i&gt;no less than&lt;/i&gt;&lt;/b&gt;&quot; you might ask ? Well - I call it &lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;switching costs&lt;/span&gt;&lt;/b&gt;... It costs time to change the focus between areas you work in... From my own experience - no less than 3%, per project - and in reality depending on specific, personal abilities for working in parallel on several things.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
If someone works for 2 projects - total time reduction for switching should be at least 6%. If the number of projects increases to 3 - then the person already spends at least 9% to switch between them. 4 projects in my opinion is already getting too much - and actually switching time per project should be extended to 4% or even 5% - which means we land in 20% of resource time only for switching. To accept such level I would see that resource really very unique :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So getting back to an example earlier where we have a resource working for us for 50% of time, while he works for 2 projects, he is actually working for us only for 47% of his/her time - which means our work estimated for 3 days will be done in 6,4 days...&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This in such small values might not count - but once you will recalculate that to the whole project, the difference might get significant (and actually the one you will miss the GoLive date :) ).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So since we are in Project Management with Excel series&lt;/div&gt;
&lt;h2&gt;
let&#39;s move that into Excel&lt;/h2&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
To do that effectively I actually have merged the &lt;a href=&quot;http://www.linkedphpers.org/2017/10/project-management-with-excel-workload.html&quot; target=&quot;_blank&quot;&gt;estimating&lt;/a&gt; and &lt;a href=&quot;http://www.linkedphpers.org/2017/05/project-management-with-excel-template.html&quot; target=&quot;_blank&quot;&gt;project plan&lt;/a&gt; templates into one - especially that in most of my projects I use them this way (together with some additional ones - but these would be planned for next articles :)). The new template you can download&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;a href=&quot;https://1drv.ms/x/s!ArJiqRu1OxiRio8DKDCmC1DFQg9qyA&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;HERE&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Additionally I have also added another&amp;nbsp;&lt;/div&gt;
&lt;h3&gt;
Project Team sheet&lt;/h3&gt;
&lt;div&gt;
where you can specify the &lt;b&gt;team members that will be performing tasks&lt;/b&gt;. Let me explain what it does there in a bit more details:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&lt;i&gt;Team member &lt;/i&gt;&lt;/b&gt;column - here you can put team members that later you will be able to select once designing your project tasks. Once you check the &lt;i&gt;column G&lt;/i&gt; in &lt;b&gt;&lt;i&gt;Estimations&lt;/i&gt;&lt;/b&gt;&amp;nbsp;sheet you will see that values from this column are taken as correct cell values - so they can be actually selected from drop down.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&lt;i&gt;Agreed assignment &lt;/i&gt;&lt;/b&gt;column - here is the assignment you have agreed this resource will work for your project. This assignment does not (yet) take under consideration focus switching costs - this is calculated further.&lt;/li&gt;
&lt;li&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;&lt;i&gt;No total projects&lt;/i&gt;&lt;/b&gt;&amp;nbsp;column - here we should set the number of projects such resource is assigned to. If you look at values you can see we have either people assigned to 1 project (which means they work only for us), as well as people that shares their time between 2 or even 3 projects.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Quite interesting you might find example of Steve (row 5) which is assigned to our project for 50%, while he has only 1 project. This would tell us this is a person that basically works in company only halftime - so eventhough he works for us only 50% of normal time, he do not need focus switch cost, as he still works only for us.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&lt;i&gt;Standard switching cost &lt;/i&gt;&lt;/b&gt;column - here we can actually change switching cost basing on actual person. You can see that in most cases you have a standard value, while Dave has been here presented as person that does not feel comfortable in changing the assignments - so his switching cost has been increased to 5%.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b style=&quot;font-style: italic;&quot;&gt;Switching cost &lt;/b&gt;column - here we calculate real switching cost that hits our project. I assumed that no one actually cares about the switching costs (meaning this cost is not secured within &quot;administrative&quot; costs) and we need to cover it - so it reduces availability of this resource for our project. At the same time if the resource works for more than one project - the switching cost is proportional to the assignment - which means that in case if John (row 3) works for 75% for our project and being assigned to another project for another 25%, it is us who is hit by 4,5% of his switching time, while another project is hit only by 1,5% (so overall switching time closes in 6%)&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&lt;i&gt;Final assignment &lt;/i&gt;&lt;/b&gt;column - here is the real assignment a resource works for us, which is basically equal to agreed assignment is the resource works only for us or agreed assignment deducted with switching cost if resource works for more than 1 project&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The most interesting, calculated value that we get from this sheet is the &lt;b&gt;&lt;i&gt;Final assignment &lt;/i&gt;&lt;/b&gt;mentioned above. This one is taken to the&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;
Estimations sheet&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
where it is being used in &lt;i&gt;column O &lt;/i&gt;to &lt;b&gt;calculate real calendar days for performing the task&lt;/b&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
In this column the owner of task (specified in &lt;i&gt;G column&lt;/i&gt;) is searched for in &lt;b&gt;&lt;i&gt;Project Team&lt;/i&gt;&lt;/b&gt; sheet and the final assignment is used to calculate how long it will take to complete the task, which workload has been calculated in &lt;i&gt;column N&lt;/i&gt; (for more about the calculation methods here please refer to&amp;nbsp;&lt;a href=&quot;http://www.linkedphpers.org/2017/10/project-management-with-excel-workload.html&quot; target=&quot;_blank&quot;&gt;Project Management with Excel - Workload estimating&lt;/a&gt; article).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
As you can see the values differs - sometimes quite a lot. The final schedule timeframe is &lt;b&gt;longer by more than 80%&lt;/b&gt; - and that only since we have taken under consideration fact our resources are not working for us exclusively.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
One more factor that has been here considered is the fact that if the task has any decimals - it already means it will not be finished within specific day. And easy rounding (using mathematical rule) will not very much work here - since no employee will be staying max. 4 hours a day to complete the tasks. I believe in the project plan we actually should not consider person to be staying even a minute after the contractual time - since I have simplified the approach by using always-round-up rule - even if there is 0,03 to be rounded (&lt;i&gt;cell N16 &lt;/i&gt;- task assigned to Alice, which is exclusively assigned to our project for 100%).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Once we have real workday values we can take them further to our&lt;/div&gt;
&lt;h3&gt;
Project Plan sheet&lt;/h3&gt;
&lt;div&gt;
Here the changes comparing to the original version from first article are smaller. Mainly the values of duration for atomic tasks (the ones that were originally typed manually in) has been changed so they refer &lt;b&gt;&lt;i&gt;Estimations &lt;/i&gt;&lt;/b&gt;sheet. Since the Finish dates are mainly created by calculating the start date and number of workdays specified in &lt;i&gt;column J &lt;/i&gt;- once this number is taken from &lt;b&gt;&lt;i&gt;Estimations&lt;/i&gt;&lt;/b&gt;, we can see how the whole project looks like now.&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;I have also made 2 changes there which are actually not related to the topic, but allows this example to be easier to be reviewed at any point in time. These changes covers:&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;cell I6 (also marked in Red) which sets the start date for today minus 3 weeks - which allows us to see the tasks that are completed, inactive or delayed&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;cell M3 so it will get the previous Monday comparing to I6 value - so the Gantt chart will be also more user friendly no matter when you will download the spreadsheet&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Can the resource sharing be handled easier ?&lt;/h2&gt;
&lt;/div&gt;
&lt;div&gt;
Well - funny question for the ending, don&#39;t you think so ? :)&lt;/div&gt;
&lt;div&gt;
And the answer is even funnier - since &lt;b&gt;IT CAN !&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
To avoid that switching costs, as well as extending time if the resource is shared, while still sharing the resource you can simply arrange with the resource that he/she will be working for you only in specific periods of time. It would mean that in your project plan you will need to remember during which time the resource is available for you, while treating everything else as his/her unavailability.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
In our example of John working for us for his 75% of time it would mean during 4 weeks (20 workdays) for first (or last) 3 weeks he will work for us, while another 1 week left he will be unavailable.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This would mean he does not need to switch, hence we have no switching costs, no thinking on whether the time we have in our estimations should be recalculated to calendar time - only we will have to manage the project plan accordingly to leaves.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The bad thing behind this is - that I have actually never had such a comfort :) Maybe I am poor negotiator - but never been able to get a resource that way :) So had to figure out how still to work on much tougher constraints - and the idea I worked out you can read in this article and see in attached file.&lt;/div&gt;
&lt;h4 style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;Hope you will like it - and would very much hope for some discussion, maybe you sharing how you deal with problems described ?&lt;/b&gt;&lt;/h4&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.linkedphpers.org/feeds/1524195487485094138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.linkedphpers.org/2018/01/project-management-with-excel-workload.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/1524195487485094138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/1524195487485094138'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2018/01/project-management-with-excel-workload.html' title='Project Management with Excel - Workload, Schedule and Resource Sharing'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitmomQyoAlOkvxAxRrEaLHwbsf6JwU2BQ-M7HPMg0Syp1tcId9ijqq3nhcyAR8V8QM3XjzzvVWnP0j7xUEcAfi97z8Jgzsj91ZycZOtJulXsoklwop-FxdoDjImG8EUZ10n70Z5uxgJQM/s72-c/resource+conflict.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7634820055071733985.post-4823435341909180394</id><published>2017-10-02T14:11:00.001+02:00</published><updated>2017-10-02T14:30:44.949+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cost"/><category scheme="http://www.blogger.com/atom/ns#" term="estimations"/><category scheme="http://www.blogger.com/atom/ns#" term="excel"/><category scheme="http://www.blogger.com/atom/ns#" term="project management"/><category scheme="http://www.blogger.com/atom/ns#" term="project plan"/><category scheme="http://www.blogger.com/atom/ns#" term="risk"/><category scheme="http://www.blogger.com/atom/ns#" term="template"/><category scheme="http://www.blogger.com/atom/ns#" term="waterfall"/><title type='text'>Project Management with Excel - Workload estimating</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn34-pKjqYKPPP-U5iLqLRbex_jpZ5vWbvxk6WIMlAojRarLK7Y9fCHpXjrVL29-YX48rOqP65rSWl8wGg6K1CudpK2Db06k6jjyH1eblb5Zzo3MUi1rcHVwW3gQEEUkjDINSRsZE6wdg/s1600/estimation.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;225&quot; data-original-width=&quot;225&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn34-pKjqYKPPP-U5iLqLRbex_jpZ5vWbvxk6WIMlAojRarLK7Y9fCHpXjrVL29-YX48rOqP65rSWl8wGg6K1CudpK2Db06k6jjyH1eblb5Zzo3MUi1rcHVwW3gQEEUkjDINSRsZE6wdg/s1600/estimation.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
This is actually already a second article regarding some templates I use for managing projects and avoiding MS Project at the same time - now covering workload estimations methods I use mostly for software development or software implementation/deployment projects.&lt;br /&gt;
More about background on why I do that, as well as the template of project plan you can&amp;nbsp;&lt;a href=&quot;http://www.linkedphpers.org/2017/05/project-management-with-excel-template.html&quot; target=&quot;_blank&quot;&gt;find here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
On this article I would like to share with you the methods I use for &lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;workload estimations&lt;/span&gt;&lt;/b&gt;. However right in the beginning I would like to point our very openly - &lt;b&gt;this is the waterfall approach&lt;/b&gt; !!! All Agile fans that would like to grill me presenting planning poker or similar methods - please stand down. The article is not referring to these methods (which in some cases might be much more effective - but not always :) ) so I do appreciate comments - not the ones that will prove Agile is better than everything however. I am actually planning also an article on which I would like to make some comparison of PM methods - and there I am pretty sure you will have a large field to grill me :)&lt;/div&gt;
&lt;br /&gt;
So - I described why I did not included planning poker, so maybe I will explain&lt;br /&gt;
&lt;h4&gt;
why I did the article from the beginning :)&amp;nbsp;&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I faced several people asking &quot;&lt;i&gt;how do you do the estimations&lt;/i&gt;&quot;, even &lt;a href=&quot;https://pm.stackexchange.com/questions/20908/overheads-calculation-assumptions/20925#20925&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;written some answer on that on StackExchange&lt;/a&gt; and most people were quite happy on my idea of doing that. So thought it might be worth sharing it here as well.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The idea is mostly backed by my own experience tied with some PM theory - so the equations you will see later on are based on theory (famous &lt;a href=&quot;https://en.wikipedia.org/wiki/Program_evaluation_and_review_technique&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;PERT - Program Evaluation and Review Technique&lt;/a&gt;), but also tuned up basing on how it was possible (for me :) ) to implement that in software development industry.&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The general estimation is based on &lt;b&gt;Expert method &lt;/b&gt;- which means we ask experts to estimate how long it is going to take to complete the task. However the single estimation given by the expert is not good enough - especially if you ask him to give you estimations for series of tasks that are already a result of breakdown. I have seen the tendency that the more expert someone is - the longer estimations he is giving &lt;i&gt;(which is quite understandable - the more export knows, the more knowledge of his lacks of knowledge he has - the more cautious he is)&lt;/i&gt;. This leads to the situation that &lt;b&gt;less experienced experts in most cases underestimates the work&lt;/b&gt;, while &lt;b&gt;the more experienced ones - overestimates&lt;/b&gt;.&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So it is our role as PMs to find some way to make these values realistic and use them in our project plans.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
As mentioned before - there are plenty of ways how can we manage or lead the estimation process - I will however focus on the one that I use successfully in waterfall projects, and that is based on PERT. According to PERT equation below:&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;T = (O&amp;nbsp;+ 4M&amp;nbsp;+ P)/6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
We basically need 3 values:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;O &lt;/b&gt;- Optimistic time of completing the task&lt;/li&gt;
&lt;li&gt;&lt;b&gt;M &lt;/b&gt;- Most Probable (I call it Realistic also) time of completing the task&lt;/li&gt;
&lt;li&gt;&lt;b&gt;P &lt;/b&gt;- Pessimistic time of completing the task&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Asking Experts to provide O and P is in most cases quite successful. They are able to provide these values quite precise.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The hard part starts when you ask them to provide you M... In most cases they will give you M as the middle value between O and P - which is in most cases wrong (too ideal :) ). That is why I created a variation of this - another equation or method I use to calculate the M value.&lt;/div&gt;
&lt;br /&gt;
Basically what I ask experts for are also 3 values:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;O - optimistic time of completing task (as mentioned above - works quite fine)&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;P - pessimistic time of completing task (as mentioned above - works quite fine)&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;R - which is a percentage value of Risk that we will fall down into Pesimistic value. In other words we assume everything will go OK, but what kind of probability there is that something will go wrong and we will need all Pessimistic time to complete the work. I have also developed kind of rules of estimating that kind of risk:&lt;/li&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;if it is task you have already done before - the risk should not exceed 20%&lt;/i&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;if it is task you know hoe to do, however never done it before, or just know the person you can ask how to complete that (and that person actually did it before) - you should estimate the risk between 10-40%&lt;/i&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;if it is task you only understand it is doable,&amp;nbsp; but have no idea yet how to do that and never done it or seen it before - you should go on the risk level 40-60%&lt;/i&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;if it is task you have no idea how to even start - estimate risk even on 60-90%&amp;nbsp;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
Now basing on these 3 values you can calculate M value:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;M = O*(1-R)+P*R&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
After putting it into PERT you can actually use the following equation:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;T = (O&amp;nbsp;+ (O*(1-R)+P*R)&amp;nbsp;+ P)/6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So that way you avoid asking your experts for M value, and instead you ask them for that Risk.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The Risk however is not being used only here.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The above equation helps you to created the times of atomic tasks - however &lt;b&gt;the fact you get the R(isk) values allows you also to estimate the level of project risk &lt;/b&gt;from schedule point of view. That is why I use this value also to calculate something I call &lt;b&gt;Margin &lt;/b&gt;for whole project. This &lt;b&gt;Margin &lt;/b&gt;I use then to mitigate the Schedule Risk - basically add the value of Margin on top of the project and use the money/time I have there if need to use the &lt;b&gt;Risk Response Plan against Schedule Risk&lt;/b&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The &lt;b&gt;Margin &lt;/b&gt;is calculated quite easily - it is simple weighted average for all Risk values - while the weight is the T value calculated on the equation presented above. The weighted average is used so we will avoid the situation that one short task with high risk will raise the overall risk dramatically.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
To easier understand the above theory I have also created the sample / template that can be used for these calculations.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;The template can be found &lt;a href=&quot;https://1drv.ms/x/s!ArJiqRu1OxiRifM7HRkIW9Q1llc9tQ&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; :)&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
It is very compatible with &lt;a href=&quot;http://www.linkedphpers.org/2017/05/project-management-with-excel-template.html&quot; target=&quot;_blank&quot;&gt;previous template I introduced for project plan&lt;/a&gt; - so both of them can be easily integrated by linking the final estimation values with a project plan.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Moving from theory to practice - apart from the actual tasks and their owners you need to provide the spreadsheet with the 3 values I described earlier:&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Optimistic - O value&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Pessimistic - P value&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Risk - R value&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Basing on these values the spreadsheet automatically calculates:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;R value - Realistic time&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;PERT value (using the pre-calculated R value)&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Margin value&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Final value - that includes both PERT value and Margin value.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Just regarding the Margin value - I use it in 2 places actually:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;As a cover for Risk Response Plan - the total value recalculated (in most cases) to real $$$&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;As floats once planning the critical path for the project - so the atomic values are added into the task time itself and this way gets to the Final value&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
You can also find kind of summaries in the rows 4 and 21 - but these are quite simple sum values.&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Hope you will like this template and - as always - all comments are much welcome :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: start;&quot;&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;About author:&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyBUEi7B3RlQY5qmKXx_vgabVDGcDxA6i5hgDLNfOVl4p3ObXpbxqKvgsomUiSUh8RMm-Kf_NS5roHYbYkV7eGJ2nDtmeq5zfqsGlLWxswU6fJcrF_TW7nwzOCszT_trsQBOxSEExDn5E/s1600/DSC_1542.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyBUEi7B3RlQY5qmKXx_vgabVDGcDxA6i5hgDLNfOVl4p3ObXpbxqKvgsomUiSUh8RMm-Kf_NS5roHYbYkV7eGJ2nDtmeq5zfqsGlLWxswU6fJcrF_TW7nwzOCszT_trsQBOxSEExDn5E/s1600/DSC_1542.jpg&quot; width=&quot;199&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: start;&quot;&gt;
&lt;b&gt;Wojciech Zieliński&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Prince2 and ITIL certified&amp;nbsp;&lt;/b&gt;manager with nearly&amp;nbsp;&lt;b&gt;15 years of project, program and people management experience&lt;/b&gt;. Managed and succeeded in&amp;nbsp;&lt;b&gt;over 25 projects and programs&amp;nbsp;&lt;/b&gt;both in IT and business areas. Recruited, led and managed&amp;nbsp;&lt;b&gt;international and distributed teams sized up to 50&lt;/b&gt;, used various project management methodologies including&amp;nbsp;&lt;b&gt;PMI, Prince2, ASAP, SCRUM, eXtreme Programming, ITIL&lt;/b&gt;. Has strong technical background covering&amp;nbsp;&lt;b&gt;SAP, Microsoft, Oracle&lt;/b&gt;&amp;nbsp;and custom developed&amp;nbsp;&lt;b&gt;CRM, ERP, Workflow and BI systems&lt;/b&gt;.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Please feel free to visit the portfolio page at&amp;nbsp;&lt;a href=&quot;http://www.inperitia.com/&quot;&gt;www.inperitia.com&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div style=&quot;text-align: start;&quot;&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.linkedphpers.org/feeds/4823435341909180394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.linkedphpers.org/2017/10/project-management-with-excel-workload.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/4823435341909180394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/4823435341909180394'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2017/10/project-management-with-excel-workload.html' title='Project Management with Excel - Workload estimating'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn34-pKjqYKPPP-U5iLqLRbex_jpZ5vWbvxk6WIMlAojRarLK7Y9fCHpXjrVL29-YX48rOqP65rSWl8wGg6K1CudpK2Db06k6jjyH1eblb5Zzo3MUi1rcHVwW3gQEEUkjDINSRsZE6wdg/s72-c/estimation.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7634820055071733985.post-3663428476586340146</id><published>2017-05-05T12:36:00.001+02:00</published><updated>2017-10-02T14:18:59.964+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="excel"/><category scheme="http://www.blogger.com/atom/ns#" term="project management"/><category scheme="http://www.blogger.com/atom/ns#" term="project plan"/><category scheme="http://www.blogger.com/atom/ns#" term="template"/><category scheme="http://www.blogger.com/atom/ns#" term="waterfall"/><title type='text'>Project Management with Excel - Template for Project Plan</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6DJU5z_w5mqEYTgaDngsHWp7d8yc8PeLxjVJZrVHEL-DICUjVfoWLHJwiPaSkc5y-2LywEkPzVIR2iUNyHfaSh6VJRAnnjh-49kP5PF1QuY7XJ4dajPtKd355cPekPIv9Gbc9jo6jG8s/s1600/Project+Plan+in+Excel.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;96&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6DJU5z_w5mqEYTgaDngsHWp7d8yc8PeLxjVJZrVHEL-DICUjVfoWLHJwiPaSkc5y-2LywEkPzVIR2iUNyHfaSh6VJRAnnjh-49kP5PF1QuY7XJ4dajPtKd355cPekPIv9Gbc9jo6jG8s/s320/Project+Plan+in+Excel.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
While diving into various project management internet sources I found plenty of templates for creating project plans in Excel. Most of them are not very sophisticated, delivering a simple table in which you can simply put the list of tasks (sometimes even on several levels - but that&#39;s already the top of sophistication I&#39;ve seen). I have to honestly admit I was reviewing only free templates - so it might be that the paid ones are delivering some more functionality.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
However since I am not a great fan of MS Project, while I have to in my daily work use some project plans - during several years I have created a plan template in Excel and decided to share it with you - hopefully you will like it.&lt;br /&gt;
It is maybe not as sophisticated as MS Project, doesn&#39;t take care of resource management at requires some Excel knowledge to be used but it fits the purpose for me - so hopefully it will also for you.&lt;br /&gt;
&lt;br /&gt;
Now I actually could simply give you the link to the file and let you download it and play around - but I think it would be better if I will also write several guidelines and information on how I use this template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
So - &lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;here is the &lt;a href=&quot;https://1drv.ms/x/s!ArJiqRu1OxiRhqlFGrV9wtLZKumTww&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;LINK&lt;/a&gt; :)&lt;/b&gt;&lt;/span&gt; &lt;/div&gt;
&lt;br /&gt;
And below some explanations, guidelines or best practices I use to make this excel effective.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
The example&lt;/h3&gt;
&lt;div&gt;
Under the &lt;a href=&quot;https://1drv.ms/x/s!ArJiqRu1OxiRhqlFGrV9wtLZKumTww&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;link &lt;/a&gt;you actually do not have clean template - there is an example of project plan (or actually a part of it - since the CRM Implementation will most likely take more phases than we can see there) for some simple project.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
And here is the very first thing - to avoid plenty of comments from Agile believers and evangelists - &lt;b&gt;this project plan is designed to be used in waterfall or waterfall-based formal procedures. It does not fit to pure Agile projects, &lt;/b&gt;is not intended to be used in such projects, hence it most likely be not effective for that. Full-stop - please do not comment the plan does not fit SCRUM :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, once clarified that, I would like also to mention for the record that this plan is not coming from any project I&#39;ve been managing or running. It has been created in less than 30 minutes just for the example purpose and using various techniques I use in this project plan. So please do not comment in scope of te timings (e.g. how the development can take 5 days, and testing another 5) - as this is not the case in here :)&lt;/div&gt;
&lt;h2&gt;
Data Structure&lt;/h2&gt;
&lt;h3&gt;
Multi-level tasks&lt;/h3&gt;
&lt;div&gt;
You can have tasks in different levels. In an example attached you have overall 5 levels - including the highest which project itself - CRM Implementation in cell B3 - actually referring to the plan title specified in A1 cell. &lt;br /&gt;
&lt;i&gt;You can add more levels by adding more columns there - but I have to admit I never had to do so and these 5 levels were a good fit for most of my projects I used this template for.&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You can play around levelling your tasks in any way you want - there are no strict rules in there. Actually &lt;b&gt;the whole Excel does not implement strict rules &lt;/b&gt;- I do not add any cell protection, since I already learned sometimes I need to do things in there I was not doing anytime before, so it is easier for me if I do not limit that. Of course when I send this to someone - sometimes I add read-only passwords, but only for review purposes (which actually can also be done using e.g. SharePoint rights).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So - having in mind no limitations, you can have several first-level tasks/projects. And I actually been using them on programme management assignments - where I had several connected projects, which were specified actually in single programme plan.&lt;/div&gt;
&lt;div&gt;
The second level I use mostly for workstreams. In the example the workstreams specified there are sequential - but I&#39;ve been using this spreadsheet in projects where the workstreams were parallel and worked fine for me.&lt;/div&gt;
&lt;div&gt;
The rest of the levels are very specific to the tasks itself. As you can see there are tasks that appears only on third level, there are ones that are levelled down. It is very much dependent on the project.&lt;/div&gt;
&lt;h3&gt;
Creating tasks&lt;/h3&gt;
&lt;div&gt;
To create task you simple add a row - or better insert it, since once inserting Excel will automatically use the upper-row formatting - so you will not have to copy conditional formatting that is implemented. You will also need to copy different formulas if you want to use them - this mainly refers to:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;formulas specified in column A - a simple one that is actually creating the number of the task basing on number of row&lt;/li&gt;
&lt;li&gt;&quot;grayed&quot; strings created in columns B:E - these are formulas that are creating in column B the unique string, kind of a task identifier. The string is created by adding all the level names together with the task name.&lt;br /&gt;&lt;i&gt;In fact in this spreadsheet this is not something you very much need, so you can actually skip this. The idea of this column (and it&#39;s use case) was when I was adding another sheet in here that was to track the resource availability and check whether recource is available for specific task. Since I did not wanted to copy (or refer) to another spreadsheet the whole plan - I was rather using B column as source for the list of all tasks and selecting task from the list to check whether task timing matches to resource availability.&lt;/i&gt;&lt;br /&gt;So bottom point - if you don&#39;t want to use it for you own purposes, you can remove the formulas and it will not affect the sheet itself.&lt;/li&gt;
&lt;li&gt;Formulas in columns G:L - they are connected with different timings or statuses, which will be described later. In general the formatting (especially the conditional formatting in column H) should be replicated if you insert the task, while other formulas are something you need to decide whether you want to copy them or do them in a way that will fit your purposes.&lt;/li&gt;
&lt;li&gt;Gant-chart in columns M:AY - here you have pure conditional formatting that is coloring the cells accordingly to timings and status. This should be replicated if you insert the rows, if you add them - you might need to copy the formatting by yourself.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Task owners&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
This is actually very simple column G, where you put the task owner in pure text. However I found it quite frequently used by various team members, that are basically filtering by this column to see what tasks they should be working on, or possibly forgot to update their status.&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;I have to admit that I had developed some additional sheets that are also adding some resource management functionalities in here - such as connection to out-of-office calendars or analysis on the workload - but this is not the part of this spreadsheet... Maybe I will share that ones as well if you like this one :)&lt;/i&gt;&lt;/div&gt;
&lt;h3&gt;
Progress&lt;/h3&gt;
&lt;div&gt;
Again quite straight forward column H. You can add there a percentage of task completion. The column will change colors depending on whether the task is completed (100%), in progress (more than &amp;nbsp;0% and less than 100%) or not started (0%). The coloring is however more sophisticated, since it refers mostly to task status. Full color description you can find there...&lt;/div&gt;
&lt;div&gt;
There is additional things I use here frequently which as AVG() formula. I use it for tasks that has some child-level tasks. In that situation I do not add here simply the percentage, but rather calculate it using AVG() formula for the child tasks - you can see examples in cells H5, H18 or H41 (and actually quite many more :)). The most &quot;advanced&quot; (or ranged) example is actually H3 - where you count the average of all progresses.&lt;/div&gt;
&lt;h3&gt;
Task timings - Start, Duration (workdays). Finish&lt;/h3&gt;
&lt;div&gt;
Here you can play actually most. The easiest way is just to type in dates - but I almost never do it so easily :)&lt;/div&gt;
&lt;div&gt;
In most cases I reference Start (column I) dates depending on other tasks or even workstreams. This enables me to automatically shift the dates if I update some of the crucial, critical path tasks. So on the start dates you can find following ways to specify them:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;references to other end dates (in most cases),&lt;/li&gt;
&lt;li&gt;MIN() formulas for tasks that has children - easiest way to get the start of the workstream or complex task (e.g. I4, I8 etc.)&lt;/li&gt;
&lt;li&gt;MAX() formulas if you want the task to start after some set of other tasks is finished (e.g. I46) - you can use also here references, all depends on your needs :)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
The Duration (column J) is also used in different ways:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;by clearly specifying number of working days task will take (it is very important you use working days, but according to standard Excel working days calendar - since it will be later on used to calculate the end date) - e.g. J6, J7&lt;/li&gt;
&lt;li&gt;by calculating number of working days using NETWORK.DAYS() formula border dates - e.g. J3, J5, J18&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
The Finish (column K) date can be used in following ways:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;by clearly specifying the end date - very rarely, or actually almost not used by myself :)&lt;/li&gt;
&lt;li&gt;by using MAX() formula to determine end date basing on child tasks end dates - e.g. K3, K5, K24&lt;/li&gt;
&lt;li&gt;by using NETWORK.DAYS() formula to calculate the end date basing on a start date and number of working days specified in J column - e.g. K6, K7&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
As per Finish column there&#39;s additional, simple functionality there which turns this column into Red once the date specified there is earlier than Start date - so that&#39;s kind of error notification.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
There is one important thing to mention in here - the start/duration/finish dates are not considered as non-stop work for the task. Therefore if you sum up the durations - you won&#39;t get the price, but only a time in which project should be finished. These times are more time slots within the task needs to be completed - therefore there&#39;s not problem in having several tasks assigned to same person at the same timeslot - since that person can work on them in parallel or sequentially within his/her own workplan.&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;
Status&lt;/h3&gt;
&lt;div&gt;
Status (column L) is always calculated basing on the task progress and start/end dates referring to current date. The value of this column is used for conditional formatting of Progress column, as well as same formulas are used in Gantt Chart. Basically the rules for Status are following:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Inactive - the task has been completed (Progress = 100%) and time for completion is in the past (has already passed) - color for that is Grey&lt;/li&gt;
&lt;li&gt;Delayed - the task is not completed (Progress &amp;lt; 100%) and time for the completion is in the past (has already passed) - color for that is Red&lt;/li&gt;
&lt;li&gt;Dangered - the task is not completed, but it has started and not reached 50% while the time assigned to this task has passed 50% of overall time - color for that is Orange&lt;/li&gt;
&lt;li&gt;On Track - the task is not completed, but it has started and should be finished on time - color for that is Green&lt;/li&gt;
&lt;li&gt;Not Started - the task has not started (Status = 0%) while the currently we are within start-finish period and task is not Endangered - color for that is Light Blue&lt;/li&gt;
&lt;li&gt;Planned - the tas has not started (Status = 0%), but the start date is in future&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
I know it might look a bit complicated - but after a while of working in here it is quite easily to get used to these colors and statuses and no longer think on formulas that are calculating them.&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;
Gantt Chart&lt;/h2&gt;
&lt;div&gt;
Gantt chart in the template is created automatically - using the conditional formatting formulas that bases on current date, task dates, row 2 in which you have the calendar-week days (wee commencing specific date) and task status. The coloring is created automatically - so there&#39;s not problem in adding some texts or notes in the Gantt chart area - it should not break as long as you will not start merging or dividing cells.&lt;/div&gt;
&lt;div&gt;
You can also format the cells (including coloring them) in the way you won&#39;t, but you need to mind the fact the conditional formatting will override your formatting - you can see that on rows 4 or 23 where the user formatting of making the cells ligh-blue is overridden in some of the cells by conditional formatting dependent on task specifics and status.&lt;/div&gt;
&lt;div&gt;
In scope of date frames - in row number 2 you can notice the dates. The only date you should actually set to get the timeframe of your project is date specified in M2 cell. The rest of the dates are calculated automatically. It is also important that you put there Monday date - since the formulas are designed in a way that all the dates in the row 2 are based on a &quot;week commencing specific Monday&quot;.&lt;/div&gt;
&lt;div&gt;
You can of course extend the number of weeks presented on the Excel - the easiest way to do so is actually copying the last column of the sheet (in an example AY) into next columns - that way both formulas for calculating the date, as well as conditional formatting should be copied correctly and should work fine.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I hope you will like this template. Please do not hesitate to let me know what do you thin in comments. As I mentioned - it works for me, and I would really love to know whether it will work for you as well.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;About author:&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyBUEi7B3RlQY5qmKXx_vgabVDGcDxA6i5hgDLNfOVl4p3ObXpbxqKvgsomUiSUh8RMm-Kf_NS5roHYbYkV7eGJ2nDtmeq5zfqsGlLWxswU6fJcrF_TW7nwzOCszT_trsQBOxSEExDn5E/s1600/DSC_1542.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyBUEi7B3RlQY5qmKXx_vgabVDGcDxA6i5hgDLNfOVl4p3ObXpbxqKvgsomUiSUh8RMm-Kf_NS5roHYbYkV7eGJ2nDtmeq5zfqsGlLWxswU6fJcrF_TW7nwzOCszT_trsQBOxSEExDn5E/s1600/DSC_1542.jpg&quot; width=&quot;199&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Wojciech Zieliński&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Prince2 and ITIL certified&amp;nbsp;&lt;/b&gt;manager with nearly&amp;nbsp;&lt;b&gt;15 years of project, program and people management experience&lt;/b&gt;. Managed and succeeded in&amp;nbsp;&lt;b&gt;over 25 projects and programs&amp;nbsp;&lt;/b&gt;both in IT and business areas. Recruited, led and managed&amp;nbsp;&lt;b&gt;international and distributed teams sized up to 50&lt;/b&gt;, used various project management methodologies including&amp;nbsp;&lt;b&gt;PMI, Prince2, ASAP, SCRUM, eXtreme Programming, ITIL&lt;/b&gt;. Has strong technical background covering&amp;nbsp;&lt;b&gt;SAP, Microsoft, Oracle&lt;/b&gt;&amp;nbsp;and custom developed&amp;nbsp;&lt;b&gt;CRM, ERP, Workflow and BI systems&lt;/b&gt;.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Please feel free to visit the portfolio page at&amp;nbsp;&lt;a href=&quot;http://www.inperitia.com/&quot;&gt;www.inperitia.com&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.linkedphpers.org/feeds/3663428476586340146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.linkedphpers.org/2017/05/project-management-with-excel-template.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/3663428476586340146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/3663428476586340146'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2017/05/project-management-with-excel-template.html' title='Project Management with Excel - Template for Project Plan'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6DJU5z_w5mqEYTgaDngsHWp7d8yc8PeLxjVJZrVHEL-DICUjVfoWLHJwiPaSkc5y-2LywEkPzVIR2iUNyHfaSh6VJRAnnjh-49kP5PF1QuY7XJ4dajPtKd355cPekPIv9Gbc9jo6jG8s/s72-c/Project+Plan+in+Excel.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7634820055071733985.post-8884891733039998669</id><published>2017-01-12T14:31:00.000+01:00</published><updated>2017-01-12T14:31:32.394+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AbstractFactoryInterface"/><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="database"/><category scheme="http://www.blogger.com/atom/ns#" term="factory"/><category scheme="http://www.blogger.com/atom/ns#" term="framework"/><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="lazy loading"/><category scheme="http://www.blogger.com/atom/ns#" term="postgres"/><category scheme="http://www.blogger.com/atom/ns#" term="ServiceManager"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><category scheme="http://www.blogger.com/atom/ns#" term="zend framework"/><title type='text'>Zend Framework 2 - Using abstract factory to create database table services</title><content type='html'>Hi All,&lt;br /&gt;
&lt;br /&gt;
While working on a one solution I have created a nice (at least in my oppinion) solution on how to automatically create table services using abstract factories and decided to share with you - hopefully you will also find it useful.&lt;br /&gt;
&lt;br /&gt;
The idea genesis was actually from a nice article on how to get rid ServiceManager and create Controllers automatically described in a blog of Alexandre Lemaire: &lt;a href=&quot;http://circlical.com/blog/2016/3/9/preparing-for-zend-f&quot; target=&quot;_blank&quot;&gt;Preparing your Zend Framework 3 Controllers. Bye ServiceLocator&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Standards you need to follow to use this solution&lt;/h2&gt;
&lt;div&gt;
Of course to have anything automated you need to follow some rules or standards. These standards includes in this case mostly the naming of the classes or database tables and other objects (identifier columns and sequences). There are following rules that needs to be followed:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;The class for Table needs to be in Model area of the module and needs to be postfixed by Table keyword - e.g. \Application\Model\ConfirmTable or \OtherModule\Model\IncomingMessageTable - both of the mentioned names matches this requirement.&lt;/li&gt;
&lt;li&gt;The name of the table should match with classname in one (&lt;b&gt;any&lt;/b&gt;) of following ways:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;It should be exactly same as lowercased classname with Table keyword removed - e.g. for \Application\Model\&lt;b&gt;Confirm&lt;/b&gt;Table the name of the table should be &lt;b&gt;confirm&lt;/b&gt;; for \OtherModule\Model\&lt;b&gt;IncomingMessage&lt;/b&gt;Table the name of the table should be &lt;b&gt;incomingmessage&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;It should be exactly same as lowercases classname, but with &quot;_&quot; character inside, always before uppercase letter appears and with Table keyword removed - e.g. for \Application\Model\&lt;b&gt;Confirm&lt;/b&gt;Table the name of the table should be&amp;nbsp;&lt;b&gt;confirm&lt;/b&gt;; for \OtherModule\Model\&lt;b&gt;IncomingMessage&lt;/b&gt;Table the name of the table should be &lt;b&gt;incoming_message&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;It can be deliberately specified in a constant LAZYFACTORY_TABLENAME inside of the table class (\Application\Model\ConfirmTable or \OtherModule\Model\IncomingMessageTable) - so using our examples the name (and now any name we want) needs to be accessible if calling \Application\Model\ConfirmTable::LAZYFACTORY_TABLENAME or \OtherModule\Model\IncomingMessageTable::LAZYFACTORY_TABLENAME.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;If we want to use the &lt;a href=&quot;https://framework.zend.com/apidoc/2.3/classes/Zend.Db.TableGateway.Feature.SequenceFeature.html&quot; target=&quot;_blank&quot;&gt;SequenceFeature&lt;/a&gt; (e.g. to retrieve the IDs of records that are inserted to the database) the table should contain constraint that matches &lt;b&gt;all &lt;/b&gt;of following rules:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;the name of constraint should be [tablename]_pkey (tablename is determined as above rules says)&lt;/li&gt;
&lt;li&gt;the constraint should be primary key for the table&lt;/li&gt;
&lt;li&gt;constraint is set only for one column&lt;/li&gt;
&lt;li&gt;column on which constraint is set should be of integer type&lt;/li&gt;
&lt;/ul&gt;
&lt;/ol&gt;
&lt;div&gt;
It is important that rule number 3 (the one regarding constraints) is not a must for function to work. This is just an option if you use sequences. If you do not, or use them differently - still the service can be created - it will only not create SequenceFeature, so either you need to deal with that by yourself or live without it.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
If you code following above rules - you can use the presented solution successfully; if not - either change the way you code, or you will need to adopt the solution to your needs or preferences :)&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
LazyTableFactory class&lt;/h2&gt;
&lt;div&gt;
First of all we need to create a class that will implement &lt;a href=&quot;https://framework.zend.com/manual/2.4/en/modules/zend.service-manager.html#abstract-factories&quot; target=&quot;_blank&quot;&gt;AbstractFactoryInterface&lt;/a&gt; - so this class cn be used as an abstract factory.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
More about this you can find in Zend Framework Documentation on this, but in short words abstract factories is something that can be called if ZF2 is unable to find a factory to create a specific service. First it runs the function canCreateServiceWithname(..) to check whether this factory is applicable to create a service and if it is - it runs createServiceWithName(..) function that should return an object that will be registered as requested service.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The full code of this class you can find below:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;class LazyTableFactory extends AbstractLazyFactory implements AbstractFactoryInterface {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; protected $tableName;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; protected $sequencedField;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; public static function createTableGateway(\Zend\Db\Adapter\Adapter $dbAdapterObject, string $tableName = null, $prototypeObject = null) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Lets now look a little bit deeper into the functions we have in here:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) function&lt;/h3&gt;
&lt;div&gt;
This one as mentioned before is the function that checks whether the service can be created. This function needs to be implemented if the class is to properly implement interface &lt;a href=&quot;https://framework.zend.com/manual/2.4/en/modules/zend.service-manager.html#abstract-factories&quot; target=&quot;_blank&quot;&gt;AbstractFactoryInterface&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The function body is following:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;&quot;&gt;public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Check if $requestedName is from Model and consists Table keywords&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!(&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stristr($name, str_replace(&quot;\\&quot;, &quot;&quot;, $requestedName)) !== false // $name needs to be same as $requestedName without \&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;&amp;amp; strstr($requestedName, &#39;\Model\\&#39;) !== false &amp;nbsp;// $requestedName needs to consist \Model\&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;&amp;amp; strstr($requestedName, &#39;Table&#39;) !== false // $requestedName needs to consist Table&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ) &amp;amp;&amp;amp; !class_exists($requestedName))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return false;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Check if correct table exists&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (defined($requestedName . &#39;::LAZYFACTORY_TABLENAME&#39;))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!is_null(constant($requestedName . &#39;::LAZYFACTORY_TABLENAME&#39;)))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $requestedNameData[1] = constant($requestedName . &#39;::LAZYFACTORY_TABLENAME&#39;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elseif (!preg_match(&quot;/([a-zA-Z0-9]*)Table$/U&quot;, $requestedName, $requestedNameData))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return false;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $dbMetadata = \Zend\Db\Metadata\Source\Factory::createSourceFromAdapter($serviceLocator-&amp;gt;get(&#39;Zend\Db\Adapter\Adapter&#39;));&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $dbTables = $dbMetadata-&amp;gt;getTableNames();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (in_array(strtolower($requestedNameData[1]), $dbTables)) // simple lowercase of tablename&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;tableName = strtolower($requestedNameData[1]);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $tableName = strtolower(preg_replace(&quot;/\B([A-Z])/&quot;, &quot;_$1&quot;, $requestedNameData[1])); // prefixing all capitals with &quot;_&quot; and lowercasing&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (in_array($tableName, $dbTables))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;tableName = $tableName;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return false; // neither the lowercased or prefixed and lowercased table name has been found - aborting&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Checks if there is pkey constraint that should be used for SequenceFeature creation&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach($dbMetadata-&amp;gt;getConstraints($this-&amp;gt;tableName) as $tableConstraint)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $tableConstraint-&amp;gt;getName() == $this-&amp;gt;tableName . &quot;_pkey&quot; // only for constranint specifically named&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;&amp;amp; $tableConstraint-&amp;gt;isPrimaryKey() // only for pkey constraint&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;&amp;amp; sizeof($tableConstraint-&amp;gt;getColumns()) &amp;lt; 2 // only for constraint set for one column&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $columns = $tableConstraint-&amp;gt;getColumns();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($dbMetadata-&amp;gt;getColumn($columns[0], $this-&amp;gt;tableName)-&amp;gt;getDataType() == &#39;integer&#39;) // checks if column is integer&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;sequencedField = $columns[0];&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return true;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
To check whether the class is applicable to create automatically a service it needs to check whether the assumptions or standards are matched by the service and database it self. Following check are being performed:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;The name of a service is an actual class specified in Model and whether it consists (most likely at the end) the &quot;Table&quot; keyword.&lt;/li&gt;
&lt;li&gt;The class for Table object we wish to use needs to follow the rules mentioned earlier in Standards section of this post.&lt;/li&gt;
&lt;/ol&gt;
If both conditions are met - the function sets the tablename appropriatelly and additionally checks whether the SequenceFeature should be created later on (basing on the rules described in Standards section).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Then function returns TRUE which means we are able to create service using createServiceWithName(..) function.&lt;/div&gt;
&lt;h3&gt;
createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) function&lt;/h3&gt;
&lt;div&gt;
This function actually creates our service. This is second function that is mandatory for the class to implement interface &lt;a href=&quot;https://framework.zend.com/manual/2.4/en/modules/zend.service-manager.html#abstract-factories&quot; target=&quot;_blank&quot;&gt;AbstractFactoryInterface&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Let&#39;s take a look at this function&#39;s body:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;&quot;&gt;public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $tableGateway = $this-&amp;gt;createTableGateway($serviceLocator-&amp;gt;get(&#39;Zend\Db\Adapter\Adapter&#39;), $this-&amp;gt;tableName);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (isset($this-&amp;gt;sequencedField))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $tableGateway-&amp;gt;getFeatureSet()-&amp;gt;addFeature(new SequenceFeature($this-&amp;gt;sequencedField, $this-&amp;gt;tableName . &quot;_&quot; . $this-&amp;gt;sequencedField . &quot;_seq&quot;));&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $tableGateway-&amp;gt;initialize();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $tableObject = new $requestedName($tableGateway);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;addObjectProperties($tableObject, $serviceLocator);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return $tableObject;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
First we need to create a &lt;a href=&quot;https://framework.zend.com/manual/2.2/en/modules/zend.db.table-gateway.html&quot; target=&quot;_blank&quot;&gt;TableGateway&lt;/a&gt; for our table. To do that we use additional function called createTableGateway(..) described below. Now let&#39;s assume that function actually creates a proper gateway - however it would be unfair if I would not make one reservation in here. The createTableGateway(..) function (BTW: defined as static function, so can be also used for different than only this class-related purposes) has some more advanced features such as specifying row prototype object. Currently abstract factory does not make use of it - which means all the tables that are created via this factory will either not have the row prototype class or this class will be needed to be added &quot;outside&quot;. This however is a &lt;b&gt;room for improvement &lt;/b&gt;for this class - but since I did not needed this yet - haven&#39;t developed :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Once the &lt;a href=&quot;https://framework.zend.com/manual/2.2/en/modules/zend.db.table-gateway.html&quot; target=&quot;_blank&quot;&gt;TableGateway&lt;/a&gt; is created the SequnceFeature is created - of course only if function canCreateServiceWithName(..) has identified it needs to be created.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
After that the TableGateway is initialized and we can use this object for creating table itself.&lt;/div&gt;
&lt;div&gt;
The table is created using name of the class passed in parameter (we already checked whether we have this class in canCreateServiceWithName(..) function), where we pass the &lt;a href=&quot;https://framework.zend.com/manual/2.2/en/modules/zend.db.table-gateway.html&quot; target=&quot;_blank&quot;&gt;TableGateway&lt;/a&gt; object created earlier. Here you might have a question why I need to pass &lt;a href=&quot;https://framework.zend.com/manual/2.2/en/modules/zend.db.table-gateway.html&quot; target=&quot;_blank&quot;&gt;TableGateway&lt;/a&gt; object to the table class, which is actually a &quot;blank&quot; class in many situations. Well - since I created also something like AbstractTable class that adds some standard functionality to all table classes I use - however this is something I will put in other article (if you will need this one :) ). For the time being (or if you decide not to use the idea I will describe in that other article) you can simply modify the function, so TableGateway will not be passed.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Then we do additional thing - we call the function addObjectProperties(..) against the newly-created object. This function is actually specified in AbstractLazyFactory and I will describe what it does later.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
At the end we can return the object we created - and it will be tied to specific service.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
createTableGateway(\Zend\Db\Adapter\Adapter $dbAdapterObject, string $tableName = null, $prototypeObject = null) function&lt;/h3&gt;
&lt;div&gt;
Actually for the needs of this factory class the function does quite easy and straitght-forward thing - it only creates TableGateway object - which can be done by simple&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;new TableGateway($this-&amp;gt;tableName, $serviceLocator-&amp;gt;get(&#39;Zend\Db\Adapter\Adapter&#39;))&lt;/span&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
instruction put into createServiceWithName(..) function. What is even more - this is not needed so much if we use simple, blank table classes.&lt;/div&gt;
&lt;div&gt;
But since I plan to prepare also additional article describing AbstractTable class and it&#39;s usage, which adds quite some more features to our standard tables - I will get a bit more into details of this function and present all it&#39;s features:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;&quot;&gt;public static function createTableGateway(\Zend\Db\Adapter\Adapter $dbAdapterObject, string $tableName = null, $prototypeObject = null) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!is_null($prototypeObject)) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $resultSetPrototype = new ResultSet();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!is_null($dbAdapterObject))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $prototypeObject-&amp;gt;setDbAdapter($dbAdapterObject);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!is_null($tableName))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $prototypeObject-&amp;gt;setDbTableName($tableName);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $resultSetPrototype-&amp;gt;setArrayObjectPrototype($prototypeObject);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $resultSetPrototype = null;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return new TableGateway($tableName, $dbAdapterObject, null, $resultSetPrototype);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
First thing you might notice here is the fact function is static. The reason for that is that I use this function also in other places of the whole application for creatiing more advance TableGateways - especially ones that will also include the prototype classes for table rows.&lt;/div&gt;
&lt;div&gt;
And this is exactly the &quot;added value&quot; this function delivers that was the purpose of putting that into a function.&lt;/div&gt;
&lt;div&gt;
I will not however go too much into the details of creating a row prototype, since it is quite nicely described in ZF2 tutorials and documentation - so I will just say it works correctly - at least for me :)&lt;/div&gt;
&lt;h2&gt;
AbstractLazyFactory class&lt;/h2&gt;
&lt;div&gt;
This class actually has been created to store just one toolkit functionality - at least for now (maybe I will improve it in the future). The reason why I haven&#39;t put that functionality directly into LazyTableFactory class is that I use this abstract class also for creating other factories - such as specific table factories (which might be a topic for next article as well - again if you like the current one, which you can express in comments :) ) or even lazy controller factory (described in a blog of Alexandre Lemaire:&amp;nbsp;&lt;a href=&quot;http://circlical.com/blog/2016/3/9/preparing-for-zend-f&quot; target=&quot;_blank&quot;&gt;Preparing your Zend Framework 3 Controllers. Bye ServiceLocator&lt;/a&gt;&amp;nbsp;mentioned earlier).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But what is that magic functionality ?&lt;/div&gt;
&lt;div&gt;
It adds special properties for the &quot;manufactured&quot; class which delivers objects from ServiceManager (such as Log, Config or Translator in my case) or can deliver various other properties, which values will be delivered by callback functions.&lt;/div&gt;
&lt;div&gt;
This allows e.g. in the manufactured class call&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;$this-&amp;gt;Log-&amp;gt;debug(...)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
for sending debugging information without a need to pass the Log service by constructor parameter or setter function.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Let&#39;s take a look how is it implemented:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;abstract class AbstractLazyFactory {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; protected function getPropertiesConfig() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return array(&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;LAZYFACTORY_INCLUDE_LOG&#39; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; =&amp;gt; function($serviceLocator) { return $serviceLocator-&amp;gt;get(&#39;Log&#39;); }, // strange, but using std &#39;Log&#39; does not work correctly&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;LAZYFACTORY_INCLUDE_CONFIG&#39; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;gt; function($serviceLocator) { return $serviceLocator-&amp;gt;get(&#39;Config&#39;); }, // strange, but using std &#39;Log&#39; does not work correctly&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;LAZYFACTORY_INCLUDE_SERVICELOCATOR&#39; &amp;nbsp; &amp;nbsp;=&amp;gt; function($serviceLocator) { return $serviceLocator; },&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;LAZYFACTORY_INCLUDE_TRANSLATOR&#39; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;gt; &#39;translator&#39;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; protected function addObjectProperties($object, ServiceLocatorInterface $serviceLocator) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach($this-&amp;gt;getPropertiesConfig() as $constant =&amp;gt; $property) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (defined(get_class($object) . &#39;::&#39; . $constant))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!is_null(constant(get_class($object) . &#39;::&#39; . $constant))) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $propertyName = constant(get_class($object) . &#39;::&#39; . $constant);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (is_string($property)) // setting the property for string values (retrieves from serviceLocator)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $object-&amp;gt;$propertyName = $serviceLocator-&amp;gt;get($property);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (is_callable($property)) // setting the property for callback values&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $object-&amp;gt;$propertyName = $property($serviceLocator);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
Structure of getPropertiesConfig() function might be somehow familiar for you - since this is the function that allows to specify the constants that needs to be set in the manufactured class and the values the appropriate properties will be set to.&lt;/div&gt;
&lt;div&gt;
So - as an example - if in the class \OtherModule\Model\IncomingMessageTable we will have&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;const LAZYFACTORY_INCLUDE_LOG = &#39;LoggerObject&#39;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
Then in the manufactured object there will be a property LoggerObject, which value will be set to the callback function delivering Log service from ServiceManager - so it can be called e.g. in a way:&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;$this-&amp;gt;LoggerObject-&amp;gt;debug(...)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
In current implementation the values for array can be of 2 types:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;callback function - returning the value that should be delivered&lt;/li&gt;
&lt;li&gt;string - then it is actually a service name from ServiceManager that should be called&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
In the second case you might notice I have left in the code the comments that Log and Config services cannot be somehow accessed differently that by callback. Here I have to admit I have no idea why - especially that accessing them via callback works fine, as well as accessing Translator by string array value works fine as well. If you find out why this works like this - would greatly appreciate sharing on the comments :)&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Then we have am actual function that is creating the properties and adding them to the object delivered in $object parameter. Apart from plenty of checks whether a constant exists and whether it is set and deciding whether we should run a callback or get teh value from ServiceManager - nothing very fancy in here :)&lt;/div&gt;
&lt;h2&gt;
Enabling abstract factory&lt;/h2&gt;
&lt;div&gt;
Now, once we have everything in place - we can enable the abstract factory (and get rid of all other table factories :) ). The way I do it is actually via module/Application/config/module.config.php file, where I set it in the following way:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&#39;service_manager&#39; =&amp;gt; array(&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;factories&#39; =&amp;gt; array(&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ),&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;abstract_factories&#39; =&amp;gt; array(&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \Application\Factory\LazyTableFactory::class,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ),&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; ),&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
So that is why in all other modules this factory will be used as well - if the factory for specific table class is not setup.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You can of course do it also in Module or any different module.config.php files - the way I do it is simply my personal preference :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Final words&lt;/h2&gt;
&lt;div&gt;
I hope you like the presented solution. As mentioned earlier in an article - it is actually a part of a bit larger solution on how to easier play with &lt;a href=&quot;https://framework.zend.com/manual/2.4/en/user-guide/database-and-models.html&quot; target=&quot;_blank&quot;&gt;ORM delivered by Zend Framework 2&lt;/a&gt;. Please feel free to share your thoughts, comments - words of appreciation are also a ice thing. At least I will know whether it is worth to take more time to describe also other parts of this solution, or nobody actually cares :)&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.linkedphpers.org/feeds/8884891733039998669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.linkedphpers.org/2017/01/zend-framework-2-using-abstract-factory.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/8884891733039998669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/8884891733039998669'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2017/01/zend-framework-2-using-abstract-factory.html' title='Zend Framework 2 - Using abstract factory to create database table services'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7634820055071733985.post-1042246057780367803</id><published>2016-04-28T13:23:00.005+02:00</published><updated>2016-04-28T13:23:43.217+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="framework"/><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="problem"/><category scheme="http://www.blogger.com/atom/ns#" term="solution"/><category scheme="http://www.blogger.com/atom/ns#" term="zend framework"/><title type='text'>Zend Framework 2 - Zend\Mail\Message::fromString() wrongly interprets headers with country-specific characters - SOLUTION</title><content type='html'>Hi All,&lt;br /&gt;
&lt;br /&gt;
While working on some project of mine I encountered a problem in &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Zend\Mail\Message::fromString()&lt;/span&gt; method. Since I&#39;ve been looking for a solution in internet for quite some time and haven&#39;t found one - I decided to describe in here what I managed to create to fix it. I do not know whether it is most elegant solution or not - the good thing is that it works. If some of you would like to reuse the solution or maybe increase it&#39;s functionality - please feel free to share your thoughts :)&lt;br /&gt;
&lt;br /&gt;
One of the functionalities of the system I am working on is filtering incoming and outgoing emails using PHP script. The script is designed as ZF2 Console application. Basically it takes an email from Sendmail queue using output_filter and processes it using &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;php .../index.php process incoming ...&lt;/span&gt; console command. Some more information on how to achieve that you can find &lt;a href=&quot;http://moshez.blogspot.de/2013/02/techpostfix-mail-server-filter-email-by.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
One of the first steps that are being taken &quot;inside&quot; the script is converting the raw message that is passed from console into &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Zend\Mail\Message&lt;/span&gt; object - or actually object of a class that inherits from &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Zend\Mail\Message&lt;/span&gt;. ZF2 provides a special static method for it which is &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Zend\Mail\Message::fromString($rawMessage)&lt;/span&gt;. The method actually goes OK - since it takes the RAW message and created the object. The problems however starts when you try to reach any of message headers using class methods. Header getters are implemented in an lazy-loading pattern - so the fact object consists &quot;wrong&quot; headers is not recognized once the object is created by &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Zend\Mail\Message::fromString()&lt;/span&gt; method.&lt;br /&gt;
&lt;br /&gt;
After quite extensive debuging, send plenties of emails there and back I recognized the problem actually is about headers that consists local characters (for Poland examples of them might be: &lt;i&gt;ź, ć, ń, ę, ą &lt;/i&gt;etc. - other countries might have more or less of such as well). Since messages were sent and received using different mailservers (&lt;i&gt;Exchange, sendmail, Lotus&lt;/i&gt;) and different email clients (&lt;i&gt;Outlook, Thunderbird, Windows Mail&lt;/i&gt;) - the headers in which these characters appeared were very different - e.g. Exchange (&lt;i&gt;or Outlook - haven&#39;t checked that in 100% :) &lt;/i&gt;) was adding &lt;i&gt;Topic-Thread&lt;/i&gt; header (as far as I know for message threading) and the full topic was put in there - so this header, among others (such as &lt;i&gt;Topic&lt;/i&gt;) also was throwing Exception once tried to be retrieved from the object.&lt;br /&gt;
&lt;br /&gt;
The problem with &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Zend\Mail\Message::fromString()&lt;/span&gt; method was that it actually didn&#39;t allowed to specify encoding for the data that is retrieved from RAW message. It simply takes the data and puts into some storage inside the object - and the data itself is retrieved on a lazy-loading basis.&lt;br /&gt;
So once you try to retrieve the header - the getter is throwing an &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Exception&lt;/span&gt; that data is in wrong format.&lt;br /&gt;
&lt;br /&gt;
What I did (and yes - &lt;b&gt;here comes the solution&lt;/b&gt; - finally :) ) was creating an inheriting class and changing the way &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Zend\Mail\Message::fromString()&lt;/span&gt; method works. Please find the code below:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;public static function fromString(string $rawMessage, string $encoding = &#39;UTF-8&#39;) {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $message = parent::fromString($rawMessage);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach($message-&amp;gt;getHeaders()-&amp;gt;toArray() as $headerName =&amp;gt; $headerValue) {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $message-&amp;gt;getHeaders()-&amp;gt;get($headerName);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } catch (\Zend\Mail\Header\Exception\InvalidArgumentException $e) { // catches only if Header is wrongly structured&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $message-&amp;gt;getHeaders()-&amp;gt;removeHeader($headerName);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $header = new \Zend\Mail\Header\GenericHeader();&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $header-&amp;gt;setEncoding($encoding);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $header-&amp;gt;setFieldName($headerName);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $header-&amp;gt;setFieldValue($headerValue);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $message-&amp;gt;getHeaders()-&amp;gt;addHeader($header);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $message-&amp;gt;getHeaders()-&amp;gt;setEncoding($encoding); // All headers are encoded in $encoding&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return $message;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
So what you can see in here is that I am introducing additional parameter &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;$encoding&lt;/span&gt; for this method that allows you to specify the encoding for the message. The parameter has a default value of &lt;i&gt;UTF-8&lt;/i&gt; - mainly so method will be compatible downwards (&lt;i&gt;eventhough PHP is throwing a Notice it is not :) &lt;/i&gt;).&lt;br /&gt;
Then it fires the standard, parent method to create an object - as I described before it will not fail yet :)&lt;br /&gt;
Then we have a code that tries to &quot;cleanse&quot; the headers - by calling everyone of them and catching the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;InvalidArgumentException&lt;/span&gt; if thrown. If this exception is raised (and catched by &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;try...catch...&lt;/span&gt; &amp;nbsp;code) - the header is removed and recreated, but with proper &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;$encoding&lt;/span&gt;.&lt;br /&gt;
After all headers are checked and potentially replaced by correctly-encoded ones - I am calling additionally the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;setEncoding()&lt;/span&gt; method against all the headers again - for all headers that were not &quot;replaced&quot; in &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;foreach()&amp;nbsp;{ try...catch.. } &lt;/span&gt;block - so all headers will be encoded in same encoding.&lt;br /&gt;
I know you might think &lt;i&gt;why don&#39;t you simply execute this setEncoding() method for all existing headers ?&lt;/i&gt;. Well - I tried - and this one fires the exception as well :) So as I assume, the method simply calls every header, but once calling - the lazy-loading causes &lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Exception &lt;/span&gt;to be thrown.&lt;br /&gt;
&lt;br /&gt;
And that&#39;s it. Please feel free to share your thoughts on this article - if you find it useful or not. Or if something can be improved :)&lt;br /&gt;
&lt;br /&gt;
If you share the positive feedback - I will try to publish more if such quite detailed articles of solutions or problems I encountered already :)</content><link rel='replies' type='application/atom+xml' href='http://www.linkedphpers.org/feeds/1042246057780367803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.linkedphpers.org/2016/04/zend-framework-2-zendmailmessagefromstr.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/1042246057780367803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/1042246057780367803'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2016/04/zend-framework-2-zendmailmessagefromstr.html' title='Zend Framework 2 - Zend\Mail\Message::fromString() wrongly interprets headers with country-specific characters - SOLUTION'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7634820055071733985.post-76360070297516110</id><published>2014-08-25T13:15:00.002+02:00</published><updated>2014-08-25T13:27:58.783+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers"/><title type='text'>LinkedPHPers crossed 50k members !</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
&lt;span style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVdPUUm54cUeNRtUtNcqePj71_OLNjMHOdaqt9ZFte6SWFQTNuy1zkxPyixnztpXKtXCxJr5v4mCLS5zYT_1_J6Dqn_JWbDkVvJW1R6dpAYsBXYpSttJTs0XZDXFN9ZKJ_S1iJro1hdtU/s1600/cake700.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVdPUUm54cUeNRtUtNcqePj71_OLNjMHOdaqt9ZFte6SWFQTNuy1zkxPyixnztpXKtXCxJr5v4mCLS5zYT_1_J6Dqn_JWbDkVvJW1R6dpAYsBXYpSttJTs0XZDXFN9ZKJ_S1iJro1hdtU/s1600/cake700.jpg&quot; height=&quot;200&quot; width=&quot;155&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;It is my great pleasure to announce the LinkedPHPers group has just crossed 50k members. The person that has been accepted to the group as 50k member is &lt;/span&gt;&lt;a href=&quot;http://www.linkedin.com/pub/joe-goulet/51/5ab/489/pl&quot; style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot; target=&quot;_blank&quot;&gt;Joe Goulet&lt;/a&gt;&lt;span style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt; - Talent Acquisition Specialist from Detroit, US. Unfortunately we do not have any budget for special gifts or prizes (eventhough there was an idea to fund it some time ago - nothing unfortunately came up of this :( ) - but please accept my real congrats on that :)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
I think such an occasion is a good time to summarize or remind some things that has happened during the group lifetime. Unfortunately LinkedIn does not give any good tools for statistics - so I will base on the stats that are present, as well as some notes I have.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
&lt;span style=&quot;text-align: -webkit-auto;&quot;&gt;The first member joined the LinkedPHPers group on March 20th 2008 - so we can say we are 6 years old already. In Poland (where I am from :) ) we would go to the first class of the primary school already :)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
The very first blog entry I have posted about this group was about &lt;a href=&quot;http://www.linkedphpers.org/2008/03/crossing-200.html&quot; target=&quot;_blank&quot;&gt;crossing 200 members&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
The next ones were about crossing &lt;a href=&quot;http://www.linkedphpers.org/2008/04/crossing-300.html&quot; target=&quot;_blank&quot;&gt;300&lt;/a&gt;, &lt;a href=&quot;http://www.linkedphpers.org/2008/07/vacation-sunny-days-and-crossing-1000.html&quot; target=&quot;_blank&quot;&gt;1200&lt;/a&gt;. Then we tried to &lt;a href=&quot;http://www.linkedphpers.org/2008/07/linkedphpers-problems-of-newsletter-and.html&quot; target=&quot;_blank&quot;&gt;move the discussions to the Google Groups&lt;/a&gt;, but the move was not very successful - so soon after that we moved back all the discussions to the new LinkedIn functionality allowing us to distinguish discussions from job offers. Actually this happened just after &lt;a href=&quot;http://www.linkedphpers.org/2009/02/crossing-5000-no-5200-already.html&quot; target=&quot;_blank&quot;&gt;we crossed 5000 members&lt;/a&gt; - so 10x less then we have right now :)&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
On 2011 I started to make some &lt;a href=&quot;http://www.linkedphpers.org/2011/07/linkedphpers-blog-update.html&quot; target=&quot;_blank&quot;&gt;weekly featured threads blog entries&lt;/a&gt; - but I have to admit this hasn&#39;t lasted very long. Something about that time also new moderators has joined the group management group - &lt;a href=&quot;https://www.linkedin.com/in/sjmckearney&quot; target=&quot;_blank&quot;&gt;Scott McKearney&lt;/a&gt; and &lt;a href=&quot;https://www.linkedin.com/in/fernandojaviermartin&quot; target=&quot;_blank&quot;&gt;Fernando Javier Martin&lt;/a&gt;. As far as I remember that was also the time the main, &lt;a href=&quot;http://www.linkedphpers.org/p/linkedphpers-group-rules.html&quot; target=&quot;_blank&quot;&gt;basic rules set for this group&lt;/a&gt; has been established. They were changed in time, making more precise, but the general idea has been actually alive since the very beginning.&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
On September 30th 2011 I have announced we have &lt;a href=&quot;http://www.linkedphpers.org/2011/09/linkedphpers-monthly-newsletter-102011.html&quot; target=&quot;_blank&quot;&gt;crossed 30k&lt;/a&gt; members in our group. August 2012 the next barrier has been crossed - &lt;a href=&quot;http://www.linkedphpers.org/2012/08/linkedphpers-just-crossed-40k-members.html&quot; target=&quot;_blank&quot;&gt;40k members&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
And now, on July 25th 2014 we have &lt;b&gt;crossed 50k members&lt;/b&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
I would like also to take this opportunity to say many thanks to some people involved in development of this great group. Especially the previously mentioned moderators:&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
- &lt;a href=&quot;http://ar.linkedin.com/in/fernandojaviermartin/pl&quot; target=&quot;_blank&quot;&gt;Fernando Javier Martin&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
- &lt;a href=&quot;http://www.linkedin.com/in/sjmckearney/pl&quot; target=&quot;_blank&quot;&gt;Scott McKearney&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
- &lt;a href=&quot;http://www.linkedin.com/in/petermaloy/pl&quot; target=&quot;_blank&quot;&gt;Peter Maloy&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
- &lt;a href=&quot;http://www.linkedin.com/in/andigutmans/pl&quot; target=&quot;_blank&quot;&gt;Andi Gutmans&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
Many thanks guys for you hard work to make this group clean from spamming, as well as collaborating in the group development. If there were none of you - I do not believe the group would grow to the level we are right now. I also would like to point out you are doing this work completely voluntary - and still I know me, as well as all the group members can count on you - this is something really great.&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
Also I would like to thank to all the active members of the group - great people that wishes to share their knowledge and experience in interesting and very knowledgeable discussions. It is you who make this group live and growing - thanks to you all.&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
I&#39;ve been thinking quite a long time how to end this letter. How to make a good &quot;final words&quot; for it. Nothing special above what I have written before comes to my mind. So again - &lt;b&gt;THANK YOU ALL FOR WHAT YOU HAVE DONE TO MAKE THIS GROUP AS SUCCESSFUL AS IT IS&lt;/b&gt; and &lt;b&gt;HAPPY PHPing TO YOU ALL&lt;/b&gt; :)&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
Also if you have any comments or inquires - please feel free to contact me using LinkedIn or my email address you can find on the &lt;a href=&quot;http://www.linkedphpers.org/p/authors.htm&quot; target=&quot;_blank&quot;&gt;LinkedPHPres website&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;About author:&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Times New Roman&#39;; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: &#39;Times New Roman&#39;; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMt3NGVjixRG-ZYkAsxg_TEeJYRCjcw1FhujZ0AoRTU97D41YIG-jh8bxHSG9HfvrZjIHoFIl9NHeZHVwObqabLmg27ALDoAp6ogqKDbw3aoO_VW_1VAvtM2KQouK1OdS_JvQiVv3yPeA/s1600/DSC_1542.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMt3NGVjixRG-ZYkAsxg_TEeJYRCjcw1FhujZ0AoRTU97D41YIG-jh8bxHSG9HfvrZjIHoFIl9NHeZHVwObqabLmg27ALDoAp6ogqKDbw3aoO_VW_1VAvtM2KQouK1OdS_JvQiVv3yPeA/s1600/DSC_1542.jpg&quot; height=&quot;200&quot; width=&quot;199&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;Wojciech Zieliński&lt;/b&gt;&amp;nbsp;-&amp;nbsp;&lt;i&gt;&lt;b&gt;PRINCE2 Practicioner&lt;/b&gt;&amp;nbsp;certified&amp;nbsp;&lt;b&gt;IT Manager with over 14-year IT experience, including 10 years of IT Project, Programme and People Management experience&lt;/b&gt;. Managed and&amp;nbsp;succeeded&amp;nbsp;in&amp;nbsp;over 25 projects and programmes including custom or product development, implementation and maintenance. Recruited, led and managed international and distributed teams sized up to 25. Used various project management methodologies including PMI, PRINCE2, ASAP, SCRUM, Extreme Programming, ITIL. Has strong technical background covering SAP, Microsoft, Oracle and custom developed CRM, ERP, Workflow and BI systems. Able to build strong authority based on skills and knowledge, acting with commitment and passion, possessing unique leadership skills in advanced Technical teams.&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;
&lt;i&gt;Please feel free to contact me on&amp;nbsp;&lt;a href=&quot;mailto:wojtek.zielinski@hotmail.com&quot;&gt;wojtek.zielinski@hotmail.com&lt;/a&gt;&amp;nbsp;or using my&amp;nbsp;&lt;a href=&quot;http://pl.linkedin.com/in/wzielinski/&quot;&gt;LinkedIn Profile&lt;/a&gt;.&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: Tahoma; text-align: -webkit-auto;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.linkedphpers.org/feeds/76360070297516110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.linkedphpers.org/2014/08/linkedphpers-crossed-50k-members.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/76360070297516110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/76360070297516110'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2014/08/linkedphpers-crossed-50k-members.html' title='LinkedPHPers crossed 50k members !'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVdPUUm54cUeNRtUtNcqePj71_OLNjMHOdaqt9ZFte6SWFQTNuy1zkxPyixnztpXKtXCxJr5v4mCLS5zYT_1_J6Dqn_JWbDkVvJW1R6dpAYsBXYpSttJTs0XZDXFN9ZKJ_S1iJro1hdtU/s72-c/cake700.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7634820055071733985.post-2498759999559825607</id><published>2014-04-15T21:14:00.001+02:00</published><updated>2017-05-05T12:53:52.837+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="pmo"/><category scheme="http://www.blogger.com/atom/ns#" term="portfolio management"/><category scheme="http://www.blogger.com/atom/ns#" term="project management"/><title type='text'>Project Manager / Project Portfolio Manager / Programme Manager / Head of PMO - who to hell is who ?</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
On a LinkedIn groups for Project Managers (&lt;a href=&quot;http://www.linkedin.com/groups/Project-Manager-Network-1-Group-37888&quot;&gt;The Project Manager Network&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/groups/Project-Manager-Community-Best-Group-35313&quot;&gt;Project Manager Community&lt;/a&gt;) I have found quite several interesting discussions regarding the &lt;b&gt;roles of Project Manager, Project Portfolio Manager, Programme Manager and Head of PMO&lt;/b&gt;. The main concern that is quite repeatedly raised is what each of these roles is responsible or accountable for. I have commented on several on these discussions, but I thought it might be useful to publish at least quite a short post in here accompanied by some example.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
But first let&#39;s try to make&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;some definitions of the Project, Project Portfolio and Programme&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
From my point of view the main differences between them are:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Project &lt;/b&gt;- by definition is finite activity with specified budget, scope and timeframe that aims to deliver specific deliverables. In this article Project will be the smallest part (eventhough in reality it is of course possible, or even needed to be divided into phases, tasks, roles etc.)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Project Portfolio &lt;/b&gt;- it is the set of projects, that are not connected to each other. Projects in Portfolio does not rely one on another and do not have to (but may) share the resources&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Programme &lt;/b&gt;- it is also set of the projects, but these project, on the contriary from Portfolio are connected to each other by having the common goal. They do not have the common deliverables, every project has it&#39;s own structure - but the deliverables of all the projects in the Programme are to deliver the main Programme goal.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
To describe the organization of the PMO and responsibilities in it I have created&lt;br /&gt;
&lt;h3&gt;
an example of organizational structure&lt;/h3&gt;
that I will describe and work on in the next paragraphs:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRiVzc75YaEhyphenhyphenSySlxkSA3KBrslIfSUK8VAnmIxk4vdHBGFT8xymyfT8RWN2EyjjoNe8CY6j0dGEIu0Vi30AEHHQJQ38tDb2PfbU2hyt9HNcsU-F6Tri-wRgD-vV0I7po6B9oKFe_L39Y/s1600/Project+Management+Office.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRiVzc75YaEhyphenhyphenSySlxkSA3KBrslIfSUK8VAnmIxk4vdHBGFT8xymyfT8RWN2EyjjoNe8CY6j0dGEIu0Vi30AEHHQJQ38tDb2PfbU2hyt9HNcsU-F6Tri-wRgD-vV0I7po6B9oKFe_L39Y/s1600/Project+Management+Office.png&quot; width=&quot;551&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Let&#39;s imagine we have a company that drives 13 projects grouped in 3 portfolios and 2 programmes as shown above.&lt;br /&gt;
&lt;br /&gt;
The portfolio projects, eventhough are managed several of them by the same Project Portfolio Manager, are completely unconnected - e.g. Project A1 from the picture is implementation of some system for customer AAA, while the Project A2 is delivering custom-development services of completely different system for customer BBB. What I mean these projects are completely different in scope / budget and timeframe - the only connection between them are the facts that they are managed by same person and they appear on the same time.&lt;br /&gt;
&lt;br /&gt;
The programme projects are connected to themselves in scope of the programme, hence they have common goal - which might be e.g. preparation of the new product line - project X1 is preparation of the CRM in sales, while X2 is preparation of the CRM in service solutions (while both aims to the common goal - creating a complete CRM solution that will be a flagship product for the company for the next years). Each of these projects are managed (on the project level) by their Project Managers, which reports on the project level to the Programme Manager of specific programme.&lt;br /&gt;
&lt;h3&gt;
Reporting lines&lt;/h3&gt;
What is important here to mention and to remember that in fact we have in here 2 report types:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;reporting on the project issues level&lt;/li&gt;
&lt;li&gt;reporting on the people management issues level&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
If we consider the reporting lines in the PMO in the people management level - the structure is very simple. Every Project Manager, Project Portfolio Manager and Programme Manager reports to Head of PMO. Hence Head of PMO does not manage (in this, quite an easy example :) ) any project, portfolio or programme - his role is pure People Management role. He&#39;s responsible for tasks such as personal development plans, dealing with team conflicts, maintaining project lessons learned procedures etc.&lt;br /&gt;
&lt;br /&gt;
Once we get to consider the project status reporting lines - things gets a bit more compliceated or structured. In case of project portfolios Project Managers manages the project teams (which btw are not part of PMO - the project teams in the same time reports on the people management level to their line managers of specific Business Units they come from). In case of programmes, the Project Managers reports to the Programme Manager in scope of their projects, while they manage the project teams in the same manner, as PMs in project portfolios.&lt;br /&gt;
&lt;br /&gt;
The question that might arise is to whom Project Portfolio Managers or Programme Managers reports to in scope of the project issues (we already said in scope of people management issues they report to Head of PMO). As they are &quot;sold&quot; to run projects that has different sources, sponsors, steering comitees, that most likely comes from different BUs in the organization - they report on the project level to them. This means they report on the project level &quot;outside&quot; the PMO.&lt;br /&gt;
&lt;h3&gt;
Questions that might arise and how they should be handled using the reporting lines&lt;/h3&gt;
&lt;div&gt;
OK - let&#39;s go a bit to some practical aspects - let&#39;s try to analyze some of the questions that can arise during business-as-ususal life and determine who should answer them:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;Steve Braun (Portfolio Manager A) wishes to go for a project management training&lt;/i&gt; - he should go to John Smith (Head of PMO) and John should cover the training from PMO budget, as he&#39;s responsible for people development in the PMO Business Unit (while having his own budget for PMO)&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Member of Project Team A1 needs to get a day off &lt;/i&gt;- he should get the approval from Steve Braun (Portfolio Manager A), as he will be unavailable for the project managed by Steve, but the final approval for that day off should be signed by member&#39; BU manager (as he&#39;s responsible for people management tasks for team members)&lt;/li&gt;
&lt;li&gt;&lt;i&gt;There&#39;s a problem that materializes the risk in Project C2&lt;/i&gt; - the problem should be reported to Bill Murray (Portfolio Manager C), and Bill if there&#39;s a need of incident report, should report this incident to the Sponsor / Steering Committee for Project C2 (he might inform John Smith about such a situation, but this is not the direct reporting line)&lt;/li&gt;
&lt;li&gt;&lt;i&gt;There&#39;s a problem that materializes the risk in Project Y2 (part of Programme Y) &lt;/i&gt;- Yens Dickens (Project Manager for Y2) should be reported and if there&#39;s a need of incident report - Yens should report this incident to Steve Fielding (Programme Manager Y). Then Steve might be needed to escalate the problem according to Risk Management Plan prepared for the whole Programme (and possibly inform Head of PMO - but only on the informative manner).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Who is the Sponsor for the Projects in Programme ?&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
This question might arise and according to the organization described the actual Sponsor for the Project that has been initiated within a Programme is the Programme Manager. As the Programme should have it&#39;s own budget - so it acts as some kind of a &quot;hat&quot; for all the projects that are driven within a Programme. What is also important - within a Programme, a Programme Manager has the ability to create Projects as long as these projects fits in the Programme budget and delivers the deliverables, that are needed to fulfill the Programme goal.&lt;/div&gt;
&lt;div&gt;
In many cases Programme is in fact a rolling activity - the budget is defined for specific time (e.g. a year) and each year the budget is negotiated and agreed for the next year. Also on such yearly meetings the level of goal completion is analyzed and the decision whether the Programme should be continued or not is made.&lt;/div&gt;
&lt;h3&gt;
Is the Head of PMO only an organizational / administrative role ?&lt;/h3&gt;
&lt;div&gt;
At first it might look this way - but in fact a Head of PMO is quite a senior role. In theory he does not drive the projects - but still this role is responsible for PMs development, as well as maintaining such aspects like PM Best Practices, Lessons Learned or standardized project management procedures that are utilized in all the projects and programmes in the company. A person in Head of PMO role is also a people manager for highly experienced employees - which means he needs to have a strong authority based on his knowledge and experience.&lt;/div&gt;
&lt;div&gt;
This means that eventhough he does not manage projects directly, he needs to have really strong knowledge and experience in this area. He also needs to be able to coach and properly asses people working in the PMO Business Unit.&lt;/div&gt;
&lt;div&gt;
I personally find such a person also as a firefighter - a fast-reacting task force that is able to help any of the Project or Programme Managers in case if they are in trouble. Such a person should be able to step into the project and suggest (but not actually execute) the correction actions to put the project back on track.&lt;/div&gt;
&lt;h3&gt;
Which roles can be mixed ?&lt;/h3&gt;
&lt;div&gt;
Generally the landscape presented is created for at least medium organizations. For larger ones it can be even extended / multiplied by either additional Project Portfolios or Programmes, as well as &quot;separated&quot; projects with assigned Project Managers.&lt;/div&gt;
&lt;div&gt;
However it is viable also for smaller organizations, where the roles in the Portfolios and Programmes can be shared by same people. Generally it is very free how do you design sharing of these roles - e.g. Steve Braun (Portfolio Manager A) can have in his portfolio also Project Y2 (which is the part of Programme Y). In the same time George Leeds (Programme Manager X) might have different projects portfolio do manage.&lt;/div&gt;
&lt;div&gt;
I think the only limitation in this scope which I would suggest to follow is that the Programme Manager should not be a Project Manager for one or more projects in his programme - e.g. we should rather not put Steve Fielding (Programme Manager Y) as Project Manager for Project Y1. Such a situation might lead to a conflict of interest, while Steve needs to control the project he&#39;s actually running - so in a way he should control himself. In quite a complex assignment during Programme Management the fact we have 2 escalated points of control is for sure a healthy situation, that should not be ruined.&lt;/div&gt;
&lt;div&gt;
Having in mind the limitation about Programme and Project Manager (for the project inside the programme) it might be unclear whether such a limitation does not apply also for Head of PMO and any of his reports (Project/Portfolio/Programme Managers). I think it does not. We should remember the Head of PMO is a People Management role - the reporting employees of PMO does not report to him on the project level. This basically means it is not the PMO Head&#39;s responsibility to actually control the projects - they are controlled by the Sponsor and Steering Committees for these projects, that contains people from different BUs than PMO. And in the same time it is in fact quite healthy to have a manager that does similar job, as his reports, as this builds a real connection between them and allows manager to know his team much better.&lt;/div&gt;
&lt;h3&gt;
Final words ?&lt;/h3&gt;
&lt;div&gt;
Well - I have to admit at the beginning I wanted to make this short, in fact just a few paragraphs explaining the picture you can see at the very beginning... I haven&#39;t succeeded with &quot;a few paragraphs&quot; for sure and touched many (maybe too many) topics in here... But I hope you managed to get to this point and I will be really very grateful for any comments.&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;About author:&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyBUEi7B3RlQY5qmKXx_vgabVDGcDxA6i5hgDLNfOVl4p3ObXpbxqKvgsomUiSUh8RMm-Kf_NS5roHYbYkV7eGJ2nDtmeq5zfqsGlLWxswU6fJcrF_TW7nwzOCszT_trsQBOxSEExDn5E/s1600/DSC_1542.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyBUEi7B3RlQY5qmKXx_vgabVDGcDxA6i5hgDLNfOVl4p3ObXpbxqKvgsomUiSUh8RMm-Kf_NS5roHYbYkV7eGJ2nDtmeq5zfqsGlLWxswU6fJcrF_TW7nwzOCszT_trsQBOxSEExDn5E/s1600/DSC_1542.jpg&quot; width=&quot;199&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Wojciech Zieliński&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Prince2 and ITIL certified &lt;/b&gt;manager with nearly &lt;b&gt;15 years of project, program and people management experience&lt;/b&gt;. Managed and succeeded in &lt;b&gt;over 25 projects and programs &lt;/b&gt;both in IT and business areas. Recruited, led and managed &lt;b&gt;international and distributed teams sized up to 50&lt;/b&gt;, used various project management methodologies including &lt;b&gt;PMI, Prince2, ASAP, SCRUM, eXtreme Programming, ITIL&lt;/b&gt;. Has strong technical background covering &lt;b&gt;SAP, Microsoft, Oracle&lt;/b&gt; and custom developed &lt;b&gt;CRM, ERP, Workflow and BI systems&lt;/b&gt;.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Please feel free to visit the portfolio page at &lt;a href=&quot;http://www.inperitia.com/&quot;&gt;www.inperitia.com&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.linkedphpers.org/feeds/2498759999559825607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.linkedphpers.org/2014/04/project-manager-project-portfolio.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/2498759999559825607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/2498759999559825607'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2014/04/project-manager-project-portfolio.html' title='Project Manager / Project Portfolio Manager / Programme Manager / Head of PMO - who to hell is who ?'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRiVzc75YaEhyphenhyphenSySlxkSA3KBrslIfSUK8VAnmIxk4vdHBGFT8xymyfT8RWN2EyjjoNe8CY6j0dGEIu0Vi30AEHHQJQ38tDb2PfbU2hyt9HNcsU-F6Tri-wRgD-vV0I7po6B9oKFe_L39Y/s72-c/Project+Management+Office.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="applications"/><category scheme="http://www.blogger.com/atom/ns#" term="coba solutions"/><category scheme="http://www.blogger.com/atom/ns#" term="project management"/><title type='text'>Small and Medium Enterperises Project Management (SMEP) part 1 - Why the new methodology ?</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.virtualprojectconsulting.com/wp-content/uploads/2009/12/typicalprojects-300x225.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.virtualprojectconsulting.com/wp-content/uploads/2009/12/typicalprojects-300x225.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;http://www.cobasolutions.com/&quot;&gt;COBA Solutions&lt;/a&gt;, decided to move forward and find a new, fully &quot;hired gun&quot; career.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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&#39;s. I managed to complete more then 25 IT projects - including implementation and R&#39;n&#39;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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Now, having some more time &quot;in between&quot; (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=&quot;text-align: justify;&quot;&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&#39;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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
But - getting to the very much beginning...&lt;/div&gt;
&lt;h2 style=&quot;text-align: justify;&quot;&gt;
why we needed the new methodology ?&lt;/h2&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
The way I see the PM methodologies is that none of them is a &quot;golden way&quot; 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 &quot;borrowed&quot; 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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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&#39;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 &quot;black hole&quot;.&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 style=&quot;text-align: justify;&quot;&gt;
How can we approach then to the SME projects ?&lt;/h2&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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 &quot;we work until we done - you pay until you believe everything is done&quot;. We work on sprints (week or 2 weeks), show a customer what we did, he says whether it&#39;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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
Once we have a large, mature organization such an approach is working OK. However in SMEs it&#39;s very rare situation. It&#39;s good there if they know, they do not quite know what they need :) In many cases on the customer side we don&#39;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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
So what is the SMEP ?&lt;/h2&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
SMEP is basically a mix of formal and agile methologies to be able to fullfill the main need of SME&#39;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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;Project Requirement Specification - not a Functional Specification like in formal methologies&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Project Pricing - using modified PERT equations and Work Breakdown Structure&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Project technical realization - using sprints and milestones with customer input each milestone&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Acceptance tests preparation - on each milestone (in a bit Agile way)&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Internal tests - using test sprints&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Acceptance tests - with a customer&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Formal system acceptation&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Guarantee service procedures - using almost pure Agile&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
What do you think ?&lt;/h2&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Now it&#39;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&#39;s worth for me to prepare the next parts of this series ?&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Please add comments&lt;/span&gt;&lt;/b&gt; - to this blog entry, or on LinkedIn... &lt;span style=&quot;font-size: large;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;Picture source:&amp;nbsp;&lt;a href=&quot;http://www.virtualprojectconsulting.com/pmmethodologies/&quot;&gt;http://www.virtualprojectconsulting.com/pmmethodologies/&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/6125672407444563924'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2012/09/small-and-medium-enterperises-project.html' title='Small and Medium Enterperises Project Management (SMEP) part 1 - Why the new methodology ?'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers"/><title type='text'>LinkedPHPers just crossed 40k members ! Some cake maybe... ?</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://data.whicdn.com/images/23293044/top-coolest-best-latest-new-fun-gadgets-gifts-pink-elephant-balloon_large.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;238&quot; src=&quot;http://data.whicdn.com/images/23293044/top-coolest-best-latest-new-fun-gadgets-gifts-pink-elephant-balloon_large.jpg&quot; width=&quot;320&quot; /&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=&quot;http://my.linkedin.com/pub/hing-chuan-hooi/0/b4/958&quot;&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=&quot;http://www.linkedin.com/groups?home=&amp;amp;gid=42140&amp;amp;trk=anet_ug_hm&quot;&gt;Php Developers&lt;/a&gt;, currently over 46k members large). The third group I have found however - &lt;a href=&quot;http://www.linkedin.com/groups?home=&amp;amp;gid=2195403&amp;amp;trk=anet_ug_hm&quot;&gt;The PHP Developer Network&lt;/a&gt; - is &quot;only&quot; 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=&quot;http://www.linkedin.com/groups?groupDashboard=&amp;amp;gid=40870&quot;&gt;statistics&lt;/a&gt;&amp;nbsp;provided by LinkedIn. I think it&#39;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=&quot;http://ar.linkedin.com/in/fernandojaviermartin&quot;&gt;Fernando Javier Martin&lt;/a&gt;, &lt;a href=&quot;http://www.linkedin.com/in/sjmckearney&quot;&gt;Scott McKearney&lt;/a&gt; and &lt;a href=&quot;http://www.linkedin.com/in/andigutmans&quot;&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=&quot;http://pl.linkedin.com/in/wzielinski&quot;&gt;Wojciech Zieliński&lt;/a&gt;&lt;br /&gt;
LinkedPHPers Founder&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;Picture source:&amp;nbsp;&lt;a href=&quot;http://weheartit.com/entry/23293044&quot;&gt;http://weheartit.com/entry/23293044&lt;/a&gt;&lt;/i&gt;&lt;/span&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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/7447438305792179559'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2012/08/linkedphpers-just-crossed-40k-members.html' title='LinkedPHPers just crossed 40k members ! Some cake maybe... ?'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><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="cms"/><category scheme="http://www.blogger.com/atom/ns#" term="coba solutions"/><category scheme="http://www.blogger.com/atom/ns#" term="cobaex"/><category scheme="http://www.blogger.com/atom/ns#" term="joomla"/><category scheme="http://www.blogger.com/atom/ns#" term="optimization"/><category scheme="http://www.blogger.com/atom/ns#" term="performance"/><category scheme="http://www.blogger.com/atom/ns#" term="speed"/><title type='text'>Functional Cache - high performance on web portals</title><content type='html'>&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc_tRAb8UwQ3rHJnSH1f_j38J5vjQEZuyHQYT-WHzx0eZKTe68k9JgsVOFH2MrPjunVANJgg0Wz6x64y9frRHIMN3zzeGKKuh6U0X07_u9iUH7fp50KlEBgNz1zihaIOGLUuoOR7sI3gk/s1600/final-cms.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;174&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc_tRAb8UwQ3rHJnSH1f_j38J5vjQEZuyHQYT-WHzx0eZKTe68k9JgsVOFH2MrPjunVANJgg0Wz6x64y9frRHIMN3zzeGKKuh6U0X07_u9iUH7fp50KlEBgNz1zihaIOGLUuoOR7sI3gk/s200/final-cms.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I would like to share with some idea of a new caching architecture implemented&amp;nbsp;&lt;a href=&quot;http://www.cobasolutions.com/business_software/en_cms&quot;&gt;COBAEX CMS&lt;/a&gt; system prepared by a company I manage - &lt;a href=&quot;http://www.cobasolutions.com/&quot;&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=&#39;more&#39;&gt;&lt;/a&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
But getting to the point - the very first question is&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Why the standard caching mechanisms are not enough ?&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
Much more about this you can read in nice article by &lt;a href=&quot;http://www.garfieldtech.com/blog/caching-tng&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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&#39;t have the copies of this page and serve only an HTML page ?&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Functional Cache&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The word &quot;functional&quot; 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=&quot;text-align: justify;&quot;&gt;
A simple example of such regeneration (based on an actual COBAEX CMS implementation) might be the page&amp;nbsp;&lt;a href=&quot;http://www.cobasolutions.com/business_software/en_cms&quot;&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&#39;s not worth getting into details which it is needed in this article).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Architecture Approach&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Implementing such approach needed the complete revision and redesigning of the whole architecture. The &quot;standard&quot; 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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
In most solutions all these elements stays on a single physical server.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;a &lt;b&gt;database server&lt;/b&gt; that stores how the whole site looks like&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;additional element - the full page generation system&lt;/b&gt; that &quot;compiles&quot; 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=&quot;text-align: justify;&quot;&gt;a &lt;b&gt;presentation server&lt;/b&gt; storing and serving pre-prepared HTML pages, that were &quot;compiled&quot; and published by the page generation system&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The main advantages of this architecture are:&lt;/div&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&quot;working copies&quot; of the page content&lt;/b&gt; - as we are creating basically the pages on the administration servers, we can use the &quot;working copies&quot; 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 &quot;temporary server&quot;. 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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Performance tests&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Even though&amp;nbsp;I believe the architecture description shows, that these systems simply must be faster then &quot;standard&quot; 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=&quot;text-align: justify;&quot;&gt;
The test procedure we followed was to install on the same virtual machine &lt;a href=&quot;http://www.joomla.org/&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Implementations&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcgjP13UGvWLFFWES7nBfS-UM2qryJeL5J30GYlnpLPGQSdyt6DvU8MzM8wqWqHKOyzA7ciiwjWA9Em11gjb4vBGhNS1yRsKoSBhQKsB0QBSD-REs9sOoV6-u0mphic4DvKDaKvWEPwVY/s1600/abk.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;155&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcgjP13UGvWLFFWES7nBfS-UM2qryJeL5J30GYlnpLPGQSdyt6DvU8MzM8wqWqHKOyzA7ciiwjWA9Em11gjb4vBGhNS1yRsKoSBhQKsB0QBSD-REs9sOoV6-u0mphic4DvKDaKvWEPwVY/s200/abk.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;http://kariera.chodkowska.edu.pl/&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKgpM3B1XhY2BrbfOCp9zXqE_NpNf6xkBqx_A-khQKLhSe_WG0gXvB0MxTNzDglEw22a583Xa9YIaky75f2QG1ujnpAOuMFx5_JEKYmmQ_ryqVoekTVZgNvDz60tXCEsd6WKjFSnAbEWI/s1600/chodkowska.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;171&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKgpM3B1XhY2BrbfOCp9zXqE_NpNf6xkBqx_A-khQKLhSe_WG0gXvB0MxTNzDglEw22a583Xa9YIaky75f2QG1ujnpAOuMFx5_JEKYmmQ_ryqVoekTVZgNvDz60tXCEsd6WKjFSnAbEWI/s200/chodkowska.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;http://www.chodkowska.edu.pl/&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgteBQXbIMAohLbedpgW5smS97RzKOk0hZ8yFETjepfphBgvT_KdptOtTRBr2DLYfIamUO2m7n1i5a62mP8NsX5v_X83Ab407fqxOZr3xUhOAIXfOJgB37qsNIR_mwRIz9G9qNBKuXJt2s/s1600/twoje-zdanie.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;153&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgteBQXbIMAohLbedpgW5smS97RzKOk0hZ8yFETjepfphBgvT_KdptOtTRBr2DLYfIamUO2m7n1i5a62mP8NsX5v_X83Ab407fqxOZr3xUhOAIXfOJgB37qsNIR_mwRIz9G9qNBKuXJt2s/s200/twoje-zdanie.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;http://www.twoje-zdanie.pl/&quot;&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 &quot;compilation&quot; mechanisms the site is really very fast, even using quite limited resources.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxyZQNPNg6zg7XfgOtp00hkAtQO3UU1W3rqHcxvelLoCF8ltJQQALefEwXCzAEc5mLw9P8mLSVESXC-B6JVcprvvFpbdNTw8chkdqaH27RKZCkBij1WtKdJ0hUbG-64p30VVdhtPVzX2I/s1600/domoklik.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;170&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxyZQNPNg6zg7XfgOtp00hkAtQO3UU1W3rqHcxvelLoCF8ltJQQALefEwXCzAEc5mLw9P8mLSVESXC-B6JVcprvvFpbdNTw8chkdqaH27RKZCkBij1WtKdJ0hUbG-64p30VVdhtPVzX2I/s200/domoklik.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;http://www.domoklik.pl/&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The mentioned implementations are of course not all of the COBAEX CMS implementations. I thought however there&#39;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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Some final words&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
OK - the article got quite long - but I hope still interesting.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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;
</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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/7833608856044919462'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/10/functional-cache-high-performance-on.html' title='Functional Cache - high performance on web portals'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc_tRAb8UwQ3rHJnSH1f_j38J5vjQEZuyHQYT-WHzx0eZKTe68k9JgsVOFH2MrPjunVANJgg0Wz6x64y9frRHIMN3zzeGKKuh6U0X07_u9iUH7fp50KlEBgNz1zihaIOGLUuoOR7sI3gk/s72-c/final-cms.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="database"/><category scheme="http://www.blogger.com/atom/ns#" term="integration"/><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers"/><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="security"/><category scheme="http://www.blogger.com/atom/ns#" term="webservices"/><title type='text'>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=&#39;more&#39;&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=&quot;http://lnkd.in/_mHdRR&quot;&gt;Database Version Control. How you keep track of your database updates?&lt;/a&gt; posted by&amp;nbsp;&lt;a href=&quot;http://www.linkedin.com/in/federicoulfo&quot;&gt;Federico Ulfo&lt;/a&gt;&amp;nbsp;- a really nice topic, I&#39;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=&quot;http://www.cobasolutions.com/en_pgcompare&quot;&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=&quot;http://lnkd.in/AMqx7J&quot;&gt;Need advise for Good Table design to accommodate 20-25 columns&lt;/a&gt; posted by&amp;nbsp;&lt;a href=&quot;http://in.linkedin.com/in/dipenbaskaran&quot;&gt;Dipen Baskaran&lt;/a&gt;&amp;nbsp;- eventhough &lt;a href=&quot;http://ar.linkedin.com/in/fernandojaviermartin&quot;&gt;Fernando&lt;/a&gt; has disagreed this topic is PHP-related - I think it&#39;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=&quot;http://draft.blogger.com/&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The next group - something about integration and APIs:&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/4Wf-_R&quot;&gt;Get Google+ Profile Information using php&lt;/a&gt; posted by&amp;nbsp;&lt;a href=&quot;http://in.linkedin.com/pub/vijay-gupta/12/602/253&quot;&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=&quot;http://lnkd.in/ahVVeQ&quot;&gt;Any suggestions for music database API?&lt;/a&gt; posted by&amp;nbsp;&lt;a href=&quot;http://uk.linkedin.com/in/davidfelton&quot;&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=&quot;http://lnkd.in/9ZafiH&quot;&gt;Any body suggest me SOAP and WSDL tutorial ?&lt;/a&gt; posted by&amp;nbsp;&lt;a href=&quot;http://in.linkedin.com/in/akkikhambhata&quot;&gt;Ankit Khambhata&lt;/a&gt;&amp;nbsp;- a must-read for any WebServices newcommers :)&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/jbR_yF&quot;&gt;Web Services in PHP&lt;/a&gt; posted by&amp;nbsp;David S.&lt;br /&gt;
&lt;br /&gt;
I wouldn&#39;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=&quot;http://lnkd.in/i9X4pe&quot;&gt;You&#39;re recommended book on advanced PHP (OOP, Design Patterns, SPL etc.)&lt;/a&gt; posted by&amp;nbsp;&lt;a href=&quot;http://za.linkedin.com/pub/shaun-morrow/20/bb6/4b8&quot;&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=&quot;http://lnkd.in/Pt2W-V&quot;&gt;AOP - Aspect Oriented Programming : Has anybody used / is using it ?&lt;/a&gt; posted by&amp;nbsp;&lt;a href=&quot;http://ar.linkedin.com/in/fernandojaviermartin&quot;&gt;Fernando Javier Martin&lt;/a&gt; - some time ago I was quite interested in that - haven&#39;t found anything good for PHP, but generally the AOP concept looks really great :)&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/PExwWF&quot;&gt;When is N-Tier architecture preferable over other options?&lt;/a&gt; posted by&amp;nbsp;&lt;a href=&quot;http://ca.linkedin.com/pub/antonio-camacho-lobeto/12/346/219&quot;&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=&quot;http://lnkd.in/CeCyUT&quot;&gt;What coding standard should I use?&lt;/a&gt; posted by&amp;nbsp;&lt;a href=&quot;http://ua.linkedin.com/pub/maksym-zaletskyy/3b/293/936&quot;&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=&quot;http://lnkd.in/KpBa5a&quot;&gt;Register Globals: One of my client sites has this on, and I&#39;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=&quot;http://uk.linkedin.com/in/bobm2010&quot;&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=&quot;http://lnkd.in/v47nCN&quot;&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=&quot;http://ng.linkedin.com/pub/agaba-akuh/38/586/966&quot;&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=&quot;http://lnkd.in/HvcZrN&quot;&gt;PHP trick &amp;amp; tips&lt;/a&gt; posted by&amp;nbsp;&lt;a href=&quot;http://www.linkedin.com/in/federicoulfo&quot;&gt;Federico Ulfo&lt;/a&gt; - this one should have more comments - c&#39;mon people - share your knowledge :)&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/E8U6sg&quot;&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&#39;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;</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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/708382986811566569'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/10/linkedphpers-features-threads-cw-382011.html' title='LinkedPHPers Features Threads - CW 38.2011 and 39.2011'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers"/><title type='text'>LinkedPHPers Monthly Newsletter - 10.2011 - 30k Members Achieved !</title><content type='html'>&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4XWzSXaJRkSXnWhEPXBBZlNSS2c3-FIXOR88YxtVNp4rHRePllVNYBVHuQL2QPZL2JckM_BZKR6Eu2Pu9vZJTZatYqK7iaOgIbLG-aqPqoTJxKKYa8LApgT7J3SxqVcIpwJRxY4cM6BA/s1600/353011aw44uovpq.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4XWzSXaJRkSXnWhEPXBBZlNSS2c3-FIXOR88YxtVNp4rHRePllVNYBVHuQL2QPZL2JckM_BZKR6Eu2Pu9vZJTZatYqK7iaOgIbLG-aqPqoTJxKKYa8LApgT7J3SxqVcIpwJRxY4cM6BA/s200/353011aw44uovpq.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; line-height: 20px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: xx-small;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&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=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;http://www.linkedin.com/in/sjmckearney&quot;&gt;Scott McKearney&lt;/a&gt; -&amp;nbsp;Engineering/Software Development: Recruiter, Sourcer, Candidate Development&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;http://ar.linkedin.com/in/fernandojaviermartin&quot;&gt;Fernando Javier Martin&lt;/a&gt; -&amp;nbsp;Sr. PHP Developer at Clarin Global - CMD&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;http://www.linkedin.com/in/andigutmans&quot;&gt;Andi Gutmans&lt;/a&gt; -&amp;nbsp;CEO at Zend Technologies&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;10.03.2008&lt;/b&gt; - The first group creation&amp;nbsp;announcement&amp;nbsp;(&lt;a href=&quot;http://www.linkedin.com/answers/technology/software-development/TCH_SFT/193716-1649357&quot;&gt;using LinkedIn Q&amp;amp;A functionality&lt;/a&gt;) has been posted&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;20.03.2008&lt;/b&gt; - The first 10 members approved on the group&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;24.03.2008&lt;/b&gt; - The LinkedPHPers webpage on Blogspot has been created - &lt;a href=&quot;http://www.linkedphpers.org/2008/03/linkedin-group-phpers-started.html&quot;&gt;and the first post announcing joining first&amp;nbsp;135&amp;nbsp;members published&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;01.04.2008&lt;/b&gt; - &lt;a href=&quot;http://www.linkedphpers.org/2008/03/crossing-200.html&quot;&gt;Crossing 200 members&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;04.04.2008&lt;/b&gt; - &lt;a href=&quot;http://www.linkedphpers.org/2008/04/crossing-300.html&quot;&gt;Crossing 300 members&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;23.07.2008&lt;/b&gt; - &lt;a href=&quot;http://www.linkedphpers.org/2008/07/vacation-sunny-days-and-crossing-1000.html&quot;&gt;Crossing 1200 members&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;30.07.2008&lt;/b&gt; - LinkedIn still does not have a nice newsletter functionality - hence &lt;a href=&quot;http://www.linkedphpers.org/2008/07/linkedphpers-problems-of-newsletter-and.html&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;19.02.2009&lt;/b&gt; - &lt;a href=&quot;http://www.linkedphpers.org/2009/02/crossing-5000-no-5200-already.html&quot;&gt;Crossing 5200 members&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;03.03.2009&lt;/b&gt; - The &lt;a href=&quot;http://www.linkedphpers.org/2009/03/webapplications-part-1-framework-vs.html&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;09.04.2009&lt;/b&gt; - &lt;a href=&quot;http://www.linkedphpers.org/2009/04/webdesk-blog-entries-import-summer.html&quot;&gt;The webdesk blog merged with LinkedPHPers homepage blog site&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;The blog has been &quot;sleeping&quot; 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=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;12.03.2011&lt;/b&gt; - &lt;a href=&quot;http://www.linkedphpers.org/2011/03/blog-reactivation-polish-entries-will.html&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;26.07.2011&lt;/b&gt; - &lt;a href=&quot;http://www.linkedphpers.org/2011/07/linkedphpers-blog-update.html&quot;&gt;LinkedPHPers blog gains an &quot;official&quot; LinkedPHPers domain&lt;/a&gt; - and it available as right now under www.linkedphpers.org address&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;26.07.2011&lt;/b&gt; - &lt;a href=&quot;http://www.linkedphpers.org/2011/07/linkedphpers-featured-threads-cw-292011.html&quot;&gt;The first article&lt;/a&gt; from the LinkedPHPers Weekly Featured Threads published&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;04.08.2011&lt;/b&gt; - &lt;a href=&quot;http://www.linkedphpers.org/2011/08/working-with-dates-using-php-tutorial.html&quot;&gt;The first members-authored article published&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;05.09.2011&lt;/b&gt; - &lt;a href=&quot;http://www.linkedphpers.org/2011/09/linkedphpers-monthly-newsletter-092011.html&quot;&gt;First LinkedPHPers Montlhy newsletter published&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;3 months ago &lt;a href=&quot;http://lnkd.in/bZAcAd&quot;&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=&quot;http://www.linkedin.com/in/manzwebdesigns&quot;&gt;Bud Manz&lt;/a&gt; (many thanks to you Bud), which published his articles in here.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;1 month ago &lt;a href=&quot;http://lnkd.in/hWQ3zP&quot;&gt;I have created&lt;/a&gt; a &lt;a href=&quot;http://www.facebook.com/pages/LinkedPHPers/121726194580178&quot;&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=&quot;text-align: justify;&quot;&gt;Also 1 month ago &lt;a href=&quot;http://lnkd.in/ysHRxh&quot;&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=&quot;text-align: justify;&quot;&gt;
In the same time&lt;a href=&quot;http://lnkd.in/whS3kh&quot;&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 &quot;in&quot; 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&#39;s their right to do that :)&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;http://lnkd.in/ARt2Gr&quot;&gt;this thread&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Of course once having such a general, historical post it would be bad not to mention the &lt;a href=&quot;http://lnkd.in/PMa22u&quot;&gt;&quot;fight&quot; 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=&quot;http://lnkd.in/PMa22u&quot;&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=&quot;http://www.linkedphpers.org/p/linkedphpers-group-rules.html&quot;&gt;rules&lt;/a&gt; - very straight forward and clear, understandable by most people :)&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: center;&quot;&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;
</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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/1658621353080500192'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/09/linkedphpers-monthly-newsletter-102011.html' title='LinkedPHPers Monthly Newsletter - 10.2011 - 30k Members Achieved !'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4XWzSXaJRkSXnWhEPXBBZlNSS2c3-FIXOR88YxtVNp4rHRePllVNYBVHuQL2QPZL2JckM_BZKR6Eu2Pu9vZJTZatYqK7iaOgIbLG-aqPqoTJxKKYa8LApgT7J3SxqVcIpwJRxY4cM6BA/s72-c/353011aw44uovpq.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="codeigniter"/><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="newbies"/><category scheme="http://www.blogger.com/atom/ns#" term="reviews"/><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="zend framework"/><title type='text'>PHP Frameworks for Web Portals and Web Applications</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
About a month ago I have started the discussion polls regarding the best framework choices for &lt;a href=&quot;http://lnkd.in/V2asfU&quot;&gt;Web Portals&lt;/a&gt; and &lt;a href=&quot;http://lnkd.in/aCxaxg&quot;&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=&#39;more&#39;&gt;&lt;/a&gt;&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.symfony-project.org/&quot;&gt;Symfony&lt;/a&gt; - 2 votes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.yiiframework.com/&quot;&gt;Yii&lt;/a&gt; - &lt;b&gt;5 votes&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://framework.zend.com/&quot;&gt;Zend Framework&lt;/a&gt; - 3 votes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://drupal.org/&quot;&gt;Drupal&lt;/a&gt; - 1 vote&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://codeigniter.com/&quot;&gt;CodeIgniter&lt;/a&gt; - 2 votes&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://framework.zend.com/&quot;&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=&quot;http://www.symfony-project.org/&quot;&gt;Symfony&lt;/a&gt;&amp;nbsp;- 4 votes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://codeigniter.com/&quot;&gt;CodeIgniter&lt;/a&gt;&amp;nbsp;- 5 votes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cakephp.org/&quot;&gt;CakePHP&lt;/a&gt; - 2 votes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.yiiframework.com/&quot;&gt;Yii&lt;/a&gt; - 2 votes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://flourishlib.com/&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Some general thoughts about this surveys are quite interesting:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;Older frameworks such as Drupal or CakePHP looses the market.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;If you want to create real good web application - create your own framework :)&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
OK - that&#39;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;
</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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/2818979745737099449'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/09/php-frameworks-for-web-portals-and-web.html' title='PHP Frameworks for Web Portals and Web Applications'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="framework"/><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="linkedphpers"/><category scheme="http://www.blogger.com/atom/ns#" term="newbies"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby"/><title type='text'>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=&#39;more&#39;&gt;&lt;/a&gt;The very first one - started and mentioned by &lt;a href=&quot;http://ar.linkedin.com/in/fernandojaviermartin&quot;&gt;Fernando Javier Martin&lt;/a&gt;:&amp;nbsp;&lt;a href=&quot;http://lnkd.in/mZg-EN&quot;&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=&quot;http://lnkd.in/zAS7mk&quot;&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=&quot;http://in.linkedin.com/pub/axita-mehta/1a/431/118&quot;&gt;AXITA MEHTA&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/B_B8s8&quot;&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=&quot;http://www.linkedin.com/in/tonyhoban&quot;&gt;Tony Hoban&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/BmpYTE&quot;&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=&quot;http://pk.linkedin.com/in/ashffaq&quot;&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=&quot;http://lnkd.in/tqjNAi&quot;&gt;How is Kohana PHP Framework ?? which one is better - Yii or Kohana ?&lt;/a&gt; started by&amp;nbsp;&lt;a href=&quot;http://ae.linkedin.com/pub/vimal-saifudin/14/331/201&quot;&gt;Vimal Saifudin&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/g9BsfP&quot;&gt;Provide feedback on Yii and Zend framework&lt;/a&gt; started by&amp;nbsp;&lt;a href=&quot;http://www.linkedin.com/in/balajimadana&quot;&gt;Balaji J. Madana&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/q-6fCZ&quot;&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=&quot;http://in.linkedin.com/in/arundgupta&quot;&gt;Arun Gupta&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
A nice threads, both started by&amp;nbsp;&lt;a href=&quot;http://cz.linkedin.com/in/tesarek&quot;&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=&quot;http://lnkd.in/f7b93Z&quot;&gt;Calling Java classes from PHP&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/f7b93Z&quot;&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=&quot;http://lnkd.in/sp_N4x&quot;&gt;&quot;Ruby vs PHP&quot; what do you think?&lt;/a&gt; started by&amp;nbsp;&lt;a href=&quot;http://www.linkedin.com/in/federicoulfo&quot;&gt;Federico Ulfo&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
And the last, but not least ones - a bit maybe &quot;uncategorized&quot;:&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/c54iWB&quot;&gt;Do PHP developers prefer to use IDEs or text editors?&lt;/a&gt; started by&amp;nbsp;&lt;a href=&quot;http://www.linkedin.com/in/aogail&quot;&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=&quot;http://lnkd.in/WN8kV9&quot;&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=&quot;http://ca.linkedin.com/pub/eric-shelley/28/6b2/b12&quot;&gt;Eric Shelley&lt;/a&gt;&amp;nbsp;- some thoughts about the future of our language in the upcoming Windows 8 operating system.</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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/1461108337566973533'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/09/linkedphpers-featured-threads-cw-362011.html' title='LinkedPHPers Featured Threads - CW 36.2011 and 37.2011'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="database"/><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="newbies"/><title type='text'>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=&#39;more&#39;&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=&quot;http://au.linkedin.com/in/ethanho&quot;&gt;Ethan Boon Liat HO&lt;/a&gt;:&amp;nbsp;&lt;a href=&quot;http://lnkd.in/d3rQuw&quot;&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=&quot;http://lnkd.in/XCPHa3&quot;&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=&quot;http://www.linkedin.com/pub/alyssa-fenwick/16/a72/359&quot;&gt;Alyssa Fenwick&lt;/a&gt;&amp;nbsp;and regarding the popularity of languages such as PHP against &quot;commercial&quot; 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=&quot;http://ar.linkedin.com/in/fernandojaviermartin&quot;&gt;Fernando Javier Martin&lt;/a&gt; -&amp;nbsp;&lt;a href=&quot;http://lnkd.in/_RaSDh&quot;&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=&quot;http://lnkd.in/AJ6W6D&quot;&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=&quot;http://in.linkedin.com/in/tonmoytewary&quot;&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=&quot;http://lnkd.in/JuASPU&quot;&gt;How to read data from DBF file?&lt;/a&gt; started by&amp;nbsp;&lt;a href=&quot;http://pl.linkedin.com/in/niziol&quot;&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=&quot;http://lnkd.in/ScKVTw&quot;&gt;Database tests with PHPUnit and PHPUnit_Extensions_Database_TestCase don&#39;t work (regarding to automate setup an teardown of the database fixture)&lt;/a&gt; started by&amp;nbsp;&lt;a href=&quot;http://de.linkedin.com/pub/jens-sieckmann/3a/53/135&quot;&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=&quot;http://pl.linkedin.com/in/wzielinski&quot;&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=&quot;http://lnkd.in/-RXtAp&quot;&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=&quot;http://lnkd.in/7bpYAP&quot;&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=&quot;http://in.linkedin.com/pub/asha-angel/21/354/926&quot;&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=&quot;http://lnkd.in/t-nd_Z&quot;&gt;When architecting your MVC apps, where are you putting your business logic?&lt;/a&gt; posted by&amp;nbsp;&lt;a href=&quot;http://www.linkedin.com/in/keithdaulton&quot;&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.</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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/5515266466659058677'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/09/linkedphpers-featured-threads-cw-352011.html' title='LinkedPHPers Featured Threads - CW 35.2011'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers"/><title type='text'>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=&#39;more&#39;&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=&quot;http://lnkd.in/PMa22u&quot;&gt;much discussed&lt;/a&gt;, &lt;a href=&quot;http://www.linkedphpers.org/p/linkedphpers-group-rules.html&quot;&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=&quot;http://uk.linkedin.com/pub/stephanie-david/7/25b/88b&quot;&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=&quot;http://lnkd.in/WvynQn&quot;&gt;most commented discussion&lt;/a&gt; was actually started a bit earlier then 08.2011 - but it&#39;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=&quot;http://www.linkedphpers.org/2011_08_01_archive.html&quot;&gt;7 articles posted only on August&lt;/a&gt; and including the Weekly Featured Threads series, a &lt;a href=&quot;http://www.linkedphpers.org/2011/08/webapplications-part-4-dictionary-data.html&quot;&gt;new article about WebApplications focusing on dictionary data&lt;/a&gt;, and 2 nice articles written by &lt;a href=&quot;http://www.linkedin.com/in/manzwebdesigns&quot;&gt;Bud Manz&lt;/a&gt;. Several &lt;a href=&quot;http://lnkd.in/bZAcAd&quot;&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=&quot;http://www.facebook.com/pages/LinkedPHPers/121726194580178&quot;&gt;our Facebook fanpage&lt;/a&gt; - please, if you have a FB account - &lt;a href=&quot;http://www.facebook.com/pages/LinkedPHPers/121726194580178&quot;&gt;join us and like us&lt;/a&gt; there as well and tell us about it on &lt;a href=&quot;http://lnkd.in/hWQ3zP&quot;&gt;this thread&lt;/a&gt; :)&lt;br /&gt;
- a Google Plus circles initiative - present yourself on &lt;a href=&quot;http://lnkd.in/ysHRxh&quot;&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=&quot;http://lnkd.in/ARt2Gr&quot;&gt;see this thread&lt;/a&gt;&lt;br /&gt;
- a new logo for our group - as you can see we still use the &quot;standard&quot; 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=&quot;http://lnkd.in/whS3kh&quot;&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;</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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/5770851273361800069'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/09/linkedphpers-monthly-newsletter-092011.html' title='LinkedPHPers Monthly Newsletter - 09.2011'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="algorythms"/><category scheme="http://www.blogger.com/atom/ns#" term="licensing"/><category scheme="http://www.blogger.com/atom/ns#" term="reporting"/><category scheme="http://www.blogger.com/atom/ns#" term="warning"/><title type='text'>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=&#39;more&#39;&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=&quot;http://lnkd.in/SSvDub&quot;&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=&quot;http://lnkd.in/Yq3VCM&quot;&gt;Which PHP framework to choose when developing Reports?&lt;/a&gt; - posted by&amp;nbsp;&lt;a href=&quot;http://pk.linkedin.com/in/salmankhwaja&quot;&gt;Salman, Khwaja Muhammad&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://lnkd.in/RQePjX&quot;&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=&quot;http://mx.linkedin.com/pub/hector-rojas/29/4b3/487&quot;&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 &quot;the riddles&quot; 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=&quot;http://lnkd.in/sC8a4g&quot;&gt;I had a piece of code that was working fine in the morning, but was intermittently problematic in the afternoon. Here&#39;s what happened&lt;/a&gt;. posted by&amp;nbsp;&lt;a href=&quot;http://www.linkedin.com/pub/david-brumbaugh/2/127/627&quot;&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=&quot;http://lnkd.in/28MZUX&quot;&gt;Major bug found in PHP 5.3.7&lt;/a&gt; posted by&amp;nbsp;&lt;a href=&quot;http://www.linkedin.com/pub/tyler-bell/39/67b/137&quot;&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 &quot;liking&quot; 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;
</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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/839223271987438929'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/09/linkedphpers-featured-threads-cw-342011.html' title='LinkedPHPers Featured Threads - CW 34.2011'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><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="linkedphpers"/><category scheme="http://www.blogger.com/atom/ns#" term="newbies"/><category scheme="http://www.blogger.com/atom/ns#" term="project management"/><title type='text'>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=&#39;more&#39;&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=&quot;http://lnkd.in/VbeRMj&quot;&gt;Tip&#39;o&#39;the day: on-the-fly PHP objects&lt;/a&gt; - started by&amp;nbsp;&lt;a href=&quot;http://ca.linkedin.com/in/nicolasbouliane&quot;&gt;Nicolas Bouliane&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/ddpT8x&quot;&gt;Interview Puzzles&lt;/a&gt; - started by&amp;nbsp;&lt;a href=&quot;http://in.linkedin.com/pub/gaurav-khanna/2b/249/13&quot;&gt;Gaurav Khanna&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/mpM-JS&quot;&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=&quot;http://in.linkedin.com/pub/pradip-sharma/20/bb2/aa5&quot;&gt;Pradip Sharma&lt;/a&gt;&lt;br /&gt;
I think it&#39;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=&quot;http://co.linkedin.com/pub/cesar-reyes/31/981/a49&quot;&gt;Cesar Reyes&lt;/a&gt; and called&amp;nbsp;&lt;a href=&quot;http://lnkd.in/jAj3wF&quot;&gt;What about TDD ??&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
And the last, but not least featured one - regarding what&#39;s upcoming and how do you like it -&amp;nbsp;&lt;a href=&quot;http://lnkd.in/ZZyGik&quot;&gt;What new feature in PHP 5.4 is most important to you?&lt;/a&gt; started by&amp;nbsp;&lt;a href=&quot;http://uk.linkedin.com/in/g4egk&quot;&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;</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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/2403453979757685145'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/08/linkedphpers-featured-threads-cw-332011.html' title='LinkedPHPers Featured Threads - CW 33.2011'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="applications"/><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="database"/><category scheme="http://www.blogger.com/atom/ns#" term="dictionary data"/><category scheme="http://www.blogger.com/atom/ns#" term="framework"/><title type='text'>WebApplications - part 4 - dictionary data</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
The last article from the &lt;a href=&quot;http://www.linkedphpers.org/search/label/cobaex&quot;&gt;WebApplications&lt;/a&gt; series was &lt;a href=&quot;http://www.linkedphpers.org/2009/05/webapplications-part-3-user-and-data.html&quot;&gt;published really long time ago&lt;/a&gt;. Since then blog has been &quot;promoted&quot; to main &lt;a href=&quot;http://www.linkedin.com/groups?about=&amp;amp;gid=40870&quot;&gt;LinkedPHPers&lt;/a&gt; group webpage, several other articles were published.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
But still this series was quite popular - so I think it&#39;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=&quot;http://www.cobasolutions.com/software_development&quot;&gt;COBAEX platform&lt;/a&gt;. The approach we use has proved itself in many customer implementations (hence &lt;a href=&quot;http://www.cobasolutions.com/software_development&quot;&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=&#39;more&#39;&gt;&lt;/a&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
So - first of all the general question:&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;&lt;b&gt;What actually is the dictionary data ?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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 &quot;downgraded&quot; 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=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;&lt;b&gt;But getting to some real-life examples...&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
However let&#39;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=&quot;text-align: justify;&quot;&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=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;city[ID, name, regionID]&lt;/span&gt;, &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;region[ID, name, countryID]&lt;/span&gt;, &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;country[ID, name]&lt;/span&gt;).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;http://www.cobasolutions.com/business_software/en_service&quot;&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&#39;s call it &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;devicetype[ID, name, parentID]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
At the moment we have covered mostly all initial type of dictionary data, now let&#39;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=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;&lt;b&gt;So let&#39;s try to model this using our dictionary data types...&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
We need following tables:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;city[ID, name, regionID] &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;- linked dictionary data&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;region[ID, name, countryID] &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;- linked dictionary data&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;country[ID, name] &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;- simple dictionary data&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;archivetype[ID, name] &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;- simple dictionary data&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;devicetype[ID, name, parentID, countryID, archivetypeID] &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;- treetype, multivalue, linked dictionary data&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;&lt;b&gt;And now the real thing - standardized management...&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;http://www.cobasolutions.com/software_development&quot;&gt;COBAEX&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&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=&quot;text-align: justify;&quot;&gt;
Generally &lt;a href=&quot;http://www.cobasolutions.com/software_development&quot;&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=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;BIN_LIB_Dict&lt;/span&gt;, from which all the dictionary data inherits.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
1. Create appropriate tables in the database&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: left;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;class APP_SVM_LIB_Dict_DeviceType extends BIN_LIB_Dict&amp;nbsp;{ &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; protected $_uniqueValues = false;  &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp;protected $_formStructure_parentname = &#39;[DICT1::APP_SVM_LIB_Dict_DeviceType]&#39;; &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp;protected $_formOrder_parentname = 200;  &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt; }&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
and that&#39;s it !&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&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=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPBJKBNiHsAAMYoxWKhs6w9nSd3Hp1MBqVWMbdz2kr7tvPrg7lZNtfy_6cq4gSk62TnSOHlmveAyE2gzZLLtq2OqAAde-_XR8FqdyWKaTw53zAJohqSbcpfbkw6alf28inggsWhoP6LGk/s1600/dictionary_data.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;116&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPBJKBNiHsAAMYoxWKhs6w9nSd3Hp1MBqVWMbdz2kr7tvPrg7lZNtfy_6cq4gSk62TnSOHlmveAyE2gzZLLtq2OqAAde-_XR8FqdyWKaTw53zAJohqSbcpfbkw6alf28inggsWhoP6LGk/s320/dictionary_data.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;class APP_SVM_MDL_Dict_ServiceEmails extends BIN_LIB_Dict {  &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp;protected $_formStructure_value = &#39;[EMAIL]&#39;; &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp;protected $_formRequired_value = true;  &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp;protected $_formStructure_name = &#39;[TEXT::OBJECTNAME]&#39;; &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp;protected $_formOrder_name = 10; &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp;protected $_formWidth_name = 250; &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;&lt;b&gt;Few words of summary&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;http://lnkd.in/dSXdXH&quot;&gt;LinkedPHPers thread&lt;/a&gt; or in the comments :)&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&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=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;Note: All the techniques that were described in the article are implemented in the &lt;a href=&quot;http://www.cobasolutions.com/software_development&quot;&gt;COBAEX Environment&lt;/a&gt; created by &lt;a href=&quot;http://www.cobasolutions.com/en_start&quot;&gt;COBA Solutions Sp. z o.o.&lt;/a&gt; and &lt;a href=&quot;http://pl.linkedin.com/in/wzielinski&quot;&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=&quot;http://pl.linkedin.com/in/wzielinski&quot;&gt;contact me directly&lt;/a&gt; or send an email on &lt;a href=&quot;mailto:info@cobasolutions.com&quot;&gt;info@cobasolutions.com&lt;/a&gt;.&lt;/i&gt;&lt;/div&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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/4839094387186373252'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/08/webapplications-part-4-dictionary-data.html' title='WebApplications - part 4 - dictionary data'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPBJKBNiHsAAMYoxWKhs6w9nSd3Hp1MBqVWMbdz2kr7tvPrg7lZNtfy_6cq4gSk62TnSOHlmveAyE2gzZLLtq2OqAAde-_XR8FqdyWKaTw53zAJohqSbcpfbkw6alf28inggsWhoP6LGk/s72-c/dictionary_data.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="applications"/><category scheme="http://www.blogger.com/atom/ns#" term="architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers"/><title type='text'>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=&#39;more&#39;&gt;&lt;/a&gt;&lt;a href=&quot;http://lnkd.in/kvWmMy&quot;&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=&quot;http://in.linkedin.com/pub/pooja-sarvaiye/2a/38/259&quot;&gt;Pooja Sarvaiye&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/py8Whp&quot;&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=&quot;http://www.linkedin.com/pub/mark-kumar-photographer/22/552/701&quot;&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=&quot;http://lnkd.in/hWQ3zP&quot;&gt;Facebook&lt;/a&gt; (&lt;a href=&quot;http://www.facebook.com/pages/LinkedPHPers/121726194580178&quot;&gt;our fanpage&lt;/a&gt;) and &lt;a href=&quot;http://lnkd.in/ysHRxh&quot;&gt;Google+&lt;/a&gt; (contact sharing)&lt;br /&gt;
- Group Recognition - &lt;a href=&quot;http://lnkd.in/whS3kh&quot;&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=&quot;http://lnkd.in/V2asfU&quot;&gt;SURVEY - PHP Framework for Web Portal&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/aCxaxg&quot;&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 :)</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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/9114861661637122463'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/08/linkedphpers-featured-threads-cw-322011.html' title='LinkedPHPers Featured Threads - CW 32.2011'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="contest"/><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="newbies"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>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=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Several threads suggested me by &lt;a href=&quot;http://ar.linkedin.com/in/fernandojaviermartin&quot;&gt;Fernando Javier Martin&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/GgWuUC&quot;&gt;What would be the best and most secure option to store customers&#39; personal information and credit card details in a log in system?&lt;/a&gt;&lt;br /&gt;
Thread started by&lt;a href=&quot;http://uk.linkedin.com/in/dmanca&quot;&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=&quot;http://uk.linkedin.com/in/romansmalinovskis&quot;&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=&quot;http://lnkd.in/G69EPK&quot;&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=&quot;http://www.linkedin.com/pub/nick-routsong/25/a3b/558&quot;&gt;Nick Routsong&lt;/a&gt; are my favourites :) Let&#39;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=&quot;http://lnkd.in/tfbGXk&quot;&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=&quot;http://www.linkedin.com/in/stephensellers&quot;&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=&quot;http://lnkd.in/6DvYb9&quot;&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=&quot;http://in.linkedin.com/in/dharm0306&quot;&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&#39;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=&quot;http://lnkd.in/Xx-abH&quot;&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=&quot;http://lnkd.in/XMxAmk&quot;&gt;Next Riddle.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Thanks for them,&amp;nbsp;&lt;a href=&quot;http://in.linkedin.com/in/jayeshambali&quot;&gt;Jayesh&lt;/a&gt; and&amp;nbsp;&lt;a href=&quot;http://uk.linkedin.com/in/romansmalinovskis&quot;&gt;Romans&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
OK - that&#39;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 :)</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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/1098443205956176175'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/08/linkedphpers-featured-threads-cw-312011.html' title='LinkedPHPers Featured Threads - CW 31.2011'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><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 type='text'>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=&#39;more&#39;&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 &#39;./MySQL.php&#39;; ?&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  = &#39;./downloads&#39;;&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 = &#39;America/Detroit&#39;;&lt;br /&gt;
&lt;br /&gt;
$myNewTZ = new DateTimeZone($myTZ);&lt;br /&gt;
&lt;br /&gt;
$Date = date_create(date(&quot;Y-m-d H:i:s&quot;));&lt;br /&gt;
&lt;br /&gt;
date_timezone_set ($Date, $myNewTZ);&lt;br /&gt;
&lt;br /&gt;
$myDate = date_format($Date, &quot;Y-m-d H:i:s&quot;);&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[&quot;month&quot;], $Date_Array[&quot;day&quot;], $Date_Array[&quot;year&quot;]);&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 = &#39;you@youremail.com&#39;;&lt;br /&gt;
&lt;br /&gt;
$failed_subject = &#39;Expired Downloads Procedure failed!&#39;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$found_subject = &#39;Expired Downloads&#39;;&lt;br /&gt;
&lt;br /&gt;
$message = &#39;&#39;;&lt;br /&gt;
&lt;br /&gt;
$filename = &#39;/&lt;your_filename.zip&gt;&#39;;&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 !== &#39;.&#39; &amp;amp;&amp;amp; $content !== &#39;..&#39;) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$SQL = &quot;select `download_id`, `download_dir`, `user_name`, `email` from `downloads` where `download_dir` like &#39;%&quot; . $content . &quot;%&#39;;&quot;;&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[&#39;download_dir&#39;] . $filename)) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&quot;Delete unsuccessful. $message\n&quot;);&lt;br /&gt;
&lt;br /&gt;
} else {&lt;br /&gt;
&lt;br /&gt;
$message .= &#39;User: &#39; . $row[&#39;user_name&#39;] . &#39; (&#39; . $row[&#39;email&#39;] . &#39;) &#39; . $row[&#39;download_dir&#39;] . &quot;\n&quot;;&lt;br /&gt;
&lt;br /&gt;
rmdir($row[&#39;download_dir&#39;]);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
rmdir(&#39;./downloads/&#39; . $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 . &#39; (file)&lt;br /&gt;
&#39;;&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(&quot;File delete unsuccessful. $message\n&quot;);&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 . &#39; (dir)&lt;br /&gt;
&#39;;&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(&quot;Directory delete unsuccessful.&quot;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
} else {&lt;br /&gt;
&lt;br /&gt;
die(&quot;$_target is not writable.&quot;);&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=&quot;http://www.blogger.com/&quot; rel=&quot;nofollow&quot;&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</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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/1799855438048095231'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/08/working-with-dates-using-php-tutorial.html' title='Working with Dates using PHP'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="ajax"/><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="tutorial"/><title type='text'>Dynamic Page Content Replacement using AJAX and PHP Tutorial</title><content type='html'>&lt;div style=&quot;text-align: left;&quot;&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=&#39;more&#39;&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=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;jquery-1.3.2.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;&lt;code&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;jquery.history.js&quot;&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=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$pages = Array(&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;Array(page =&amp;gt; ‘main.php’, title =&amp;gt; ‘Home’, hash =&amp;gt; ‘main’),&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;Array(page =&amp;gt; ‘portfolio.php’, title =&amp;gt; ‘Portfolio’, hash =&amp;gt; ‘portfolio’),&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;Array(page =&amp;gt; ‘templates.php’, title =&amp;gt; ‘Templates’, hash =&amp;gt; ‘templates’),&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;Array(page =&amp;gt; ‘price.php’, title =&amp;gt; ‘Pricing’, hash =&amp;gt; ‘price’),&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&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=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&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=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&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=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// [CDATA[&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;var pages = [&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$i = 0;           // count variable&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$end = &quot;&#39; },\n&quot;;   // variable for the end of the array variable&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$page_count = count($pages); // number of pages for the site&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;foreach ($pages as $page) {  // Iterate through the PHP array&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;if ($i++ == $page_count) {      // current page is last page,&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 90px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$end = &quot;&#39; }\n&quot;;       //   close the array.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;echo &quot;\t\t{ title: &#39;{$page[&#39;title&#39;]}’, hash: ‘” . $page[&#39;hash&#39;] . $end;           // output the array values for the javascript array&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;];&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// ]]&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;script type=”text/javascript”&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// &amp;lt;!–&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// PageLoad function&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// This function is called when:&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// 1. after calling $.historyInit();&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// 2. after calling $.historyLoad();&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// 3. after pushing “Go Back” button of a browser&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;function pageload(hash) {&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// hash contains a value, let’s use it.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;if(hash) {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// restore ajax loaded state&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// Load data from the server and place the returned HTML into&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;//   the matched element.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$(“#art-content”).load(hash + “.php?noheader=false”,&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;null,&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;contentLoaded);  // javascript function contentLoaded() function is called&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;cur_hash = hash;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;} else {   // otherwise, load the home page&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// start page&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$(“#art-content”).load(“main.php?noheader=false”,&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;null,&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;contentLoaded);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;cur_hash = ‘main’;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$page[&#39;page&#39;] = ‘main.php’;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$(document).ready(function(){&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// After the DOM is done loading,&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// Initialize history plugin.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// The callback is called at once by present location.hash.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$.historyInit(pageload);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// set onlick event for buttons&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$(“a[rel=&#39;history&#39;]“).click(linkClick);&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;});&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;function contentLoaded() {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// for each page, make any links that go to that page&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// use the hash-mark href instead and have rel=’history’&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// so that they use the jquery history plugin to process&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// and load their content through ajax instead of a link&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$(function() {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$.each(pages, function(i, val) {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 90px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$(‘a[href=&#39; + val[&#39;hash&#39;] + ‘.php]’)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 120px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;.attr(‘rel’, ‘history’)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 120px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;.attr(‘href’, ‘#’ + val[&#39;hash&#39;])&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 120px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;.click(linkClick);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 90px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;if(cur_hash) {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 90px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;cur_hash = cur_hash.replace(/^.*#/, ”);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 90px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$(“a[rel=&#39;history&#39;]“).removeClass(‘active’);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 90px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$(‘#l_’ + cur_hash).addClass(‘active’);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 60px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;var cur_hash;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;function linkClick() {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;cur_hash = this.href;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;cur_hash = cur_hash.replace(/^.*#/, ”);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// moves to a new page.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// pageload is called at once.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$.historyLoad(cur_hash);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;$(‘#link’).attr(‘href’).valueOf() = cur_hash;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;return false;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;// –&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;For more info on the jQuery  Library, visit their website at &lt;a href=&quot;http://jquery.com/&quot;&gt;http://jquery.com/&lt;/a&gt;.&lt;/div&gt;Now for the html part…&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;&lt;code&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;ul class=&quot;art-menu&quot;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;/*construct the menu from the item array built in the head section */&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;foreach ($pages as $item) {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;echo “&amp;lt;li&amp;gt;&amp;lt;a id=\”l_{$item[&#39;hash&#39;]}\” href=\”{$item[&#39;page&#39;]}\”&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[&#39;title&#39;]}&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=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&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=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&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=&quot;padding-left: 30px; text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;div class=”art-content”&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;!—jQuery code dumps the requested content here –&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/1378536553503237228'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/08/dynamic-page-content-replacement-using.html' title='Dynamic Page Content Replacement using AJAX and PHP Tutorial'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="chat"/><category scheme="http://www.blogger.com/atom/ns#" term="linkedphpers"/><category scheme="http://www.blogger.com/atom/ns#" term="project management"/><title type='text'>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=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://lnkd.in/WvynQn&quot;&gt;Where are located the best PHP developers?&lt;/a&gt;&lt;br /&gt;
Thread mentioned in &lt;a href=&quot;http://www.linkedphpers.org/2011/07/linkedphpers-featured-threads-cw-292011.html&quot;&gt;previous entry&lt;/a&gt;, started by &lt;a href=&quot;http://www.linkedin.com/pub/federico-ulfo/24/183/35a&quot;&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=&quot;http://lnkd.in/xHvs-B&quot;&gt;how do i add live chat in my website?&lt;/a&gt;&lt;br /&gt;
Created by &lt;a href=&quot;http://pk.linkedin.com/pub/shahid-islam/35/731/509&quot;&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=&quot;http://lnkd.in/UHwA4p&quot;&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=&quot;http://in.linkedin.com/pub/bedashree-chakraborty/26/325/923&quot;&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=&quot;http://lnkd.in/zUb_uZ&quot;&gt;Equivalents in PHP for Application and Session events?&lt;/a&gt;&lt;br /&gt;
Thread started by &lt;a href=&quot;http://in.linkedin.com/pub/prahlad-yeri/16/a53/243&quot;&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=&quot;http://www.linkedphpers.org/2011/07/linkedphpers-featured-threads-cw-292011.html&quot;&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 :)</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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7634820055071733985/posts/default/3446873283247234250'/><link rel='alternate' type='text/html' href='http://www.linkedphpers.org/2011/08/linkedphpers-featured-posts-cw-302011.html' title='LinkedPHPers Featured Posts - CW 30.2011'/><author><name>Voyteck</name><uri>http://www.blogger.com/profile/07872923335549949802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>