Leaderboard
Popular Content
Showing content with the highest reputation on 09/14/2013 in all areas
-
Hi there, well, a few days ago another project of mine went online. I did that homepage for a local voluntary firefighters' club with a friend of mine at the front. My job was to create the technical basement. I used the 960 Grid System framework to do the design and implemented the base templates, my friend created an interface to synchronize the homepage calendar with a firefighters' organizational software he programmed on his own and also did some optical tweaks, Piwik integration and content. http://www.feuerwehr-friedrichshofen.de/ Regards Seuche6 points
-
Sevarf2, you are correct about something here in that theoretically, supplying the template to the find() call should enable it to run faster. ProcessWire needs to know the template for a page before it starts loading it. So it'll query the DB for the page's template if it doesn't already know it. However, we don't have that optimization in place for $pages->find() at present, so your $pages->get("id=123, template=book"); doesn't benefit from that. But you can take advantage of that optimization by using the $pages->getById() method. It would technically be the fastest way to retrieve a page, but it's rare that I would be up for using it when developing a site (I only use it for core development). But it may be worth trying if you are trying to optimize a large amount of page retrievals. I'm not sure it'll make much difference in the end, but it's worth a shot. $template = $templates->get('book'); $page = $pages->getById($page_id, $template)->first(); The getById() method is really meant for retrieving multiple pages, which is why it returns a PageArray. If you have multiple pages using the same template, you can retrieve all of them here: $pageArray = $pages->getById(array(123,456,789), $template); If you can also supply a parent_id to the method (meaning, you already know all the provided page IDs have the same template and parent), it can use that for a little further optimization: $pageArray = $pages->getById(array(123,45,789), $template, $parent_id); Btw, the purpose of $pages->getById() method is as a support for all the other get(), find() and children() methods in ProcessWire (or anything else that returns a Page or PageArray from the DB). All pages loaded from the database are loaded by the getById() method, so all the other get/find methods are actually front-ends to it. getById() was never intended to be part of the public API though.5 points
-
4 points
-
Greetings, This is fun. But it really is a good subject to compare what life is like before and after ProcessWire. I already posted my humorous visual. But now, after using ProcessWire more in recent months, here's another way I see it... Before ProcessWire I spent too much time comparing and experimenting with CMSs and frameworks, chasing after specific capabilities. How well does this system do search? What are the templating or theming requirements? Is there a module for [fill in need]? Does it do tags? Is it easy to integrate scripts? No single system did all of these things well, so I was always trying another one, always having to be satisfied with "good enough," and always working around limitations. New projects always presented another "surprise" coding need I had not considered before, forcing me to search again for a system that can do it. After ProcessWire I can confidently handle all of these capabilities, dong them the way I need them to be done for each project, and I know the system will provide an intuitive way to handle those "surprise" coding needs that inevitably arise. I gain better and better understanding of the underlying coding principles behind these development capabilities. Thanks, Matthew4 points
-
Can you describe your scenario? Here's a common scenario: Lets say you've got a section called /articles/ and you want to have authors that can edit articles: 1. Create new role called "author" and check permission box for "View" and "Edit". Assign this role to one or more users you've created. 2. Edit your "Article" template (Setup > Templates > edit), the one represented by /articles/some-article/, etc. 3. Check the "yes" box on "access" tab to enable access control. 4. Next to the "author" role, check boxes for: View, Edit Want your authors to be able to create new articles too? 1. Edit your "Article" template again, check the box for "Create" for the author role. 2. Edit your "Articles" template (the one represented by page /articles/). Enable access control and check the box for "Add Children" for the author role. Want authors to only be able to create new articles but not to publish them? 1. Add a new permission (Access > Permissions > New) and call it "page-publish" 2. You don't have to do anything else. Since the author role doesn't have page-publish permission, they can't publish pages. They can still edit and create unpublished pages. Tell me more about your scenario and I'll outline instructions.4 points
-
GOOD NEWS for those with little children or with a sensitive mind: I have written a VB program that permanently scans the screen for the pink colored string apeisa and than places a 100x100px black rectangle positioned x +30 and y +50 on top of that screen area. For all of you who have little children and can work on windows, I can sell a licence for only 12,- € (per day) and if you don't want like to have these scensored black rectangle you can upgrade to the premium version for only + 4,- € (per day). The premium version places the old avatar picture of antti on top of the screen.4 points
-
It sounds like this is more multi-language/similar-site, rather than actual multi-site. You mentioned all the domains describe the same content (for the most part) so I would probably take the "multi-site" out of your thinking about it, because it's only multi-site so far as it is multi-language. I'd use the dev branch, purely because it's going to take you a lot farther on the multi-language side. It should be plenty stable, but you'll just have to use extra care when updating (i.e. test things out on your own before upgrading a live server). If you could, I would try to do this all on 1 domain rather than split among multiple domains, but I'll assume that's not an option. But it'll be workable either way. If using multiple domains (or subdomains), you'll only need to install the LanguageSupportPageNames module if you want to have the same pages use language-specific names. I'm guessing you'll want that. However, you'll want to set the $user->language yourself, based on the domain/subdomain, rather than any other factor. You can do that with code like this at the top of a common include/file for all site template files: // grab the subdomain, i.e. "en", "de", "at", etc. list($languageName) = explode('.', $config->httpHost); // sanitize it just for good measure $languageName = $sanitizer->pageName($languageName); $language = null; // attempt to find a language with the same name if($languageName) $language = $languages->get($languageName); // if no language matches, then we'll assume 'default' language. if(!$language || !$language->id) $language = $languages->get('default'); // set the language to the user $user->language = $language; The above is essentially serving as your "multi-site" code, forcing the language to match the subdomain. You'd want to remove any other multi-site solutions. You'd want to use multi-language text fields where possible. When using multi-language textarea fields where you need rich-text editing, I suggest installing the InputfieldCKEditor module and using it in inline mode. This scales much better for multi-language environments than TinyMCE. For situations where you need different images per language, you can use the tags feature to devise your own matching method (perhaps using the language name as the tag), or you can use language alternate fields. For situations where you have a page available in one language and not another (or some and not others) then you can simply make them active or inactive from the checkboxes on each page's "settings" tab. To summarize, I would treat this site purely as a multi-language site, and would probably develop it without considering the multiple domains/subdomains. Then when it comes time to launch, point all those domains at the same site, but use the $config->httpHost trick above to set the language based on the subdomain its being accessed from.3 points
-
@xeo, what you want to do is not the intention of the module. In PW the urls follow the structure of the tree, if you would shorten your urls like you are saying, there would be problems with pages overriding other with the same name. Imagine that you have a page called "About" in the root of the website (mydomain.com/about), and you would write an article with the title "About". You would have a problem because they would share the same url. If you want to have short urls for your articles, you can put them under a parent that is on the root, and has a short name (not short title) -home --about --contacts --articles (name: a) ---article1 ---article2 This way, your article1 url would be mydomain/a/article1 If you want to have an even shorter url for the articles (avoiding urls like: mydomain/a/my-new-article-with-a-very-very-veeeeeeeeery-long-title), you can create a system that accepts their IDs on the URL (mydomain/a/123): <?php // on top of the template file of the "articles" page ("/a/") // url segments have to be activated on this template if ($input->urlSegments) { // if there are segments in the URL $id = (int)$input->urlSegment1; // get the first segment ant turn it into an integer $myURL = $pages->get("/a/")->find("id={$id}")->first()->url; // get the url of the page with the id in the segment if ($myURL && !$input->urlSegment2) { // if page exists and there's not a second segment $session->redirect($myURL); // redirect to the correct page } else { throw new PageNotFoundException(); // if not, throw a 404 } }3 points
-
3 points
-
Selector may be a good way to go in that case. We'll have to look closer at this. But if you are interested in experimenting with different options, one way to go would be having a module add a new hook function to the Pageimage class, like this (warning: written in browser, not tested): public function init() { $this->addHook('Pageimage:mySize', $this, 'mySize'); } public function mySize(HookEvent $event) { $pageimage = $event->object; $selectorString = $event->arguments(0); $selectors = new Selectors($selectorString); $settings = array(); $width = 0; $height = 0; foreach($selectors as $selector) { if($selector->field == 'width') $width = $selector->value; else if($selector->field == 'height') $height = $selector->value; else $settings[$selector->field] = $selector->value; } if(count($settings) || $width || $height) { return $pageimage->size($width, $height, $settings); } else { return $pageimage; // nothing to do, return original } } Usage: $thumb = $page->image->mySize("width=300, height=200, upscaling=0, sharpening=medium");3 points
-
I was feeling left out - now I have a hat thanks to Martijn's bowler from earlier in the topic Antti - I nearly lose my lunch every time I see your avatar. Problem is you post so much so it's hard to avoid3 points
-
I have now gone "live" at the permanent address: re le vo DOT se/en (DNS may still not be updated from all hosts). Some items remain to be translated (like the banner texts and most of the news items) but since you asked before Craig; I would now be very happy about any errors or awkward wording that you may spot. Of course, a lot of work remain with this site (I have not yet done work on adaptation for old browsers and I hope to implement a lot of new content sections and functions) but even at this early stage, it would be great to know how you think the design, responsiveness and such work. Since I opted to go at it from scratch, without templates and such, feedback on stuff like that would be awesome. And thanks once again for all the valuable help from you, fellow PW:ers!3 points
-
Font Awesome Page Label (almost stable version) Yet another PageListLabel module, why? Font Awesome is really awesome, hundreds of high quality icons, ready to use. (Don't we all know how cool icon fonts are.) I wished to use icons in conjunction with the other PageList modules out there. (Page List Better Labels, Page List Image Label & Page List Show Page Id ) I wanted the possibility to style the icons individually with CSS. Showing icons triggered bij template name, but can be overruled bij Page ID. (Trash Page, 404 Page not found etc.) I wanted a better file or folder indication in the PageList tree. Download: github modules directory2 points
-
I promised I would share my summer-project when I got a bit further along and now most of basic design is up on the test server (still just test content though, only some of it will be there in production). Two pages remain to be styled and some minor touch-ups are left for sure, but the gist of the simple design should be visible. Clean Scandinavian has been the motto. Will update to publishable version over the coming week/weeks. I will also clean up the code and do some validation fixing etc during that time. Any suggestions, pointers and tips from you pros would be much appreciated (tough love is the ticket). Keep in mind that I am not a pro and that apart from a sole static site I helped a buddy with 10 years ago, this is my first attempt at any of this (html, design, php, cms etc), so spare me the sharpest ax. A testament to the Processwire excellence - and to all of you helpful souls on this page - is that I have been able to get at least this far with no prior experience, so I would like to extend a heartfelt thanks to Ryan, Soma, Teppo and all the rest of you that have helped form this product in general, and taken the time to help me out on specific questions. You truly rock! re le vo DOT se/en2 points
-
2 points
-
If you wanted it to automatically bypass the _main.php template during an ajax request, you could also do something like this in your _init.php: $useMain = !$config->ajax;2 points
-
Thanks guys!! Will go through these suggestions as soon as I can and get back to you. Saturday night here, "apparently" I have to get away from the computer and be social and whatnot... meh2 points
-
It all depends on your server hardware and the filesystem that is running. There's no problem having thousands of folders. Ext4 can handle 64'000 subfolders but I'm sure this limit does not exist, because I have a site running with more pages and folders too.2 points
-
hmm, no one replied to the question there... so I post it here. Some possible translation updates: /wire/templates-admin/default.php (for complete main menu and heading translations) /* * Dynamic phrases that we want to be automatically translated * * These are in a comment so that they register with the parser, in place of the dynamic __() function calls with page titles. * * __("Pages"); * __("Setup"); * __("Modules"); * __("Access"); * __("Admin"); * __("Languages"); // add * __("Users"); // add * __("Roles"); // add * __("Permissions"); // add * */ /wire/modules/LanguageSupport/ProcessLanguage.module (translatable 'Edit' and 'Translate new File' link) $lastMod = date($this->config->dateFormat, filemtime($pagefile->filename)); $edit = __('Edit', __FILE__); // add $out = "<div class='InputfieldFileLanguageInfo'>" . "<ul class='actions'>" . "<li><a href='{$translationUrl}edit/?language_id={$page->id}&textdomain=$textdomain'>$edit</a></li>" . // change "</ul>" . "<p><span class='InputfieldFileLanguageFilename'>/$file —</span> <span class='notes'>$message</span></p>" . "</div>"; $translationUrl = $this->translationUrl(); $page = $event->arguments[0]->get('page'); $translate = __('Translate New File', __FILE__); // add $out = "<ul class='actions LanguageFilesActions'>" . "<li><a href='{$translationUrl}add/?language_id={$page->id}'>$translate</a></li>" . // change "</ul>";2 points
-
a very positive review from a guy who knows what he is talking about. pro pw: high performance even with large scale sites active and friendly community future safe good for commercial websites with the need to manage and display a lot of data (example scyscraper profile) highly flexible and powerful core, no plugins required contra pw: no asset/media management2 points
-
Both the same and since you specify a id explicit, it will just get that page and the template wouldn't be required. But actually there's a difference in it: $pages->get($pageID); Will get the page even if unpublished, in trash, hidden or user would have no access! It isn't doing a real "find" and it's much like getting a row from DB no matter what. It's like a shortcut PW is doing in this case not doing a usual page finder search. $pages->get("template=book,id=$pageID"); This will convert the previous into a "page finder search" much like when using a find("template=book, title=Mytitle"), thus behave different. It will not return a page if unpublished or hidden or in trash or the user has no access. EDIT: In fact in the last one, it will even get the page even if the template isn't correct! So the id=id is the key here. Any selector will get ignored. So doesn't really make sense to add selector if you got the ID. Page ID is one of the things that's unique an always the same untill you delete it.2 points
-
The Organization of American Historians just converted its website to Processwire: http://www.oah.org/ Founded in 1907 and with its headquarters located in Bloomington, Indiana, the OAH is the largest professional society dedicated to the teaching and study of American history. — Michael Regoli, OAH1 point
-
1 point
-
Technically I suppose you could have thousands of templates, but that's not where the scalability focus is. PW is designed to scale to unlimited pages, but not templates or fields. There's also the development factor–I don't think one could effectively develop a site with thousands of templates because that's just too much to keep track of. Consider the computer dictionary definition of Template: "a preset format for a document or file, used so that the format does not have to be recreated each time it is used." That describes templates in ProcessWire–something common so that you don't need huge quantities of them. Mary–do you think you need thousands of templates for layout reasons, field reasons, or access control reasons (or something else)? I think you'll be able to achieve what you need while only having a few templates, but want to better understand the foundation of the need.1 point
-
Hello there, In my long slow way of discovering coding, I ended up realizing I needed something like... the Pages Web Service. I installed it, tried it and thought.... Woa! How can Ryan do so much... It seems perfect for my needs right now! I was stcuk and now I can go forward again. So I'll keep on exploring and trying to do my stuff. But on my way, I wanted to stop and say THANKS to Ryan for his work and the way he's sharing it... I sometimes ask for help, this time, no answer needed ;-)1 point
-
I think that's okay, but it could be problematic in some cases like when file locations are different between master and dev, or when dev is using an updated DB schema from master. I don't think that either is the case right now, but just something to watch out for. The safest bet is to run them on separate databases. In your current setup, worst case is probably that you could end up being only able to run dev (with some part of the DB schema not compatible with the older stable branch). The changing file locations is not so much of an issue, but if you get errors you might need to manually clear the Modules cache (i.e. remove all /site/assets/cache/Modules.* files).1 point
-
@ryan: is there any timeline for PW 2.4? Because of the bad weather today I have done a lot more updates in translations for PW. But until now not pushed it on GitHub. EDIT: all pull request done. Hopefully no mistakes..1 point
-
Sometimes I prefer getting pages by template if appropriate, it means the name can be changed yet the "about" template or "contact" template is unlikely to.1 point
-
Ryan in my tests, this doesn't work as in your examples. $template = $templates->get('basic-page'); $p = $pages->getById(1386, $template)->first(); The page 1386 has the template "basic-page" but the query doesn't return it. But it does find it when using this: $template = $templates->get('basic-page'); $p = $pages->getById(array(1386), $template)->first(); BUT it also returns the page when I specify a wrong template $template = $templates->get('custom'); $p = $pages->getById(array(1386), $template)->first(); I'm not sure what all about it when using id's to retrieve a page how would a template be of any benefit?1 point
-
Awesome work Kongondo! Very impressive seeing it in action from your video too. Regarding the help-please section and security: is the Process tool intended primarily for superuser/developer use, or something that would be available to non-superusers? If exclusive to superusers (as many admin/developer helper tools can be), security becomes a much simpler task because we already assume they have access to do whatever they want. If not exclusive to superusers, then there's more to consider. With regards to SQL queries, it looks like you are doing a good job of sanitizing everything that gets bundled into a query. But for any string values, you might also want to run them through $str=$db->escape_string($str); just to complete it with the DB driver's own sanitization method. It's probably not technically necessary in any of the instances I saw, but it's just a good practice either way. Of course, you can also use numbered parameters in mysqli to avoid that issue, but I don't care for mysqli's implementation of this and generally don't use it (on the other hand, PDO's named parameters are great).1 point
-
I can't go to the PW forum with that avatar from antii before children's bedtime. ( now sitting sneaky in a corner, hiding for the little girl. Antii, tnx for that )1 point
-
1 point
-
Great module, when you have time please fix the link to twitter dev on the module page1 point
-
Mary, I suppose the questions are: 1. Why do you need thousands of templates? Are the baby sites structurally different (e.g. one has title and headline field, the other only has title, or different markup, etc) and/or are they aesthetically different (CSS)? 2. Will the baby sites each have more than 1 template? Max number of templates? In the end, you do not need each to have unique templates. You can have a base template and pull in .inc or .tpl files via the API to populate the unique portions of the baby sites in the frontend. Soma proposed a wonderful "template delegation" approach that would fit your project nicely, I think. Have a read here. http://processwire.com/talk/topic/740-a-different-way-of-using-templates-delegate-approach/. There's other approaches there as well. So, instead of ending up with thousands of templates, you could end up with thousands of template file includes. Even then, I should think you can still cut down on the numbers depending on the uniqueness of the baby sites. It just needs careful planning/mulling over. Having said that, I don't think having thousands of templates will have any performance issues in the backend. I could be wrong on this one since I have never tried it though . You'd probably have to organise them in such a way you could easily edit them. You could use tags to group them in the backend. You could even go fancy and create a simple module that would list your templates in a table, maybe with pagination + search function to filter the list, + a click to edit a template (add fields, etc). The link could take you to the PW template edit screen or could open a modal to edit the template. This would be sort of extending the PW template backend view. We can help you get there if you want to take this route. Just my 2cts, there will be other thoughts am sure...1 point
-
Ryan, I like your honesty, how gracious you are, and the fact that you're just such a nice guy1 point
-
Thanks for the feedback guys, this was a can of worms situation. I came to realize I also needed a frontend login form and I leveraged the homepage being viewable by all to accomplish this. I wanted to to have csrf protection in my form so I extended the ProcessLogin core module (https://gist.github.com/jdart/6545755) and called the module in the home template: #home.php echo $modules->get('SpexLogin')->execute(); if (!$user->isLoggedin()) return; Hopefully that will be helpful for someone. Maybe1 point
-
Used the magnific popup to. if($("a>img").length) { Modernizr.load([{ load: ['/site/templates/js/jquery.magnific-popup.min.js', '/site/templates/css/magnific-popup.css'], complete: function () { $("a>img").parent().append("<div class='pop-up'><i class='icon-popup'></i></div>").addClass("magnific"); $(".magnific").magnificPopup({ type: 'image', gallery: { enabled: true }, removalDelay: 300, mainClass: 'popup-slide' }); } }]); } It's a nice lookin lightbox.... TNX arjen1 point
-
1 point
-
Ok I tested again with another install. When viewing page on default language (/de/about/), and in template create or edit a page (always with API): 1. creating page works fine, language is same before and after 2. editing the page and modifying the title of each language, I get the famous error 3. when removing repeater from template, it works, no error When viewing page on alternative language (/en/about/), and in template create or edit a page 1. creating fails, error 2. editing fails, error 3. when removing repeater, it works fine Hope this help you reproduce1 point
-
Sorry about that jQuery.. edited and deleted. That profile exporter issue was just a side note that I noticed when I was trying to solve the main issue: Some images do not end up to database during upload and that's why they dissapear from input field after page save. All images do trasfer to filesystem correctly. So I belive it's a MySQL issue since only setup where I can reproduce this is at PHP 5.3.23 / MySQL 5.0.8 (although tested only couple of different combinations available). I can PM you some login details to live site if you wan't to go explore. That jQuery break notification on firebug probably has nothing to do with this.1 point
-
I might have found a bug with field dependencies and the image field. I have the Visitibility Presentation set to default "Always Open (default)" and have set "Show this field only if" to the folowing condition: p_type_select!=1024,p_type_select!=1025,p_type_select!=1026,p_type_select!=1032,p_type_select!=1186,p_type_select!=1187 When i try to upload an image (both drag&drop and with the button) it somehow fails. Removing the "Show this field only if" condition makes the field useable again. Note: The image field is inside a Field Set Tab, but im not sure if thats the cause of the problem.1 point
-
If the module needs JS/CSS in the frontend (e.g. in templates), I don't see any solution other than let the dev add those scripts himself or using the Page::render hook, assuming that the module is autoload. Why? Because the module creator can't know your template structure. There are lots of different approaches, using a head.inc file is just one of them. Adding the scripts/styles to the config arrays will only work if those arrays are used to output the scripts in the templates. This is because Pw does not force you how to generate the markup, it's pure freedom1 point
-
If you don't want that in some particular situations, you can use HTTP-Header like Cache-Control "no-transform" for images! http://mobiforge.com/developing/story/setting-http-headers-advise-transcoding-proxies1 point
-
Reviving this old thread. Luckily, since I'm only getting into PHP now, by going straight to OOP, I've not really had to unlearn some procedural PHP in order to grasp OOP. I found the following helpful: http://net.tutsplus.com/tutorials/php/object-oriented-php-for-beginners/ http://www.tutorialspoint.com/php/php_object_oriented.htm http://phpro.org/tutorials/Object-Oriented-Programming-with-PHP.html http://www.codewalkers.com/c/a/Programming-Basics/ObjectOriented-PHP-Fields-Properties-and-Methods/ http://www.massassi.com/php/articles/classes/ http://net.tutsplus.com/tutorials/php/from-procedural-to-object-oriented-php/ http://net.tutsplus.com/tutorials/php/real-world-oop-with-php-and-mysql/ PHP Academy tuts - videos1 point
-
Well now you and all the pw-members have my address - whenever in Stockholm, please abuse it - lunch, beer or whatever shall be on me for any supporters of pw! All the best, //dice1 point
-
Lets say you want to setup a role "pr-editor" that can add press releases as children of page /about/pr/. The page /about/pr/ uses template "pr-index", and the individual press releases (children) use template "pr-item". Create a new role "pr-editor" and give it "page-edit", "page-add" and any other permissions you want. Give that "pr-editor" role to a user that you will test with. Edit the template "pr-index". On the "access" tab, check the box for "add children" for role "pr-editor". Optional but recommended: On the "family" tab, set the "allowed children" to be template "pr-item". Save. Edit the template "pr-item". On the "access" tab, check the box for "create pages" for role "pr-editor". Optional but recommended: On the "family" tab, set the "allowed parents" to be template "pr-index". Save. Login with the user that has the "pr-editor" role and test it out.1 point
-
But if I give the permission to the role, they already have delete permission for all pages. I want to limit the delete permission to only some templates, independently from the edit permission.1 point
-
Regarding learning OOP, WillyC actually makes a good point there about something that is kind of helpful in learning it. Thinking about interfaces in code the way you do interfaces with the objects you interact with in real life. Objects are meant to be self contained things that have defined inputs and outputs, hiding the [potentially complex] details of how it happens and just giving you predictable inputs and outputs. If you start relating objects in real life to their equivalent in code, things start to come together a little easier and it gets your mind in the right place. Stepping back from his toilet example and use something like a faucet instead. The inputs are knobs that set the temperature and strength of flow. And the output is water at the temp and flow you set. $faucet = new Faucet(); $faucet->setTemp(97); $faucet->setFlow(10); echo $faucet->render(); (or something like that)1 point
-
oop easier than no.oop. how abowt real objet likes coffey maker. $m=new coffeymaker(): $m->fillcoffey('frenchyroast'); $m->fillwater('750ml'); $coffey=$m->brew(); $me=new WillyC(); $me->drink($coffey); $t=new toilet(); $me->pee($t); and that.all there,^b^b^b oops $t->flush(); and thatall there is now.youknow oop(ee)1 point
-
No need to really learn OOP to make PW modules. What knowledge do you think you lack? As with everything, start simple learn from the big ones. Look at how modules in core or third party are done, look at HelloWorld.module. Basic modules mostly only require 1 file and it's more about what type it should be and how it's done in PW. Learning OOP will help you only understanding the backgrounds. Not saying it's not good, but maybe just start and see where you get stuck, then come here and ask. You might even figure it out on yourself, but count on the community to guide you. I mentioned I always have had problems understanding OOP and read about it for years (java, actionscript, js etc), I'm still bad in wrapping my mind around it and build something from scratch (even still now), but just starting to do something always helped me a lot. And not surprisingly PW lead me to understand even more as before while doing some fairly advanced modules I did not think was possible. The wonderful thing is learning PW will help you elsewhere too. The year using PW I learned more than the previous 5 years!1 point