Wedge
Public area => Development blog => Topic started by: Arantor on September 13th, 2011, 03:31 PM
-
It's been a while since we've posted anything on the blog, so I figured I'd do just that, heh.
Of recent times I've been playing with the replacement for the package manager, which while still rather incomplete, is taking form in the code - it even enables and disables simple add-ons right now (meaning that simple add-ons can actually be used in the spirit in which they are intended)
For those who haven't seen the pictures already posted on the subject, I present a screenshot that I took at the weekend.
It's close enough to how things are currently, with the difference that it actually works for both enabling and disabling simple add-ons (ones that don't create or modify the existing DB tables, that is)
I know it was left very much at a disjoint at the end of the last time I wrote about the replacement for the package manager, so I just want to cover off everything that's happened, because there's an awful lot of it, and it's why there haven't been any commits from me lately despite there being a lot of coding going on.
A lot of the stuff I talked about before as being almost whimsically answered is now pretty much finalised, so without further ado... I should point out that there were a surprising number of "Oh, that hadn't occurred to me" moments in the design, but I'm pleased to say that I think they've all been ironed out now.
If you're not interested in technobabble, here's the point where you probably want to stop, with the understanding that it's being designed in a way that promotes add-ons that don't need file edits and should thus survive updates and so on a bit better.
There's an Addons/ folder, right up there next to Packages/, and each add-on gets its own folder in there. Doesn't matter how big or small it is, that's what happens. Everything that happens, happens in that folder. Sources, templates, language files, CSS, JS, images, etc. It's all in there.
I will write a proper tutorial on this sometime but here's the rundown of what the system does.
Here's where it gets really funky. You know as well as I do that users are unpredictable, and often prone to doing odd things, so I took care of that. It doesn't matter what folder an add-on is created with, it could be myaddon/ or my_addon_1.1/, it doesn't actually matter, because you never directly refer to it.
When you create the add-on, you give it an ID, that has the author and add-on name, e.g. Arantor:WedgeDesk, and it's *this* that's used. Everything that you do with an add-on will make use of this ID.
Let's say you have a big add-on that has multiple source files and multiple template files, arranged in src/ and tpl/ respectively, and just live in your add-on's folder. I'll use WedgeDesk as an example.
I want to load the main source: (The .php is added automatically.)
loadAddonSource('Arantor:WedgeDesk', 'src/WedgeDesk');
It doesn't matter what folder it's in, you never have to worry about it. Similar deal with loading templates and language files:
loadAddonTemplate('Arantor:WedgeDesk', 'tpl/WedgeDesk'); // loads tpl/WedgeDesk.template.php
loadAddonLanguage('Arantor:WedgeDesk', 'lang/WedgeDesk'); // loads the right file from lang/WedgeDesk.*.php
No more dumping files throughout the different folders - everything's in one place.
There is a caveat at this point: it does mean that an add-on can't magically have different templates for different themes and just drop them into the relevant folders. That's not to say that it can't be done, it just means having the multiple templates stored inside the add-on and making sure that the theme is checked before calling loadAddonTemplate.
There is more, since there's functions for loading CSS files from your add-on, plus JavaScript files, and in both cases they must be called so that the proper caching and substitution comes in.
Lastly, you may be wondering how you insert images, if you're not using $settings['images_url'] or $settings['default_images_url'], well, there's a method for that too.
Specifically, if you ever need to refer to an add-on by URL, the base URL (i.e. www.example.com/Addons/youraddon(http://www.example.com/Addons/youraddon)) is available in $context['addons_url']['addonid'], so I can always call WedgeDesk images through $context['addons_url']['Arantor:WedgeDesk'].
There's more, too. If an add-on uses only hooked files (the recommended method), when an error occurs, it's possible to attribute that error to that add-on in the error log, so you'll know if an add-on is acting up.
There's plenty more to do, of course, like provide facilities in the language editor for editing the language files in add-ons, but for now at least, there's an awful lot of work done to facilitate strong add-on support. There's also file editing to provide, plus quite a bit of the DB support, but it is coming along nicely now.
(Oh, and one last thing. If you rename an add-on's folder to something different, or just delete it, it should automatically disable. If it uses file edits, all bets are off, of course, but that's discouraged anyway.)
-
converting SimpleDesk to run on WedgeDesk
:lol:
-
Freudian slip :P But if that's the only critique, I did really well :D
-
Though it's not on SVN yet, might get more critique then... :whistle:
Depends on if I actually try it out, which I probably will, if only to see what happens when I try to port my mods and break Wedge. ;) I have a feeling that your next commit'll introduce some new hooks to play around with :D
-
Yes, it does add a few new hooks, but the fact that a hook can actually load a file automagically will help.
But I'll be interested to know also what hooks will be desirable to add as well.
-
I know WedgeDesk covers most of them (I think).
-
Yeah, it does make thorough use of them...
-
OK, as a heads-up in case you didn't see it in the revision log: the first version of this has been committed. It's capable of enabling any add-on in the addons folder, provided that it only does simple DB changes (new tables of its own, updating those tables only, and not adding columns/indexes to tables that aren't its own), hooks, scheduled tasks and settings.
As of right now I'm about to test enable/disable scripts (much like SMF's code and database blocks in the package-info.xml file, with the difference that they should only be for very specialised jobs, like inserting rows into tables, or doing complex install-time logic)
After that, I'm going to work on the ability to add arbitrary columns and rows to existing tables (like a new column in the members table, for example)
I am, I have to say, quite proud of the updating code here; when you call create_table for a table that isn't one of Wedge's own (i.e. from an add-on) and the table already exists, it tries to manipulate the table to add new columns and indexes so that the table is updated. The cool part is that it does it all in a single statement per table.
While that might not seem important, it can be if there's multiple columns to add: the way MySQL handles an ALTER TABLE to add columns is that it will perform a temporary table creation, with the new schema, and copy the existing data into it as it goes - then switch the tables around after it's done.
On top of that, consider also that the setup may not only require 2x the space (for the old and new tables) but potentially a third copy, and while it's doing all that file I/O, it is hampering the possibly DB queries it could be serving instead, so doing it once if possible is much more efficient in the long run.
Anyway, that's where I'm up to with it so far, and I'm planning on building a few very simple demo plugins, not so much for download and distribution (after all, they won't be any use to you without Wedge!) but for those with access to the source to see how they work and all the stuff that goes on, because there is a lot of it behind the scenes.
-
So, a progress report.
Enable/disable-time scripts now work, meaning that it's possible to install big and scary add-ons, and even work-around (badly) certain limitations in the add-on manager that will be phased out in due course.
So, I already shared these behind closed doors, but I think I should share them here too.
Read the descriptions, there's more discussion there on the meat of the images.
Right now, there are three add-ons that I'm aware of for Wedge, one is a simple demo that proves what it does, one is WedgeDesk and there's a third, that was posted today as a WIP. I'm excited because it shows the potential of the system very neatly, but also because it's the first add-on that wasn't written by me.
It makes me feel warm inside because it's proof in some way that I'm not just living in a fantasy land of how wonderful writing Wedge add-ons will be, and I have made some UI changes based on things that came out of that add-on, namely reminding me that certain things weren't present and making it easier for authors to provide contact details for their add-ons.
(Even though I have a certain amount of reputation for being an immovable force when it comes to what I think is best, I'm really not. Just have to give me a good enough reason for implementing something.)
-
Dont worry Pete. Your system is perfection and worth the commitment. Well, it would be if it were called a plugin system :lol: just kidding.
-
It's not perfection - but it is getting there :P
And seriously, when it's done, if you want to go and rename it, I won't mind. Much. :P
I have to admit, I'm quite pleased with the feel of the remove page, even if it's a bit bald, but to be honest, if it were any prettier, it would neutralise some of the gravity of the page.
-
I wouldn't remind it. The name was popular amongst English speakers. Meaning it should be used in the English version. I use extension in French and that's nice enough. Other languages might use plugin...
-
So I had a silly little idea come to mind about the name of Add-On in Wedge. The idea was that there could be some pun on the name Wedge that can be turned into a form of Widget. Like Wedget or Wedgit (as a pun on Wedge-it).
Sure, you get the problem of having to have people figure out what a Wedget represents as opposed to the more universal title of Add-On, but I thought that it was rather amusing.
-
I already suggested wedget as a joke some time ago. Someone was enthusiastic about it -- but I wasn't ;)
My main issue with add-on is that one is supposed to use the hyphen but in theory it's not always used.
-
Wedgon?
-
Reminds me of energon from Transformers.
-
OK, so after this morning's hacking away at it, it should now be able to handle the case where it can actually remove add-ons, but only if it can grab permission to do so.
I haven't yet given it the ability to ask for FTP details in order to be able to make things writable. Though, if it can actually use chmod on it, it will do so (and do so correctly for folders vs files, it won't make everything 777, only files 666 and folders 777, as it should because it's well behaved - assuming has the power of chmod, of course...)
File permissions are a big pain in the arse, and one reason why I'm so keen to avoid having to do file edits generally...
-
I love the plain, straight talking instructions - "Press this button and this happens"
-
That's the beauty of it, because more and more add-ons don't do file edits, add-ons just need to be enabled rather than complex chains of scary looking instructions...
-
That's the beauty of it, because more and more add-ons don't do file edits, add-ons just need to be enabled rather than complex chains of scary looking instructions...
+1 :cool:
-
So we might as well make files NON-editable... :niark:
-
Don't tempt me, after all the valid debate Unknown gave on it...
-
He's no longer here. French proverb. Those missing are always wrong :P
-
Heh, that said, he did make a valid point about it...
-
He left? I can see that he's not active for over 2 months...
-
I don't know if he left or is simply busy, but whatever, he made a valid argument that I saw the wisdom of, and wanted to account for. I still think the majority of the time, it's not going to be a problem because I think the warning I have yet to place on it will put people off using it :niark:
Dragooon's been looking over how to make queries extensible (which I'm loving, by the way) and my next task is how to make permissions work so that you can handle files and delete them without the usual faff associated with it.
I am hoping, though not sure I'll be able to pull it off yet, that you'll be able to use not only FTP but also SSH to log in and perform changes (that you just give it your details and it'll do the rest, and reinstate the original permissions so that you don't get left open accidentally, even with just uploading add-ons)
Honestly, though, the whole mentality behind what I'm pushing here is keeping it straightforward enough to be usable and that users can feel comfortable about doing it - most users will not care what files are being edited unless they have to do it themselves.
-
please help me, I want to publish a question for the admin, but I have trouble finding a place to publish.
thanks
-
What question are you trying to ask? Ask it here, then I'll break this into a new thread for you (as here is almost certainly not the right place!)
-
I think it's spam :)
-
Maybe. Maybe not. There's no signature, there's an avatar and some other things - these are not things usually added by a would-be spammer.
-
Spam. Pretty sure about it... old topic + unrelated post + generic content + commercial website link but no forum in it...