Archive for the ‘zend framework’ Category
PHP Frameworks popularity estimation
About 2.5 years passed since I posted the development activity comparison of major PHP frameworks. Since then I’ve got about 4.5k hits from search engines, which IMHO is not such a bad sample to summarize people’s interest in each of them.
Again, no conclusions – just pure numbers
| Query | Hits | Zend | CakePHP | Symfony | CodeIgniter | Prado | Seagull | eZ |
| zend framework vs cakephp | 573 | 573 | 573 | 0 | 0 | 0 | 0 | 0 |
| zend vs cakephp | 319 | 319 | 319 | 0 | 0 | 0 | 0 | 0 |
| cakephp symfony | 258 | 0 | 258 | 258 | 0 | 0 | 0 | 0 |
| zend vs symfony | 254 | 254 | 0 | 254 | 0 | 0 | 0 | 0 |
| cakephp vs zend framework | 217 | 217 | 217 | 0 | 0 | 0 | 0 | 0 |
| symfony vs zend | 210 | 210 | 0 | 210 | 0 | 0 | 0 | 0 |
| zend framework vs symfony | 187 | 187 | 0 | 187 | 0 | 0 | 0 | 0 |
| symfony vs cakephp | 185 | 0 | 185 | 185 | 0 | 0 | 0 | 0 |
| zend framework vs | 176 | 176 | 0 | 0 | 0 | 0 | 0 | 0 |
| codeigniter vs zend framework | 143 | 143 | 0 | 0 | 143 | 0 | 0 | 0 |
| prado framework | 139 | 0 | 0 | 0 | 0 | 139 | 0 | 0 |
| cakephp vs zend | 139 | 139 | 139 | 0 | 0 | 0 | 0 | 0 |
| symfony vs zend framework | 138 | 138 | 0 | 138 | 0 | 0 | 0 | 0 |
| zend framework cakephp | 131 | 131 | 131 | 0 | 0 | 0 | 0 | 0 |
| prado vs zend | 103 | 103 | 0 | 0 | 0 | 103 | 0 | 0 |
| zend framework vs codeigniter | 84 | 84 | 0 | 0 | 84 | 0 | 0 | 0 |
| cakephp vs symfony | 82 | 0 | 82 | 82 | 0 | 0 | 0 | 0 |
| prado vs cakephp | 81 | 0 | 81 | 0 | 0 | 81 | 0 | 0 |
| prado vs symfony | 80 | 0 | 0 | 80 | 0 | 80 | 0 | 0 |
| zend vs codeigniter | 76 | 76 | 0 | 0 | 76 | 0 | 0 | 0 |
| zend or cakephp | 69 | 69 | 69 | 0 | 0 | 0 | 0 | 0 |
| codeigniter vs cakephp | 68 | 0 | 68 | 0 | 68 | 0 | 0 | 0 |
| codeigniter vs zend | 62 | 62 | 0 | 0 | 62 | 0 | 0 | 0 |
| zend vs code igniter | 60 | 60 | 0 | 0 | 60 | 0 | 0 | 0 |
| cakephp zend framework | 59 | 59 | 59 | 0 | 0 | 0 | 0 | 0 |
| codeigniter vs symfony | 55 | 0 | 0 | 55 | 55 | 0 | 0 | 0 |
| cakephp symfony zend | 52 | 52 | 52 | 52 | 0 | 0 | 0 | 0 |
| cakephp vs prado | 50 | 0 | 50 | 0 | 0 | 50 | 0 | 0 |
| symfony zend framework | 48 | 48 | 0 | 48 | 0 | 0 | 0 | 0 |
| cakephp vs codeigniter | 48 | 0 | 48 | 0 | 48 | 0 | 0 | 0 |
| zend framework vs code igniter | 46 | 46 | 0 | 0 | 46 | 0 | 0 | 0 |
| zend framework vs. cakephp | 46 | 46 | 46 | 0 | 0 | 0 | 0 | 0 |
| symfony vs codeigniter | 45 | 0 | 0 | 45 | 45 | 0 | 0 | 0 |
| symfony vs prado | 39 | 0 | 0 | 39 | 0 | 39 | 0 | 0 |
| zend vs prado | 37 | 37 | 0 | 0 | 0 | 37 | 0 | 0 |
| zend cakephp | 37 | 37 | 37 | 0 | 0 | 0 | 0 | 0 |
| zend framework symfony | 36 | 36 | 0 | 36 | 0 | 0 | 0 | 0 |
| zend framework or cakephp | 35 | 35 | 35 | 0 | 0 | 0 | 0 | 0 |
| prado symfony | 35 | 0 | 0 | 35 | 0 | 35 | 0 | 0 |
| seagull vs cakephp | 34 | 0 | 34 | 0 | 0 | 0 | 34 | 0 |
| zend framework versus cakephp | 32 | 32 | 32 | 0 | 0 | 0 | 0 | 0 |
| Total | 4568 | 3369 | 2515 | 1704 | 687 | 564 | 34 | 0 |
| Interest Ratio | 73.75% | 55.06% | 37.30% | 15.04% | 12.35% | 0.74% | 0.00% |
Zend Porn
Web 2.0 Porn Sites run Zend Framework
I never mentioned here, but in my pre-previous developer’s life I was working in a small adult internet company. Right now one of my collegues called me on IM to ask a question about an error he suddenly got fro one of the sites he affiliates to. This is the error:
Fatal error: Uncaught exception ‘Zend_Db_Adapter_Exception’ with message ‘SQLSTATE[00000] [1040] Too many connections’ in /www/zt/root/library/Zend/Db/Adapter/Pdo/Abstract.php:129
Stack trace:
#0 /www/zt/root/library/Zend/Db/Adapter/Abstract.php(216): Zend_Db_Adapter_Pdo_Abstract->_connect()
#1 /www/zt/root/library/Zend/Db/Adapter/Pdo/Abstract.php(204): Zend_Db_Adapter_Abstract->query(‘????SELECT?????…’, Array)
#2 /www/zt/root/mvc/models/User.php(490): Zend_Db_Adapter_Pdo_Abstract->query(‘????SELECT?????…’)
#3 /www/zt/root/mvc/models/User.php(91): User->attachVideosByIp()
#4 /www/zt/root/bootstrap.php(35): User->__construct()
#5 /www/zt/root/index.php(7): require(‘/www/zt/root/bo…’)
#6 {main}
thrown in /www/zt/root/library/Zend/Db/Adapter/Pdo/Abstract.php on line 129
Warning: Unknown: write failed: No space left on device (28) in Unknown on line 0
Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0
BTW, the site (it was Zoo Tube) is not really bad (according to Google cache) and even seems to be a clone of another Web 2.0 porn site – Red Tube, which makes me think ZF is really becomes a trend in real world and and real money projects. Isn’t it amazing?
Grouped Completion (Content Assist) in PDT
Last Wednesday I was working on grouping of code completion (content assist) options. It’s now only exists in CVS and will be (hopefully) released with the build after the next one (the current is already finalized).
Overview
The main point of the feature is collapsing of multiple same-prefixed options into groups, instead of showing a long list of the options. For example if your application is based on Zend Framework or PEAR, most of library’s classes start with “Zend_” or “PEAR_”, and this is what you will get as a completion option. In addition, the grouped list doesn’t show common prefix if an user already typed it.
In general it’s applied to all the types of elements (classes, functions/methods, variables and constants) in all the possible contexts (general completion, doc blocks, new/instanceof etc.). The feature is disabled by default can can be found at:
Preferences->PHP->Editor->Code Assist->Group Completion Options
The logic of the grouping is very similar to completion of files in include statements in Zend Neon and is quite simple:
- If there are several options which share common prefix AND there are additional elements which do NOT have this prefix, the sibling elements are collapsed to groups with “…” suffix.
- After completion of a group, completion pops up immediately again to show elements with the typed prefix.
- If typed prefix has common prefix with proposed elements/groups, it’s collapsed with “…” prefix.
How it works
First, all the types of code completion options are created by objects which extend an abstract CompletionProposalGroup (View Source). The class’ work is to receive an array of CodeData’s and return an array of ICompletionOption’s. This is why the feature’s code is mostly aggregated in this class.
So, instead of just creating a completion option for each element, we should first create a tree of all elements, based on elements’ name chunks separated by “_”, then go over the tree and extract only the relevant elements and groups, and then create chopped completion options for groups and elements. And now in details -
Creating Tree of Elements
CompletionProposalGroup.buildCompletionTree()
Luckily, Eclipse platform provides two base components which made the implementation relatively simple. It’s IPath/Path couple, which provide a comfortable solution for handling abstract OS-like paths, and ElementTree, which is a recursive tree data structure which gives access to it’s nodes based on IPaths.
The first action item here is to create a path from element’s name – it’s done by replacing all delimiters with slashes and providing the result string to Path’s constructor. Then it’s time to recursively create the element – if the parent path is not in the tree, we’ll add it with null data attached (these nodes will represent element groups in the future). After the parents exist, we are adding the element itself to the tree with CodeData object attached.
Extracting relevant Elements and Groups
CompletionProposalGroup.treeRecursiveCreateElement()
In order to get the relevant elements and groups according to 3 rules mentioned above, we basically need to recursively get children of a tree node starting from the root. However if there are no children for current node or the node has sibling(s) – we don’t want to continue deeper inside, and just return the current node. As a result, we get list of elements and collapsed groups to create completion proposals from.
Creating Elements and Groups Completion
CompletionProposalGroup.calcCompletionProposals()
Afterwards, the only remaining thing is to create proposals. For element proposals there is a wrapper proxy PartialProposal for CodeDataCompletionProposal which cuts off matching segments of prefix, and for groups – there is a wrapper proxy TemporaryCompletionProposal for CompletionProposal created with cut prefixes, which only ovverrides ICompletionProposal.apply() method to reactivate completion immediately group application.
That’s all it’s about.
Zend Framework vs. CakePHP, Symfony, Seagull, WACT, Prado, TRAX, eZ and CodeIgniter
In contraversal with what it might seem, I won’t compare features of the mentioned projects. For that purpose you may just read this nice article by Dennis Pallett.
Instead, I will share you what I learned with help of [in]famous Ohloh project – the codebase, activity and participants dynamics comparison of the mentioned projects.
Well, I’ll not make any conclusions – just observe the facts.
Codebase:
(lines of code)
Zend Framework CakePHP Symfony
Zend Framework Seagull WACT
Zend Framework PRADO TRAX
Zend Framework eZ CodeIgniter
Activity:
(commits)
Zend Framework CakePHP Symfony
Zend Framework Seagull WACT
Zend Framework PRADO TRAX
Zend Framework eZ CodeIgniter
Participants:
(active committers)
Zend Framework CakePHP Symfony
Zend Framework Seagull WACT
Zend Framework PRADO TRAX
Zend Framework eZ CodeIgniter
Enjoy.
Integration of Zend Framework and Prototype Ajax
Last two days I’ve worked on implementing an example of integration of Zend Framework’s MVC and Prototype’s Ajax for HTML Forms submission and validation.
The solution consist of 2 parts:
1. There is a new View Helper to create an Ajax-enabled form.
This part mostly consists of JavaScript code, which alters default HTML Form behavior to submit the input element values to the action’s URL with Ajax, if form’s method is set to ‘ajax’.
In addition the form itself listens to submission result events and (by default) marks input elements if they are invalid.
2. There is a new customized abstract base Controller which replaces default ViewRenderer with a new one, which:
a) detects whether the request was received from Ajax.
b) if true, will not render the view, but instead will output with the input validation information, if either.
Well, the development is not really over yet, but what I originally wanted to say is I’ve just realized how I miss writing good old JS.
By the way, I need to repeat [ad:start] how happy I am to have PHP, HTML and JavaScript editors in one powerful standardized environment (Eclipse) – what I never had in the past, before PDT, WST & ATF came to the picture [ad:end]
).
Blog RSS feed