Snap! Websites
An Open Source CMS System in C++
Some pages in the book are details about a feature or combination of features. This special status is used for those pages since they are not expected to have a status per se.
See a complete list of features sorted by Snap! Websites Development Status (note that not applicable pages are not shown in that list.)
IMPORTANT NOTE
This feature was not implemented. We instead went with the fully dynamic signals using boost::signals2 which allows you to grow plugins without having to recompile everything (and thus offer users a way to install additional plugins by simply installing a package on your Linux system.)
As I have been researching for the fastest signal system, I came up with what follows.
There is one draw back: all the modules must all be statically compiled (i.e. no independent "plug-in" type of functionality. Under Linux, that means no .so and under Windows no .dll)
The C++ ...
For some rather non-obvious reason, spam bots are having fun posting totally random, most usually non readable messages (gibberish as in random letters and numbers) to public forms they find on the Internet.
Even for themselves, it seems to me that it would be a lot more effective to post useful messages and not blow away their chance from the start.
Yet, many of these bots are quite retarded and can be prevented to post uselessly using a few tricks as follow:
See also: Anti-Spam feature
You can include a form identifier in all your public forms. This may not sound like ...
I moved this feature under the Editor entry because what I talk about here are the widgets of the inline editor offered as the editor plugin. For this reason I marked this page as Details only.
Some of the content of this page needs to be duplicated somewhere else and then this page removed. There are many important points such as the security entry at the bottom.
We want a way to make it really easy to create the HTML output.
At first I was thinking about forms, however, to make it really easy for the entire output we want to support widgets. ...
More about groups, actions, and permissions is defined here: Content Object in Cassandra (Content Tree)
When viewing permissions as sets, the decision on whether a user has permission to do something is easily taken: the set of permissions intersected by the set of groups the user is part of must not be empty.
However, there are cases when a certain action may require multiple authorizations and if all those authorizations are not satisfied, then the user cannot take that action. This is represented by multiple sets of permissions (realms or categories of permissions.)
A good example ...
At this time we're testing Cassandra to properly understand how it works and make sure we can use it the way we're thinking we want to use it. This works. See libQtCassandra
Next we want to implement a simple test to check cTemplate and see that we can (1) create a simple layout with variables and fill in the fields; (2) extract the fields to generate the dependencies. We changed our plans on this one we'll be using XML and XSLT to transform the XML to whatever output the user is interested in (HTML, PDF, Text, RDF, etc.)
As we're working with Cassandra, make sure we can get ...
Each block of data that we manage in Cassandra is 100% an equivalent to an SQL table.
For example, we could create a simple table to manage pages as this one:
page_identifier title body
This table includes a page_identifier that gives you a way to reference this table from another table. Now I write another module that extends a page and gives it a teaser capability. What directly comes to mind (at least to me) is adding the teaser field to the table:
page_identifier title body teaser
This is very good since that way we do not increase the search time ...
(Note: I put some references at the bottom--links to other pages that are related to this.)
At this point, we have made progress in the conceptual (At least) implementation. Note that the libQtCassandra already works and the support of the tables as described below is possible and has already been used in a few places.
The thinking, however, somewhat changed. We want to implement the tables in a way that is very agnostic to the plugins in order to make sure that we can always change the backend if need be (one day we may want to offer support of other databases, even ...
The one main reason for Cassandra is speed. However, Cassandra lacks the usual SQL connectivity capabilities (i.e. why we call SQL databases relational.) In other words, an SQL statement can be used to connect many tables together without the need for said data to be otherwise connected is powerful but not available in Cassandra.
In an SQL database, it is customary to extend a table by creating a new table and having a one to one connection. For example, a User table is likely to offer a user identifier (user_id) column. You can now create an ...
Note: the feature is defined here: List feature [core]
See also the C-like Expressions.
Many of the entries in a website are lists:
The number of lists is pretty much infinite and is really only limited by the data available on your website and your ...
Whenever you create a page you generate dependencies.
For example, a page may include its own content, the list of the last 3 pages created on your website, the list of the last 5 news feed titles, and the teaser of another page in a box.
These are all called dependencies.
When you change a page's own content, that page is marked as changed and in general we're done.
However, in cases where a page A is referenced in a page B, we need to refresh page B with the new content in page A.
For example, in our prevent example we mentioned the idea of showing a ...
Snap! Websites
An Open Source CMS System in C++