cutelyst  4.5.1
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
Cutelyst::CuteleeView Class Referencefinal

A view that renders templates using Cutelee engine. More...

#include <Cutelyst/Plugins/View/Cutelee/cuteleeview.h>

Inheritance diagram for Cutelyst::CuteleeView:

Signals

void changed ()
 

Public Member Functions

 CuteleeView (QObject *parent=nullptr, const QString &name=QString())
 
void addTranslationCatalog (const QString &path, const QString &catalog)
 
void addTranslationCatalogs (const QMultiHash< QString, QString > &catalogs)
 
void addTranslator (const QLocale &locale, QTranslator *translator)
 
void addTranslator (const QString &locale, QTranslator *translator)
 
Cutelee::Engine * engine () const
 
QStringList includePaths () const
 
bool isCaching () const
 
QVector< QLocaleloadTranslationsFromDir (const QString &filename, const QString &directory, const QString &prefix=QStringLiteral("."), const QString &suffix=QStringLiteral(".qm"))
 
void preloadTemplates ()
 
QByteArray render (Context *c) const override final
 
void setCache (bool enable)
 
void setIncludePaths (const QStringList &paths)
 
void setTemplateExtension (const QString &extension)
 
void setWrapper (const QString &name)
 
QString templateExtension () const
 
QString wrapper () const
 
- Public Member Functions inherited from Cutelyst::View
 View (QObject *parent, const QString &name)
 
virtual ~View () override=default
 
Modifiers modifiers () const override
 
void setMinimalSizeToDeflate (qint32 minSize=-1)
 
- Public Member Functions inherited from Cutelyst::Component
 Component (QObject *parent=nullptr)
 
virtual ~Component () override
 
bool execute (Context *c)
 
virtual bool init (Application *application, const QVariantHash &args)
 
QString name () const noexcept
 
QString reverse () const noexcept
 
void setName (const QString &name)
 
void setReverse (const QString &reverse)
 
- Public Member Functions inherited from QObject
 QObject (QObject *parent)
 
QBindable< QStringbindableObjectName ()
 
bool blockSignals (bool block)
 
const QObjectListchildren () const const
 
QMetaObject::Connection connect (const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type) const const
 
void deleteLater ()
 
void destroyed (QObject *obj)
 
bool disconnect (const char *signal, const QObject *receiver, const char *method) const const
 
bool disconnect (const QObject *receiver, const char *method) const const
 
void dumpObjectInfo () const const
 
void dumpObjectTree () const const
 
QList< QByteArraydynamicPropertyNames () const const
 
virtual bool event (QEvent *e)
 
virtual bool eventFilter (QObject *watched, QEvent *event)
 
findChild (const QString &name, Qt::FindChildOptions options) const const
 
QList< T > findChildren (const QRegularExpression &re, Qt::FindChildOptions options) const const
 
QList< T > findChildren (const QString &name, Qt::FindChildOptions options) const const
 
QList< T > findChildren (Qt::FindChildOptions options) const const
 
bool inherits (const char *className) const const
 
void installEventFilter (QObject *filterObj)
 
bool isQuickItemType () const const
 
bool isWidgetType () const const
 
bool isWindowType () const const
 
void killTimer (int id)
 
virtual const QMetaObjectmetaObject () const const
 
void moveToThread (QThread *targetThread)
 
QString objectName () const const
 
void objectNameChanged (const QString &objectName)
 
QObjectparent () const const
 
QVariant property (const char *name) const const
 
 Q_CLASSINFO (Name, Value)
 
 Q_EMIT Q_EMIT
 
 Q_ENUM (...)
 
 Q_ENUM_NS (...)
 
 Q_ENUMS (...)
 
 Q_FLAG (...)
 
 Q_FLAG_NS (...)
 
 Q_FLAGS (...)
 
 Q_GADGET Q_GADGET
 
 Q_GADGET_EXPORT (EXPORT_MACRO)
 
 Q_INTERFACES (...)
 
 Q_INVOKABLE Q_INVOKABLE
 
 Q_MOC_INCLUDE Q_MOC_INCLUDE
 
 Q_NAMESPACE Q_NAMESPACE
 
 Q_NAMESPACE_EXPORT (EXPORT_MACRO)
 
 Q_OBJECT Q_OBJECT
 
 Q_PROPERTY (...)
 
 Q_REVISION Q_REVISION
 
 Q_SET_OBJECT_NAME (Object)
 
 Q_SIGNAL Q_SIGNAL
 
 Q_SIGNALS Q_SIGNALS
 
 Q_SLOT Q_SLOT
 
 Q_SLOTS Q_SLOTS
 
qobject_cast (const QObject *object)
 
