This is an extension for LambdaCms which allows admins to manage media files.
NOTE: At this point the functionality provided by this extension is very basic. Pull request adding features are most welcome.
Installing
LambdaCms extensions come as plain Haskell packages and need to be added to the
project's .cabal
file like any other package dependency.
The following guide expects a newly initialized LambdaCms base application.
When you have an existing base app this guide show still be easy to follow.
In the library
section of your base application's .cabal
file append the following
line to build-depends
:
, lambdacms-media >= 0.2.0 && < 0.3
The media extension's admin section needs to be mounted in the base app's
router, therefor add the following line to your config/routes
file:
/admin/media MediaAdminSubR MediaAdmin getLambdaCmsMedia
To Application.hs
add import LambdaCms.Media
and the following line:
...
let getLambdaCms = CoreAdmin
getLambdaCmsMedia = MediaAdmin -- add this line
mkFoundation appConnPool = App {..}
...
The procede by including the migrateLambdaCmsMedia
function to Application.hs
as shown in this snippet:
...
runLoggingT
(runSqlPool (mapM_ runMigration [migrateAll, migrateLambdaCmsCore, migrateLambdaCmsMedia]) pool)
(messageLoggerSource theFoundation appLogger)
...
To Foundation.hs
also add import LambdaCms.Media
and the following two lines:
...
, getLambdaCms :: CoreAdmin
, getLambdaCmsMedia :: MediaAdmin -- add this line
}
...
adminMenu = (defaultCoreAdminMenu CoreAdminR)
++ (defaultMediaAdminMenu MediaAdminR) -- add this line
renderLanguages _ = ["en", "nl"]
...
The last line hooks the media admin section into the admin menu.
Finally the following instance needs to be defined in Foundation.hs
:
instance LambdaCmsMedia App where
mediaR = MediaAdminSubR
staticDir y = appStaticDir $ appSettings y
staticRoot _ = "/static"
That's it! You can now cabal install
the new dependency and run
yesod devel
to test drive the freshly installed extension.
A common usecase would be to use the "media" that are managed using the
lambdacms-media
extension in other extensions. For example: to add an
image to a blog post.
First off all the lambdacms-media
package needs to become a package
dependency of that particular extension's package.
Then we can add an imageId
to the Post
model.
Post
title Text
body Text
imageId MediaId Maybe
To make it all work we need to put a constraint on the type class
defined in the Foundation.hs
:
...
class LambdaCmsMedia master => MysitePostSub master where
...
After this the attachedMaybeMedia
function may be used in the
handler functions of the blog post extension.
License
All code in this repository is released under the MIT license, as specified
in the LICENSE file.