From 9e82414728b9b5aca315ab5ba8acbb1cdc639516 Mon Sep 17 00:00:00 2001 From: Dmitriy Simushev Date: Fri, 14 Feb 2014 10:51:22 +0000 Subject: [PATCH] Use handlebars.php for dialogs' templates --- .../libs/classes/Mibew/Style/ChatStyle.php | 28 +- .../TemplateEngine/ChatTemplateEngine.php | 262 ------------------ src/mibew/styles/dialogs/default/chat.css | 5 +- .../dialogs/default/templates/agentchat.tpl | 1 - .../dialogs/default/templates/agentrochat.tpl | 1 - .../styles/dialogs/default/templates/chat.tpl | 119 -------- .../dialogs/default/templates/error.tpl | 45 --- .../styles/dialogs/default/templates/mail.tpl | 56 ---- .../dialogs/default/templates/mailsent.tpl | 45 --- .../dialogs/default/templates/nochat.tpl | 45 --- .../dialogs/default/templates/redirect.tpl | 62 ----- .../dialogs/default/templates/redirected.tpl | 45 --- .../server_side/_layout.handlebars | 56 ++++ .../server_side/agentchat.handlebars | 1 + .../server_side/agentrochat.handlebars | 1 + .../templates_src/server_side/chat.handlebars | 116 ++++++++ .../server_side/error.handlebars | 23 ++ .../templates_src/server_side/mail.handlebars | 34 +++ .../server_side/mailsent.handlebars | 11 + .../server_side/nochat.handlebars | 15 + .../server_side/redirect.handlebars | 32 +++ .../server_side/redirected.handlebars | 11 + 22 files changed, 325 insertions(+), 689 deletions(-) delete mode 100644 src/mibew/libs/classes/Mibew/TemplateEngine/ChatTemplateEngine.php delete mode 100644 src/mibew/styles/dialogs/default/templates/agentchat.tpl delete mode 100644 src/mibew/styles/dialogs/default/templates/agentrochat.tpl delete mode 100644 src/mibew/styles/dialogs/default/templates/chat.tpl delete mode 100644 src/mibew/styles/dialogs/default/templates/error.tpl delete mode 100644 src/mibew/styles/dialogs/default/templates/mail.tpl delete mode 100644 src/mibew/styles/dialogs/default/templates/mailsent.tpl delete mode 100644 src/mibew/styles/dialogs/default/templates/nochat.tpl delete mode 100644 src/mibew/styles/dialogs/default/templates/redirect.tpl delete mode 100644 src/mibew/styles/dialogs/default/templates/redirected.tpl create mode 100644 src/mibew/styles/dialogs/default/templates_src/server_side/_layout.handlebars create mode 100644 src/mibew/styles/dialogs/default/templates_src/server_side/agentchat.handlebars create mode 100644 src/mibew/styles/dialogs/default/templates_src/server_side/agentrochat.handlebars create mode 100644 src/mibew/styles/dialogs/default/templates_src/server_side/chat.handlebars create mode 100644 src/mibew/styles/dialogs/default/templates_src/server_side/error.handlebars create mode 100644 src/mibew/styles/dialogs/default/templates_src/server_side/mail.handlebars create mode 100644 src/mibew/styles/dialogs/default/templates_src/server_side/mailsent.handlebars create mode 100644 src/mibew/styles/dialogs/default/templates_src/server_side/nochat.handlebars create mode 100644 src/mibew/styles/dialogs/default/templates_src/server_side/redirect.handlebars create mode 100644 src/mibew/styles/dialogs/default/templates_src/server_side/redirected.handlebars diff --git a/src/mibew/libs/classes/Mibew/Style/ChatStyle.php b/src/mibew/libs/classes/Mibew/Style/ChatStyle.php index c75155d9..2f77c694 100644 --- a/src/mibew/libs/classes/Mibew/Style/ChatStyle.php +++ b/src/mibew/libs/classes/Mibew/Style/ChatStyle.php @@ -19,7 +19,7 @@ namespace Mibew\Style; // Import namespaces and classes of the core use Mibew\Settings; -use Mibew\TemplateEngine\ChatTemplateEngine; +use Mibew\Handlebars\HelpersSet; /** * Represents a chat style @@ -29,7 +29,7 @@ class ChatStyle extends AbstractStyle implements StyleInterface /** * Template engine for chat templates. * - * @var \Mibew\TemplateEngine\ChatTemplateEngine + * @var \Handlebars\Handlebars */ protected $templateEngine; @@ -42,10 +42,19 @@ class ChatStyle extends AbstractStyle implements StyleInterface { parent::__construct($style_name); - $this->templateEngine = new ChatTemplateEngine( - $this->filesPath(), - $this->name() + $templates_loader = new \Handlebars\Loader\FilesystemLoader( + MIBEW_FS_ROOT . '/' . $this->filesPath() . '/templates_src/server_side/' ); + + $this->templateEngine = new \Handlebars\Handlebars(array( + 'loader' => $templates_loader, + 'partials_loader' => $templates_loader, + 'helpers' => new \Handlebars\Helpers(HelpersSet::getHelpers()) + )); + + // Use custom function to escape strings + $this->templateEngine->setEscape('safe_htmlspecialchars'); + $this->templateEngine->setEscapeArgs(array()); } /** @@ -70,6 +79,15 @@ class ChatStyle extends AbstractStyle implements StyleInterface public function render($template_name, $data = array()) { start_html_output(); + + // Pass additional variables to template + $data['mibewRoot'] = MIBEW_WEB_ROOT; + $data['mibewVersion'] = MIBEW_VERSION; + $data['currentLocale'] = CURRENT_LOCALE; + $data['rtl'] = (getlocal("localedirection") == 'rtl'); + $data['stylePath'] = MIBEW_WEB_ROOT . '/' . $this->filesPath(); + $data['styleName'] = $this->name(); + echo($this->templateEngine->render($template_name, $data)); } diff --git a/src/mibew/libs/classes/Mibew/TemplateEngine/ChatTemplateEngine.php b/src/mibew/libs/classes/Mibew/TemplateEngine/ChatTemplateEngine.php deleted file mode 100644 index 1c01018f..00000000 --- a/src/mibew/libs/classes/Mibew/TemplateEngine/ChatTemplateEngine.php +++ /dev/null @@ -1,262 +0,0 @@ -stylePath = $style_path; - $this->styleName = $style_name; - } - - /** - * Renders template and returns HTML for it. - * - * @param string $template_name Name of a template with neither path nor - * extension. - * @param array $data Data for substitutions. - * @return string Rendered HTML markup. - */ - public function render($template_name, $data) - { - $this->flattenTemplateData = array_flatten_recursive($data); - $this->templateData = $data; - $contents = $this->getTemplateFileContent($template_name); - - return $this->expandText($contents); - } - - /** - * Check if condition form conditional construction is true. - * - * @param string $condition Condition name. Can be any element name of the - * template data array. - */ - public function checkCondition($condition) - { - if ($condition == 'errors') { - return !empty($this->templateData['errors']) - && is_array($this->templateData['errors']); - } - - return !empty($this->flattenTemplateData[$condition]); - } - - /** - * Process conditional construction. This function is a callback for - * "preg_replace_callback" function. - * - * @param array $matches matches passed from "preg_replace_callback" - * function. - * @return string One of conditional blocks depending of conditional value. - */ - public function expandCondition($matches) - { - $value = $this->checkCondition($matches[2]) ^ ($matches[1] != 'if'); - - if ($value) { - return preg_replace_callback( - self::IF_REGEXP, - array($this, "expandCondition"), - $matches[3] - ); - } elseif (isset($matches[4])) { - return preg_replace_callback( - self::IF_REGEXP, - array($this, "expandCondition"), - substr($matches[4], strpos($matches[4], "}") + 1) - ); - } - - return ""; - } - - /** - * Replace variables in template with its values. This function is a - * callback for "preg_replace_callback" function. - * - * @param array $matches matches passed from "preg_replace_callback" - * function. - * @return string Value of the variable or empty string if the value was not - * passed in with template data. - */ - public function expandVar($matches) - { - $prefix = $matches[1]; - $var = $matches[2]; - - if (!$prefix) { - if ($var == 'mibewroot') { - return MIBEW_WEB_ROOT; - } elseif ($var == 'tplroot') { - return MIBEW_WEB_ROOT . "/" . $this->stylePath; - } elseif ($var == 'styleid') { - return $this->styleName; - } elseif ($var == 'pagination') { - return generate_pagination( - MIBEW_WEB_ROOT . '/' . $this->stylePath, - $this->templateData['pagination'] - ); - } elseif ($var == 'errors' || $var == 'harderrors') { - $errors_data_exists = !empty($this->templateData['errors']) - && is_array($this->templateData['errors']); - if ($errors_data_exists) { - $result = getlocal("$var.header"); - foreach ($this->templateData['errors'] as $e) { - $result .= getlocal("errors.prefix") - . $e - . getlocal("errors.suffix"); - } - $result .= getlocal("errors.footer"); - - return $result; - } - } - } elseif ($prefix == 'msg:' || $prefix == 'msgjs:' || $prefix == 'url:') { - $message = ''; - if (strpos($var, ",") !== false) { - $pos = strpos($var, ","); - $param = substr($var, $pos + 1); - $var = substr($var, 0, $pos); - $message = getlocal2($var, array($this->flattenTemplateData[$param])); - } else { - $message = getlocal($var); - } - if ($prefix == 'msgjs:') { - return json_encode($message); - } - return $message; - } elseif ($prefix == 'form:') { - return form_value($this->templateData, $var); - } elseif ($prefix == 'page:' || $prefix == 'pagejs:') { - $message = isset($this->flattenTemplateData[$var]) - ? $this->flattenTemplateData[$var] - : ""; - - return ($prefix == 'pagejs:') ? json_encode($message) : $message; - } elseif ($prefix == 'if:' || $prefix == 'else:' || $prefix == 'endif:' || $prefix == 'ifnot:') { - return ""; - } - - return ""; - } - - /** - * Process "include" control structure. This function is a callback for - * "preg_replace_callback" function. - * - * @param array $matches matches passed from "preg_replace_callback" - * function. - * @return string Contents of including file - */ - public function expandInclude($matches) - { - $template_name = $matches[1]; - - return $this->getTemplateFileContent($template_name); - } - - /** - * Converts all control structures to markup. - * - * @param string $text Source text - * @return string Markup with no control structures - */ - public function expandText($text) - { - $text = preg_replace_callback( - "/\\\${include:([\w\.]+)}/", - array($this, "expandInclude"), - $text - ); - - $text = preg_replace_callback( - self::IF_REGEXP, - array($this, "expandCondition"), - $text - ); - - return preg_replace_callback( - "/\\\${(\w+:)?([\w\.,]+)}/", - array($this, "expandVar"), - $text - ); - } - - /** - * Loads content of a template file. - * - * @param string $template_name Name of a template file to load. - * @return string Template file's content. - * - * @throws \RuntimeException If there is no such template file or the file - * is not readable. - */ - protected function getTemplateFileContent($template_name) - { - $full_file_path = MIBEW_FS_ROOT . '/' . $this->stylePath - . '/templates/' . $template_name . '.tpl'; - - if (!is_readable($full_file_path)) { - throw new \RuntimeException( - 'Cannot load template file: "' . $full_file_path . '"' - ); - } - - return file_get_contents($full_file_path); - } -} diff --git a/src/mibew/styles/dialogs/default/chat.css b/src/mibew/styles/dialogs/default/chat.css index 88fbaf76..69ee6e24 100644 --- a/src/mibew/styles/dialogs/default/chat.css +++ b/src/mibew/styles/dialogs/default/chat.css @@ -104,9 +104,8 @@ img { text-decoration: none; } #page-title { - position: absolute; - right: 14px; - bottom: 5px; + float: right; + margin-top: 5px; text-align: right; } /* ----------- */ diff --git a/src/mibew/styles/dialogs/default/templates/agentchat.tpl b/src/mibew/styles/dialogs/default/templates/agentchat.tpl deleted file mode 100644 index 9b720b3f..00000000 --- a/src/mibew/styles/dialogs/default/templates/agentchat.tpl +++ /dev/null @@ -1 +0,0 @@ -${include:chat.tpl} \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates/agentrochat.tpl b/src/mibew/styles/dialogs/default/templates/agentrochat.tpl deleted file mode 100644 index 9b720b3f..00000000 --- a/src/mibew/styles/dialogs/default/templates/agentrochat.tpl +++ /dev/null @@ -1 +0,0 @@ -${include:chat.tpl} \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates/chat.tpl b/src/mibew/styles/dialogs/default/templates/chat.tpl deleted file mode 100644 index e006481e..00000000 --- a/src/mibew/styles/dialogs/default/templates/chat.tpl +++ /dev/null @@ -1,119 +0,0 @@ - - - - - ${msg:chat.window.title.agent} - - - - ${page:additional_css} - - - - - - - - - - - - - - - - - - - - - ${page:additional_js} - - - - - - - -
- - \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates/error.tpl b/src/mibew/styles/dialogs/default/templates/error.tpl deleted file mode 100644 index 116df0ce..00000000 --- a/src/mibew/styles/dialogs/default/templates/error.tpl +++ /dev/null @@ -1,45 +0,0 @@ - - - - ${msg:chat.error_page.title} - - - - -
- -
-
-
-
- ${msg:chat.error_page.close} -
-
 