qobject_cast (QObject *object)
 
 QT_NO_NARROWING_CONVERSIONS_IN_CONNECT QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
 
void removeEventFilter (QObject *obj)
 
void setObjectName (const QString &name)
 
void setObjectName (QAnyStringView name)
 
void setParent (QObject *parent)
 
bool setProperty (const char *name, const QVariant &value)
 
bool setProperty (const char *name, QVariant &&value)
 
bool signalsBlocked () const const
 
int startTimer (int interval, Qt::TimerType timerType)
 
int startTimer (std::chrono::milliseconds interval, Qt::TimerType timerType)
 
QThreadthread () const const
 

Properties

bool cache
 
QStringList includePaths
 
QString templateExtension
 
QString wrapper
 
- Properties inherited from QObject
 objectName
 

Additional Inherited Members

- Public Types inherited from Cutelyst::Component
enum  Modifier {
  None , OnlyExecute , BeforeExecute , AroundExecute ,
  AfterExecute
}
 
- Static Public Member Functions inherited from QObject
QMetaObject::Connection connect (const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
 
QMetaObject::Connection connect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type)
 
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type)
 
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type)
 
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, Functor functor)
 
bool disconnect (const QMetaObject::Connection &connection)
 
bool disconnect (const QObject *sender, const char *signal, const QObject *receiver, const char *method)
 
bool disconnect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)
 
