@sbj it's still relevant. The only thing, IMO, that needs to be included are data writers and prepared statements. In this late stage of XF 1.x series I doubt that this tutorial will be updated. As for XF 2.x, I would like to write a new tutorial, but I doubt it will be official as I am no longer part of staff here, but you never know, this kind of straight forward tutorial is needed.
what else do we need to comprehend before we can create our own add-ons
Three things off the top of my head. I think if I had to pick the most important one to focus on, it would be responses. You can dump a response out, and sometimes it would appear to be nothing there, when actually there is, you just need to know what to look for and that information is provided to you in the relevant controller. You need to be aware of when your code should be executed, ie: view, and $response has that information.
The second thing would be data writers. You can do a lot with them, from manipulating the data in the pre-save, to executing your code after the post-save. You don't need a data writer for everything. A simple update for a member, for example, can be handled by a model.
The third thing would be where your add-on should tap in to XF to be executed. The guaranteed place is the front controller pre-view. You can accomplish most everything there and it (may) contain a wealth of data from the type of view, to breadcrumbs and everything in between, but is it practical? It just depends on where your data is going to be used. If on almost every page, then yes, if only on a member's profile, then no.
One more little thing that I am always aware of, calling phrases:
If you call an uncached phrase in your code it is going to cause a query. No big deal, unless you need a few of them loaded, each may cause a separate query, so make sure all phrase objects that you need are grouped together. For example:
$myNeededPhrase1 = new XenForo_Phrase('myphrase_hello_world');
$myNeededPhrase2 = new XenForo_Phrase('myphrase_hello_universe');
The above takes one query to retrieve both objects, and yet:
$myNeededPhrase1 = new XenForo_Phrase('myphrase_hello_world');
some code here to do something nifty, and then...
$myNeededPhrase2 = new XenForo_Phrase('myphrase_hello_universe');
will take two queries. When it comes to unnecessary queries, I'm a little anal on that and so always watchful,
