Product loop adjustements
This commit is contained in:
@@ -6,11 +6,11 @@
|
||||
* Functions needed for Thelia bootstrap
|
||||
*/
|
||||
define('THELIA_ROOT' , rtrim(realpath(__DIR__ .'/../'),'/') . "/");
|
||||
define('THELIA_LOCAL_DIR' , THELIA_ROOT . '/local/');
|
||||
define('THELIA_LOCAL_DIR' , THELIA_ROOT . 'local/');
|
||||
define('THELIA_CONF_DIR' , THELIA_LOCAL_DIR . 'config/');
|
||||
define('THELIA_MODULE_DIR' , THELIA_LOCAL_DIR . 'modules/');
|
||||
define('THELIA_WEB_DIR' , THELIA_ROOT . '/web/');
|
||||
define('THELIA_TEMPLATE_DIR' , THELIA_ROOT . '/templates/');
|
||||
define('THELIA_WEB_DIR' , THELIA_ROOT . 'web/');
|
||||
define('THELIA_TEMPLATE_DIR' , THELIA_ROOT . 'templates/');
|
||||
define('DS', DIRECTORY_SEPARATOR);
|
||||
|
||||
$loader = require __DIR__ . "/vendor/autoload.php";
|
||||
|
||||
@@ -27,6 +27,12 @@ class AdminController extends BaseAdminController {
|
||||
|
||||
public function indexAction()
|
||||
{
|
||||
return $this->render("home.html");
|
||||
return $this->render("home");
|
||||
}
|
||||
|
||||
public function processAction()
|
||||
{
|
||||
echo "not yet coded !";
|
||||
exit();
|
||||
}
|
||||
}
|
||||
@@ -50,10 +50,23 @@ use Thelia\Core\Event\ActionEvent;
|
||||
|
||||
class BaseAdminController extends ContainerAware
|
||||
{
|
||||
const TEMPLATE_404 = "404.html";
|
||||
const TEMPLATE_404 = "404";
|
||||
|
||||
protected function undefinedAction()
|
||||
public function processTemplateAction($template)
|
||||
{
|
||||
try {
|
||||
if (! empty($template)) {
|
||||
// If we have a view in the URL, render this view
|
||||
return $this->render($template);
|
||||
}
|
||||
else if (null != $view = $this->getRequest()->get('view')) {
|
||||
return $this->render($view);
|
||||
}
|
||||
}
|
||||
catch (\Exception $ex) {
|
||||
// Nothing special
|
||||
}
|
||||
|
||||
return new Response($this->renderRaw(self::TEMPLATE_404), 404);
|
||||
}
|
||||
|
||||
@@ -81,6 +94,9 @@ class BaseAdminController extends ContainerAware
|
||||
*/
|
||||
protected function renderRaw($templateName, $args = array())
|
||||
{
|
||||
// Add the template standard extension
|
||||
$templateName .= '.html';
|
||||
|
||||
$session = $this->getSession();
|
||||
|
||||
$args = array_merge($args, array(
|
||||
@@ -158,7 +174,7 @@ class BaseAdminController extends ContainerAware
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a ParserInterface instance parser
|
||||
* @return a ParserInterfac instance parser
|
||||
*/
|
||||
protected function getParser()
|
||||
{
|
||||
|
||||
@@ -37,7 +37,7 @@ class SessionController extends BaseAdminController {
|
||||
|
||||
public function showLoginAction()
|
||||
{
|
||||
return $this->render("login.html");
|
||||
return $this->render("login");
|
||||
}
|
||||
|
||||
public function checkLogoutAction()
|
||||
@@ -100,6 +100,6 @@ class SessionController extends BaseAdminController {
|
||||
$this->getParserContext()->setErrorForm($adminLoginForm);
|
||||
|
||||
// Display the login form again
|
||||
return $this->render("login.html");
|
||||
return $this->render("login");
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@
|
||||
<loop class="Thelia\Core\Template\Loop\Auth" name="auth"/>
|
||||
<loop class="Thelia\Core\Template\Loop\Order" name="order"/>
|
||||
<loop class="Thelia\Core\Template\Loop\OrderStatus" name="order-status"/>
|
||||
<loop class="Thelia\Core\Template\Loop\CategoryPath" name="category-path"/>
|
||||
</loops>
|
||||
|
||||
<forms>
|
||||
|
||||
@@ -24,8 +24,22 @@
|
||||
<default key="_controller">Thelia\Admin\Controller\SessionController::checkLoginAction</default>
|
||||
</route>
|
||||
|
||||
<route id="admin.undefined" path="/admin/{everything}">
|
||||
<default key="_controller">Thelia\Admin\Controller\AdminController::undefinedAction</default>
|
||||
<requirement key="everything">.*</requirement>
|
||||
|
||||
<!-- Route to the catalog controller (process category browsing) -->
|
||||
|
||||
<route id="admin.catalog" path="/admin/catalog">
|
||||
<default key="_controller">Thelia\Admin\Controller\CategoryController::indexAction</default>
|
||||
</route>
|
||||
|
||||
<route id="admin.category" path="/admin/catalog/category/{action}">
|
||||
<default key="_controller">Thelia\Admin\Controller\CategoryController::processAction</default>
|
||||
<requirement key="action">.*</requirement>
|
||||
</route>
|
||||
|
||||
<!-- The default route, to display a template -->
|
||||
|
||||
<route id="admin.processTemplate" path="/admin/{template}">
|
||||
<default key="_controller">Thelia\Admin\Controller\AdminController::processTemplateAction</default>
|
||||
<requirement key="template">.*</requirement>
|
||||
</route>
|
||||
</routes>
|
||||
@@ -30,6 +30,8 @@ class LoopResultRow
|
||||
public function set($key, $value)
|
||||
{
|
||||
$this->substitution[$key] = $value === null ? '' : $value;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function get($key)
|
||||
|
||||
@@ -168,14 +168,25 @@ class Category extends BaseLoop
|
||||
if ($this->not_empty && $category->countAllProducts() == 0) continue;
|
||||
|
||||
$loopResultRow = new LoopResultRow();
|
||||
$loopResultRow->set("TITLE",$category->getTitle());
|
||||
$loopResultRow->set("CHAPO", $category->getChapo());
|
||||
$loopResultRow->set("DESCRIPTION", $category->getDescription());
|
||||
$loopResultRow->set("POSTSCRIPTUM", $category->getPostscriptum());
|
||||
$loopResultRow->set("PARENT", $category->getParent());
|
||||
$loopResultRow->set("ID", $category->getId());
|
||||
$loopResultRow->set("URL", $category->getUrl());
|
||||
$loopResultRow->set("PRODUCT_COUNT", $category->countChild());
|
||||
|
||||
$loopResultRow
|
||||
->set("ID", $category->getId())
|
||||
->set("TITLE",$category->getTitle())
|
||||
->set("CHAPO", $category->getChapo())
|
||||
->set("DESCRIPTION", $category->getDescription())
|
||||
->set("POSTSCRIPTUM", $category->getPostscriptum())
|
||||
->set("PARENT", $category->getParent())
|
||||
->set("URL", $category->getUrl())
|
||||
->set("PRODUCT_COUNT", $category->countChild())
|
||||
->set("VISIBLE", $category->getVisible() ? "1" : "0")
|
||||
->set("POSITION", $category->getPosition())
|
||||
|
||||
->set("CREATE_DATE", $category->getCreatedAt())
|
||||
->set("UPDATE_DATE", $category->getUpdatedAt())
|
||||
->set("VERSION", $category->getVersion())
|
||||
->set("VERSION_DATE", $category->getVersionCreatedAt())
|
||||
->set("VERSION_AUTHOR", $category->getVersionCreatedBy())
|
||||
;
|
||||
|
||||
$loopResult->addRow($loopResultRow);
|
||||
}
|
||||
|
||||
@@ -271,12 +271,12 @@ class Product extends BaseLoop
|
||||
$search->orderBy('real_price', Criteria::DESC);
|
||||
break;
|
||||
case "manual":
|
||||
if(null === $this->category || count($this->category) != 1)
|
||||
if(null === $category || count($category) != 1)
|
||||
throw new \InvalidArgumentException('Manual order cannot be set without single category argument');
|
||||
$search->orderByPosition(Criteria::ASC);
|
||||
break;
|
||||
case "manual_reverse":
|
||||
if(null === $this->category || count($this->category) != 1)
|
||||
if(null === $category || count($category) != 1)
|
||||
throw new \InvalidArgumentException('Manual order cannot be set without single category argument');
|
||||
$search->orderByPosition(Criteria::DESC);
|
||||
break;
|
||||
@@ -406,6 +406,7 @@ class Product extends BaseLoop
|
||||
$loopResultRow->set("WEIGHT", $product->getWeight());
|
||||
$loopResultRow->set("PROMO", $product->getPromo());
|
||||
$loopResultRow->set("NEW", $product->getNewness());
|
||||
$loopResultRow->set("POSITION", $product->getPosition());
|
||||
|
||||
$loopResult->addRow($loopResultRow);
|
||||
}
|
||||
|
||||
@@ -51,6 +51,48 @@ abstract class AbstractSmartyPlugin
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a function or block parameter value, and normalize it, trimming balnks and
|
||||
* making it lowercase
|
||||
*
|
||||
* @param array $params the parameters array
|
||||
* @param mixed $name as single parameter name, or an array of names. In this case, the first defined parameter is returned. Use this for aliases (context, ctx, c)
|
||||
* @param mixed $default the defaut value if parameter is missing (default to null)
|
||||
* @return mixed the parameter value, or the default value if it is not found.
|
||||
*/
|
||||
public function getNormalizedParam($params, $name, $default = null)
|
||||
{
|
||||
$value = $this->getParam($params, $name, $default);
|
||||
|
||||
if (is_string($value)) $value = strtolower(trim($value));
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a function or block parameter value
|
||||
*
|
||||
* @param array $params the parameters array
|
||||
* @param mixed $name as single parameter name, or an array of names. In this case, the first defined parameter is returned. Use this for aliases (context, ctx, c)
|
||||
* @param mixed $default the defaut value if parameter is missing (default to null)
|
||||
* @return mixed the parameter value, or the default value if it is not found.
|
||||
*/
|
||||
public function getParam($params, $name, $default = null)
|
||||
{
|
||||
if (is_array($name)) {
|
||||
foreach($name as $test) {
|
||||
if (isset($params[$test])) {
|
||||
return $params[$test];
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (isset($params[$name])) {
|
||||
return $params[$name];
|
||||
}
|
||||
|
||||
return $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return an array of SmartyPluginDescriptor
|
||||
*/
|
||||
|
||||
@@ -78,13 +78,13 @@ class DataAccessFunctions extends AbstractSmartyPlugin
|
||||
*/
|
||||
protected function userDataAccess($objectLabel, $context, $params)
|
||||
{
|
||||
$attribute = $params['attr'];
|
||||
$attribute = $this->getNormalizedParam($params, array('attribute', 'attrib', 'attr'));
|
||||
|
||||
if (! empty($attribute)) {
|
||||
$user = $this->securityContext->setContext($context)->getUser();
|
||||
|
||||
if (null != $user) {
|
||||
$getter = sprintf("get%s", ucfirst(strtolower($attribute)));
|
||||
$getter = sprintf("get%s", ucfirst($attribute));
|
||||
|
||||
if (method_exists($user, $getter)) {
|
||||
return $user->$getter();
|
||||
|
||||
@@ -85,11 +85,13 @@ class Form extends AbstractSmartyPlugin
|
||||
{
|
||||
if ($repeat) {
|
||||
|
||||
if (empty($params['name'])) {
|
||||
$name = $this->getParam($params, 'name');
|
||||
|
||||
if (null == $name) {
|
||||
throw new \InvalidArgumentException("Missing 'name' parameter in form arguments");
|
||||
}
|
||||
|
||||
$instance = $this->createInstance($params['name']);
|
||||
$instance = $this->createInstance($name);
|
||||
|
||||
// Check if parser context contains our form
|
||||
$errorForm = $this->parserContext->getErrorForm();
|
||||
@@ -212,10 +214,11 @@ class Form extends AbstractSmartyPlugin
|
||||
protected function getFormFieldView($params) {
|
||||
$instance = $this->getInstanceFromParams($params);
|
||||
|
||||
if (! isset($params['field']))
|
||||
$fieldName = $this->getParam($params, 'field');
|
||||
|
||||
if (null == $fieldName)
|
||||
throw new \InvalidArgumentException("'field' parameter is missing");
|
||||
|
||||
$fieldName = $params['field'];
|
||||
|
||||
if (empty($instance->getView()[$fieldName]))
|
||||
throw new \InvalidArgumentException(sprintf("Field name '%s' not found in form %s", $fieldName, $instance->getName()));
|
||||
@@ -225,12 +228,12 @@ class Form extends AbstractSmartyPlugin
|
||||
|
||||
protected function getInstanceFromParams($params) {
|
||||
|
||||
if (empty($params['form'])) {
|
||||
$instance = $this->getParam($params, 'form');
|
||||
|
||||
if (null == $instance) {
|
||||
throw new \InvalidArgumentException("Missing 'form' parameter in form arguments");
|
||||
}
|
||||
|
||||
$instance = $params["form"];
|
||||
|
||||
if (! $instance instanceof \Thelia\Form\BaseForm) {
|
||||
throw new \InvalidArgumentException(sprintf("form parameter in form_field block must be an instance of
|
||||
\Thelia\Form\BaseForm, instance of %s found", get_class($instance)));
|
||||
|
||||
@@ -48,22 +48,25 @@ class Security extends AbstractSmartyPlugin
|
||||
public function checkAuthFunction($params, &$smarty)
|
||||
{
|
||||
// Context: 'front' or 'admin'
|
||||
$context = strtolower(trim($params['context']));
|
||||
$context = $this->getNormalizedParam($params, 'context');
|
||||
|
||||
$this->securityContext->setContext($context);
|
||||
|
||||
$roles = $this->_explode($params['roles']);
|
||||
$permissions = $this->_explode($params['permissions']);
|
||||
$roles = $this->_explode($this->getParam($params, 'roles'));
|
||||
$permissions = $this->_explode($this->getParam($params, 'permissions'));
|
||||
|
||||
if (! $this->securityContext->isGranted($roles, $permissions)) {
|
||||
|
||||
$ex = new AuthenticationException(
|
||||
sprintf("User not granted for roles '%s', permissions '%s' in context '%s'.",
|
||||
implode(',', $roles), implode(',', $permissions), $context
|
||||
)
|
||||
);
|
||||
|
||||
if (! empty($params['login_tpl'])) {
|
||||
$ex->setLoginTemplate($params['login_tpl']);
|
||||
$loginTpl = $this->getParam($params, 'login_tpl');
|
||||
|
||||
if (null != $loginTpl) {
|
||||
$ex->setLoginTemplate($loginTpl);
|
||||
}
|
||||
|
||||
throw $ex;
|
||||
@@ -73,7 +76,7 @@ class Security extends AbstractSmartyPlugin
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the various smarty plugins hendled by this class
|
||||
* Define the various smarty plugins handled by this class
|
||||
*
|
||||
* @return an array of smarty plugin descriptors
|
||||
*/
|
||||
|
||||
@@ -71,9 +71,11 @@ class TheliaLoop extends AbstractSmartyPlugin
|
||||
/**
|
||||
* Process the count function: executes a loop and return the number of items found
|
||||
*/
|
||||
public function theliaCount($params, $template) {
|
||||
public function theliaCount($params, $template)
|
||||
{
|
||||
$type = $this->getParam($params, 'type');
|
||||
|
||||
if (empty($params['type']))
|
||||
if (null == $type)
|
||||
throw new \InvalidArgumentException("Missing 'type' parameter in count arguments");
|
||||
|
||||
$loop = $this->createLoopInstance($params);
|
||||
@@ -97,13 +99,15 @@ class TheliaLoop extends AbstractSmartyPlugin
|
||||
*/
|
||||
public function theliaLoop($params, $content, $template, &$repeat)
|
||||
{
|
||||
if (empty($params['name']))
|
||||
$name = $this->getParam($params, 'name');
|
||||
|
||||
if (null == $name)
|
||||
throw new \InvalidArgumentException("Missing 'name' parameter in loop arguments");
|
||||
|
||||
if (empty($params['type']))
|
||||
throw new \InvalidArgumentException("Missing 'type' parameter in loop arguments");
|
||||
$type = $this->getParam($params, 'type');
|
||||
|
||||
$name = $params['name'];
|
||||
if (null == $type)
|
||||
throw new \InvalidArgumentException("Missing 'type' parameter in loop arguments");
|
||||
|
||||
if ($content === null) {
|
||||
// Check if a loop with the same name exists in the current scope, and abort if it's the case.
|
||||
@@ -223,10 +227,10 @@ class TheliaLoop extends AbstractSmartyPlugin
|
||||
*/
|
||||
public function theliaPageLoop($params, $content, $template, &$repeat)
|
||||
{
|
||||
if (empty($params['rel']))
|
||||
throw new \InvalidArgumentException("Missing 'rel' parameter in page loop");
|
||||
$loopName = $this->getParam($params, 'rel');
|
||||
|
||||
$loopName = $params['rel'];
|
||||
if (null == $loopName)
|
||||
throw new \InvalidArgumentException("Missing 'rel' parameter in page loop");
|
||||
|
||||
// Find loop results in the current template vars
|
||||
/* $loopResults = $template->getTemplateVars($loopName);
|
||||
@@ -274,11 +278,10 @@ class TheliaLoop extends AbstractSmartyPlugin
|
||||
*/
|
||||
protected function checkEmptyLoop($params, $template)
|
||||
{
|
||||
$loopName = $this->getParam($params, 'rel');
|
||||
|
||||
if (empty($params['rel']))
|
||||
throw new \InvalidArgumentException("Missing 'rel' parameter in ifloop/elseloop arguments");
|
||||
|
||||
$loopName = $params['rel'];
|
||||
if (null == $loopName)
|
||||
throw new \InvalidArgumentException("Missing 'rel' parameter in ifloop/elseloop arguments");
|
||||
|
||||
if (! isset($this->loopstack[$loopName])) {
|
||||
throw new \InvalidArgumentException("Loop $loopName is not defined.");
|
||||
|
||||
@@ -49,10 +49,10 @@ class Translation extends AbstractSmartyPlugin
|
||||
$vars = array();
|
||||
|
||||
foreach($params as $name => $value) {
|
||||
$vars["%$name"] = $value;
|
||||
if ($name != 'l') $vars["%$name"] = $value;
|
||||
}
|
||||
|
||||
return $this->translator->trans($params['l'], $vars);
|
||||
return $this->translator->trans($this->getParam($params, 'l'), $vars);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -47,7 +47,7 @@ class UrlGenerator extends AbstractSmartyPlugin
|
||||
public function generateUrlFunction($params, &$smarty)
|
||||
{
|
||||
// the path to process
|
||||
$path = trim($params['path']);
|
||||
$path = $this->getParam($params, 'path');
|
||||
|
||||
return URL::absoluteUrl($path, $this->getArgsFromParam($params));
|
||||
}
|
||||
@@ -59,19 +59,36 @@ class UrlGenerator extends AbstractSmartyPlugin
|
||||
* @param unknown $smarty
|
||||
* @return string no text is returned.
|
||||
*/
|
||||
public function generateViewUrlFunction($params, &$smarty)
|
||||
public function generateFrontViewUrlFunction($params, &$smarty)
|
||||
{
|
||||
return $this->generateViewUrlFunction($params, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Process administration view url generator function
|
||||
*
|
||||
* @param array $params
|
||||
* @param unknown $smarty
|
||||
* @return string no text is returned.
|
||||
*/
|
||||
public function generateAdminViewUrlFunction($params, &$smarty)
|
||||
{
|
||||
return $this->generateViewUrlFunction($params, true);
|
||||
}
|
||||
|
||||
protected function generateViewUrlFunction($params, $forAdmin)
|
||||
{
|
||||
// the view name (without .html)
|
||||
$view = trim($params['view']);
|
||||
$view = $this->getParam($params,'view');
|
||||
|
||||
// the related action (optionale)
|
||||
$action = trim($params['action']);
|
||||
$action = $this->getParam($params, 'action');
|
||||
|
||||
$args = $this->getArgsFromParam($params);
|
||||
|
||||
if (! empty($action)) $args['action'] = $action;
|
||||
|
||||
return URL::viewUrl($view, $args);
|
||||
return $forAdmin ? URL::adminViewUrl($view, $args) : URL::viewUrl($view, $args);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -83,14 +100,13 @@ class UrlGenerator extends AbstractSmartyPlugin
|
||||
*/
|
||||
private function getArgsFromParam($params) {
|
||||
|
||||
if (isset($params['args']))
|
||||
return explode($params['args'], ',');
|
||||
$args = $this->getParam($params, array('arguments', 'args'));
|
||||
|
||||
return array();
|
||||
return $args !== null ? explode($args, ',') : array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the various smarty plugins hendled by this class
|
||||
* Define the various smarty plugins handled by this class
|
||||
*
|
||||
* @return an array of smarty plugin descriptors
|
||||
*/
|
||||
@@ -98,7 +114,8 @@ class UrlGenerator extends AbstractSmartyPlugin
|
||||
{
|
||||
return array(
|
||||
new SmartyPluginDescriptor('function', 'url', $this, 'generateUrlFunction'),
|
||||
new SmartyPluginDescriptor('function', 'viewurl', $this, 'generateViewUrlFunction')
|
||||
new SmartyPluginDescriptor('function', 'viewurl', $this, 'generateFrontViewUrlFunction'),
|
||||
new SmartyPluginDescriptor('function', 'admin_viewurl', $this, 'generateAdminViewUrlFunction')
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ class URL
|
||||
|
||||
$root = $path_only ? ConfigQuery::read('base_url', '/') : self::getIndexPage();
|
||||
|
||||
$base = $root . $path;
|
||||
$base = $root . '/' . ltrim($path, '/');
|
||||
}
|
||||
else
|
||||
$base = $path;
|
||||
@@ -67,11 +67,26 @@ class URL
|
||||
return $base . $queryString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Absolute URL to a administration view
|
||||
*
|
||||
* @param string $viewName the view name (e.g. login for login.html)
|
||||
* @param mixed $parameters An array of parameters
|
||||
*
|
||||
* @return string The generated URL
|
||||
*/
|
||||
public static function adminViewUrl($viewName, array $parameters = array()) {
|
||||
|
||||
$path = sprintf("%s/admin/%s", self::getIndexPage(), $viewName); // FIXME ! view= should not be necessaray, check routing parameters
|
||||
|
||||
return self::absoluteUrl($path, $parameters);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Absolute URL to a view
|
||||
*
|
||||
* @param string $viewName the view name (e.g. login for login.html)
|
||||
* @param mixed $parameters An array of parameters
|
||||
* @param string $viewName the view name (e.g. login for login.html)
|
||||
* @param mixed $parameters An array of parameters
|
||||
*
|
||||
* @return string The generated URL
|
||||
*/
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
{$page_title={intl l='Thelia'}}
|
||||
{$page_title={intl l='Page not found'}}
|
||||
|
||||
{include file='includes/header.inc.html'}
|
||||
|
||||
<div class="brandbar container">
|
||||
<a class="brand" href="index.php">{images file='assets/img/logo-thelia-34px.png'}<img src="{$asset_url}" alt="{intl l='Thelia, solution e-commerce libre'}" />{/images}</a>
|
||||
</div>
|
||||
|
||||
<div id="wrapper" class="container">
|
||||
<h1>Oops! An Error Occurred</h1>
|
||||
<h2>The server returned a "404 Not Found".</h2>
|
||||
<h1>{intl l="Oops! An Error Occurred"}</h1>
|
||||
<h2>{intl l='The server returned a "404 Not Found"'}</h2>
|
||||
<p>{intl l='The page you\'ve requested was not found. Please check the page address, and try again.'}</p>
|
||||
</div>
|
||||
|
||||
|
||||
{include file='includes/footer.inc.html'}
|
||||
@@ -1,11 +1,28 @@
|
||||
// -- Tools --------------------------------------------------------------------
|
||||
|
||||
.border-radius(@radius: 5px) {
|
||||
-webkit-border-radius: @radius;
|
||||
-moz-border-radius: @radius;
|
||||
border-radius: @radius;
|
||||
.rounded(@radius: 2px) {
|
||||
-webkit-border-radius: @radius;
|
||||
-moz-border-radius: @radius;
|
||||
border-radius: @radius;
|
||||
}
|
||||
|
||||
.border-radius(@topright: 0, @bottomright: 0, @bottomleft: 0, @topleft: 0) {
|
||||
-webkit-border-top-right-radius: @topright;
|
||||
-webkit-border-bottom-right-radius: @bottomright;
|
||||
-webkit-border-bottom-left-radius: @bottomleft;
|
||||
-webkit-border-top-left-radius: @topleft;
|
||||
-moz-border-radius-topright: @topright;
|
||||
-moz-border-radius-bottomright: @bottomright;
|
||||
-moz-border-radius-bottomleft: @bottomleft;
|
||||
-moz-border-radius-topleft: @topleft;
|
||||
border-top-right-radius: @topright;
|
||||
border-bottom-right-radius: @bottomright;
|
||||
border-bottom-left-radius: @bottomleft;
|
||||
border-top-left-radius: @topleft;
|
||||
.background-clip(padding-box);
|
||||
}
|
||||
|
||||
|
||||
.box-shadow(@shadow: 0 1px 2px rgba(0,0,0,.05)) {
|
||||
-webkit-box-shadow: @shadow;
|
||||
-moz-box-shadow: @shadow;
|
||||
@@ -130,6 +147,10 @@ hr {
|
||||
float: right;
|
||||
margin: 0px;
|
||||
|
||||
.control-group {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
input.search-query {
|
||||
background: url("img/search.png") no-repeat;
|
||||
width: 212px;
|
||||
@@ -137,7 +158,7 @@ hr {
|
||||
outline: none;
|
||||
border: none;
|
||||
padding: 5px 20px 5px 20px;
|
||||
border-radius: 0px;
|
||||
.rounded(0px);
|
||||
font-size: 12px;
|
||||
color: #eee;
|
||||
|
||||
@@ -160,7 +181,7 @@ hr {
|
||||
border: none;
|
||||
top: 17px;
|
||||
box-shadow: none;
|
||||
border-radius: 0px;
|
||||
.rounded(0px);
|
||||
z-index: 1337;
|
||||
}
|
||||
}
|
||||
@@ -196,6 +217,7 @@ hr {
|
||||
// -- Brandbar ----------------------------------------------------------------
|
||||
|
||||
.loginpage {
|
||||
|
||||
.brandbar {
|
||||
width: 100%;
|
||||
}
|
||||
@@ -231,7 +253,7 @@ hr {
|
||||
}
|
||||
|
||||
.breadcrumb {
|
||||
border-radius: 0px;
|
||||
.rounded(0px);
|
||||
padding: 25px 0px 25px 30px;
|
||||
background: url("img/logo-light.png") left center no-repeat;
|
||||
float: left;
|
||||
@@ -279,6 +301,38 @@ hr {
|
||||
}
|
||||
}
|
||||
|
||||
// -- Navigation bar ----------------------------------------------------------
|
||||
|
||||
.navbar {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.navbar-inner {
|
||||
border-top: none;
|
||||
.border-radius(0, 4px, 4px, 0);
|
||||
|
||||
.container{
|
||||
width: 1170px;
|
||||
}
|
||||
}
|
||||
|
||||
// -- Breadcrumb --------------------------------------------------------------
|
||||
|
||||
.breadcrumb {
|
||||
margin-top: 0;
|
||||
background-color: transparent;
|
||||
padding: 0 15px;
|
||||
|
||||
|
||||
> li > .divider {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
> .active {
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
// -- Feed list on home page --------------------------------------------------
|
||||
|
||||
.feed-list {
|
||||
@@ -314,10 +368,15 @@ hr {
|
||||
margin: 0 auto 20px;
|
||||
background-color: #fff;
|
||||
border: 1px solid #e5e5e5;
|
||||
.border-radius;
|
||||
.rounded(5px);
|
||||
.box-shadow;
|
||||
}
|
||||
|
||||
textarea:focus, input[type="text"]:focus, input[type="password"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="date"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, input[type="number"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="color"]:focus, .uneditable-input:focus {
|
||||
border: 1px solid #E9730F;
|
||||
box-shadow: 0px 0px 8px #FFA65A;
|
||||
}
|
||||
|
||||
// -- Allow inline forms validation states ------------------------------------
|
||||
|
||||
.form-inline .warning .control-label,
|
||||
@@ -474,4 +533,51 @@ hr {
|
||||
color: #3a87ad;
|
||||
background-color: #d9edf7;
|
||||
border-color: #3a87ad;
|
||||
}
|
||||
|
||||
// -- Catalog Tables ----------------------------------------------------------
|
||||
|
||||
.table-striped {
|
||||
|
||||
background: white;
|
||||
|
||||
caption {
|
||||
text-align: left;
|
||||
color: #5A6876;
|
||||
text-transform: uppercase;
|
||||
font-weight: bold;
|
||||
background-color: #fff;
|
||||
padding: 0.5em 0.5em 0.5em 1em;
|
||||
border-bottom: 2px solid #A5CED8;
|
||||
|
||||
line-height: 30px;
|
||||
|
||||
.btn-add-item {
|
||||
display: block;
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
td, th {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
td.object-title, th.object-title {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
td.message {
|
||||
// Center the alert box (20px bottom margin) in the table cell
|
||||
padding: 20px 20px 0 20px;
|
||||
|
||||
// No border, nor background in alert blocks
|
||||
.alert {
|
||||
border: none;
|
||||
background-color: transparent;
|
||||
|
||||
&-info {
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,9 @@
|
||||
|
||||
{module_include location='home_top'}
|
||||
|
||||
welcome home !
|
||||
<div class="span12">
|
||||
This is the administration home page. Put some interesting statistics here, and display useful information :)
|
||||
</div>
|
||||
|
||||
{module_include location='home_bottom'}
|
||||
</div>
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
{module_include location='before_footer'}
|
||||
|
||||
<hr />
|
||||
<footer class="modal-footer">
|
||||
<div class="container">
|
||||
@@ -7,19 +9,12 @@
|
||||
- <a href="http://contrib.thelia.net/" target="_blank">{intl l='Contributions Thelia'}</a>
|
||||
<span class="pull-right">{intl l='interface par <a target="_blank" href="http://www.steaw-webdesign.com/">Steaw-Webdesign</a>'}</span>
|
||||
</p>
|
||||
|
||||
{module_include location='in_footer'}
|
||||
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
{* Include required JS files *}
|
||||
|
||||
{javascripts file='../assets/js/jquery.min.js'}
|
||||
<link rel="stylesheet" href="{$asset_url}" target="screen">
|
||||
{/javascripts}
|
||||
|
||||
{javascripts file='../assets/bootstrap/js/bootstrap.min.js'}
|
||||
<link rel="stylesheet" href="{$asset_url}" target="screen">
|
||||
{/javascripts}
|
||||
|
||||
{* TODO allow modules to include JS here *}
|
||||
{module_include location='after_footer'}
|
||||
</body>
|
||||
</html>
|
||||
@@ -19,6 +19,16 @@
|
||||
<link rel="stylesheet" href="{$asset_url}">
|
||||
{/stylesheets}
|
||||
|
||||
{* Include here page specifc CSS file, if any *}
|
||||
|
||||
{if ! empty($thelia_page_css_file)}
|
||||
{stylesheets file='../assets/css/$thelia_page_css_file' filters='less,cssembed'}
|
||||
<link rel="stylesheet" href="{$asset_url}" target="screen">
|
||||
{/stylesheets}
|
||||
{/if}
|
||||
|
||||
{* Modules css are included here *}
|
||||
|
||||
{module_include location='head_css'}
|
||||
</head>
|
||||
<body>
|
||||
@@ -59,12 +69,6 @@
|
||||
<div class="navbar">
|
||||
<div class="navbar-inner">
|
||||
<div class="container">
|
||||
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</a>
|
||||
|
||||
<div class="nav-collapse">
|
||||
|
||||
<ul class="nav">
|
||||
|
||||
@@ -48,14 +48,9 @@
|
||||
{module_include location='index_middle'}
|
||||
|
||||
<div class="row-fluid feed-list">
|
||||
{loop type="feed" name="thelia_feeds" url="http://thelia.net/Flux-rss.html?id_rubrique=8" limit="3"}
|
||||
<div class="span4 feed-list-item">
|
||||
<h3>{$DATE}</h3>
|
||||
<h2><a href="#URL" target="_blank" title="{intl l='Lire la suite'}">{$TITLE|strip_tags}</a></h2>
|
||||
<p>{$DESCRIPTION|strip_tags|truncate:250:"...":true}</p>
|
||||
<p><a class="btn" href="#URL" target="_blank">{intl l='Lire la suite »'}</a></p>
|
||||
</div>
|
||||
{/loop}
|
||||
<div class="span4 offset4">
|
||||
<div class="well">{intl l="Loading Thelia lastest news..."}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -63,4 +58,12 @@
|
||||
|
||||
</div>
|
||||
|
||||
{include file='includes/js.inc.html'}
|
||||
|
||||
<script>
|
||||
$(function () {
|
||||
$(".feed-list").load("{admin_viewurl view='includes/thelia_news_feed'}");
|
||||
})
|
||||
</script>
|
||||
|
||||
{include file='includes/footer.inc.html'}
|
||||
Reference in New Issue
Block a user