bool disconnect (const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
 
QString tr (const char *sourceText, const char *disambiguation, int n)
 
- Public Attributes inherited from QObject
typedef QObjectList
 
- Protected Member Functions inherited from Cutelyst::View
 View (ViewPrivate *d, QObject *parent, const QString &name)
 
- Protected Member Functions inherited from Cutelyst::Component
 Component (ComponentPrivate *d, QObject *parent=nullptr)
 
virtual bool afterExecute (Context *c)
 
void applyRoles (const QStack< Component * > &roles)
 
virtual bool aroundExecute (Context *c, QStack< Component * > stack)
 
virtual bool beforeExecute (Context *c)
 
virtual bool dispatcherReady (const Dispatcher *dispatch, Controller *controller)
 
- Protected Member Functions inherited from QObject
virtual void childEvent (QChildEvent *event)
 
virtual void connectNotify (const QMetaMethod &signal)
 
virtual void customEvent (QEvent *event)
 
virtual void disconnectNotify (const QMetaMethod &signal)
 
bool isSignalConnected (const QMetaMethod &signal) const const
 
int receivers (const char *signal) const const
 
QObjectsender () const const
 
int senderSignalIndex () const const
 
virtual void timerEvent (QTimerEvent *event)
 

Detailed Description

The CuteleeView is a view handler that renders templates using the Cutelee engine. It loads template files from the included paths and populates them with stash values.

The view should be initialized in you reimplementation of Application::init(), it can than be easily called from a RenderView action. You can specify a name for your view that can be either set dynamically via Context::setCustomView() or via the :View("name") argument of the RenderView action. A view with an empty name will be the default view.

The view will try to find the template file name to render in the stash using the "template" key. If that key is not available, it will try to find a template named after the private name of the current action.

Included additional tags

Beside the tags included in Cutelee, Cutelyst provides some own tags:

c_uri_for

This tag uses Context::uriFor() to create an URL for a specific path populated with arguments and optional query parameters. Path is the only required argument for the tag, the QUERY keyword must preceed query parameters.

{% c_uri_for "/path" "arg1" "arg2" QUERY "foo=bar" c.req.queryParams %}

c_csrf_token

This tag creates a hidden HTML form input field containing a CSRF protection token generated by CSRFProtection::getTokenFormField(). It has no parameters and should be used inside form tags.

{% c_csrf_token %}

c_csrf_token_value

This tag writes the current CSRF token as returned by CSRFProtection::getToken(). This can be useful if you only need the token value instead of a complete form field to use it for example in a meta tag for access with JavaScript.

{% c_csrf_token_value %}

Usage example

Initialize the view in your reimplementation of Application::init():

#include <Cutelyst/Plugins/View/Cutelee/cuteleeview.h>
using namespace Cutelyst;
bool MyApp::init()
{
// other initialization stuff
// ...
// register the view to the application without a name
// as our default view
auto view = new CuteleeView(this);
view->setCached(true);
view->setIncludePaths({"/path/to/my/tempalte/files"});
// if you want to use Cutelee tags for internationalization
// and localization, you have to explicitely load that Cutelee plugin library
view->engine()->addDefaultLibrary("cutelee_18ntags");
}
CuteleeView(QObject *parent=nullptr, const QString &name=QString())
Definition: cuteleeview.cpp:33
The Cutelyst namespace holds all public Cutelyst API.

Load the view with a RenderView action on for example the End() method of your root controller:

#include <Cutelyste/Controller>
using namespace Cutelyst;
class Root : public Controller
{
public:
explicit Root(QObject *parent = nullptr);
~Root() override = default;
C_ATTR(index, :Path :Args(0))
void index(Context *c);
private:
// Here we specify the RenderView action using the default nameless view
// created in our app’s init method. We could use the additional :View("foo")
// argument to select a specific named view if we would have more than one.
C_ATTR(End, :ActionClass("RenderView"))
void End(Context *c) { Q_UNUSED(c); }
}
Q_OBJECTQ_OBJECT
QObject * parent() const const

Inside the implementation of the index method from above we now set the name of the template file to use:

void Root::index(Context *c)
{
// other stuff for our index method
// ...
// the CuteleeView called by the RenderView action of the End method will now try
// to load the template file from /path/to/my/template/files/frontend/index.html
c->setStash("template", "frontend/index.html");
}
Logging category
cutelyst.view.cutelee
Logging with Cutelyst

Definition at line 138 of file cuteleeview.h.

Constructor & Destructor Documentation

◆ CuteleeView()

CUTELEE_END_LOOKUP CuteleeView::CuteleeView ( QObject parent = nullptr,
const QString name = QString() 
)
explicit

Constructs a CuteleeView object with the given parent and name.

The name can be used to specify different views that can be called either dynamically by Context::setCustomView() or with the :View("name") argument of the RenderView action.

Definition at line 33 of file cuteleeview.cpp.

References QDir::currentPath(), QObject::parent(), and setIncludePaths().

Member Function Documentation

◆ addTranslationCatalog()

void CuteleeView::addTranslationCatalog ( const QString path,
const QString catalog 
)

Dynamically adds translation catalog at path to the translator.

Translation catalogs can be used to dynamically integrate translations into the CuteleeView, for example for plugins and themes. The catalog could be the name of an extension for example that is loaded from a locale specifc directory under path.

The catalog will be loaded in the following way: /path/locale/catalog, for example /usr/share/mycutelystapp/l10n/de_DE/fancytheme.qm. The current locale is defined by Context::locale() when rendering the theme. The path /usr/share/myapp/l10n would then contain locale specific subdirectories like de_DE, pt_BR, etc. that contain the translation files named by catalog.

Usage example:
bool MyCutelystApp::init()
{
// ...
auto view = new CuteleeView(this);
view->addTranslationCatalog(QStringLiteral("/usr/share/mycutelystapp/l10n"),
QStringLiteral("fancytheme"));
// ...
}
See also
Translate your application
Since
Cutelyst 1.5.0

Definition at line 262 of file cuteleeview.cpp.

References QString::isEmpty().

◆ addTranslationCatalogs()

void CuteleeView::addTranslationCatalogs ( const QMultiHash< QString, QString > &  catalogs)

Adds a dictionary of translation catalogs and paths to the translator.

The key of the QHash is the name of the catalog, the value is the path. See addTranslationCatalog() for more information about translation catalogs.

See also
Translate your application
Since
Cutelyst 1.5.0

Definition at line 270 of file cuteleeview.cpp.

◆ addTranslator() [1/2]

void CuteleeView::addTranslator ( const QLocale locale,
QTranslator translator 
)

Adds a translator for the specified locale to the list of translators.

Example usage
bool MyCutelystApp::init()
{
// ...
auto view = new CuteleeView(this);
auto deDeTrans = new QTranslator(this);
if (deDeTrans->load(QStringLiteral("de_DE"),
QStringLiteral("/path/to/my/translations")) {
view->addTranslator(QLocale("de_DE"), deDeTrans);
}
auto ptBrTrans = new QTranslator(this);
if (ptBrTrans->load(QStringLiteral("pt_BR"),
QStringLiteral("/path/to/my/translations")) {
view->addTranslator(QLocale("pt_BR"), ptBrTrans);
}
// ...
}

It is mostly easier to use loadTranslationsFromDir() to load all available translations in a bunch.

See also
Translate your application
Since
Cutelyst 1.5.0

Definition at line 250 of file cuteleeview.cpp.

Referenced by addTranslator(), and loadTranslationsFromDir().

◆ addTranslator() [2/2]

void CuteleeView::addTranslator ( const QString locale,
QTranslator translator 
)

Adds a translator for the specified locale to the list of translators.

The locale string should be parseable by QLocale.

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

See also
loadTranslationsFromDir()
Translate your application
Since
Cutelyst 1.4.0

Definition at line 257 of file cuteleeview.cpp.

References addTranslator().

◆ engine()

Cutelee::Engine * CuteleeView::engine ( ) const

Returns the Cutelee::Engine pointer that is used by this engine.

Definition at line 127 of file cuteleeview.cpp.

◆ includePaths()

QStringList CuteleeView::includePaths ( ) const

Returns the list of include paths.

See also
setIncludePaths()

Definition at line 65 of file cuteleeview.cpp.

◆ isCaching()

bool CuteleeView::isCaching ( ) const

Returns true if caching is enabled.

See also
setCache()

Definition at line 161 of file cuteleeview.cpp.

Referenced by preloadTemplates().

◆ loadTranslationsFromDir()

QVector< QLocale > CuteleeView::loadTranslationsFromDir ( const QString filename,
const QString directory,
const QString prefix = QStringLiteral("."),
const QString suffix = QStringLiteral(".qm") 
)

Loads translations for a specific filename from a single directory and returns a list of added locales.

This can be used to load translations for a template if the translation file names follow a common schema. Let us assume you organised your translation files as follows:

  • /usr/share/myapp/translations/mytemplate_de.qm
  • /usr/share/myapp/translations/mytemplate_pt_BR.qm
  • ...

You can then use loadTranslationsFromDir() on your registered CuteleeView object as follows:

bool MyApp::init()
{
auto view = new CuteleeView(this);
view->loadTranslationsFromDir(QStringLiteral("mytemplate"),
QStringLiteral("/usr/share/myapp/translations"),
QStringLiteral("_"));
}

prefix is the part between the file name and the locale part. In the example above it is "_", if it is not set the default "." will be used. The suffix is the file name suffix that defaults to ".qm".

See also
addTranslator(), loadTranslationsFromDir()
Translate your application
Since
Cuteylst 2.1.0

Definition at line 277 of file cuteleeview.cpp.

References addTranslator(), QList::append(), QLocale::C, QDir::entryInfoList(), QDir::exists(), QDir::Files, QString::indexOf(), QString::isEmpty(), QLocale::language(), QString::length(), QString::mid(), QList::reserve(), and QList::squeeze().

◆ preloadTemplates()

void CuteleeView::preloadTemplates ( )

When called, setCache() is set to true and templates are loaded.

Definition at line 133 of file cuteleeview.cpp.

References QDir::Files, isCaching(), QDir::NoDotAndDotDot, QString::remove(), setCache(), QString::startsWith(), and QDirIterator::Subdirectories.

◆ render()

QByteArray CuteleeView::render ( Context c) const
finaloverridevirtual

All subclasses must reimplement this when doing it's rendering. If an error (c->error()) is not set c->response()->body() is defined with the returned value, this is useful if the view is not meant to be used as a body.

Implements Cutelyst::View.

Definition at line 167 of file cuteleeview.cpp.

References Cutelyst::Context::action, Cutelyst::Context::appendError(), QVariant::fromValue(), QString::isEmpty(), Cutelyst::Context::locale(), Cutelyst::Context::qtTrId(), QString::remove(), Cutelyst::Context::res(), Cutelyst::Component::reverse(), Cutelyst::Response::setBody(), Cutelyst::Context::setStash(), QString::startsWith(), Cutelyst::Context::stash(), and QString::toUtf8().

◆ setCache()

void CuteleeView::setCache ( bool  enable)

Sets if template caching should be done, this increases performance at the cost of higher memory usage.

See also
isCaching()

Definition at line 105 of file cuteleeview.cpp.

References QObject::Q_EMIT().

Referenced by preloadTemplates().

◆ setIncludePaths()

void CuteleeView::setIncludePaths ( const QStringList paths)

Sets the list of include paths which will be looked for when resolving templates files.

See also
includePaths()

Definition at line 71 of file cuteleeview.cpp.

References QObject::Q_EMIT().

Referenced by CuteleeView().

◆ setTemplateExtension()

void CuteleeView::setTemplateExtension ( const QString extension)

Sets the template extension, defaults to ".html".

See also
templateExtension()

Definition at line 85 of file cuteleeview.cpp.

References QObject::Q_EMIT().

◆ setWrapper()

void CuteleeView::setWrapper ( const QString name)

Sets the template wrapper name, the template will be rendered into content variable in which the wrapper template should render.

See also
wrapper()

Definition at line 98 of file cuteleeview.cpp.

References Cutelyst::Component::name(), and QObject::Q_EMIT().

◆ templateExtension()

QString CuteleeView::templateExtension ( ) const

Returns the template extension, defaults to ".html".

See also
setTemplateExtenion()

Definition at line 79 of file cuteleeview.cpp.

◆ wrapper()

QString CuteleeView::wrapper ( ) const

Returns the template wrapper.

See also
setWrapper()

Definition at line 92 of file cuteleeview.cpp.