-
-
-
- ${harderrors} -
- - \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates/mail.tpl b/src/mibew/styles/dialogs/default/templates/mail.tpl deleted file mode 100644 index 850d415d..00000000 --- a/src/mibew/styles/dialogs/default/templates/mail.tpl +++ /dev/null @@ -1,56 +0,0 @@ - - - - ${msg:chat.window.title.user} - - - - - -
- - -
- -
-
-
-
- ${msg:mailthread.close} -
-
- ${msg:mailthread.enter_email} -   - ${msg:mailthread.perform} -
-
-
-
- ${if:errors} - ${errors} - ${endif:errors} -
-
- - diff --git a/src/mibew/styles/dialogs/default/templates/mailsent.tpl b/src/mibew/styles/dialogs/default/templates/mailsent.tpl deleted file mode 100644 index b978fff3..00000000 --- a/src/mibew/styles/dialogs/default/templates/mailsent.tpl +++ /dev/null @@ -1,45 +0,0 @@ - - - - ${msg:chat.window.title.user} - - - - -
- -
-
-
-
- ${msg:chat.mailthread.sent.close} -
-
${msg:chat.mailthread.sent.content,email}
-
-
-
-   -
- - \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates/nochat.tpl b/src/mibew/styles/dialogs/default/templates/nochat.tpl deleted file mode 100644 index 54a3317b..00000000 --- a/src/mibew/styles/dialogs/default/templates/nochat.tpl +++ /dev/null @@ -1,45 +0,0 @@ - - - - ${msg:chat.window.title.user} - - - - -
- -
-
-
-
- ${msg:page.chat.old_browser.close} -
-
${msg:page.chat.old_browser.problem}
-
-
-
- ${msg:page.chat.old_browser.list} -
- - \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates/redirect.tpl b/src/mibew/styles/dialogs/default/templates/redirect.tpl deleted file mode 100644 index 9696874c..00000000 --- a/src/mibew/styles/dialogs/default/templates/redirect.tpl +++ /dev/null @@ -1,62 +0,0 @@ - - - - ${msg:chat.window.title.agent} - - - - -
- -
-
-
-
- ${msg:chat.redirect.back} -
-
${msg:chat.redirect.choose}
-
-
-
-
- ${if:redirectToAgent} - ${msg:chat.redirect.operator} -
    - ${page:redirectToAgent} -
