Commit 86f1a3e7 authored by John Fox Woland's avatar John Fox Woland
Browse files

+ mod_ilj: отложенное выполнение - параметр waitfor и тэг trigger

* ajax.js -> mod_ajax.js
* mod_ajax: зависимость от mod_head. От этого модуля должны зависеть все, которые используют ajax
+ mod_messageblock: отображение сообщений (особенностатусных: успех/ошибка)
* mod_feedback: зависимость от mod_ajax и mod_messageblock
v Вызов callback из ajax_post/get с параметрами null
parent 6082f8a9
#modmessageblock
{
display: none;
}
\ No newline at end of file
......@@ -13,8 +13,6 @@ function ajax_get (url, params, callback)
http.onreadystatechange = function() {
if (http.readyState == 4)
callback(http.responseText, http.status);
else
callback(null, null);
};
http.send(null);
......@@ -39,8 +37,6 @@ function ajax_post (url, params, callback)
http.onreadystatechange = function() {
if (http.readyState == 4)
callback(http.responseText, http.status);
else
callback(null, null);
};
http.send(params);
......
function modfeedback_send ()
{
modmessageblock_set();
var fields = Array('name', 'email', 'phone', 'subj', 'message');
var params = '';
for (var i in fields)
{
var field = document.getElementById('modfeedback_' + fields[i]);
if ((fields[i] == 'name' || fields[i] == 'email' || fields[i] == 'message') && (!field.value))
{
modmessageblock_set('Поля, отмеченные звёздочкой, обязательны для заполнения', 'errorblock');
return;
}
/*if (strlen(params))
params += '&';*/
params += field.id + '=' + encodeURIComponent(field.value) + '&';
}
/* FIX: заменить на переменную с урлом */
ajax_post("http://dev.fox.perm.ru/ajax/feedback", params, modfeedback_callback);
}
/* FIX: Зависимость от языка */
function modfeedback_callback (result, status)
{
if (status != 200)
{
modmessageblock_set('Ошибка протокола: ' + status, 'errorblock');
return;
}
var data = eval('(' + result + ')');
if (data.status == 'error')
{
modmessageblock_set('Ошибка обработчика: ' + data.message, 'errorblock');
return;
}
modmessageblock_set('Сообщение отправлено', 'successblock');
}
function modmessageblock_set (message, class)
{
var block = document.getElementById("modmessageblock");
var block_message = document.getElementById("modmessageblock_message");
if (!(block && block_message))
return;
if (message)
{
while (block_message.firstChild)
block_message.removeChild(block_message.firstChild);
modmessageblock_add (message);
block.className = class;
block.style.display = 'block';
}
else
block.style.display = 'none';
}
function modmessageblock_add (message)
{
var block_message = document.getElementById("modmessageblock_message");
block_message.appendChild(document.createTextNode(message));
}
\ No newline at end of file
<?php
// REQS: module:handler ; REG: true
// REQS: module:handler, module:head ; REG: true
class Ajax extends Module
{
private $mod_handler;
private $mod_handler, $mod_head;
public function reg ()
{
......@@ -11,12 +11,16 @@
public function reqs ()
{
return array(array("type" => "module", "value" => "handler"));
return array(array("type" => "module", "value" => "handler"),
array("type" => "module", "value" => "head"));
}
public function init ($initvals)
{
$this->mod_handler =& $initvals["mod_handler"];
$this->mod_head =& $initvals["mod_head"];
$this->mod_head->add("js", "/engine/js/mod_ajax.js");
return true;
}
......
<?php
// REQS: module:head, module:messageblock, module:ajax ; REG: false
class Feedback extends Module
{
private $mod_head;
public function reqs ()
{
return array(array("type" => "module", "value" => "head"),
array("type" => "module", "value" => "messageblock"),
array("type" => "module", "value" => "ajax"));
}
public function init ($initvals)
{
$this->mod_head =& $initvals["mod_head"];
$this->mod_head->add("js", "/engine/js/mod_feedback.js");
return true;
}
public function ajax ()
{
$res = array("status" => "error", "message" => "Функция не реализована", "response" => null);
$res = array("status" => "success");
return $res;
}
public function render ($params)
{
/* TODO: Привязать к языку */
return <<<HTML
<div id="mod_feedback">
<div id="modfeedback_status">
<div id="modfeedback_stmessage" class="blockmessage">
</div>
</div>
{"module":"messageblock"}
<label for="modfeedback_name">Имя<sup>*</sup></label>
<input id="modfeedback_name" class="modfeedback_contacts" /><br />
......
......@@ -7,7 +7,10 @@
/* Содержание переменной state - массив со следующими значениями:
- nesting = уровень вложенности парсера
- path = путь вложенности. Содержит все тэги, результат обработки которых парсится, в порядке вложения */
private $footnotes = array(), $state;
private $state;
/* footnotes не переинициализируется без тэга fns. Даже при нескольких вызовах render. Это не бага, это фича. */
private $footnotes = array();
private $blocks, $queue;
public function __construct ($state = null)
{
......@@ -67,6 +70,16 @@
return $GLOBALS[$tag["var"]];
}
/* Распарсить все тэги, которые ждали триггера */
private function tag_trigger ($tag)
{
$trigger = $tag["trigger"];
if ($this->queue[$trigger])
foreach ($this->queue[$trigger] as $block)
$this->tag($block, true);
return "";
}
/* Вызвать метод render у модуля
Должен существовать объект класса с указанным именем */
private function tag_module ($tag)
......@@ -79,78 +92,93 @@
return "<i>СООБЩЕНИЕ ПАРСЕРА: не найден модуль '<b>{$tag["module"]}</b>'</i>";
}
private function tag ($tag)
private function tag ($block, $trigger = false)
{
if (!$tag)
return "";
$json =& $this->blocks[$block];
if (strncmp($tag, "{*", 2) == 0)
return "";
if (!$json)
return;
if (strcmp($tag, "{}") == 0)
if (strncmp($json, "{*", 2) == 0)
{
$json = "";
return;
}
if (strcmp($json, "{}") == 0)
{
$json = "{";
return "{";
}
$json = json_decode($tag, true);
$tag = json_decode($json, true);
if (!$tag)
return;
if (!$json)
return $tag;
$keys = array_keys($json);
if ($tag["waitfor"] && !$trigger)
{
$trigger = $tag["waitfor"];
if (!$this->queue[$trigger])
$this->queue[$trigger] = array();
array_push($this->queue[$trigger], $block);
return;
}
$keys = array_keys($tag);
$func = "tag_{$keys[0]}";
/* FIX: Несколько извращённый способ передачи модулю состояния парсера и ид тэга */
$state = $this->state;
++$state["nesting"];
array_push($state["path"], $json);
array_push($state["path"], $tag);
if (!$json["params"])
$json["params"] = array();
if (!$tag["params"])
$tag["params"] = array();
$json["params"]["parser-state"] = $state;
$tag["params"]["parser-state"] = $state;
if (method_exists($this, $func))
{
$res = $this->$func($json);
if ($json["parse"])
$res = $this->$func($tag);
if ($tag["parse"])
{
$ilj = new Ilj($state);
$res = $ilj->render(array("tpl" => $res));
$ilj = null;
}
return $res;
$json = $res;
}
return $tag;
}
private function parse ($tpl)
{
$this->tags = false;
$this->tpl = $tpl;
$this->res = "";
$this->blocks = array();
$this->queue = array();
$nested = 0;
$string = false;
$escape = -2;
$block = 0;
for ($i = 0; $i < strlen($this->tpl); $i++)
{
$char = $this->tpl[$i];
if ($nested)
{
$tag .= $this->tpl[$i];
switch ($this->tpl[$i])
$this->blocks[$block] .= $char;
switch ($char)
{
case "}":
if (!$string)
--$nested;
if ($nested == 0)
{
$parsed = $this->tag($tag);
if (strcmp($parsed, $tag) != 0)
$this->tags = true;
$this->res .= $parsed;
$string = false;
}
$this->tag($block++);
break;
case "{":
if (!$string)
......@@ -165,14 +193,16 @@
break;
}
}
else if ($this->tpl[$i] == '{')
else if ($char == '{')
{
$tag = "{";
$nested++;
++$nested;
++$block;
$this->blocks[$block] .= $char;
}
else
$this->res .= $this->tpl[$i];
$this->blocks[$block] .= $char;
}
$this->res = implode("", $this->blocks);
return $this->res;
}
......
<?php
require_once("messageblock.php");
?>
\ No newline at end of file
<?php
// REQS: module:head ; REG: false
class Messageblock extends Module
{
private $mod_head;
public function reqs ()
{
return array(array("type" => "module", "value" => "head"));
}
public function init ($initvals)
{
$this->mod_head =& $initvals["mod_head"];
$this->mod_head->add("js", "/engine/js/mod_messageblock.js");
$this->mod_head->add("css", "/engine/css/mod_messageblock.css");
return true;
}
public function render ($params)
{
return <<<HTML
<div id="modmessageblock">
<div id="modmessageblock_message">
</div>
</div>
HTML;
}
}
?>
\ No newline at end of file
<?php
define ("DEBUG", 1);
// define ("DEBUG", 1);
if (defined("DEBUG") && DEBUG)
......
......@@ -18,7 +18,8 @@ div.successblock
/* opacity: 0.2; */
border: 1px solid green;
background-color: #809A80;
color: #a0ffa0;
/* color: #a0ffa0; */
color: green;
}
div.errorblock
......@@ -27,12 +28,8 @@ div.errorblock
/* opacity: 0.2; */
border: 1px solid red;
background-color: #B38080;
color: #ffa0a0;
}
div.blockmessage
{
margin: 10px 20px;
/* color: #ffa0a0; */
color: red;
}
#mod_feedback
......@@ -74,11 +71,14 @@ div.blockmessage
width: 30%;
}
#modfeedback_status
#modmessageblock
{
width: 95%;
margin-bottom: 10px;
display: none;
}
#modmessageblock_message
{
margin: 10px 20px;
}
#modfeedback_message
......
{"module":"dbpage","parse":true}
{"module":"feedback"}
\ No newline at end of file
{"module":"feedback","parse":true}
\ No newline at end of file
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
{"module":"head","parse":true}
{"module":"head","parse":true,"waitfor":"head"}
<link rel="stylesheet" type="text/css" href="/site/css/pioneer.css" />
<script language="javascript" type="text/javascript" src="/site/js/pioneer.js"></script>
</head>
......@@ -37,4 +37,5 @@
show_ie_notice();
</script>
</body>
</html>
\ No newline at end of file
</html>
{"trigger":"head"}
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment