Mike, if developers are happy with the direction or various tweaks are
made to achieve that, we'd hope it would go into 12.1 (that's what
we've punted on for the @since tags anyway).
On 20 December 2011 12:03, Jeremy Wilken <gnom...@gnomeontherun.com> wrote:
> Thanks Louis, it looks promising and after taking a look at the code it
> looks like I might have imagined an abstracted content model system might.
> There is a lot there as you say, but why not try to refactor one of the CMS
> extensions as an example?
Jeremy I actually tried to make a simple, ground-up component but we
have some more work to do on mapping to custom tables names. The
current API is hardcoded to use #__content which, of course, is
already taken in the CMS. And, as Louis mentioned, there are some
roadblocks in the platform MVC at the moment that we need to sort out
to take it to the next level (the tight coupling to the CMS is a
problem).
> Will there be a kind of content type manager, or will it be expected that
> only developers will hook into this as part of their extensions?
You can imagine UCM as the API or engine for how an extension
developer would build a CCK, where content type managers, field
manipulation and all that jazz is definitely application or extension
specific. So, just hypothetically, K2 and Zoo could switch to using
UCM to power their content, but could implement totally different
strategies in how the backend (or even frontend) user might interact
with it. And obviously there's the whole new world of how standalone
platform apps would interact with it.
> I also
> wonder if the concept of 'like/unlike' really belongs in there?
It makes sense in terms of the other social features we've already
implemented at work, but aren't ready for release in this cut.
Probably best to look at it as the first integrated social feature.
> I suspect it will take all of the next 6-7 months for Joomla 3.0 and
> Platform 12.2 or 12.3 to fully realize this, but look forward to hearing
> more and seeing it in action.
That's what we'd expect too if the consensus is this is a good way forward :)
Regards,
Andrew Eddie
http://learn.theartofjoomla.com - training videos for Joomla 1.7 developers
The idea is that you create temporary objects before you go in to an
edit screen to create the item. This solves the problem where you
might want to link to something you are creating on in an edit screen
however because it hasn't been saved yet it doesn't have an ID. By
giving it an ID before editing it you can then tie any of those things
to the temporary ID. Upon saving the item properly the item is not
marked as temporary any further. Upon cancelling the item is deleted
and you can code your content item to clean up any linked items. You
can also periodically scan for items that were being edited but
dropped their session to either provide some kind of recovery
functionality (perhaps you have autosave so the majority of the
content is still around) or automatically delete those items.
Sam Moffatt
http://pasamio.id.au
Hey
What is the current status of the UCM? Do we have implementation plan to integrate it to the CMS (for 3.0)?
Best Regards,
Ofer Cohen Joomlics Anonymous Group
IMHO, 3.0 should be include the UCM and multisite, cause it will make Joomla! more acceptable as enterprise product. Those 2 features are in the head of the ideas pool.
I've also hearing Rob's amazing lecture in NY and I was wonder how we didn't get the UCM till now (reminder: com_content was not changed since mambo's days).
Once the UCM would be in the platform we should call the
community to help us with the UCM implementation into the CMS.
Ofer Cohen Joomlics Anonymous Group
But ... I want to say personally just based on reading the code, hearing Rob's talk in New York and some playing : I hope this gets merged ASAP and that as soon as 2.5 GA is out that we pull the updated platform including it over to the CMS repo in a 3.0 branch.
Consider this. You have a content type fictitiously called ML. The
extended table would include language, ml_title and ml_body in the
most simple case. There could be "one" row in the master content
table for the content. However, with language in the extended data,
you can have many translations for the same content but still
maintaining the same content_id (translations are tightly coupled to
the content, which is not the case in the CMS at the moment). That's
a basic sketch - obviously there's a lot of devil in the detail but
that's the way I think I'd approach it.
Whatever the case, this topic is a whole sub-project on it's own and I
remember saying that we have the opportunity to start from scratch and
design ML from the ground up. I would start with trying to build on
top of UCM first and then see where bolstering of the base content
type and data is necessary. However that happens, we'll end up with
some sort of one (content_id) to many (translations) type of thing
which means, to me, a language field in the base content type is
redundant.
Regards,
Andrew Eddie
Sort of. There should be some foreign key constraints in there somewhere.
Just on the "rules" field, the UCM uses different names for the
actions compared to what the CMS uses. You'll notice there's a new
authorisation package in the UCM branch that deals with a slight
change in how that is handled. What I expect will happen is there
would be some sort of translation layer that could, on the fly,
convert "action" names from one system to another. This might sound
like overkill but if you also consider a custom platform app could be
getting default permissions from a LDAP server or similar, we'll
eventually need that facility anyway.
> P.S. What in the world are some of those fields about ...
Which fields?
Regards,
Andrew Eddie
I get this error:
Catchable fatal error: Argument 5 passed to JContent::__construct() must be an instance of JWeb, instance of JAdministrator given, called in /Applications/MAMP/htdocs/joomla-cms/libraries/joomla/content/factory.php on line 168 and defined in /Applications/MAMP/htdocs/joomla-cms/libraries/joomla/content/content.php on line 135
The issue appears to be that JContentFactory passes the JApplication object to the JContent constructor but it is type hinted for JWeb causing this error.
Appearently the JContent constructor is fetching the JApplication object from the factory again anyway so I suspect it shouldn't be passed to it in the first place, which means the issue is in JContentFactory.
Does JContentFactory even need to keep track of the app when we're using JApplication?
Rouven
> I think language is a thing we would expect to see in the core table and
> that it's at least as central as a media field. I don't know how you are
> thinking about it but to me that core table should have all of the basics
> that should be (or potentially be since you wouldn't force an application
> to be language aware) in every content type.
Translations do belong to a *separate* table, and definitely *not* to
the original record. Thus one can have several translations for the
*same* item, retaining the ID and any relation for that item without the
need to duplicate everything.
With UCM providing unique IDs through all kinds of content, only 1 extra
table for translations and 1 single join is needed to cover everything.
Regards,
Niels
--
| http://barcamp-wk.de · 1. Barcamp Westküste 2./3. März 2012 |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · e-Commerce · Joomla! Content Management |
------------------------------------------------------------------
Regards,
Andrew Eddie
http://learn.theartofjoomla.com - training videos for Joomla 1.7 developers
Am 22.01.2012 23:40, schrieb Andrew Eddie:
> That's my thinking too Niels.
>
> Regards,
> Andrew Eddie
> http://learn.theartofjoomla.com - training videos for Joomla 1.7 developers
>
>
>
> On 23 January 2012 14:36, Niels Braczek <nbra...@bsds.de> wrote:
>> Am 22.01.2012 11:04, schrieb Elin Waring:
>>
>>> I think language is a thing we would expect to see in the core table and
>>> that it's at least as central as a media field. I don't know how you are
>>> thinking about it but to me that core table should have all of the basics
>>> that should be (or potentially be since you wouldn't force an application
>>> to be language aware) in every content type.
>> Translations do belong to a *separate* table, and definitely *not* to
>> the original record. Thus one can have several translations for the
>> *same* item, retaining the ID and any relation for that item without the
>> need to duplicate everything.
>>
>> With UCM providing unique IDs through all kinds of content, only 1 extra
>> table for translations and 1 single join is needed to cover everything.
>>
>> Regards,
>> Niels
>>
>> --
>> | http://barcamp-wk.de � 1. Barcamp Westk�ste 2./3. M�rz 2012 |
1. I found at least two issues because JContent is apparently written with JWeb in mind. Do we even need to track the app when using JApplication? We could just use JFactory like we do everywhere else.
2. I'm really unsure how the split model/controller should look like now. JContent does so many of the things the model used to do I wonder if it make sense to add separate Models for those extensions that use JContent.
3. In general I found it quite easy to work with JContent. I got everything but saving in com_content set up in about 4 hours with no prior knowledge of the class. On the other hand it took me about 2 hours before that to set up the tables correctly - as Elin pointed out the demo SQL doesn't quite match the CMS. (and I suck at database stuff). Overall the documentation is really great - thanks for that!
4. What is the intended process to get that stuff into the platform? Do you want to get the MVC stuff in before/at the same time or can the UCM land earlier?
5. It would be nice to get the UCM branch updated, I'd like to send back fixes for a few issues I found.
I'll probably have more later but that's it for now.
Rouven
> I think that some how people have totally lost the thread raised by my
> original question which was not about translated content, multilingual
> sites or anything like that.
I assumed that, because the language field is used that way in 1.7.
> 1. It's baseline expected that the actual language of a page will be given
> in the header. [...]
> 2. If and when we have a search package in the platform, wouldn't we
> routinely want to incorporate information about the user's language and the
> content language in order to provide the most useful results at the top of
> the results list? [...]
Ok, I think, I got your point now.
In consequence, *every* table having textual content would need a
language field, which contains the code of the language the content
actually is *written* in (currently the language field is widely used to
declare the language the content is *targeting* at, i.e., for which
language it should be shown).
> Those are just two of the reasons why I think it would make sense to just
> add a column.
Seen from that perspective, it actually does make sense.
Language is a natural (and important) attribute of textual content that
usually can't be retrieved from the content itself, so it has to be
provided as a separate field.
> Thanks, and yes I know it is all because of the excitement of something
> potentially new and cool people are taking small, narrowly defined comments
> and running in all different interesting directions with them.
[OT] That's how the system is working. One leads to the other. That is
ok and intended; see Usenet culture. [/OT]
I totally agree with Elin regarding the 'language' *property* to be a
relevant property for a content item.
I'm just curious about the rational why it shoudn't be in "the core"? I
hope some of those "voting" against can provide reasonable answers to
back up their thinking.
As Elin already noted several times, having a language field/property
attached to content is *not* about *translations* or multilingual
content, gentlemen, which is why I think some are/were entirely missing
the point Elin tried to make.
It's about storing a perfectly legitimate and relevant *attribute* with
the original content data. A attribute that has an inherent meaning for
the majory of content humans create and deal with.
She presented some interesting use cases and I'm glad to see Niels got
the drift, once he pulled off his CMS hat :)
> Language is a natural (and important) attribute of textual content
> that usually can't be retrieved from the content itself, so it
> has to be provided as a separate field.
If you throw language in the mix *you can* go multilingual with about
anything, and *you can* do translations, but this are just two possible
applications of language.
I'd argue that language allows to attribute much more than just
"textual" content.
If you think of language, stop thinking "CMS" and stop thinking
"webpage". Language carries much more than some formal grammer or script
that's applied to its textual representation.
We all write and/or speak some sort of language, right?
We all name things using a language, don't we?
So for those with some lack of imagination, here are a couple of more
examples and why `language` is an important and inherent property of
_content_.
If all of your application's content is nothing but sourcecode
snippets, the `language` field could perfectly well feature the name of
the *programming language* a snippet is written in, i.e. PHP, Ruby,
Java, C++, you name it.
You might think a category could do it, and you're right. It could, but
why bother with that (business) data, if the `language` attribute
already delivers that information and perfectly attributes the code?
You release the app, people love it, but they want the code comments to
be available in various forms, even other (spoken) languages, or more
specific, with and without examples etc.
Your snippet-app's data model _could_ then split the sourcecode from
it's comments, and use the code language for the former and a human
language for the latter.
Comments can be in English, Spanish, Klingon.
And since the language issue is out of the way, comments can be derived
into simple API "content types", more elaborate "content types" or turn
into tutorial "content types" ...
Open for translators to kickit.
Even the code itself could be "translated" from one programming language
to another.
Although a `language` property often represents a human language, it's
also useful as a locale to apply (or preserve) proper data formatting.
Any piece of communication detail, part of a more complex content type
(let's call 'em "compound types"), may have the need to be formatted
based on it's language (locale) which might very well be different from
the language assigned to the compound content type.
A customer (human) contact presumably speaks a particular language no
matter where s/he lives, so it's nice for customer care to have that
information at hand to contact "the spanish guy living in India".
My communication details in an address book might contain 'en'
despite it's not my first language.
My home address might feature 'de' so the app knows how to properly
format the address and validate the phone number.
My lastname (if you want to be that granular) would feature 'fr' so a
TTS engine can pronounce it correctly...
Assigned to text the application or consumer of that text can choose
the approriate spell-checker.
Screen readers can switch the language dictionary.
Assigned to audio one can feed the stream to the appropriate
transcription tool that knows how to handle it (i.e. Adobe Premiere).
So whereever I look I can see a language attached to it :)
For those who (still) disagree, here are some questions:
Why can't you "see" it? ;)
What makes `language` a less important *property* of some arbitrary
basic type of content such as text, image, audio, or video, than let's
say, fields such as `created_by[_alias]`, `hits`, various meta
fields, or a bunch of dates?
What makes those fields so utterly superior over `language` that they're
"granted" their own field, which apparently makes them inherently
relevant to the record, and a "must have" for ALL types of content?
They're certainly *nice to have* from a pure *technical* perspective and
pretty *convenient*, too, but they have nothing to do with the *content*
itself nor are they even close to be even considered *a native property*
for the any sort of *content* humans create and consume.
They're at best considered *business data* and as such *exclusively*
related to some inner workings of some aribitrary application.
They're exchangeable meta-data an application can use to make smarter
decisions according to its "business" model.
It's been suggested to put `language` in a separate table.
Fine, but why should anybody else then bother with or have any general
need for such meta-data fields or a purely statistical information such
as `hits`?
Hit when, by what, or why?
Even the updated, checked-out or whatever'ed dates are only required for
specific application logic; they're not inherent attributes of content.
We just got used to these (kind of) fields.
They're a habit, maybe a good practice, but that's about it.
What if content isn't supposed to be edited or modified once it has been
created/added (think of static archives)? Why would such content have a
need for a modified or checked-out date hanging around?
Why are any such fields considered necessary and more relevant to be
applied to ALL content items by default, but the most obvious property
of almost any content created *by* humans *for* humans is not?
They can easily be replaced with completely different values and it
wouldn't make any real difference.
Change the "owner" or the modified date. No problem.
Try that with `language`...
CirTap
This is at least one production deployed situation where language
isn't a concern or even a part of what was offered. The UCM, as with
most systems, was designed with it's particular base requirements in
mind with a mind to making something generic available: so there isn't
a language field because it just wasn't required and wouldn't be
utilised.
So instead of long posts on the utility of such a field, let's instead
do as Louis' suggests: work out how it should be handled and what
would be required to make that happen instead.
Cheers,
Sam Moffatt
http://pasamio.id.au
For a starter: how 'bout adding a generic field to said generic solution
and name it 'language'?
Then people have a "first class citizien" in the content table and
something to handle.
There are many ways to skin a cat, but you need a cat first.
CirTap
> She presented some interesting use cases and I'm glad to see Niels got
> the drift, once he pulled off his CMS hat :)
;-)
>> Language is a natural (and important) attribute of textual content
>> that usually can't be retrieved from the content itself, so it
>> has to be provided as a separate field.
> I'd argue that language allows to attribute much more than just
> "textual" content.
Yes, you're right. "Textual" in this context should be replaced with
"containing text (written or spoken)".
> If all of your application's content is nothing but sourcecode
> snippets, the `language` field could perfectly well feature the name of
> the *programming language* a snippet is written in, i.e. PHP, Ruby,
> Java, C++, you name it.
Since programming languages usually need different renderers, they are
different content *types* (eg, as a subtype of "snippet"). Storing the
*type* information in a language property seems not to be the right
approach to me.
Nevertheless, I agree with the other points you raise.
> This is at least one production deployed situation where language
> isn't a concern or even a part of what was offered. The UCM, as with
> most systems, was designed with it's particular base requirements in
> mind with a mind to making something generic available: so there isn't
> a language field because it just wasn't required and wouldn't be
> utilised.
Well, what we've seen in this discussion is that the language field *is*
needed. How it is handled, depends on the application. CMS will use it
to set the appropriate headers and meta tags. Other applications will
maybe do other things with it. That is not the platform's concern.
> So instead of long posts on the utility of such a field,
That long post might have made the need of the field obvious to many
peaople. So it were far from being superfluous.
> let's instead
> do as Louis' suggests: work out how it should be handled and what
> would be required to make that happen instead.
To start with: Just add that field. Document it as containing the
language the content is written (or spoken) in, and thus restricted to
ISO compliant codes (wiki, column comment). The further handling of that
field is delegated to the application.
Also ... and I know I need to build instead of code browse and maybe this is just totally obvious but I just want to ask so I know how to build a simple example.If I did this in a hypothetical web application X, the rules are stored right there in the content item so we wouldn't need anything like the assets table that .. some other applications built on older versions of the platform, let's call that application Y, have to hold the rules (setting aside inheritance/nesting for the moment). And presumably also if application X had the capacity to add ... things... that were built to extend it, the rules for those things could be stored right in the #__things table.And if Application Y wanted to move to this, in terms of content, it would really just have to go get the rules from the assets tables and add them to a new column in the content table. And in terms of things move the rules to the things table.Is that about right?Elin
1) Yes, this is a known issue. The main problem is that the three existing applications (JApplication, JWeb, and JCli) do not share a common interface. This is the main reason that I've been pushing JApplicationInterface. I'm going to try to get that all squared away this week and submit a pull request so we can deal with all the applications in a similar way. Not having that, we decided to just use JWeb as the base point because that would be the most adaptable from the platform perspective.2) In our implementation, we usually let the controller interact directly with content objects for CRUD operations and left the model to fetching data for views. In a revamped MVC paradigm, this would probably change but that separation worked pretty well given the state of things.3) I assume the biggest issue was the foreign keys to jos_users? Sorry about that, it is something we meant to note somewhere but forgot.4) I think the content stuff as is (aside from needing to be updated) can go in independently of any MVC work. That's why we decided to release this chunk of code the way it is instead of tying it to any MVC work that we've done independently or that is going on in the larger community.5) We were going to try to do that last week but just got distracted. I'd be happy to review any fixes you might have.Cheers,
Rob
Could one of you explain a little more about the $temporary property? Is the basic idea that there is a quick temporary save on create which lets us do things but then the flag is removed on the real/permanent save?Elin
Well, I think it just raises the point that language is thought of in
many different ways.
>
> Here are just a couple of reasons why it would make sense.
>
> 1. It's baseline expected that the actual language of a page will be given
> in the header. Do we really need to build a whole separate table just to do
> this for a web application running sites that might just have a few pieces
> of content are in a language that is not the default language for the
> instance of the application?
There is nothing stopping an application from adding the field to the
base table. JDatabaseObject will work it out.
> Do we even assume that all platform web
> applications have a default language?
I would expect that if you need a default language you would include it.
> None of the example applications so
> far have that, even the ones that have configurations.
I'm sure one could be provided, just needs someone to write it.
> 2. If and when we have a search package in the platform, wouldn't we
> routinely want to incorporate information about the user's language and the
> content language in order to provide the most useful results at the top of
> the results list? Not to mention won't we need to know if we need to deal
> with not having spaces between words or double byte spaces? Aren't we likely
> to just end up having to add language as a field later if we add search? And
> isn't search basically the way people interact with the web?
Well, we've already established that language can be considered in
several forms, so I think the role for treating those forms rests with
the search "plugin".
> Those are just two of the reasons why I think it would make sense to just
> add a column.
You can add the column for your application. However, I would leave
handling for that column in a derived class, not JContent.
> Here are two use cases where a site could have multiple languages but is not
> having translated content.
>
> 1. I run the language department in a school. We teach English, Mandarin,
> German, and Latin. I write a simple web application to allow my students to
> post essays they have written in the languages they are learning. Should I
> really need to create a whole new extras table just to get that one column?
Well, it would be a reasonable assumption that you are probably going
to have other custom fields, so the join table will exist anyway, but
yes, I'd add the column in the extended data for this case (note: you
don't need one table for language, and then another table for custom
fields - the language column would be a "custom field" among zero to
many more).
> 2. I run an international NGO that helps victims of natural disasters find
> lost relatives. I never know from one day to the next if i will be dealing
> with an earthquake in Armenia or a tsunami in Sri Lanka. I want the people
> who I am serving to be able to write in their own languages and I want
> search engines to index my site effectively so that people searching for
> people impacted by a specific disaster are served as efficiently as possible
> which means sending out the correct information on the language of the
> content items.
Again, you are likely to have a great deal of extended data so there
is no additional overhead in having the language field in the join
table.
>
> I'm not saying it shouldn't be a discussion (just like the need for 4 dates
> or a media field or revisions or featured can be--and I'm in favor of all
> of them) but I'd appreciate it if this discussion could be about the
> question I actually raised and that what I have raised not be misrepresented
> (and I'm certain that was unintentional).
The solution I gave to you covers a one-to-one or a one-to-many (aka
ML) situation. To be perfectly clear on the answer to your question:
I'd use a custom language field (it just happens to also cover ML as
well) *but* a custom application can still do whatever it likes to the
base jos_content table and then define it's own handling in a custom
class (there is a lot of scope to override with custom classes, see
JContentFactory).
Regards,
Andrew Eddie
Specifying the language of content is useful for a wide number of applications, from linguistically-sensitive searching to applying language-specific display properties. In some cases the potential applications for language information are still waiting for implementations to catch up, whereas in others, such as detection of language by voice browsers, it is a necessity today. On the other hand, adding markup for language information to content is something that can and should be done today. Without it, it will not be possible to take advantage of any future developments.
Regards,
Andrew Eddie
If I have a type that uses a second table to store extended fields it doesn't get deleted when I call JConent::delete(). I suspect this is a bug.
I also got a more general question - how do I get the id of a type?
Intuitively I'd have said JContentFactory::getType() with the type name as an argument would get me an object from which I could read the id. However this just loads the class (if not a special one is created just JContent) with no data populated.
My next guess was to try JFactoryHelper::getTypes() which returns an array of all type objects (this time populated) but the id is hidden away in a protected property.
Best regards
Rouven
You need to have an FK restraint on the content_id and have it
cascade. That way the database does all the cleanup and you don't
need to code it explicitly.
> I also got a more general question - how do I get the id of a type?
> Intuitively I'd have said JContentFactory::getType() with the type name as an argument would get me an object from which I could read the id. However this just loads the class (if not a special one is created just JContent) with no data populated.
>
> My next guess was to try JFactoryHelper::getTypes() which returns an array of all type objects (this time populated) but the id is hidden away in a protected property.
We generally only have to work with the alias of the type. What are
you trying to do?
Regards,
Andrew Eddie
> On 25 January 2012 13:08, Rouven Weßling <m...@rouvenwessling.de> wrote:
>> I know we're still talking about the architecture but I think I may have found a bug but I'm not entirely sure.
>>
>> If I have a type that uses a second table to store extended fields it doesn't get deleted when I call JConent::delete(). I suspect this is a bug.
>
> You need to have an FK restraint on the content_id and have it
> cascade. That way the database does all the cleanup and you don't
> need to code it explicitly.
That's where I'm being punished for knowing next to nil about SQL. Will try it out.
>> I also got a more general question - how do I get the id of a type?
>> Intuitively I'd have said JContentFactory::getType() with the type name as an argument would get me an object from which I could read the id. However this just loads the class (if not a special one is created just JContent) with no data populated.
>>
>> My next guess was to try JFactoryHelper::getTypes() which returns an array of all type objects (this time populated) but the id is hidden away in a protected property.
>
> We generally only have to work with the alias of the type. What are
> you trying to do?
As a test bed I'm trying to change com_content to use JContent. I'm using a direct access to the database to fetch the data for the list view. Now if I add another content type they would all be listed (set aside that the innerjoin wouldn't work, let's assume to content types that only use the content table) but I only want those of one content type.
Thanks for your help
Rouven
Regards,
Andrew Eddie
Hey Rob,
Is there any documents in the wiki about all of those content & UCM definitions?
When can we see the last improvements of the UCM?
Thanks
Ofer Cohen
We are very pleased to present our first draft of what we, at eBay, have coined the Unified Content Model, or UCM for short. UCM is the basis for an intranet product at eBay that we call the DataHub which is currently modeled on Joomla 1.5. It's a social analytics site that allows business, financial and data analysts a way to collaborate on our data and analytics assets. You can sort of think of it as a GitHub for data/analytics. The repository (https://github.com/eBaySF/joomla-platform) holds a fork of the Joomla Platform with the first step in making parts of the DataHub available to both the Joomla and wider Open Source communities. There are many parts to what we have built which are in varying degrees of readiness to share, but we wanted to get the ball rolling with the foundational stuff with an eye to sharing all the other bits as soon as is feasible. We'd love to know what you think and if there is interest in adding it to the core platform distribution. With that here is a quick overview of what you will find in the content branch of our fork.
New Content Package
Under /libraries/joomla you'll find a new content package. This package includes some new classes: JContent, JContentType, JContentHelper and JContentFactory. JContent supports a base content object that automatically handles typical "content" data that will be familiar to Joomla and CMS users alike - things like a title, body, checkin and checkout, and so forth. JContent is designed to be extended both in terms of API and in terms of database schema. The base object already does this by providing related tables to capture hits and whether users "like" the content. Any number of content "types" can be supported which use the base schema and API, or can be extended from JContent to add more API, and can be linked to one or more additional tables to provide additional "fields" for the content.
JDatabaseObject
There are a number of additions to support the content package and one of these is a new class called JDatabaseObject. JDatabaseObject can be thought of as a re-imagined JTable class, and allows for content to be stored across multiple tables. It's strength is that it is aware of the schema of declared tables so while you can bind as much data to the objects as you want, only the data in the underlying tables is stored (compare this to JTable where you can get into trouble if you add properties that aren't in the database table).
JCacheObject
Underpinning JDatabaseObject is JCacheObject and this provides as simple way for objects to cache instances of themselves either in memory or to a persistent store.
New Authorisation Package
The authorisation package is a reworking of Joomla's access package but done to decouple it from the CMS-ism's of that package. This new package adds a number of interfaces to allow for better design practice. Among these are a new concept called "authorisers" and you'll find two authorisers in the package: "default" and "root". Currently the Joomla CMS hard codes the checks for what it calls a "root" or "super" user. Separating the logic out into authorisation strategies allows for such checks to be done at a more abstract level, even allowing for an application to create new strategies.
Documentation
The API includes full documentation blocks and also a developers reference in docbook format for all the new code mentioned above.
Feedback
Hopefully the code will speak for itself, but there is certainly a lot to take in. We'd appreciate feedback on the API and how we've handled various aspects of the UCM. Following that feedback, we would like to offer this to the Joomla Platform if it's something that others will find useful.
Future Steps
Showing off code is great, but showing off how it works is even better. We are developing a simple platform application to show off the main capabilities of the UCM architecture and that should be available in Q1 next year. There are some coupling problems with the current platform MVC implementation which made it hard to put together a dead simple example application. Since reworking that part of the platform is on the 12.1 roadmap we decided to put off the example application until then. Those of you who are already building platform applications will be able to play with the UCM, and we certainly look forward to your thoughts.Obviously we could not include everything that we've built in the DataHub all at once, but to list a few of the things we've already built on top of the UCM that we'd like to share in the near future include integrated tagging support, social groups, member profiles, activities (think activity stream), and much more.Cheers,Louis
Ofer Cohen