- ${endif:redirectToAgent} -
-
- ${if:redirectToGroup} - ${msg:chat.redirect.group} -
    - ${page:redirectToGroup} -
- ${endif:redirectToGroup} -
-
%nbsp;
-
${pagination}
-
- - \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates/redirected.tpl b/src/mibew/styles/dialogs/default/templates/redirected.tpl deleted file mode 100644 index de11039b..00000000 --- a/src/mibew/styles/dialogs/default/templates/redirected.tpl +++ /dev/null @@ -1,45 +0,0 @@ - - - - ${msg:chat.window.title.user} - - - - -
- -
-
-
-
- ${msg:chat.redirected.close} -
-
${page:message}
-
-
-
-   -
- - \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates_src/server_side/_layout.handlebars b/src/mibew/styles/dialogs/default/templates_src/server_side/_layout.handlebars new file mode 100644 index 00000000..2f5232bf --- /dev/null +++ b/src/mibew/styles/dialogs/default/templates_src/server_side/_layout.handlebars @@ -0,0 +1,56 @@ + + + + + {{#block "windowTitle"}}{{l10n "chat.window.title.user"}}{{/block}} + + + {{#block "head"}}{{/block}} + + + + {{#block "page"}} + {{! Logo block}} +
+ +
+ + {{! Header block. Contains page description and buttons}} +
+
+
+ {{#block "buttons"}}{{/block}} +
+
+ {{#block "message"}} {{/block}} +
+
+
+ + {{! Main content block}} +
+ {{#block "content"}} {{/block}} +
+ {{/block}} + + \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates_src/server_side/agentchat.handlebars b/src/mibew/styles/dialogs/default/templates_src/server_side/agentchat.handlebars new file mode 100644 index 00000000..1f928c3d --- /dev/null +++ b/src/mibew/styles/dialogs/default/templates_src/server_side/agentchat.handlebars @@ -0,0 +1 @@ +{{> chat}} \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates_src/server_side/agentrochat.handlebars b/src/mibew/styles/dialogs/default/templates_src/server_side/agentrochat.handlebars new file mode 100644 index 00000000..1f928c3d --- /dev/null +++ b/src/mibew/styles/dialogs/default/templates_src/server_side/agentrochat.handlebars @@ -0,0 +1 @@ +{{> chat}} \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates_src/server_side/chat.handlebars b/src/mibew/styles/dialogs/default/templates_src/server_side/chat.handlebars new file mode 100644 index 00000000..c24b263d --- /dev/null +++ b/src/mibew/styles/dialogs/default/templates_src/server_side/chat.handlebars @@ -0,0 +1,116 @@ +{{#extends "_layout"}} + {{#override "head"}} + + + {{additional_css}} + + + + + + + + + + + + + + + + + + + + + {{additional_js}} + + + + + + {{/override}} + + {{#override "page"}} +
+ {{/override}} +{{/extends}} \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates_src/server_side/error.handlebars b/src/mibew/styles/dialogs/default/templates_src/server_side/error.handlebars new file mode 100644 index 00000000..b415c0d3 --- /dev/null +++ b/src/mibew/styles/dialogs/default/templates_src/server_side/error.handlebars @@ -0,0 +1,23 @@ +{{#extends "_layout"}} + {{#override "windowTitle"}}{{l10n "chat.error_page.title"}}{{/override}} + + {{#override "pageTitle"}}{{l10n "chat.error_page.title"}}{{/override}} + + {{#override "buttons"}} + + {{l10n 'chat.error_page.close'}} + + {{/override}} + + {{#override "content"}} + {{#if errors}} + {{l10n "harderrors.header"}} + {{#each errors}} + {{l10n "errors.prefix"}} + {{{this}}} + {{l10n "errors.suffix"}} + {{/each}} + {{l10n "errors.footer"}} + {{/if}} + {{/override}} +{{/extends}} \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates_src/server_side/mail.handlebars b/src/mibew/styles/dialogs/default/templates_src/server_side/mail.handlebars new file mode 100644 index 00000000..52795c85 --- /dev/null +++ b/src/mibew/styles/dialogs/default/templates_src/server_side/mail.handlebars @@ -0,0 +1,34 @@ +{{#extends "_layout"}} + {{#override "pageTitle"}}{{l10n "mailthread.title"}}{{/override}} + + {{#override "buttons"}} + + {{l10n 'mailthread.close'}} + + {{/override}} + + {{#override "message"}} +
+ + + + + + {{l10n "mailthread.enter_email"}} +   + {{l10n "mailthread.perform"}} +
+ {{/override}} + + {{#override "content"}} + {{#if errors}} + {{l10n "errors.header"}} + {{#each errors}} + {{l10n "errors.prefix"}} + {{{this}}} + {{l10n "errors.suffix"}} + {{/each}} + {{l10n "errors.footer"}} + {{/if}} + {{/override}} +{{/extends}} \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates_src/server_side/mailsent.handlebars b/src/mibew/styles/dialogs/default/templates_src/server_side/mailsent.handlebars new file mode 100644 index 00000000..71b5a566 --- /dev/null +++ b/src/mibew/styles/dialogs/default/templates_src/server_side/mailsent.handlebars @@ -0,0 +1,11 @@ +{{#extends "_layout"}} + {{#override "pageTitle"}}{{l10n "chat.mailthread.sent.title"}}{{/override}} + + {{#override "buttons"}} + + {{l10n 'chat.mailthread.sent.close'}} + + {{/override}} + + {{#override "message"}}{{l10n "chat.mailthread.sent.content" email}}{{/override}} +{{/extends}} \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates_src/server_side/nochat.handlebars b/src/mibew/styles/dialogs/default/templates_src/server_side/nochat.handlebars new file mode 100644 index 00000000..5806383c --- /dev/null +++ b/src/mibew/styles/dialogs/default/templates_src/server_side/nochat.handlebars @@ -0,0 +1,15 @@ +{{#extends "_layout"}} + {{#override "pageTitle"}}{{l10n "chat.error_page.title"}}{{/override}} + + {{#override "buttons"}} + + {{l10n 'page.chat.old_browser.close'}} + + {{/override}} + + {{#override "message"}}{{l10n "page.chat.old_browser.problem"}}{{/override}} + + {{#override "content"}} + {{l10n "page.chat.old_browser.list"}} + {{/override}} +{{/extends}} \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates_src/server_side/redirect.handlebars b/src/mibew/styles/dialogs/default/templates_src/server_side/redirect.handlebars new file mode 100644 index 00000000..69585813 --- /dev/null +++ b/src/mibew/styles/dialogs/default/templates_src/server_side/redirect.handlebars @@ -0,0 +1,32 @@ +{{#extends "_layout"}} + {{#override "pageTitle"}}{{l10n "chat.redirect.title"}}{{/override}} + + {{#override "buttons"}} + + {{l10n 'chat.redirect.back'}} + + {{/override}} + + {{#override "message"}}{{l10n "chat.redirect.choose"}}{{/override}} + + {{#override "content"}} +
+ {{#if redirectToAgent}} + {{l10n "chat.redirect.operator"}} + + {{/if}} +
+
+ {{#if redirectToGroup}} + {{l10n "chat.redirect.group"}} + + {{/if}} +
+
 
+
{{generatePagination stylePath pagination}}
+ {{/override}} +{{/extends}} \ No newline at end of file diff --git a/src/mibew/styles/dialogs/default/templates_src/server_side/redirected.handlebars b/src/mibew/styles/dialogs/default/templates_src/server_side/redirected.handlebars new file mode 100644 index 00000000..77e5cc32 --- /dev/null +++ b/src/mibew/styles/dialogs/default/templates_src/server_side/redirected.handlebars @@ -0,0 +1,11 @@ +{{#extends "_layout"}} + {{#override "pageTitle"}}{{l10n "chat.redirected.title"}}{{/override}} + + {{#override "buttons"}} + + {{l10n 'chat.redirected.close'}} + + {{/override}} + + {{#override "message"}}{{message}}{{/override}} +{{/extends}} \ No newline at end of file