diff --git a/src/admin/declare_list.php b/src/admin/declare_list.php
index 92a26e4..6ecc761 100644
--- a/src/admin/declare_list.php
+++ b/src/admin/declare_list.php
@@ -36,7 +36,11 @@ require_once dirname(dirname(__FILE__)) .'/application/bootstrap.php';
if (in_array($user['authlevel'], array(LEVEL_ADMIN, LEVEL_OPERATOR))) {
includeLang('admin');
if ($_GET['cmd'] == 'dele') {
- DeleteSelectedUser ( $_GET['user'] );
+ $player = new Wootook_Player_Model_Entity();
+ $player->load(intval($_GET['user']));
+ if ($player->getId()) {
+ $player->delete();
+ }
}
if ($_GET['cmd'] == 'sort') {
$TypeSort = $_GET['type'];
diff --git a/src/admin/userlist.php b/src/admin/userlist.php
index 232c53c..84fb74f 100644
--- a/src/admin/userlist.php
+++ b/src/admin/userlist.php
@@ -36,7 +36,11 @@ require_once dirname(dirname(__FILE__)) .'/application/bootstrap.php';
if (in_array($user['authlevel'], array(LEVEL_ADMIN, LEVEL_OPERATOR))) {
includeLang('admin');
if ($_GET['cmd'] == 'dele') {
- DeleteSelectedUser ( $_GET['user'] );
+ $player = new Wootook_Player_Model_Entity();
+ $player->load(intval($_GET['user']));
+ if ($player->getId()) {
+ $player->delete();
+ }
}
if ($_GET['cmd'] == 'sort') {
$TypeSort = $_GET['type'];
diff --git a/src/application/bootstrap.php b/src/application/bootstrap.php
index df0ffdc..1154c2a 100644
--- a/src/application/bootstrap.php
+++ b/src/application/bootstrap.php
@@ -126,7 +126,8 @@ if (!defined('DISABLE_IDENTITY_CHECK')) {
exit(0);
}
- if (!Wootook::getGameConfig('game/general/active') && !in_array($user->getData('authlevel'), array(LEVEL_ADMIN, LEVEL_MODERATOR, LEVEL_OPERATOR))) {
+ //var_dump(Wootook::getGameConfig('game/general/active'));
+ if (!Wootook::getGameConfig('game/general/active')/* && !in_array($user->getData('authlevel'), array(LEVEL_ADMIN, LEVEL_MODERATOR, LEVEL_OPERATOR))*/) {
$layout = new Wootook_Core_Model_Layout(Wootook_Core_Model_Layout::DOMAIN_FRONTEND);
$layout->load('message');
diff --git a/src/application/code/core/Legacies/Empire/Controller/DefenseController.php b/src/application/code/core/Legacies/Empire/Controller/DefenseController.php
index 8f3e7d0..b04103d 100644
--- a/src/application/code/core/Legacies/Empire/Controller/DefenseController.php
+++ b/src/application/code/core/Legacies/Empire/Controller/DefenseController.php
@@ -13,10 +13,6 @@ class Legacies_Empire_Controller_DefenseController
{
parent::preDispatch();
- if ($this->getResponse()->isDispatched()) {
- return;
- }
-
$planet = $this->getCurrentPlanet();
if ($planet->getElement(Legacies_Empire::ID_BUILDING_SHIPYARD) < 1) {
diff --git a/src/application/code/core/Legacies/Empire/Controller/ResearchLabController.php b/src/application/code/core/Legacies/Empire/Controller/ResearchLabController.php
index 06f78af..0650172 100644
--- a/src/application/code/core/Legacies/Empire/Controller/ResearchLabController.php
+++ b/src/application/code/core/Legacies/Empire/Controller/ResearchLabController.php
@@ -13,10 +13,6 @@ class Legacies_Empire_Controller_ResearchLabController
{
parent::preDispatch();
- if ($this->getResponse()->isDispatched()) {
- return;
- }
-
$planet = $this->getCurrentPlanet();
if ($planet->getElement(Legacies_Empire::ID_BUILDING_SHIPYARD) < 1) {
diff --git a/src/application/code/core/Legacies/Empire/Controller/ShipyardController.php b/src/application/code/core/Legacies/Empire/Controller/ShipyardController.php
index 20d8724..ebf7b90 100644
--- a/src/application/code/core/Legacies/Empire/Controller/ShipyardController.php
+++ b/src/application/code/core/Legacies/Empire/Controller/ShipyardController.php
@@ -13,10 +13,6 @@ class Legacies_Empire_Controller_ShipyardController
{
parent::preDispatch();
- if ($this->getResponse()->isDispatched() || $this->getResponse()->isRedirect()) {
- return;
- }
-
$planet = $this->getCurrentPlanet();
if ($planet->getElement(Legacies_Empire::ID_BUILDING_SHIPYARD) < 1) {
diff --git a/src/application/code/core/Legacies/Empire/install/mysql5/install-1.5.0.php b/src/application/code/core/Legacies/Empire/install/mysql5/install-1.5.0.php
index 53d982c..c4fc32e 100644
--- a/src/application/code/core/Legacies/Empire/install/mysql5/install-1.5.0.php
+++ b/src/application/code/core/Legacies/Empire/install/mysql5/install-1.5.0.php
@@ -160,14 +160,13 @@ CREATE TABLE IF NOT EXISTS {$this->getTableName('fleets')} (
`fleet_end_system` SMALLINT UNSIGNED NOT NULL,
`fleet_end_planet` TINYINT UNSIGNED NOT NULL,
`fleet_end_type` TINYINT UNSIGNED NOT NULL,
- `fleet_taget_owner` BIGINT UNSIGNED NOT NULL,
+ `fleet_target_owner` BIGINT UNSIGNED NOT NULL,
`fleet_resource_metal` DECIMAL(65,0) NOT NULL DEFAULT 0,
`fleet_resource_crystal` DECIMAL(65,0) NOT NULL DEFAULT 0,
`fleet_resource_deuterium` DECIMAL(65,0) NOT NULL DEFAULT 0,
- `fleet_target_owner` BIGINT UNSIGNED NOT NULL,
`fleet_group` BIGINT UNSIGNED NOT NULL,
`fleet_mess` BIGINT UNSIGNED NOT NULL,
- `start_time` INT,
+ `start_time` TIMESTAMP NOT NULL,
PRIMARY KEY (`fleet_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SQL_EOF;
@@ -286,7 +285,7 @@ CREATE TABLE IF NOT EXISTS {$this->getTableName('planets')} (
`planet` TINYINT UNSIGNED NOT NULL,
`last_update` DATETIME NOT NULL,
`planet_type` TINYINT UNSIGNED NOT NULL,
- `destruyed` BOOL NOT NULL DEFAULT FALSE,
+ `destruyed` INT UNSIGNED NOT NULL DEFAULT FALSE,
`b_building` DATETIME NOT NULL,
`b_building_id` TEXT NOT NULL,
`b_tech` DATETIME NOT NULL,
diff --git a/src/application/code/core/Legacies/Stats/Block/View.php b/src/application/code/core/Legacies/Stats/Block/View.php
index f1a830b..d966318 100644
--- a/src/application/code/core/Legacies/Stats/Block/View.php
+++ b/src/application/code/core/Legacies/Stats/Block/View.php
@@ -22,7 +22,7 @@ class Legacies_Stats_Block_View
return $this->_statData;
}
- public function getPlayerStatData($type)
+ public function getPlayerStatData()
{
if (empty($this->_statData)) {
$playerId = Wootook_Player_Model_Session::getSingleton()->getPlayerId();
@@ -31,7 +31,6 @@ class Legacies_Stats_Block_View
$statement = $readAdapter->select()
->from($readAdapter->getTable('statpoints'))
- ->where('stat_type', $type)
->where('id_owner', $playerId)
->prepare()
;
diff --git a/src/application/code/core/Wootook.php b/src/application/code/core/Wootook.php
index a7dc9ca..e427d1d 100644
--- a/src/application/code/core/Wootook.php
+++ b/src/application/code/core/Wootook.php
@@ -189,6 +189,11 @@ class Wootook
return Wootook_Core_Model_Session::factory($namespace);
}
+ /**
+ * @static
+ * @param string|null $locale
+ * @return Wootook_Core_Model_Translator
+ */
public static function getTranslator($locale = null)
{
if ($locale === null) {
@@ -381,7 +386,7 @@ class Wootook
}
try {
- $adapter = Wootook_Core_Database_ConnectionManager::getSingleton()
+ $adapter = Wootook_Core_Database_ConnectionManager::getSingleton()
->getConnection('core_read');
} catch (Wootook_Core_Exception_Database_AdapterError $e) {
self::$isInstalled = false;
@@ -394,24 +399,21 @@ class Wootook
switch ($type) {
case 'website':
$select->where(new Wootook_Core_Database_Sql_Placeholder_Expression('website_id = :website_id', array('website_id' => $model->getId())));
- $statement = $adapter->prepare($select);
- $statement->execute();
break;
case 'game':
$select->where(new Wootook_Core_Database_Sql_Placeholder_Expression('game_id = :game_id', array('game_id' => $model->getId())));
- $statement = $adapter->prepare($select);
- $statement->execute();
break;
default:
$select->where('website_id', 0);
$select->where('game_id', 0);
- $statement = $adapter->prepare($select);
- $statement->execute();
break;
}
+ $statement = $select->prepare();
+ $statement->execute();
+
foreach ($statement as $row) {
$config->setConfig($row['config_path'], $row['config_value']);
}
@@ -598,6 +600,7 @@ class Wootook
if (self::$_config === null) {
self::loadConfig();
}
+
if (!self::$isInstalled) {
if (isset(self::$_config['default'])) {
self::$_gameConfigs[Wootook_Core_Model_Game::DEFAULT_CODE] = clone self::$_config['default'];
@@ -781,6 +784,7 @@ class Wootook
$queryParams = array();
if (isset($params['_query'])) {
$queryParams = $params['_query'];
+ unset($params['_query']);
}
$serializedParams = array();
diff --git a/src/application/code/core/Wootook/Core/App.php b/src/application/code/core/Wootook/Core/App.php
index 6bf2c02..e21368a 100644
--- a/src/application/code/core/Wootook/Core/App.php
+++ b/src/application/code/core/Wootook/Core/App.php
@@ -112,44 +112,44 @@ class Wootook_Core_App
return $this->_newInstance($className, $constructorParams);
}
- public function getModel($module, $class)
+ public function getModel($module, $class, Array $constructorParams = array())
{
$className = $this->_resolveClassType($this->_globalConfig->models, $module, $class);
return $this->_newInstance($className, $constructorParams);
}
- public function getResource($module, $class)
+ public function getResource($module, $class, Array $constructorParams = array())
{
$className = $this->_resolveClassType($this->_globalConfig->resources, $module, $class);
return $this->_newInstance($className, $constructorParams);
}
- public function getHelper($module, $class)
+ public function getHelper($module, $class, Array $constructorParams = array())
{
$className = $this->_resolveClassType($this->_globalConfig->helpers, $module, $class);
return $this->_newInstance($className, $constructorParams);
}
- public function getBlockSingleton($module, $class)
+ public function getBlockSingleton($module, $class, Array $constructorParams = array())
{
}
- public function getModelSingleton($module, $class)
+ public function getModelSingleton($module, $class, Array $constructorParams = array())
{
}
- public function getResourceSingleton($module, $class)
+ public function getResourceSingleton($module, $class, Array $constructorParams = array())
{
}
- public function getHelperSingleton($module, $class)
+ public function getHelperSingleton($module, $class, Array $constructorParams = array())
{
}
-}
\ No newline at end of file
+}
diff --git a/src/application/code/core/Wootook/Core/Block/Html/Page.php b/src/application/code/core/Wootook/Core/Block/Html/Page.php
index b2879f8..12c7775 100644
--- a/src/application/code/core/Wootook/Core/Block/Html/Page.php
+++ b/src/application/code/core/Wootook/Core/Block/Html/Page.php
@@ -16,4 +16,4 @@ class Wootook_Core_Block_Html_Page
return $this;
}
-}
\ No newline at end of file
+}
diff --git a/src/application/code/core/Wootook/Core/Config/Node.php b/src/application/code/core/Wootook/Core/Config/Node.php
index c35b58b..309c1cf 100644
--- a/src/application/code/core/Wootook/Core/Config/Node.php
+++ b/src/application/code/core/Wootook/Core/Config/Node.php
@@ -1,7 +1,7 @@
_children[$offset]);
}
}
-}
\ No newline at end of file
+
+ public function valid()
+ {
+ return key($this->_children);
+ }
+
+ public function next()
+ {
+ next($this->_children);
+ }
+
+ public function current()
+ {
+ return current($this->_children);
+ }
+
+ public function rewind()
+ {
+ reset($this->_children);
+ }
+
+ public function key()
+ {
+ return key($this->_children);
+ }
+
+ public function count()
+ {
+ return count($this->_children);
+ }
+}
diff --git a/src/application/code/core/Wootook/Core/Database/Adapter/Adapter.php b/src/application/code/core/Wootook/Core/Database/Adapter/Adapter.php
index c101d6a..41d8bdb 100644
--- a/src/application/code/core/Wootook/Core/Database/Adapter/Adapter.php
+++ b/src/application/code/core/Wootook/Core/Database/Adapter/Adapter.php
@@ -11,6 +11,11 @@ abstract class Wootook_Core_Database_Adapter_Adapter
return $this->_handler;
}
+ public function getDataMapper()
+ {
+ return new Wootook_Core_Database_Orm_DataMapper();
+ }
+
/**
*
* @param string $prefix
diff --git a/src/application/code/core/Wootook/Core/Database/Orm/DataMapper/DateTime.php b/src/application/code/core/Wootook/Core/Database/Orm/DataMapper/DateTime.php
index 4217302..1e37d12 100644
--- a/src/application/code/core/Wootook/Core/Database/Orm/DataMapper/DateTime.php
+++ b/src/application/code/core/Wootook/Core/Database/Orm/DataMapper/DateTime.php
@@ -35,4 +35,4 @@ class Wootook_Core_Database_Orm_DataMapper_DateTime
{
return new Wootook_Core_DateTime($value, $this->getFormat());
}
-}
\ No newline at end of file
+}
diff --git a/src/application/code/core/Wootook/Core/Database/Orm/DataMapper/FieldMapper.php b/src/application/code/core/Wootook/Core/Database/Orm/DataMapper/FieldMapper.php
index 6161033..a7e989c 100644
--- a/src/application/code/core/Wootook/Core/Database/Orm/DataMapper/FieldMapper.php
+++ b/src/application/code/core/Wootook/Core/Database/Orm/DataMapper/FieldMapper.php
@@ -4,7 +4,7 @@ abstract class Wootook_Core_Database_Orm_DataMapper_FieldMapper
{
protected $_mapper = null;
- public function __construct(Wootook_Core_Database_Orm_DataMapper $mapper)
+ public function __construct(Wootook_Core_Database_Orm_DataMapper $mapper = null)
{
$this->_mapper = $mapper;
}
@@ -12,4 +12,4 @@ abstract class Wootook_Core_Database_Orm_DataMapper_FieldMapper
abstract public function encode($value);
abstract public function decode($value);
-}
\ No newline at end of file
+}
diff --git a/src/application/code/core/Wootook/Core/Database/Sql/Delete.php b/src/application/code/core/Wootook/Core/Database/Sql/Delete.php
index 9a905e8..84d8e37 100644
--- a/src/application/code/core/Wootook/Core/Database/Sql/Delete.php
+++ b/src/application/code/core/Wootook/Core/Database/Sql/Delete.php
@@ -74,8 +74,9 @@ class Wootook_Core_Database_Sql_Delete
public function renderFrom()
{
if ($this->_parts[self::FROM]['schema'] !== null) {
- return "DELETE FROM {$this->getConnection()->quoteIdentifier($this->_parts[self::FROM]['schema'])}.{$this->getConnection()->quoteIdentifier($this->_parts[self::FROM]['schema'])}";
+ return "DELETE FROM {$this->getConnection()->quoteIdentifier($this->_parts[self::FROM]['schema'])}.{$this->getConnection()->quoteIdentifier($this->_parts[self::FROM]['table'])}";
}
+ return "DELETE FROM {$this->getConnection()->quoteIdentifier($this->_parts[self::FROM]['table'])}";
}
public function render()
diff --git a/src/application/code/core/Wootook/Core/Database/Sql/DmlFilterableQuery.php b/src/application/code/core/Wootook/Core/Database/Sql/DmlFilterableQuery.php
index 565143a..6ca3730 100644
--- a/src/application/code/core/Wootook/Core/Database/Sql/DmlFilterableQuery.php
+++ b/src/application/code/core/Wootook/Core/Database/Sql/DmlFilterableQuery.php
@@ -183,7 +183,7 @@ abstract class Wootook_Core_Database_Sql_DmlFilterableQuery
$dateValues = array();
if (isset($value['from'])) {
if ($value['from'] instanceof Wootook_Core_DateTime) {
- $dateValues['from'] = "{$adapter->quoteIdentifier($field)} >= {$adapter->quote($this->getDataMapper()->load('DateTime')->encode($value['from']))}";
+ $dateValues['from'] = "{$adapter->quoteIdentifier($field)} >= {$adapter->quote($this->getConnection()->getDataMapper()->load('DateTime')->encode($value['from']))}";
} else if (is_string($value['from'])) {
$dateValues['from'] = "{$adapter->quoteIdentifier($field)} >= {$adapter->quote($value['from'])}";
} else if (is_numeric($value['from'])) {
@@ -192,7 +192,7 @@ abstract class Wootook_Core_Database_Sql_DmlFilterableQuery
}
if (isset($value['to'])) {
if ($value['to'] instanceof Wootook_Core_DateTime) {
- $dateValues['to'] = "{$adapter->quoteIdentifier($field)} <= {$adapter->quote($this->getDataMapper()->load('DateTime')->encode($value['to']))}";
+ $dateValues['to'] = "{$adapter->quoteIdentifier($field)} <= {$adapter->quote($this->getConnection()->getDataMapper()->load('DateTime')->encode($value['to']))}";
} else if (is_string($value['to'])) {
$dateValues['to'] = "{$adapter->quoteIdentifier($field)} <= {$adapter->quote($value['to'])}";
} else if (is_numeric($value['to'])) {
diff --git a/src/application/code/core/Wootook/Core/Database/Sql/Placeholder/Variable.php b/src/application/code/core/Wootook/Core/Database/Sql/Placeholder/Variable.php
new file mode 100644
index 0000000..04e4217
--- /dev/null
+++ b/src/application/code/core/Wootook/Core/Database/Sql/Placeholder/Variable.php
@@ -0,0 +1,20 @@
+_paramName = $paramName;
+ $this->_paramType = $type;
+ }
+
+ public function __toString()
+ {
+ return ':' . $this->_paramName;
+ }
+}
diff --git a/src/application/code/core/Wootook/Core/Database/Statement/Pdo/Mysql.php b/src/application/code/core/Wootook/Core/Database/Statement/Pdo/Mysql.php
index 675fa7e..33b243d 100644
--- a/src/application/code/core/Wootook/Core/Database/Statement/Pdo/Mysql.php
+++ b/src/application/code/core/Wootook/Core/Database/Statement/Pdo/Mysql.php
@@ -3,6 +3,9 @@
class Wootook_Core_Database_Statement_Pdo_Mysql
extends Wootook_Core_Database_Statement_Statement
{
+ /**
+ * @var PDOStatement
+ */
protected $_handler = null;
protected $_query = null;
@@ -114,8 +117,20 @@ class Wootook_Core_Database_Statement_Pdo_Mysql
*/
public function fetchAll($style = null, $col = null)
{
- throw new Wootook_Core_Exception_Database_StatementError($this, 'Unimplemented', null, $e);
- return array();
+ try {
+ if ($style !== null) {
+ if ($col !== null) {
+ $result = $this->_handler->fetchAll($style, $col);
+ } else {
+ $result = $this->_handler->fetchAll($style);
+ }
+ } else {
+ $result = $this->_handler->fetchAll($style);
+ }
+ } catch (PDOException $e) {
+ throw new Wootook_Core_Exception_Database_StatementError($this, $e->getMessage(), null, $e);
+ }
+ return $result;
}
/**
diff --git a/src/application/code/core/Wootook/Core/Database/Statement/Statement.php b/src/application/code/core/Wootook/Core/Database/Statement/Statement.php
index a9b2fef..9e8875f 100644
--- a/src/application/code/core/Wootook/Core/Database/Statement/Statement.php
+++ b/src/application/code/core/Wootook/Core/Database/Statement/Statement.php
@@ -100,7 +100,9 @@ abstract class Wootook_Core_Database_Statement_Statement
}
$data = $this->fetch(Wootook_Core_Database_ConnectionManager::FETCH_ASSOC);
- $object->getDataMapper()->decode($object, $data);
+ if ($data !== false) {
+ $object->getDataMapper()->decode($object, $data);
+ }
return $object;
}
@@ -202,11 +204,12 @@ abstract class Wootook_Core_Database_Statement_Statement
public function rewind()
{
- return $this->_currentIndex = 0;
+ return $this->_currentIndex;
}
public function valid()
{
- return $this->_currentRow !== null;
+ $rows = $this->rowCount();
+ return $rows > 0 && $this->_currentIndex <= $rows;
}
}
diff --git a/src/application/code/core/Wootook/Core/DateTime.php b/src/application/code/core/Wootook/Core/DateTime.php
index 3f201dc..06a6d79 100644
--- a/src/application/code/core/Wootook/Core/DateTime.php
+++ b/src/application/code/core/Wootook/Core/DateTime.php
@@ -143,14 +143,14 @@ class Wootook_Core_DateTime
case self::SECOND:
$current = getdate($this->_datetime);
if ($type === self::OPERATOR_ADD) {
- $parts = $current[$part] += $value;
+ $current[$part] += $value;
} else if ($type === self::OPERATOR_SUB) {
- $parts = $current[$part] -= $value;
+ $current[$part] -= $value;
} else if ($type === self::OPERATOR_SET) {
- $parts = $current[$part] = $value;
+ $current[$part] = $value;
}
- $this->_datetime = $this->_mktime($parts);
+ $this->_datetime = $this->_mktime($current);
break;
case self::TIMESTAMP:
@@ -173,6 +173,22 @@ class Wootook_Core_DateTime
return $this->_datetime - $date->_datetime;
}
+ public function isEarlier(self $date = null)
+ {
+ if ($date === null) {
+ $date = new self();
+ }
+ return (bool) ($this->diff($date) > 0);
+ }
+
+ public function isLater(self $date = null)
+ {
+ if ($date === null) {
+ $date = new self();
+ }
+ return (bool) ($this->diff($date) < 0);
+ }
+
protected function _mktime(Array $parts)
{
return mktime($parts[self::HOUR], $parts[self::MINUTE], $parts[self::SECOND],
diff --git a/src/application/code/core/Wootook/Core/Email.php b/src/application/code/core/Wootook/Core/Email.php
index 0dfcba4..e94331e 100644
--- a/src/application/code/core/Wootook/Core/Email.php
+++ b/src/application/code/core/Wootook/Core/Email.php
@@ -2,30 +2,49 @@
class Wootook_Core_Email
{
- protected static $_defaultHeadrs = array(
- );
+ /**
+ * @var Wootook_Core_Email_Transport_Transport
+ */
+ protected $_transport = null;
- protected $_headers = array();
+ public function __construct(Wootook_Core_Email_Transport_Transport $transport = null)
+ {
+ if ($transport === null) {
+ $transport = new Wootook_Core_Email_Transport_Sendmail();
+ }
+ $this->setTransport($transport);
+ }
+
+ public function setTransport(Wootook_Core_Email_Transport_Transport $transport)
+ {
+ $this->_transport = $transport;
+ }
+
+ /**
+ * @return Wootook_Core_Email_Transport_Transport
+ */
+ public function getTransport()
+ {
+ return $this->_transport;
+ }
public function send($to, $from, $subject, $body, Array $headers = array())
{
- $this->_prepareHeaders($headers);
- }
-
- public function setHeader($name, $value)
- {
- $this->_headers[$name] = $value;
- }
-
- protected function _prepareHeaders($headers)
- {
- foreach ($headers as $name => $value) {
- $this->setHeader($name, $value);
+ try {
+ $this->_transport
+ ->addRecipient($to)
+ ->setFrom($from)
+ ->setSubject($subject)
+ ->addPart(new Wootook_Core_Email_Part_Part($body))
+ ->addHeaders($headers)
+ ->connect()
+ ->send()
+ ;
+ } catch (Wootook_Core_Exception_RuntimeException $e) {
+ throw new Wootook_Core_Exception_RuntimeException('Could not send mail.', null, $e);
}
- $this->addHeader('X-Mailer', 'PHP/' . PHP_VERSION . ' Wootook/' . VERSION);
- $this->addHeader('Content-Transfer-Encoding', '7bit');
- $this->addHeader('Content-Type', 'text/plain; charset=utf-8');
+ $this->_transport->disconnect();
return $this;
}
diff --git a/src/application/code/core/Wootook/Core/Email/Part/Part.php b/src/application/code/core/Wootook/Core/Email/Part/Part.php
new file mode 100644
index 0000000..563a051
--- /dev/null
+++ b/src/application/code/core/Wootook/Core/Email/Part/Part.php
@@ -0,0 +1,16 @@
+_content = $content;
+ }
+
+ public function render()
+ {
+ return $this->_content;
+ }
+}
\ No newline at end of file
diff --git a/src/application/code/core/Wootook/Core/Email/Transport/Sendmail.php b/src/application/code/core/Wootook/Core/Email/Transport/Sendmail.php
new file mode 100644
index 0000000..165247a
--- /dev/null
+++ b/src/application/code/core/Wootook/Core/Email/Transport/Sendmail.php
@@ -0,0 +1,162 @@
+_prepareHeaders();
+ }
+
+ public function setFrom($from)
+ {
+ if (is_array($from)) {
+ $this->_from = sprintf('"%s" <%s>', $this->_formatUnicode(current($from)), key($from));
+ } else {
+ $this->_from = $from;
+ }
+ return $this;
+ }
+
+ public function clearFrom()
+ {
+ $this->_from = null;
+
+ return $this;
+ }
+
+ public function addRecipient($recipient)
+ {
+ if (is_array($recipient)) {
+ foreach ($recipient as $email => $name) {
+ $this->_recipients[] = sprintf('"%s" <%s>', $this->_formatUnicode($name), $email);
+ }
+ } else {
+ $this->_recipients[] = $recipient;
+ }
+ return $this;
+ }
+
+ public function clearRecipients()
+ {
+ $this->_recipients = array();
+
+ return $this;
+ }
+
+ public function setSubject($subject)
+ {
+ $this->_subject = $this->_formatUnicode($subject);
+
+ return $this;
+ }
+
+ public function clearSubject()
+ {
+ $this->_subject = null;
+
+ return $this;
+ }
+
+ public function addHeader($name, $value)
+ {
+ $this->_headers[$name] = $value;
+
+ return $this;
+ }
+
+ public function addHeaders($headers)
+ {
+ foreach ($headers as $name => $value) {
+ $this->_headers[$name] = $value;
+ }
+
+ return $this;
+ }
+
+ public function clearHeaders()
+ {
+ $this->_headers = array();
+
+ return $this;
+ }
+
+ public function addPart(Wootook_Core_Email_Part_Part $part)
+ {
+ $this->_parts[] = $part;
+
+ return $this;
+ }
+
+ public function clearParts()
+ {
+ $this->_parts = array();
+
+ return $this;
+ }
+
+ protected function _formatUnicode($string)
+ {
+ return '=?UTF-8?B?' . base64_encode($string) . '?=';
+ }
+
+ protected function _prepareHeaders(Array $headers = array())
+ {
+ $this->addHeader('MIME-Version', '1.0');
+
+ foreach ($headers as $name => $value) {
+ $this->setHeader($name, $value);
+ }
+
+ $this->addHeader('X-Mailer', 'PHP/' . PHP_VERSION . ' Wootook/' . VERSION);
+ $this->addHeader('Content-Transfer-Encoding', '8bit');
+ $this->addHeader('Content-Type', 'text/plain; charset=utf-8; format=flowed');
+
+ return $this;
+ }
+
+ public function reset()
+ {
+ $this->clearHeaders();
+ $this->clearParts();
+ $this->clearFrom();
+ $this->clearRecipients();
+ $this->clearSubject();
+
+ return $this;
+ }
+
+ public function connect()
+ {
+ return $this;
+ }
+
+ public function disconnect()
+ {
+ return $this;
+ }
+
+ public function send()
+ {
+ $content = '';
+ foreach ($this->_parts as $part) {
+ $content .= $part->render();
+ }
+
+ $this->addHeader('To', implode(',', $this->_recipients));
+
+ if (!mail(implode(',', $this->_recipients), $this->_subject, $content, implode("\r\n", $this->_headers))) {
+ throw new Wootook_Core_Exception_RuntimeException('Could not send mail.');
+ }
+
+ return $this;
+ }
+}
\ No newline at end of file
diff --git a/src/application/code/core/Wootook/Core/Email/Transport/Transport.php b/src/application/code/core/Wootook/Core/Email/Transport/Transport.php
new file mode 100644
index 0000000..fed059e
--- /dev/null
+++ b/src/application/code/core/Wootook/Core/Email/Transport/Transport.php
@@ -0,0 +1,22 @@
+_errors[] = array(
@@ -77,7 +80,8 @@ class Wootook_Core_ErrorProfiler
'message' => $errstr,
'file' => $errfile,
'line' => $errline,
- 'context' => $errcontext
+ 'context' => $errcontext,
+ 'trace' => $trace
);
break;
@@ -89,7 +93,8 @@ class Wootook_Core_ErrorProfiler
'message' => $errstr,
'file' => $errfile,
'line' => $errline,
- 'context' => $errcontext
+ 'context' => $errcontext,
+ 'trace' => $trace
);
break;
@@ -101,7 +106,8 @@ class Wootook_Core_ErrorProfiler
'message' => $errstr,
'file' => $errfile,
'line' => $errline,
- 'context' => $errcontext
+ 'context' => $errcontext,
+ 'trace' => $trace
);
break;
@@ -116,7 +122,8 @@ class Wootook_Core_ErrorProfiler
'message' => $errstr,
'file' => $errfile,
'line' => $errline,
- 'context' => $errcontext
+ 'context' => $errcontext,
+ 'trace' => $trace
);
break;
}
@@ -172,10 +179,87 @@ Type: {$code}
Message: {$error['message']}
File: {$error['file']}
Line: {$error['line']}
-\n
+
+{$this->_renderBacktrace($error['trace'])}
+
ERROR_EOF;
}
+ protected function _renderBacktrace(Array $traces)
+ {
+ $output = '
';
+ foreach (array_slice($traces, 1) as $key => $trace) {
+ if (preg_match('#^(include|require)(_once)?$#', $trace['function'])) {
+ $output .= sprintf("#%d %s(%s) called at [%s:%s]\n",
+ $key, $trace['function'], $trace['args'][0], $trace['file'], $trace['line']);
+ } else if (!isset($trace['file']) || !isset($trace['line'])) {
+ if (isset($trace['class'])) {
+ $output .= sprintf("#%d Internal function %s%s%s(%s)\n",
+ $key, $trace['class'], $trace['type'], $trace['function'], implode(', ', $this->_formatArgs($trace['args'])));
+ } else {
+ $output .= sprintf("#%d Internal function %s(%s)\n",
+ $key, $trace['function'], implode(', ', $this->_formatArgs($trace['args'])));
+ }
+ } else {
+ if (isset($trace['class'])) {
+ $output .= sprintf("#%d %s%s%s(%s) called at [%s:%s]\n",
+ $key, $trace['class'], $trace['type'], $trace['function'], implode(', ', $this->_formatArgs($trace['args'])), $trace['file'], $trace['line']);
+ } else {
+ $output .= sprintf("#%d %s(%s) called at [%s:%s]\n",
+ $key, $trace['function'], implode(', ', $this->_formatArgs($trace['args'])), $trace['file'], $trace['line']);
+ }
+ }
+ }
+ return $output . '';
+ }
+
+ private function _formatArgs($args)
+ {
+ $argumentList = array();
+ foreach ($args as $argument) {
+ if (is_object($argument)) {
+ $argumentList[] = get_class($argument);
+ } else if (is_array($argument)) {
+ $keys = array_keys($argument);
+ $values = $this->_formatArgs($argument);
+
+ $length = count($values);
+ $output = array();
+ for ($index = 0; $index < $length; $index++) {
+ $output[] = sprintf('[%s] => %s', $keys[$index], $values[$index]);
+ }
+
+ $argumentList[] = '[' . implode(', ', $output) . ']';
+ } else {
+ $argumentList[] = var_export($argument, true);
+ }
+ }
+
+ return $argumentList;
+ }
+
+ protected function _renderConfig(Wootook_Core_Config_Node $config, $level = 0)
+ {
+ $output = '';
+ foreach ($config as $key => $value) {
+ $output .= sprintf('- ', $level);
+ $output .= sprintf('%s', $key);
+ if ($value instanceof Wootook_Core_Config_Node) {
+ if (count($value) > 0) {
+ $output .= $this->_renderConfig($value, $level + 1);
+ } else {
+ $output .= 'Empty node';
+ }
+ } else {
+ $output .= '
' . htmlspecialchars(var_export($value, true), ENT_QUOTES, 'UTF-8') . '';
+ }
+ $output .= ' ';
+ }
+ $output .= '
';
+
+ return $output;
+ }
+
public function shutdownManager()
{
if ($this->_mute === true) {
@@ -185,66 +269,140 @@ ERROR_EOF;
$index = 0;
echo '';
echo '
Debug profiler
';
- if (count($this->_errors) <= 0 && count($this->_warnings) <= 0 &&
- count($this->_notices) <= 0 && count($this->_otherErrors) <= 0 &&
- count($this->_exceptions) <= 0) {
- echo '
Error profiler was empty.
';
- } else {
- echo '
';
- foreach ($this->_errors as $error) {
- ++$index;
- echo '
Message #' . $index . '
';
- echo '
';
- echo $this->_renderError($index, $error);
- echo '
';
- }
- foreach ($this->_warnings as $error) {
+ echo '
';
+ echo '
';
+ echo '
Errors (' . count($this->_errors) . ')
';
+ echo '
';
+ foreach ($this->_errors as $error) {
+ ++$index;
+ echo '
Message #' . $index . '
';
+ echo '
';
+ echo $this->_renderError($index, $error);
+ echo '
';
+ }
+ echo '
';
+ echo '
Warnings (' . count($this->_warnings) . ')
';
+ echo '
';
+ foreach ($this->_warnings as $error) {
+ ++$index;
+ echo '
Message #' . $index . '
';
+ echo '
';
+ echo $this->_renderError($index, $error);
+ echo '
';
+ }
+ echo '
';
+ echo '
Notices (' . count($this->_notices) . ')
';
+ echo '
';
+ foreach ($this->_notices as $error) {
+ ++$index;
+ echo '
Message #' . $index . '
';
+ echo '
';
+ echo $this->_renderError($index, $error);
+ echo '
';
+ }
+ echo '
';
+ foreach ($this->_otherErrors as $errno => $errorList) {
+ echo '
Other error errno#' . $errno . ' (' . count($errorList) . ')
';
+ echo '
';
+ foreach ($errorList as $error) {
++$index;
echo '
Message #' . $index . '
';
echo '
';
echo $this->_renderError($index, $error);
echo '';
}
- foreach ($this->_notices as $error) {
- ++$index;
- echo '
Message #' . $index . '
';
- echo '
';
- echo $this->_renderError($index, $error);
- echo '
';
- }
- foreach ($this->_otherErrors as $errorList) {
- foreach ($errorList as $error) {
- ++$index;
- echo '
Message #' . $index . '
';
- echo '
';
- echo $this->_renderError($index, $error);
- echo '
';
- }
- }
- foreach ($this->_exceptions as $exception) {
- ++$index;
- echo '
Message #' . $index . '
';
- echo '
';
- echo $exception->getMessage() . PHP_EOL;
- echo $exception->getTraceAsString() . PHP_EOL;
- echo '
';
+ echo '
';
+ }
+ echo '
Exceptions (' . count($this->_exceptions) . ')
';
+ echo '
';
+ foreach ($this->_exceptions as $exception) {
+ ++$index;
+ echo '
Message #' . $index . '
';
+ echo '
';
+ echo $exception->getMessage() . PHP_EOL;
+ echo $exception->getTraceAsString() . PHP_EOL;
+ echo '
';
- $child = 0;
- $current = $exception;
- while (($current = $current->getPrevious()) !== null) {
- $child++;
- echo '
Message #' . $index . ', child level #' . $child . '
';
- echo '
';
- echo $current->getMessage() . PHP_EOL;
- echo $current->getTraceAsString() . PHP_EOL;
- echo PHP_EOL;
- echo '
';
- }
+ $child = 0;
+ $current = $exception;
+ while (($current = $current->getPrevious()) !== null) {
+ $child++;
+ echo '
Message #' . $index . ', child level #' . $child . '
';
+ echo '
';
+ echo $current->getMessage() . PHP_EOL;
+ echo $current->getTraceAsString() . PHP_EOL;
echo PHP_EOL;
+ echo '';
}
echo '
';
}
echo '
';
+ echo <<
+(function(){
+var sections = jQuery('.error-profiler');
+sections.each(function(){
+ var element = jQuery(this);
+ element.hide();
+ });
+
+jQuery('.error-profiler-link').click(function(e){
+ var rel = jQuery(this).attr('rel');
+ sections.each(function(){
+ var element = jQuery(this);
+ if (element.hasClass(rel) && !element.hasClass('opened')) {
+ element.slideDown(500, function(){element.addClass('opened');});
+ } else {
+ element.slideUp(500, function(){element.removeClass('opened');});
+ }
+ });
+ });
+})();
+
+JS_EOF;
+ echo 'Configuration profiler
';
+ echo 'Global configuration
';
+ echo '';
+ $config = clone Wootook::getConfig();
+ foreach ($config->getConfig('resource/database') as $node) {
+ if ($node->params) {
+ $node->params->reset();
+ }
+ }
+ echo $this->_renderConfig(Wootook::getConfig(), 0);
+ echo '
';
+ echo 'Website configuration
';
+ echo '';
+ echo $this->_renderConfig(Wootook::getWebsiteConfig());
+ echo '
';
+ echo 'Game configuration
';
+ echo '';
+ echo $this->_renderConfig(Wootook::getGameConfig());
+ echo '
';
+ echo ' ';
+ echo <<
+(function(){
+var sections = jQuery('.config-profiler');
+sections.each(function(){
+ var element = jQuery(this);
+ element.hide();
+ });
+
+jQuery('.config-profiler-link').click(function(e){
+ var rel = jQuery(this).attr('rel');
+ sections.each(function(){
+ var element = jQuery(this);
+ if (element.hasClass(rel) && !element.hasClass('opened')) {
+ element.slideDown(500, function(){element.addClass('opened');});
+ } else {
+ element.slideUp(500, function(){element.removeClass('opened');});
+ }
+ });
+ });
+})();
+
+JS_EOF;
}
public static function register()
diff --git a/src/application/code/core/Wootook/Core/Mvc/Controller/Front.php b/src/application/code/core/Wootook/Core/Mvc/Controller/Front.php
index 7823ea3..6c6b20f 100644
--- a/src/application/code/core/Wootook/Core/Mvc/Controller/Front.php
+++ b/src/application/code/core/Wootook/Core/Mvc/Controller/Front.php
@@ -197,6 +197,7 @@ class Wootook_Core_Mvc_Controller_Front
$this->_response->setIsDispatched();
+ $this->preDispatch();
$controller->preDispatch();
if (!$this->_response->isDispatched()) {
continue;
@@ -212,6 +213,7 @@ class Wootook_Core_Mvc_Controller_Front
}
$controller->postDispatch();
+ $this->postDispatch();
if ($this->_response->isDispatched() || $this->_response->isRedirect()) {
break;
@@ -246,4 +248,24 @@ class Wootook_Core_Mvc_Controller_Front
return $this;
}
+
+ public function preDispatch()
+ {
+ Wootook::dispatchEvent('core.mvc.controller.front.pre-dispatch', array(
+ 'request' => $this->_request,
+ 'response' => $this->_response
+ ));
+
+ return $this;
+ }
+
+ public function postDispatch()
+ {
+ Wootook::dispatchEvent('core.mvc.controller.front.post-dispatch', array(
+ 'request' => $this->_request,
+ 'response' => $this->_response
+ ));
+
+ return $this;
+ }
}
diff --git a/src/application/code/core/Wootook/Core/Mvc/Controller/Request/Http.php b/src/application/code/core/Wootook/Core/Mvc/Controller/Request/Http.php
index b41a7e1..3780a37 100644
--- a/src/application/code/core/Wootook/Core/Mvc/Controller/Request/Http.php
+++ b/src/application/code/core/Wootook/Core/Mvc/Controller/Request/Http.php
@@ -32,7 +32,12 @@ class Wootook_Core_Mvc_Controller_Request_Http
$params = '';
if (($offset = strpos($this->getServer('REQUEST_URI'), $baseUri)) !== false) {
- $path = substr($this->getServer('REQUEST_URI'), $offset + strlen($baseUri));
+ $queryParamsOffset = strpos($this->getServer('REQUEST_URI'), '?');
+ if ($queryParamsOffset !== false) {
+ $path = substr($this->getServer('REQUEST_URI'), $offset + strlen($baseUri), $queryParamsOffset - $offset - 1);
+ } else {
+ $path = substr($this->getServer('REQUEST_URI'), $offset + strlen($baseUri));
+ }
$moduleOffset = strpos($path, '/');
if ($moduleOffset !== false) {
diff --git a/src/application/code/core/Wootook/Core/Mvc/Model/Entity.php b/src/application/code/core/Wootook/Core/Mvc/Model/Entity.php
index 06a4181..2c19005 100644
--- a/src/application/code/core/Wootook/Core/Mvc/Model/Entity.php
+++ b/src/application/code/core/Wootook/Core/Mvc/Model/Entity.php
@@ -59,11 +59,12 @@ abstract class Wootook_Core_Mvc_Model_Entity
if (!is_array($datas) || empty($datas)) {
throw new Wootook_Core_Exception_DataAccessException('Could not load data: this id could not be found.');
}
+ $realId = $datas[$this->getIdFieldName()];
unset($datas[$this->getIdFieldName()]);
$this->_data = array();
$this->getDataMapper()->decode($this, $datas);
- $this->setId($id);
+ $this->setId($realId);
return $this;
}
diff --git a/src/application/code/core/Wootook/Core/Mvc/View/View.php b/src/application/code/core/Wootook/Core/Mvc/View/View.php
index b68ef69..4847061 100644
--- a/src/application/code/core/Wootook/Core/Mvc/View/View.php
+++ b/src/application/code/core/Wootook/Core/Mvc/View/View.php
@@ -90,6 +90,17 @@ class Wootook_Core_Mvc_View_View
}
}
+ public function renderDateTime($dateTime, $format = null)
+ {
+ if ($format === null) {
+ $format = 'H:i:s';
+ }
+ if (!$dateTime instanceof Wootook_Core_DateTime) {
+ $dateTime = new Wootook_Core_DateTime($dateTime);
+ }
+ return $dateTime->toString($format);
+ }
+
public function escape($unescaped)
{
return htmlspecialchars($unescaped, ENT_QUOTES, 'UTF-8');
diff --git a/src/application/code/core/Wootook/Core/Resource/EntityCollection.php b/src/application/code/core/Wootook/Core/Resource/EntityCollection.php
index 44a376a..0f0d29b 100644
--- a/src/application/code/core/Wootook/Core/Resource/EntityCollection.php
+++ b/src/application/code/core/Wootook/Core/Resource/EntityCollection.php
@@ -21,7 +21,7 @@ abstract class Wootook_Core_Resource_EntityCollection
protected $_items = array();
- public function __construct(Wootook_Core_Database_Adapter_Pdo_Mysql $connection = null)
+ public function __construct(Wootook_Core_Database_Adapter_Adapter $connection = null)
{
$this->setReadConnection($connection);
@@ -153,17 +153,28 @@ abstract class Wootook_Core_Resource_EntityCollection
return $this;
}
- public function getSize()
+ public function getSize($maintainGrouping = array())
{
$clone = clone $this->_select;
- $clone->_fields = array();
- $clone->column('1');
+ $clone->reset(Wootook_Core_Database_Sql_Select::COLUMNS);
+ if (empty($maintainGrouping)) {
+ $clone->reset(Wootook_Core_Database_Sql_Select::GROUP);
+ } else {
+ $groupingFields = $clone->getPart(Wootook_Core_Database_Sql_Select::GROUP);
+ $clone->reset(Wootook_Core_Database_Sql_Select::GROUP);
+ foreach ($groupingFields as $field) {
+ if (in_array($field, $maintainGrouping)) {
+ $clone->group($field);
+ }
+ }
+ }
+ $clone->column(new Wootook_Core_Database_Sql_Placeholder_Expression('COUNT(*)'));
$database = $this->getReadConnection();
$statement = $database->prepare($clone);
$statement->execute();
- $count = $statement->rowCount();
+ $count = $statement->fetchColumn();
$statement->closeCursor();
return $count;
diff --git a/src/application/code/core/Wootook/Empire/Block/Overview/Fleet/List.php b/src/application/code/core/Wootook/Empire/Block/Overview/Fleet/List.php
new file mode 100644
index 0000000..770fcbb
--- /dev/null
+++ b/src/application/code/core/Wootook/Empire/Block/Overview/Fleet/List.php
@@ -0,0 +1,77 @@
+_fleetCollection === null) {
+ $player = Wootook_Player_Model_Session::getSingleton()->getPlayer();
+ $this->_fleetCollection = $player->getVisibleFleets();
+ }
+ return $this->_fleetCollection;
+ }
+
+ public function setItemTemplate($template)
+ {
+ $this->_itemTemplate = $template;
+
+ return $this;
+ }
+
+ public function getItemTemplate()
+ {
+ return $this->_itemTemplate;
+ }
+
+ public function setItemBlockType($blockType)
+ {
+ $this->_itemBlockType = $blockType;
+
+ return $this;
+ }
+
+ public function getItemBlockType()
+ {
+ return $this->_itemBlockType;
+ }
+
+ public function getItemBlock($fleet)
+ {
+ $blockName = $this->getNameInLayout() . ".item({$fleet->getId()})";
+
+ return $this->getLayout()
+ ->createBlock($this->getItemBlockType(), $blockName)
+ ->setTemplate($this->getItemTemplate())
+ ->setFleetItem($fleet);
+ }
+
+ public function prepareLayout()
+ {
+ parent::prepareLayout();
+
+ $this->_initChildBlocks();
+
+ return $this;
+ }
+
+ public function _initChildBlocks()
+ {
+ $parentBlock = $this->getLayout()
+ ->createBlock('core/concat', $this->getNameInLayout() . '.item-list')
+ ;
+ $this->setPartial('item-list', $parentBlock);
+
+ foreach ($this->getFleetCollection()->load() as $fleet) {
+ $block = $this->getItemBlock($fleet);
+ $parentBlock->setPartial($block->getNameInLayout(), $block);
+ }
+
+ return $this;
+ }
+}
diff --git a/src/application/code/core/Wootook/Empire/Block/Overview/Fleet/List/Item.php b/src/application/code/core/Wootook/Empire/Block/Overview/Fleet/List/Item.php
new file mode 100644
index 0000000..cd1cffc
--- /dev/null
+++ b/src/application/code/core/Wootook/Empire/Block/Overview/Fleet/List/Item.php
@@ -0,0 +1,153 @@
+_currentPlayer == null) {
+ $this->_currentPlayer = Wootook_Player_Model_Session::getSingleton()->getPlayer();
+ }
+ return $this->_currentPlayer;
+ }
+
+ /**
+ * @return Wootook_Player_Resource_Entity_Collection
+ */
+ public function getFleetOwnerCollection()
+ {
+ if ($this->_ownerCollection == null) {
+ $this->_ownerCollection = $this->getFleetItem()->getOwnerCollection();
+ }
+ return $this->_ownerCollection;
+ }
+
+ /**
+ * @return Wootook_Player_Resource_Entity_Collection
+ */
+ public function getFleetOwnerUsernames()
+ {
+ $usernameList = array();
+ foreach ($this->getFleetOwnerCollection()->load() as $owner) {
+ $usernameList[] = $owner->getUsername();
+ }
+ return $usernameList;
+ }
+
+ public function setFleetItem(Wootook_Empire_Model_Fleet $fleetItem)
+ {
+ $this->_fleet = $fleetItem;
+
+ return $this;
+ }
+
+ /**
+ * @return Wootook_Empire_Model_Fleet
+ */
+ public function getFleetItem()
+ {
+ return $this->_fleet;
+ }
+
+ public function getStartTime()
+ {
+ return $this->getFleetItem()->getStartTime();
+ }
+
+ public function getActionTime()
+ {
+ return $this->getFleetItem()->getActionTime();
+ }
+
+ public function getArrivalTime()
+ {
+ return $this->getFleetItem()->getArrivalTime();
+ }
+
+ public function isOwner()
+ {
+ return $this->getFleetItem()->isOwnedBy($this->getPlayer());
+ }
+
+ public function getRowClass()
+ {
+ return $this->getFleetItem()->getRowClass($this->getPlayer());
+ }
+
+ public function getOriginPlanet()
+ {
+ return $this->getFleetItem()->getOriginPlanet();
+ }
+
+ public function getOriginPlayer()
+ {
+ return $this->getOriginPlanet()->getPlayer();
+ }
+
+ public function getOriginPlayerName()
+ {
+ $player = $this->getOriginPlanet()->getPlayer();
+
+ if ($player !== null) {
+ return $player->getUsername();
+ }
+ return null;
+ }
+
+ public function getOriginPlanetName()
+ {
+ return $this->getOriginPlanetName();
+ }
+
+ public function getOriginPlanetCoords()
+ {
+ return $this->getOriginPlanetCoords();
+ }
+
+ public function getDestinationPlanet()
+ {
+ return $this->getFleetItem()->getDestinationPlanet();
+ }
+
+ public function getDestinationPlayer()
+ {
+ return $this->getDestinationPlanet()->getPlayer();
+ }
+
+ public function getDestinationPlayerName()
+ {
+ $player = $this->getDestinationPlanet()->getPlayer();
+
+ if ($player !== null) {
+ return $player->getUsername();
+ }
+ return null;
+ }
+
+ public function getDestinationPlanetName()
+ {
+ return $this->getDestinationPlanetName();
+ }
+
+ public function getDestinationPlanetCoords()
+ {
+ return $this->getDestinationPlanetCoords();
+ }
+
+ public function getMissionLabel()
+ {
+ return $this->getFleetItem()->getMissionLabel();
+ }
+
+ public function isMission($type)
+ {
+ return $this->getFleetItem()->isMission($type);
+ }
+}
diff --git a/src/application/code/core/Wootook/Empire/Model/Fleet.php b/src/application/code/core/Wootook/Empire/Model/Fleet.php
index 80d857a..e622226 100644
--- a/src/application/code/core/Wootook/Empire/Model/Fleet.php
+++ b/src/application/code/core/Wootook/Empire/Model/Fleet.php
@@ -34,6 +34,12 @@ class Wootook_Empire_Model_Fleet
{
$this->setIdFieldName('fleet_id');
$this->setTableName('fleets');
+
+ $this->getDataMapper()
+ ->addRule('fleet_start_time', 'date-time')
+ ->addRule('fleet_end_time', 'date-time')
+ ->addRule('fleet_end_stay', 'date-time')
+ ;
}
public static function planetListener($eventData)
@@ -48,10 +54,16 @@ class Wootook_Empire_Model_Fleet
return false;
}
- public function getOwner()
+ /**
+ * @return null|Wootook_Player_Resource_Entity_Collection
+ */
+ public function getOwnerCollection()
{
if ($id = $this->getData('fleet_owner')) {
- return Wootook_Player_Model_Entity::factory($id);
+ $ownerCollection = new Wootook_Player_Resource_Entity_Collection($this->getReadConnection());
+ $ownerCollection->addFieldToFilter('id', $id);
+
+ return $ownerCollection;
}
return null;
}
@@ -86,6 +98,8 @@ class Wootook_Empire_Model_Fleet
return 'missiles';
} else if ($this->isMission(Legacies_Empire::ID_MISSION_EXPEDITION)) {
return 'expedition';
+ } else if ($this->isMission(Legacies_Empire::ID_MISSION_ORE_MINING)) {
+ return 'ore-mining';
}
}
@@ -107,25 +121,34 @@ class Wootook_Empire_Model_Fleet
return Wootook::__('Missiles Launch');
} else if ($this->isMission(Legacies_Empire::ID_MISSION_EXPEDITION)) {
return Wootook::__('Expedition');
+ } else if ($this->isMission(Legacies_Empire::ID_MISSION_ORE_MINING)) {
+ return Wootook::__('Ore mining');
}
return Legacies::__('Unknown');
}
+ /**
+ * @return Wootook_Core_DateTime
+ */
public function getStartTime()
{
return $this->getData('fleet_start_time');
}
+ /**
+ * @return Wootook_Core_DateTime
+ */
+
public function getActionTime()
{
return $this->getData('fleet_end_stay');
}
+ /**
+ * @return Wootook_Core_DateTime
+ */
public function getArrivalTime()
{
- if ($this->isMission(Legacies_Empire::ID_MISSION_STATION) || $this->isMission(Legacies_Empire::ID_MISSION_STATION_ALLY)) {
- return $this->getActionTime();
- }
return $this->getData('fleet_end_time');
}
@@ -141,15 +164,85 @@ class Wootook_Empire_Model_Fleet
return Wootook_Empire_Model_Planet::factoryFromCoords($coords, $type);
}
+ public function getOriginPlanetName()
+ {
+ if (!($planet = $this->getOriginPlanet()->getId())) {
+ return '';
+ }
+ return $planet->getName();
+ }
+
+ public function getOriginPlanetCoords()
+ {
+ if (!($planet = $this->getOriginPlanet()->getId())) {
+ return sprintf('%s:%s:%s', $this->getData('fleet_start_galaxy'), $this->getData('fleet_start_system'), $this->getData('fleet_start_planet'));
+ }
+ return $planet->getCoords();
+ }
+
public function getDestinationPlanet()
{
$coords = array(
'galaxy' => $this->getData('fleet_end_galaxy'),
'system' => $this->getData('fleet_end_system'),
'position' => $this->getData('fleet_end_planet')
- );
+ );
$type = $this->getData('fleet_end_type');
return Wootook_Empire_Model_Planet::factoryFromCoords($coords, $type);
}
+
+ public function getDestinationPlanetName()
+ {
+ if (!($planet = $this->getDestinationPlanet()->getId())) {
+ return '';
+ }
+ return $planet->getName();
+ }
+
+ public function getDestinationPlanetCoords()
+ {
+ if (!($planet = $this->getDestinationPlanet()->getId())) {
+ return sprintf('%s:%s:%s', $this->getData('fleet_end_galaxy'), $this->getData('fleet_end_system'), $this->getData('fleet_end_planet'));
+ }
+ return $planet->getCoords();
+ }
+
+ public function goBack()
+ {
+ $this->setData('fleet_mess', 1)->save();
+
+ return $this;
+ }
+
+ /**
+ * @param Wootook_Empire_Model_Planet $planet
+ * @return Wootook_Empire_Model_Fleet
+ */
+ public function dock(Wootook_Empire_Model_Planet $planet)
+ {
+ // Backward-compatible way to unserialize fleet ships listing
+ $serializedFleetArray = $this->getData('fleet_array');
+ foreach (explode(';', $serializedFleetArray) as $fleetShipData) {
+ if (empty($fleetShipData)) {
+ continue;
+ }
+ $fleetShipData = explode(',', $fleetShipData);
+ if (count($fleetShipData) != 2) {
+ continue;
+ }
+ $planet->setElement($fleetShipData[0], Math::add($planet->getElement($fleetShipData[0]), $fleetShipData[1]));
+ }
+
+ $planet
+ ->setData('metal', Math::add($planet->getData('metal'), $this->getData('fleet_resource_metal')))
+ ->setData('cristal', Math::add($planet->getData('cristal'), $this->getData('fleet_resource_crystal')))
+ ->setData('deuterium', Math::add($planet->getData('deuterium'), $this->getData('fleet_resource_deuterium')))
+ ->save();
+ ;
+
+ $this->delete();
+
+ return $this;
+ }
}
diff --git a/src/application/code/core/Wootook/Empire/Model/Planet.php b/src/application/code/core/Wootook/Empire/Model/Planet.php
index 4dc76f7..980524f 100644
--- a/src/application/code/core/Wootook/Empire/Model/Planet.php
+++ b/src/application/code/core/Wootook/Empire/Model/Planet.php
@@ -105,7 +105,8 @@ class Wootook_Empire_Model_Planet
->getConnection('core_read');
$collection = new Wootook_Empire_Resource_Planet_Collection($adapter);
$collection->addCoordsToFilter($coords['galaxy'], $coords['system'], $coords['position'], $coords['type'])
- ->setPage(1, 1);
+ ->setPage(1, 1)
+ ->load();
$planet = $collection->getFirstItem();
if ($planet !== null) {
@@ -166,6 +167,9 @@ class Wootook_Empire_Model_Planet
throw new Wootook_Core_Exception_RuntimeException(Wootook::__('Undefined method %s::%s.', get_class($this), $method));
}
+ /**
+ * @return Wootook_Core_DateTime
+ */
public function getLastUpdate()
{
return $this->getData('last_update');
@@ -424,7 +428,7 @@ class Wootook_Empire_Model_Planet
public function getFleetCollection($time = null)
{
- $collection = new Wootook_Empire_Resource_Fleet_Collection();
+ $collection = new Wootook_Empire_Resource_Fleet_Collection($this->getReadConnection());
$collection->addPlanetToFilter($this, $time);
return $collection;
@@ -469,22 +473,18 @@ class Wootook_Empire_Model_Planet
public function getMoon()
{
- static $statement = null;
-
if ($this->isMoon()) {
return null;
}
if ($this->_moon === null) {
- if ($statement === null) {
- $collection = new Wootook_Empire_Resource_Planet_Collection($this->getReadConnection());
- $collection->addFieldToFilter('galaxy', $this->getGalaxy())
- ->addFieldToFilter('system', $this->getGalaxy())
- ->addFieldToFilter('planet', $this->getPosition())
- ->addFieldToFilter('planet_type', self::TYPE_MOON)
- ->load()
- ;
- }
+ $collection = new Wootook_Empire_Resource_Planet_Collection($this->getReadConnection());
+ $collection->addFieldToFilter('galaxy', $this->getGalaxy())
+ ->addFieldToFilter('system', $this->getGalaxy())
+ ->addFieldToFilter('planet', $this->getPosition())
+ ->addFieldToFilter('planet_type', self::TYPE_MOON)
+ ->load()
+ ;
$this->_moon = $collection->getFirstItem();
@@ -606,7 +606,7 @@ class Wootook_Empire_Model_Planet
public function isDestroyed()
{
- return (bool) $this->getData('destruyed');
+ return (bool) ($this->getData('destruyed') > 0);
}
public function destroy()
@@ -641,13 +641,21 @@ class Wootook_Empire_Model_Planet
}
$this
- ->setData('destruyed', true)
+ ->setData('destruyed', time() + 172800)
->setData('id_owner', 0)
->save();
return $this;
}
+ public function isErasable()
+ {
+ if ($this->isDestroyed() && $this->getData('destruyed') >= time()) {
+ return true;
+ }
+ return false;
+ }
+
public function getElement($elementId)
{
$fields = Wootook_Empire_Helper_Config_FieldsAlias::getSingleton();
@@ -896,6 +904,32 @@ class Wootook_Empire_Model_Planet
return intval($value);
}
+ public static function planetChangeListener($eventData)
+ {
+ if (!isset($eventData['request']) || !$eventData['request'] instanceof Wootook_Core_Mvc_Controller_Request_Http) {
+ return;
+ }
+
+ /** @var Wootook_Core_Mvc_Controller_Request_Http $request */
+ $request = $eventData['request'];
+ if (!($planetId = $request->getQuery('___planet'))) {
+ return;
+ }
+
+ $session = Wootook_Player_Model_Session::getSingleton();
+ if (!$session->isLoggedIn()) {
+ return;
+ }
+ $planet = new Wootook_Empire_Model_Planet();
+ $planet->load($planetId);
+ if (!$planet->getId()) {
+ return;
+ }
+
+ $player = $session->getPlayer();
+ $player->setCurrentPlanet($planet);
+ }
+
public static function planetUpdateListener($eventData)
{
if (isset($eventData['planet'])) {
diff --git a/src/application/code/core/Wootook/Empire/Resource/Fleet/Collection.php b/src/application/code/core/Wootook/Empire/Resource/Fleet/Collection.php
index 7c9cd8c..ea399f3 100644
--- a/src/application/code/core/Wootook/Empire/Resource/Fleet/Collection.php
+++ b/src/application/code/core/Wootook/Empire/Resource/Fleet/Collection.php
@@ -10,20 +10,23 @@ class Wootook_Empire_Resource_Fleet_Collection
public function addPlanetToFilter(Wootook_Empire_Model_Planet $planet, $time = null)
{
+ if ($time === null) {
+ $time = new Wootook_Core_DateTime();
+ }
$this->addFieldToFilter(null, array(
array('and' => array(
array('eq' => array('field' => 'fleet_start_galaxy', 'value' => $planet->getGalaxy())),
array('eq' => array('field' => 'fleet_start_system', 'value' => $planet->getSystem())),
array('eq' => array('field' => 'fleet_start_planet', 'value' => $planet->getPosition())),
array('eq' => array('field' => 'fleet_start_type', 'value' => $planet->getType())),
- array('date' => array('field' => 'fleet_start_time', 'value' => array('to' => $time))),
+ //array('date' => array('field' => 'fleet_start_time', 'value' => array('to' => $time))),
)),
array('and' => array(
array('eq' => array('field' => 'fleet_end_galaxy', 'value' => $planet->getGalaxy())),
array('eq' => array('field' => 'fleet_end_system', 'value' => $planet->getSystem())),
array('eq' => array('field' => 'fleet_end_planet', 'value' => $planet->getPosition())),
array('eq' => array('field' => 'fleet_end_type', 'value' => $planet->getType())),
- array('date' => array('field' => 'fleet_end_time', 'value' => array('to' => $time))),
+ //array('date' => array('field' => 'fleet_end_time', 'value' => array('to' => $time))),
))
));
@@ -32,6 +35,9 @@ class Wootook_Empire_Resource_Fleet_Collection
public function addIsVisibleToFilter(Wootook_Player_Model_Entity $player, $time = null)
{
+ if ($time === null) {
+ $time = new Wootook_Core_DateTime();
+ }
$this->addFieldToFilter(null, array(
array('and' => array(
array('eq' => array('field' => 'fleet_owner', 'value' => $player->getId())),
diff --git a/src/application/code/core/Wootook/Player/Controller/AccountController.php b/src/application/code/core/Wootook/Player/Controller/AccountController.php
index 98815cc..824a20d 100644
--- a/src/application/code/core/Wootook/Player/Controller/AccountController.php
+++ b/src/application/code/core/Wootook/Player/Controller/AccountController.php
@@ -41,7 +41,7 @@ class Wootook_Player_Controller_AccountController
{
$session = new Wootook_Player_Model_Session();
if ($session->isLoggedIn()) {
- $this->_redirect('player/overview');
+ $this->_redirect('*/overview');
return;
}
@@ -55,27 +55,29 @@ class Wootook_Player_Controller_AccountController
$request = $this->getRequest();
if (!$request->isPost()) {
- $this->_redirect('player/account/login');
+ $this->_redirect('*/*/login');
return;
}
if ($request->getPost('username') === null || $request->getPost('password') === null) {
- $this->_redirect('player/account/login');
+ $this->_redirect('*/*/login');
return;
}
$session = new Wootook_Player_Model_Session();
if ($session->isLoggedIn()) {
- $this->_redirect('player/overview');
+ $this->_redirect('*/overview');
return;
}
$session->login($request->getPost('username'), $request->getPost('password'), (bool) $request->getPost('rememberme'));
if ($session->isLoggedIn()) {
- $this->_redirect('player/overview');
+ $this->_redirect('*/overview');
+ return;
} else {
- $this->_redirect('player/account/login');
+ $this->_redirect('*/*/login');
+ return;
}
}
@@ -84,6 +86,9 @@ class Wootook_Player_Controller_AccountController
$session = Wootook_Player_Model_Session::getSingleton();
if ($session->isLoggedIn()) {
$session->logout();
+ } else {
+ $this->_redirect('*/*/login');
+ return;
}
$this->_redirect('');
@@ -93,16 +98,131 @@ class Wootook_Player_Controller_AccountController
{
$session = new Wootook_Player_Model_Session();
if ($session->isLoggedIn()) {
- $this->_redirect('player/overview');
+ $this->_redirect('*/overview');
return;
}
$this->loadLayout('player.registration');
+ $this->_prepareLayoutMessages(Wootook_Player_Model_Entity::SESSION_KEY);
$this->renderLayout();
}
- public function logoutSuccessAction()
+ public function newPostAction()
{
+ $session = Wootook_Player_Model_Session::getSingleton();
+ if ($session->isLoggedIn()) {
+ $this->_redirect('*/overview');
+ return;
+ }
+
+ $request = $this->getRequest();
+
+ if ($request->getPost('password') != $request->getPost('password_confirm')) {
+ $session->addError(Wootook::__('Passwords does not match. Please check your input.'));
+ $this->_redirect('*/*/new');
+ return;
+ }
+
+ if ($request->getPost('email') != $request->getPost('email_confirm')) {
+ $session->addError(Wootook::__('Both emails does not match. Please check your input.'));
+ $this->_redirect('*/*/new');
+ return;
+ }
+
+ try {
+ $user = Wootook_Player_Model_Entity::register($request->getPost('username'), $request->getPost('email'), $request->getPost('password'));
+ } catch (Wootook_Empire_Exception_RuntimeException $e) {
+ $session->addError(Wootook::__('Could not create user: %s', $e->getMessage()));
+ $this->_redirect('*/*/new');
+ return;
+ }
+
+ if (!$user || !$user->getId()) {
+ $session->addError(Wootook::__('Could not create user. Please contact the game administrator for more information.'));
+ $this->_redirect('*/*/new');
+ return;
+ }
+
+ $session->setLoggedIn($user);
+ if ($request->getPost('planet_name') != '') {
+ $user->getHomePlanet()->setName($request->getPost('planet_name'))->save();
+ } else {
+ $user->getHomePlanet()->setName(Wootook::__('Planet'))->save();
+ }
+
+ $this->_redirect('*/overview');
+ }
+
+ public function lostPasswordAction()
+ {
+ $session = new Wootook_Player_Model_Session();
+ if ($session->isLoggedIn()) {
+ $this->_redirect('*/overview');
+ return;
+ }
+
+ $this->loadLayout('player.lost-password');
+ $this->_prepareLayoutMessages(Wootook_Player_Model_Entity::SESSION_KEY);
+ $this->renderLayout();
+ }
+
+ /**
+ * Send new password by mail
+ */
+ public function lostPasswordPostAction()
+ {
+ $session = new Wootook_Player_Model_Session();
+ if ($session->isLoggedIn()) {
+ $this->_redirect('*/overview');
+ return;
+ }
+
+ if (!$this->getRequest()->isPost()) {
+ $this->_redirect('*/*/lost-password');
+ return;
+ }
+
+ $email = $this->getRequest()->getPost('email');
+ $username = $this->getRequest()->getPost('username');
+
+ $player = new Wootook_Player_Model_Entity();
+ $player->loadByEmail($email);
+
+ if (!$player->getId() || strtolower($player->getUsername()) != strtolower(trim($username))) {
+ $session->addError(Wootook::__('The information you entered could not be found.'));
+ $this->_redirect('*/*/lost-password');
+ return;
+ }
+
+ $chars = array(
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P',
+ 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e',
+ 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v',
+ 'w', 'x', 'y', 'z', '2', '3', '4', '5', '6', '7', '8', '9'
+ );
+
+ shuffle($chars);
+ $passwordChars = array_slice($chars, 0, 10);
+ $newPassword = implode($passwordChars);
+
+ $player->setPassword($newPassword)->save();
+
+ try {
+ $mailer = new Wootook_Core_Email();
+ $mailer->send(
+ array($player->getEmail() => $player->getUsername()),
+ array('contact@wootook.org' => 'Wootook'),
+ Wootook::__('Your new password'),
+ Wootook::__('Your new password is %s', $newPassword));
+ } catch (Wootook_Core_Exception_RuntimeException $e) {
+ Wootook_Player_Model_Session::getSingleton()
+ ->addError($e->getMessage());
+
+ $this->_redirect('*/*/lost-password');
+ return;
+ }
+
+ $this->_redirect('*/*/login');
}
public function editAction()
diff --git a/src/application/code/core/Wootook/Player/Controller/OverviewController.php b/src/application/code/core/Wootook/Player/Controller/OverviewController.php
index 62a0884..97db0cf 100644
--- a/src/application/code/core/Wootook/Player/Controller/OverviewController.php
+++ b/src/application/code/core/Wootook/Player/Controller/OverviewController.php
@@ -6,10 +6,7 @@ class Wootook_Player_Controller_OverviewController
public function indexAction()
{
$this->loadLayout('player.overview');
+ $this->_prepareLayoutMessages(Wootook_Player_Model_Entity::SESSION_KEY);
$this->renderLayout();
- /*
- $this->getResponse()
- ->setRedirect(Wootook::getStaticUrl('overview.php'), Wootook_Core_Mvc_Controller_Response_Http::REDIRECT_TEMPORARY);
- */
}
}
\ No newline at end of file
diff --git a/src/application/code/core/Wootook/Player/Model/Entity.php b/src/application/code/core/Wootook/Player/Model/Entity.php
index fe296c3..389b8ba 100644
--- a/src/application/code/core/Wootook/Player/Model/Entity.php
+++ b/src/application/code/core/Wootook/Player/Model/Entity.php
@@ -88,6 +88,21 @@ class Wootook_Player_Model_Entity
return $this->getData('username');
}
+ public function getEmail()
+ {
+ return $this->getData('email');
+ }
+
+ public function loadByEmail($email)
+ {
+ return $this->load($email, 'email');
+ }
+
+ public function setPassword($newPassword)
+ {
+ return $this->setData('password', $this->hash($newPassword));
+ }
+
public static function hash($password, $salt = null)
{
if ($salt === null) {
@@ -222,12 +237,10 @@ class Wootook_Player_Model_Entity
public function createNewPlanet($galaxy, $system, $position, $type, $name, $size = null)
{
if ($size === null) {
- $baseSize = Wootook::getGameConfig('planet/initial/fields');
-
- $factor = $position * 10 / (1 + log($position * 10));
- $fuzz = 2 * $factor * pow(sin($factor), 2) / 2 + $factor / 4;
-
- $size = mt_rand(floor($factor / 10), ceil($factor * 5 / 4)) + mt_rand(0, $fuzz);
+ $size = Wootook::getGameConfig('planet/initial/fields');
+ }
+ if ($size === null) {
+ $size = 200;
}
$now = new Wootook_Core_DateTime();
@@ -464,6 +477,11 @@ class Wootook_Player_Model_Entity
return $this;
}
+ /**
+ * Returns all the flying fleets owned by the player
+ *
+ * @return Wootook_Empire_Resource_Fleet_Collection
+ */
public function getFleets()
{
$collection = new Wootook_Empire_Resource_Fleet_Collection($this->getReadConnection());
@@ -473,15 +491,22 @@ class Wootook_Player_Model_Entity
return $collection;
}
+ /**
+ * Counts all the flying fleets owned by the player
+ *
+ * @return mixed
+ */
public function getFleetCount()
{
- $collection = new Wootook_Empire_Resource_Fleet_Collection($this->getReadConnection());
-
- $this->_prepareFleetCollection($collection);
-
- return $collection->getSize();
+ return $this->getFleets()->getSize();
}
+ /**
+ * Returns all the visible fleets
+ *
+ * @param null $time
+ * @return Wootook_Empire_Resource_Fleet_Collection
+ */
public function getVisibleFleets($time = null)
{
$collection = new Wootook_Empire_Resource_Fleet_Collection($this->getReadConnection());
@@ -494,6 +519,19 @@ class Wootook_Player_Model_Entity
return $collection;
}
+ /**
+ * Returns all the visible fleets
+ *
+ * @param null $time
+ * @return Wootook_Empire_Resource_Fleet_Collection
+ * @deprecated
+ * @alias getVisibleFleets
+ */
+ public function getFleetCollection($time = null)
+ {
+ return $this->getVisibleFleets($time);
+ }
+
public function getElement($elementId)
{
$fields = Wootook_Empire_Helper_Config_FieldsAlias::getSingleton();
@@ -538,14 +576,6 @@ class Wootook_Player_Model_Entity
return false;
}
- public function getFleetCollection($time = null)
- {
- $fleetCollection = new Wootook_Empire_Resource_Fleet_Collection($this->getReadConnection());
- $fleetCollection->addIsVisibleToFilter($this, $time);
-
- return $fleetCollection;
- }
-
public function getNewMessagesCount()
{
$messageCollection = new Wootook_Player_Resource_Message_Collection($this->getReadConnection());
@@ -582,6 +612,11 @@ class Wootook_Player_Model_Entity
}
}
+ public function isBanned()
+ {
+ return $this->getData('bana') ? true : false;
+ }
+
public function isVacation()
{
return $this->getData('urlaubs_modus') ? true : false;
@@ -592,6 +627,11 @@ class Wootook_Player_Model_Entity
return $this->getData('urlaubs_until');
}
+ public function getLastLoginDate()
+ {
+ return $this->getData('onlinetime');
+ }
+
public function setVacation($active = true)
{
$this->setData('urlaubs_modus', $active);
diff --git a/src/application/code/core/Wootook/Player/Resource/Entity/Collection.php b/src/application/code/core/Wootook/Player/Resource/Entity/Collection.php
index 7ff8a91..3e2c1bc 100644
--- a/src/application/code/core/Wootook/Player/Resource/Entity/Collection.php
+++ b/src/application/code/core/Wootook/Player/Resource/Entity/Collection.php
@@ -23,9 +23,12 @@ class Wootook_Player_Resource_Entity_Collection
{
$onlineTime = (int) $onlineTime;
+ $date = new Wootook_Core_DateTime();
+ $date->sub($onlineTime, Wootook_Core_DateTime::TIMESTAMP);
+
if ($onlineTime > 0) {
$this->addFieldToFilter('onlinetime', array(array(
- 'gt' => new Wootook_Core_Database_Sql_Placeholder_Expression('UNIX_TIMESTAMP() - :online_time))', array('online_time' => $onlineTime))
+ Wootook_Core_Database_Sql_Select::OPERATOR_DATE => array('from' => $date)
)));
}
diff --git a/src/application/code/core/Wootook/Server/Mvc/Dispatcher.php b/src/application/code/core/Wootook/Server/Mvc/Dispatcher.php
new file mode 100644
index 0000000..b3d9bbc
--- /dev/null
+++ b/src/application/code/core/Wootook/Server/Mvc/Dispatcher.php
@@ -0,0 +1 @@
+
+ * @license http://www.opensource.org/licenses/bsd-license.php
+ * @package FirePHPCore
+ */
+
+
+/**
+ * Sends the given data to the FirePHP Firefox Extension.
+ * The data can be displayed in the Firebug Console or in the
+ * "Server" request tab.
+ *
+ * For more information see: http://www.firephp.org/
+ *
+ * @copyright Copyright (C) 2007-2009 Christoph Dorn
+ * @author Christoph Dorn
+ * @license http://www.opensource.org/licenses/bsd-license.php
+ * @package FirePHPCore
+ */
+class Wildfire_Stream {
+
+ /**
+ * FirePHP version
+ *
+ * @var string
+ */
+ const VERSION = '0.3'; // @pinf replace '0.3' with '%%package.version%%'
+
+ /**
+ * Firebug LOG level
+ *
+ * Logs a message to firebug console.
+ *
+ * @var string
+ */
+ const LOG = 'LOG';
+
+ /**
+ * Firebug INFO level
+ *
+ * Logs a message to firebug console and displays an info icon before the message.
+ *
+ * @var string
+ */
+ const INFO = 'INFO';
+
+ /**
+ * Firebug WARN level
+ *
+ * Logs a message to firebug console, displays an warning icon before the message and colors the line turquoise.
+ *
+ * @var string
+ */
+ const WARN = 'WARN';
+
+ /**
+ * Firebug ERROR level
+ *
+ * Logs a message to firebug console, displays an error icon before the message and colors the line yellow. Also increments the firebug error count.
+ *
+ * @var string
+ */
+ const ERROR = 'ERROR';
+
+ /**
+ * Dumps a variable to firebug's server panel
+ *
+ * @var string
+ */
+ const DUMP = 'DUMP';
+
+ /**
+ * Displays a stack trace in firebug console
+ *
+ * @var string
+ */
+ const TRACE = 'TRACE';
+
+ /**
+ * Displays an exception in firebug console
+ *
+ * Increments the firebug error count.
+ *
+ * @var string
+ */
+ const EXCEPTION = 'EXCEPTION';
+
+ /**
+ * Displays an table in firebug console
+ *
+ * @var string
+ */
+ const TABLE = 'TABLE';
+
+ /**
+ * Starts a group in firebug console
+ *
+ * @var string
+ */
+ const GROUP_START = 'GROUP_START';
+
+ /**
+ * Ends a group in firebug console
+ *
+ * @var string
+ */
+ const GROUP_END = 'GROUP_END';
+
+ /**
+ * Singleton instance of FirePHP
+ *
+ * @var FirePHP
+ */
+ protected static $instance = null;
+
+ /**
+ * Flag whether we are logging from within the exception handler
+ *
+ * @var boolean
+ */
+ protected $inExceptionHandler = false;
+
+ /**
+ * Flag whether to throw PHP errors that have been converted to ErrorExceptions
+ *
+ * @var boolean
+ */
+ protected $throwErrorExceptions = true;
+
+ /**
+ * Flag whether to convert PHP assertion errors to Exceptions
+ *
+ * @var boolean
+ */
+ protected $convertAssertionErrorsToExceptions = true;
+
+ /**
+ * Flag whether to throw PHP assertion errors that have been converted to Exceptions
+ *
+ * @var boolean
+ */
+ protected $throwAssertionExceptions = false;
+
+ /**
+ * Wildfire protocol message index
+ *
+ * @var int
+ */
+ protected $messageIndex = 1;
+
+ /**
+ * Options for the library
+ *
+ * @var array
+ */
+ protected $options = array('maxDepth' => 10,
+ 'maxObjectDepth' => 5,
+ 'maxArrayDepth' => 5,
+ 'useNativeJsonEncode' => true,
+ 'includeLineNumbers' => true);
+
+ /**
+ * Filters used to exclude object members when encoding
+ *
+ * @var array
+ */
+ protected $objectFilters = array(
+ 'firephp' => array('objectStack', 'instance', 'json_objectStack'),
+ 'firephp_test_class' => array('objectStack', 'instance', 'json_objectStack')
+ );
+
+ /**
+ * A stack of objects used to detect recursion during object encoding
+ *
+ * @var object
+ */
+ protected $objectStack = array();
+
+ /**
+ * Flag to enable/disable logging
+ *
+ * @var boolean
+ */
+ protected $enabled = true;
+
+ /**
+ * The insight console to log to if applicable
+ *
+ * @var object
+ */
+ protected $logToInsightConsole = null;
+
+ /**
+ * When the object gets serialized only include specific object members.
+ *
+ * @return array
+ */
+ public function __sleep()
+ {
+ return array('options','objectFilters','enabled');
+ }
+
+ /**
+ * Gets singleton instance of FirePHP
+ *
+ * @param boolean $AutoCreate
+ * @return FirePHP
+ */
+ public static function getInstance($AutoCreate = false)
+ {
+ if ($AutoCreate===true && !self::$instance) {
+ self::init();
+ }
+ return self::$instance;
+ }
+
+ /**
+ * Creates FirePHP object and stores it for singleton access
+ *
+ * @return FirePHP
+ */
+ public static function init()
+ {
+ return self::setInstance(new self());
+ }
+
+ /**
+ * Set the instance of the FirePHP singleton
+ *
+ * @param FirePHP $instance The FirePHP object instance
+ * @return FirePHP
+ */
+ public static function setInstance($instance)
+ {
+ return self::$instance = $instance;
+ }
+
+ /**
+ * Set an Insight console to direct all logging calls to
+ *
+ * @param object $console The console object to log to
+ * @return void
+ */
+ public function setLogToInsightConsole($console)
+ {
+ if(is_string($console)) {
+ if(get_class($this)!='FirePHP_Insight' && !is_subclass_of($this, 'FirePHP_Insight')) {
+ throw new Exception('FirePHP instance not an instance or subclass of FirePHP_Insight!');
+ }
+ $this->logToInsightConsole = $this->to('request')->console($console);
+ } else {
+ $this->logToInsightConsole = $console;
+ }
+ }
+
+ /**
+ * Enable and disable logging to Firebug
+ *
+ * @param boolean $Enabled TRUE to enable, FALSE to disable
+ * @return void
+ */
+ public function setEnabled($Enabled)
+ {
+ $this->enabled = $Enabled;
+ }
+
+ /**
+ * Check if logging is enabled
+ *
+ * @return boolean TRUE if enabled
+ */
+ public function getEnabled()
+ {
+ return $this->enabled;
+ }
+
+ /**
+ * Specify a filter to be used when encoding an object
+ *
+ * Filters are used to exclude object members.
+ *
+ * @param string $Class The class name of the object
+ * @param array $Filter An array of members to exclude
+ * @return void
+ */
+ public function setObjectFilter($Class, $Filter)
+ {
+ $this->objectFilters[strtolower($Class)] = $Filter;
+ }
+
+ /**
+ * Set some options for the library
+ *
+ * Options:
+ * - maxDepth: The maximum depth to traverse (default: 10)
+ * - maxObjectDepth: The maximum depth to traverse objects (default: 5)
+ * - maxArrayDepth: The maximum depth to traverse arrays (default: 5)
+ * - useNativeJsonEncode: If true will use json_encode() (default: true)
+ * - includeLineNumbers: If true will include line numbers and filenames (default: true)
+ *
+ * @param array $Options The options to be set
+ * @return void
+ */
+ public function setOptions($Options)
+ {
+ $this->options = array_merge($this->options,$Options);
+ }
+
+ /**
+ * Get options from the library
+ *
+ * @return array The currently set options
+ */
+ public function getOptions()
+ {
+ return $this->options;
+ }
+
+ /**
+ * Set an option for the library
+ *
+ * @param string $Name
+ * @param mixed $Value
+ * @throws Exception
+ * @return void
+ */
+ public function setOption($Name, $Value)
+ {
+ if (!isset($this->options[$Name])) {
+ throw $this->newException('Unknown option: ' . $Name);
+ }
+ $this->options[$Name] = $Value;
+ }
+
+ /**
+ * Get an option from the library
+ *
+ * @param string $Name
+ * @throws Exception
+ * @return mixed
+ */
+ public function getOption($Name)
+ {
+ if (!isset($this->options[$Name])) {
+ throw $this->newException('Unknown option: ' . $Name);
+ }
+ return $this->options[$Name];
+ }
+
+ /**
+ * Register FirePHP as your error handler
+ *
+ * Will throw exceptions for each php error.
+ *
+ * @return mixed Returns a string containing the previously defined error handler (if any)
+ */
+ public function registerErrorHandler($throwErrorExceptions = false)
+ {
+ //NOTE: The following errors will not be caught by this error handler:
+ // E_ERROR, E_PARSE, E_CORE_ERROR,
+ // E_CORE_WARNING, E_COMPILE_ERROR,
+ // E_COMPILE_WARNING, E_STRICT
+
+ $this->throwErrorExceptions = $throwErrorExceptions;
+
+ return set_error_handler(array($this,'errorHandler'));
+ }
+
+ /**
+ * FirePHP's error handler
+ *
+ * Throws exception for each php error that will occur.
+ *
+ * @param int $errno
+ * @param string $errstr
+ * @param string $errfile
+ * @param int $errline
+ * @param array $errcontext
+ */
+ public function errorHandler($errno, $errstr, $errfile, $errline, $errcontext)
+ {
+ // Don't throw exception if error reporting is switched off
+ if (error_reporting() == 0) {
+ return;
+ }
+ // Only throw exceptions for errors we are asking for
+ if (error_reporting() & $errno) {
+
+ $exception = new ErrorException($errstr, 0, $errno, $errfile, $errline);
+ if ($this->throwErrorExceptions) {
+ throw $exception;
+ } else {
+ $this->fb($exception);
+ }
+ }
+ }
+
+ /**
+ * Register FirePHP as your exception handler
+ *
+ * @return mixed Returns the name of the previously defined exception handler,
+ * or NULL on error.
+ * If no previous handler was defined, NULL is also returned.
+ */
+ public function registerExceptionHandler()
+ {
+ return set_exception_handler(array($this,'exceptionHandler'));
+ }
+
+ /**
+ * FirePHP's exception handler
+ *
+ * Logs all exceptions to your firebug console and then stops the script.
+ *
+ * @param Exception $Exception
+ * @throws Exception
+ */
+ function exceptionHandler($Exception)
+ {
+
+ $this->inExceptionHandler = true;
+
+ header('HTTP/1.1 500 Internal Server Error');
+
+ try {
+ $this->fb($Exception);
+ } catch (Exception $e) {
+ echo 'We had an exception: ' . $e;
+ }
+ $this->inExceptionHandler = false;
+ }
+
+ /**
+ * Register FirePHP driver as your assert callback
+ *
+ * @param boolean $convertAssertionErrorsToExceptions
+ * @param boolean $throwAssertionExceptions
+ * @return mixed Returns the original setting or FALSE on errors
+ */
+ public function registerAssertionHandler($convertAssertionErrorsToExceptions = true, $throwAssertionExceptions = false)
+ {
+ $this->convertAssertionErrorsToExceptions = $convertAssertionErrorsToExceptions;
+ $this->throwAssertionExceptions = $throwAssertionExceptions;
+
+ if ($throwAssertionExceptions && !$convertAssertionErrorsToExceptions) {
+ throw $this->newException('Cannot throw assertion exceptions as assertion errors are not being converted to exceptions!');
+ }
+
+ return assert_options(ASSERT_CALLBACK, array($this, 'assertionHandler'));
+ }
+
+ /**
+ * FirePHP's assertion handler
+ *
+ * Logs all assertions to your firebug console and then stops the script.
+ *
+ * @param string $file File source of assertion
+ * @param int $line Line source of assertion
+ * @param mixed $code Assertion code
+ */
+ public function assertionHandler($file, $line, $code)
+ {
+ if ($this->convertAssertionErrorsToExceptions) {
+
+ $exception = new ErrorException('Assertion Failed - Code[ '.$code.' ]', 0, null, $file, $line);
+
+ if ($this->throwAssertionExceptions) {
+ throw $exception;
+ } else {
+ $this->fb($exception);
+ }
+
+ } else {
+ $this->fb($code, 'Assertion Failed', FirePHP::ERROR, array('File'=>$file,'Line'=>$line));
+ }
+ }
+
+ /**
+ * Start a group for following messages.
+ *
+ * Options:
+ * Collapsed: [true|false]
+ * Color: [#RRGGBB|ColorName]
+ *
+ * @param string $Name
+ * @param array $Options OPTIONAL Instructions on how to log the group
+ * @return true
+ * @throws Exception
+ */
+ public function group($Name, $Options = null)
+ {
+
+ if (!$Name) {
+ throw $this->newException('You must specify a label for the group!');
+ }
+
+ if ($Options) {
+ if (!is_array($Options)) {
+ throw $this->newException('Options must be defined as an array!');
+ }
+ if (array_key_exists('Collapsed', $Options)) {
+ $Options['Collapsed'] = ($Options['Collapsed'])?'true':'false';
+ }
+ }
+
+ return $this->fb(null, $Name, FirePHP::GROUP_START, $Options);
+ }
+
+ /**
+ * Ends a group you have started before
+ *
+ * @return true
+ * @throws Exception
+ */
+ public function groupEnd()
+ {
+ return $this->fb(null, null, FirePHP::GROUP_END);
+ }
+
+ /**
+ * Log object with label to firebug console
+ *
+ * @see FirePHP::LOG
+ * @param mixes $Object
+ * @param string $Label
+ * @return true
+ * @throws Exception
+ */
+ public function log($Object, $Label = null, $Options = array())
+ {
+ return $this->fb($Object, $Label, FirePHP::LOG, $Options);
+ }
+
+ /**
+ * Log object with label to firebug console
+ *
+ * @see FirePHP::INFO
+ * @param mixes $Object
+ * @param string $Label
+ * @return true
+ * @throws Exception
+ */
+ public function info($Object, $Label = null, $Options = array())
+ {
+ return $this->fb($Object, $Label, FirePHP::INFO, $Options);
+ }
+
+ /**
+ * Log object with label to firebug console
+ *
+ * @see FirePHP::WARN
+ * @param mixes $Object
+ * @param string $Label
+ * @return true
+ * @throws Exception
+ */
+ public function warn($Object, $Label = null, $Options = array())
+ {
+ return $this->fb($Object, $Label, FirePHP::WARN, $Options);
+ }
+
+ /**
+ * Log object with label to firebug console
+ *
+ * @see FirePHP::ERROR
+ * @param mixes $Object
+ * @param string $Label
+ * @return true
+ * @throws Exception
+ */
+ public function error($Object, $Label = null, $Options = array())
+ {
+ return $this->fb($Object, $Label, FirePHP::ERROR, $Options);
+ }
+
+ /**
+ * Dumps key and variable to firebug server panel
+ *
+ * @see FirePHP::DUMP
+ * @param string $Key
+ * @param mixed $Variable
+ * @return true
+ * @throws Exception
+ */
+ public function dump($Key, $Variable, $Options = array())
+ {
+ if (!is_string($Key)) {
+ throw $this->newException('Key passed to dump() is not a string');
+ }
+ if (strlen($Key)>100) {
+ throw $this->newException('Key passed to dump() is longer than 100 characters');
+ }
+ if (!preg_match_all('/^[a-zA-Z0-9-_\.:]*$/', $Key, $m)) {
+ throw $this->newException('Key passed to dump() contains invalid characters [a-zA-Z0-9-_\.:]');
+ }
+ return $this->fb($Variable, $Key, FirePHP::DUMP, $Options);
+ }
+
+ /**
+ * Log a trace in the firebug console
+ *
+ * @see FirePHP::TRACE
+ * @param string $Label
+ * @return true
+ * @throws Exception
+ */
+ public function trace($Label)
+ {
+ return $this->fb($Label, FirePHP::TRACE);
+ }
+
+ /**
+ * Log a table in the firebug console
+ *
+ * @see FirePHP::TABLE
+ * @param string $Label
+ * @param string $Table
+ * @return true
+ * @throws Exception
+ */
+ public function table($Label, $Table, $Options = array())
+ {
+ return $this->fb($Table, $Label, FirePHP::TABLE, $Options);
+ }
+
+ /**
+ * Insight API wrapper
+ *
+ * @see Insight_Helper::to()
+ */
+ public static function to()
+ {
+ $instance = self::getInstance();
+ if (!method_exists($instance, "_to")) {
+ throw new Exception("FirePHP::to() implementation not loaded");
+ }
+ $args = func_get_args();
+ return call_user_func_array(array($instance, '_to'), $args);
+ }
+
+ /**
+ * Insight API wrapper
+ *
+ * @see Insight_Helper::plugin()
+ */
+ public static function plugin()
+ {
+ $instance = self::getInstance();
+ if (!method_exists($instance, "_plugin")) {
+ throw new Exception("FirePHP::plugin() implementation not loaded");
+ }
+ $args = func_get_args();
+ return call_user_func_array(array($instance, '_plugin'), $args);
+ }
+
+ /**
+ * Check if FirePHP is installed on client
+ *
+ * @return boolean
+ */
+ public function detectClientExtension()
+ {
+ // Check if FirePHP is installed on client via User-Agent header
+ if (@preg_match_all('/\sFirePHP\/([\.\d]*)\s?/si',$this->getUserAgent(),$m) &&
+ version_compare($m[1][0],'0.0.6','>=')) {
+ return true;
+ } else
+ // Check if FirePHP is installed on client via X-FirePHP-Version header
+ if (@preg_match_all('/^([\.\d]*)$/si',$this->getRequestHeader("X-FirePHP-Version"),$m) &&
+ version_compare($m[1][0],'0.0.6','>=')) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Log varible to Firebug
+ *
+ * @see http://www.firephp.org/Wiki/Reference/Fb
+ * @param mixed $Object The variable to be logged
+ * @return true Return TRUE if message was added to headers, FALSE otherwise
+ * @throws Exception
+ */
+ public function fb($Object)
+ {
+ if($this instanceof FirePHP_Insight && method_exists($this, '_logUpgradeClientMessage')) {
+ if(!FirePHP_Insight::$upgradeClientMessageLogged) { // avoid infinite recursion as _logUpgradeClientMessage() logs a message
+ $this->_logUpgradeClientMessage();
+ }
+ }
+
+ static $insightGroupStack = array();
+
+ if (!$this->getEnabled()) {
+ return false;
+ }
+
+ if ($this->headersSent($filename, $linenum)) {
+ // If we are logging from within the exception handler we cannot throw another exception
+ if ($this->inExceptionHandler) {
+ // Simply echo the error out to the page
+ echo 'FirePHP ERROR: Headers already sent in '.$filename.' on line '.$linenum.'. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.
';
+ } else {
+ throw $this->newException('Headers already sent in '.$filename.' on line '.$linenum.'. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.');
+ }
+ }
+
+ $Type = null;
+ $Label = null;
+ $Options = array();
+
+ if (func_num_args()==1) {
+ } else
+ if (func_num_args()==2) {
+ switch(func_get_arg(1)) {
+ case self::LOG:
+ case self::INFO:
+ case self::WARN:
+ case self::ERROR:
+ case self::DUMP:
+ case self::TRACE:
+ case self::EXCEPTION:
+ case self::TABLE:
+ case self::GROUP_START:
+ case self::GROUP_END:
+ $Type = func_get_arg(1);
+ break;
+ default:
+ $Label = func_get_arg(1);
+ break;
+ }
+ } else
+ if (func_num_args()==3) {
+ $Type = func_get_arg(2);
+ $Label = func_get_arg(1);
+ } else
+ if (func_num_args()==4) {
+ $Type = func_get_arg(2);
+ $Label = func_get_arg(1);
+ $Options = func_get_arg(3);
+ } else {
+ throw $this->newException('Wrong number of arguments to fb() function!');
+ }
+
+ if($this->logToInsightConsole!==null && (get_class($this)=='FirePHP_Insight' || is_subclass_of($this, 'FirePHP_Insight'))) {
+ $msg = $this->logToInsightConsole;
+ if ($Object instanceof Exception) {
+ $Type = self::EXCEPTION;
+ }
+ if($Label && $Type!=self::TABLE && $Type!=self::GROUP_START) {
+ $msg = $msg->label($Label);
+ }
+ switch($Type) {
+ case self::DUMP:
+ case self::LOG:
+ return $msg->log($Object);
+ case self::INFO:
+ return $msg->info($Object);
+ case self::WARN:
+ return $msg->warn($Object);
+ case self::ERROR:
+ return $msg->error($Object);
+ case self::TRACE:
+ return $msg->trace($Object);
+ case self::EXCEPTION:
+ return $this->plugin('engine')->handleException($Object, $msg);
+ case self::TABLE:
+ if (isset($Object[0]) && !is_string($Object[0]) && $Label) {
+ $Object = array($Label, $Object);
+ }
+ return $msg->table($Object[0], array_slice($Object[1],1), $Object[1][0]);
+ case self::GROUP_START:
+ $insightGroupStack[] = $msg->group(md5($Label))->open();
+ return $msg->log($Label);
+ case self::GROUP_END:
+ if(count($insightGroupStack)==0) {
+ throw new Error('Too many groupEnd() as opposed to group() calls!');
+ }
+ $group = array_pop($insightGroupStack);
+ return $group->close();
+ default:
+ return $msg->log($Object);
+ }
+ }
+
+ if (!$this->detectClientExtension()) {
+ return false;
+ }
+
+ $meta = array();
+ $skipFinalObjectEncode = false;
+
+ if ($Object instanceof Exception) {
+
+ $meta['file'] = $this->_escapeTraceFile($Object->getFile());
+ $meta['line'] = $Object->getLine();
+
+ $trace = $Object->getTrace();
+ if ($Object instanceof ErrorException
+ && isset($trace[0]['function'])
+ && $trace[0]['function']=='errorHandler'
+ && isset($trace[0]['class'])
+ && $trace[0]['class']=='FirePHP') {
+
+ $severity = false;
+ switch($Object->getSeverity()) {
+ case E_WARNING: $severity = 'E_WARNING'; break;
+ case E_NOTICE: $severity = 'E_NOTICE'; break;
+ case E_USER_ERROR: $severity = 'E_USER_ERROR'; break;
+ case E_USER_WARNING: $severity = 'E_USER_WARNING'; break;
+ case E_USER_NOTICE: $severity = 'E_USER_NOTICE'; break;
+ case E_STRICT: $severity = 'E_STRICT'; break;
+ case E_RECOVERABLE_ERROR: $severity = 'E_RECOVERABLE_ERROR'; break;
+ case E_DEPRECATED: $severity = 'E_DEPRECATED'; break;
+ case E_USER_DEPRECATED: $severity = 'E_USER_DEPRECATED'; break;
+ }
+
+ $Object = array('Class'=>get_class($Object),
+ 'Message'=>$severity.': '.$Object->getMessage(),
+ 'File'=>$this->_escapeTraceFile($Object->getFile()),
+ 'Line'=>$Object->getLine(),
+ 'Type'=>'trigger',
+ 'Trace'=>$this->_escapeTrace(array_splice($trace,2)));
+ $skipFinalObjectEncode = true;
+ } else {
+ $Object = array('Class'=>get_class($Object),
+ 'Message'=>$Object->getMessage(),
+ 'File'=>$this->_escapeTraceFile($Object->getFile()),
+ 'Line'=>$Object->getLine(),
+ 'Type'=>'throw',
+ 'Trace'=>$this->_escapeTrace($trace));
+ $skipFinalObjectEncode = true;
+ }
+ $Type = self::EXCEPTION;
+
+ } else
+ if ($Type==self::TRACE) {
+
+ $trace = debug_backtrace();
+ if (!$trace) return false;
+ for( $i=0 ; $i_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php'
+ || substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) {
+ /* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */
+ } else
+ if (isset($trace[$i]['class'])
+ && isset($trace[$i+1]['file'])
+ && $trace[$i]['class']=='FirePHP'
+ && substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') {
+ /* Skip fb() */
+ } else
+ if ($trace[$i]['function']=='fb'
+ || $trace[$i]['function']=='trace'
+ || $trace[$i]['function']=='send') {
+
+ $Object = array('Class'=>isset($trace[$i]['class'])?$trace[$i]['class']:'',
+ 'Type'=>isset($trace[$i]['type'])?$trace[$i]['type']:'',
+ 'Function'=>isset($trace[$i]['function'])?$trace[$i]['function']:'',
+ 'Message'=>$trace[$i]['args'][0],
+ 'File'=>isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'',
+ 'Line'=>isset($trace[$i]['line'])?$trace[$i]['line']:'',
+ 'Args'=>isset($trace[$i]['args'])?$this->encodeObject($trace[$i]['args']):'',
+ 'Trace'=>$this->_escapeTrace(array_splice($trace,$i+1)));
+
+ $skipFinalObjectEncode = true;
+ $meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'';
+ $meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:'';
+ break;
+ }
+ }
+
+ } else
+ if ($Type==self::TABLE) {
+
+ if (isset($Object[0]) && is_string($Object[0])) {
+ $Object[1] = $this->encodeTable($Object[1]);
+ } else {
+ $Object = $this->encodeTable($Object);
+ }
+
+ $skipFinalObjectEncode = true;
+
+ } else
+ if ($Type==self::GROUP_START) {
+
+ if (!$Label) {
+ throw $this->newException('You must specify a label for the group!');
+ }
+
+ } else {
+ if ($Type===null) {
+ $Type = self::LOG;
+ }
+ }
+
+ if ($this->options['includeLineNumbers']) {
+ if (!isset($meta['file']) || !isset($meta['line'])) {
+
+ $trace = debug_backtrace();
+ for( $i=0 ; $trace && $i_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php'
+ || substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) {
+ /* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */
+ } else
+ if (isset($trace[$i]['class'])
+ && isset($trace[$i+1]['file'])
+ && $trace[$i]['class']=='FirePHP'
+ && substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') {
+ /* Skip fb() */
+ } else
+ if (isset($trace[$i]['file'])
+ && substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php') {
+ /* Skip FB::fb() */
+ } else {
+ $meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'';
+ $meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:'';
+ break;
+ }
+ }
+ }
+ } else {
+ unset($meta['file']);
+ unset($meta['line']);
+ }
+
+ $this->setHeader('X-Wf-Protocol-1','http://meta.wildfirehq.org/Protocol/JsonStream/0.2');
+ $this->setHeader('X-Wf-1-Plugin-1','http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/'.self::VERSION);
+
+ $structure_index = 1;
+ if ($Type==self::DUMP) {
+ $structure_index = 2;
+ $this->setHeader('X-Wf-1-Structure-2','http://meta.firephp.org/Wildfire/Structure/FirePHP/Dump/0.1');
+ } else {
+ $this->setHeader('X-Wf-1-Structure-1','http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1');
+ }
+
+ if ($Type==self::DUMP) {
+ $msg = '{"'.$Label.'":'.$this->jsonEncode($Object, $skipFinalObjectEncode).'}';
+ } else {
+ $msg_meta = $Options;
+ $msg_meta['Type'] = $Type;
+ if ($Label!==null) {
+ $msg_meta['Label'] = $Label;
+ }
+ if (isset($meta['file']) && !isset($msg_meta['File'])) {
+ $msg_meta['File'] = $meta['file'];
+ }
+ if (isset($meta['line']) && !isset($msg_meta['Line'])) {
+ $msg_meta['Line'] = $meta['line'];
+ }
+ $msg = '['.$this->jsonEncode($msg_meta).','.$this->jsonEncode($Object, $skipFinalObjectEncode).']';
+ }
+
+ $parts = explode("\n",chunk_split($msg, 5000, "\n"));
+
+ for( $i=0 ; $i2) {
+ // Message needs to be split into multiple parts
+ $this->setHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex,
+ (($i==0)?strlen($msg):'')
+ . '|' . $part . '|'
+ . (($isetHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex,
+ strlen($part) . '|' . $part . '|');
+ }
+
+ $this->messageIndex++;
+
+ if ($this->messageIndex > 99999) {
+ throw $this->newException('Maximum number (99,999) of messages reached!');
+ }
+ }
+ }
+
+ $this->setHeader('X-Wf-1-Index',$this->messageIndex-1);
+
+ return true;
+ }
+
+ /**
+ * Standardizes path for windows systems.
+ *
+ * @param string $Path
+ * @return string
+ */
+ protected function _standardizePath($Path)
+ {
+ return preg_replace('/\\\\+/','/',$Path);
+ }
+
+ /**
+ * Escape trace path for windows systems
+ *
+ * @param array $Trace
+ * @return array
+ */
+ protected function _escapeTrace($Trace)
+ {
+ if (!$Trace) return $Trace;
+ for( $i=0 ; $i_escapeTraceFile($Trace[$i]['file']);
+ }
+ if (isset($Trace[$i]['args'])) {
+ $Trace[$i]['args'] = $this->encodeObject($Trace[$i]['args']);
+ }
+ }
+ return $Trace;
+ }
+
+ /**
+ * Escape file information of trace for windows systems
+ *
+ * @param string $File
+ * @return string
+ */
+ protected function _escapeTraceFile($File)
+ {
+ /* Check if we have a windows filepath */
+ if (strpos($File,'\\')) {
+ /* First strip down to single \ */
+
+ $file = preg_replace('/\\\\+/','\\',$File);
+
+ return $file;
+ }
+ return $File;
+ }
+
+ /**
+ * Check if headers have already been sent
+ *
+ * @param string $Filename
+ * @param integer $Linenum
+ */
+ protected function headersSent(&$Filename, &$Linenum)
+ {
+ return headers_sent($Filename, $Linenum);
+ }
+
+ /**
+ * Send header
+ *
+ * @param string $Name
+ * @param string $Value
+ */
+ protected function setHeader($Name, $Value)
+ {
+ return header($Name.': '.$Value);
+ }
+
+ /**
+ * Get user agent
+ *
+ * @return string|false
+ */
+ protected function getUserAgent()
+ {
+ if (!isset($_SERVER['HTTP_USER_AGENT'])) return false;
+ return $_SERVER['HTTP_USER_AGENT'];
+ }
+
+ /**
+ * Get all request headers
+ *
+ * @return array
+ */
+ public static function getAllRequestHeaders() {
+ static $_cached_headers = false;
+ if($_cached_headers!==false) {
+ return $_cached_headers;
+ }
+ $headers = array();
+ if(function_exists('getallheaders')) {
+ foreach( getallheaders() as $name => $value ) {
+ $headers[strtolower($name)] = $value;
+ }
+ } else {
+ foreach($_SERVER as $name => $value) {
+ if(substr($name, 0, 5) == 'HTTP_') {
+ $headers[strtolower(str_replace(' ', '-', str_replace('_', ' ', substr($name, 5))))] = $value;
+ }
+ }
+ }
+ return $_cached_headers = $headers;
+ }
+
+ /**
+ * Get a request header
+ *
+ * @return string|false
+ */
+ protected function getRequestHeader($Name)
+ {
+ $headers = self::getAllRequestHeaders();
+ if (isset($headers[strtolower($Name)])) {
+ return $headers[strtolower($Name)];
+ }
+ return false;
+ }
+
+ /**
+ * Returns a new exception
+ *
+ * @param string $Message
+ * @return Exception
+ */
+ protected function newException($Message)
+ {
+ return new Exception($Message);
+ }
+
+ /**
+ * Encode an object into a JSON string
+ *
+ * Uses PHP's jeson_encode() if available
+ *
+ * @param object $Object The object to be encoded
+ * @return string The JSON string
+ */
+ public function jsonEncode($Object, $skipObjectEncode = false)
+ {
+ if (!$skipObjectEncode) {
+ $Object = $this->encodeObject($Object);
+ }
+
+ if (function_exists('json_encode')
+ && $this->options['useNativeJsonEncode']!=false) {
+
+ return json_encode($Object);
+ } else {
+ return $this->json_encode($Object);
+ }
+ }
+
+ /**
+ * Encodes a table by encoding each row and column with encodeObject()
+ *
+ * @param array $Table The table to be encoded
+ * @return array
+ */
+ protected function encodeTable($Table)
+ {
+
+ if (!$Table) return $Table;
+
+ $new_table = array();
+ foreach($Table as $row) {
+
+ if (is_array($row)) {
+ $new_row = array();
+
+ foreach($row as $item) {
+ $new_row[] = $this->encodeObject($item);
+ }
+
+ $new_table[] = $new_row;
+ }
+ }
+
+ return $new_table;
+ }
+
+ /**
+ * Encodes an object including members with
+ * protected and private visibility
+ *
+ * @param Object $Object The object to be encoded
+ * @param int $Depth The current traversal depth
+ * @return array All members of the object
+ */
+ protected function encodeObject($Object, $ObjectDepth = 1, $ArrayDepth = 1, $MaxDepth = 1)
+ {
+ if ($MaxDepth > $this->options['maxDepth']) {
+ return '** Max Depth ('.$this->options['maxDepth'].') **';
+ }
+
+ $return = array();
+
+ if (is_resource($Object)) {
+
+ return '** '.(string)$Object.' **';
+
+ } else
+ if (is_object($Object)) {
+
+ if ($ObjectDepth > $this->options['maxObjectDepth']) {
+ return '** Max Object Depth ('.$this->options['maxObjectDepth'].') **';
+ }
+
+ foreach ($this->objectStack as $refVal) {
+ if ($refVal === $Object) {
+ return '** Recursion ('.get_class($Object).') **';
+ }
+ }
+ array_push($this->objectStack, $Object);
+
+ $return['__className'] = $class = get_class($Object);
+ $class_lower = strtolower($class);
+
+ $reflectionClass = new ReflectionClass($class);
+ $properties = array();
+ foreach( $reflectionClass->getProperties() as $property) {
+ $properties[$property->getName()] = $property;
+ }
+
+ $members = (array)$Object;
+
+ foreach( $properties as $plain_name => $property ) {
+
+ $name = $raw_name = $plain_name;
+ if ($property->isStatic()) {
+ $name = 'static:'.$name;
+ }
+ if ($property->isPublic()) {
+ $name = 'public:'.$name;
+ } else
+ if ($property->isPrivate()) {
+ $name = 'private:'.$name;
+ $raw_name = "\0".$class."\0".$raw_name;
+ } else
+ if ($property->isProtected()) {
+ $name = 'protected:'.$name;
+ $raw_name = "\0".'*'."\0".$raw_name;
+ }
+
+ if (!(isset($this->objectFilters[$class_lower])
+ && is_array($this->objectFilters[$class_lower])
+ && in_array($plain_name,$this->objectFilters[$class_lower]))) {
+
+ if (array_key_exists($raw_name,$members)
+ && !$property->isStatic()) {
+
+ $return[$name] = $this->encodeObject($members[$raw_name], $ObjectDepth + 1, 1, $MaxDepth + 1);
+
+ } else {
+ if (method_exists($property,'setAccessible')) {
+ $property->setAccessible(true);
+ $return[$name] = $this->encodeObject($property->getValue($Object), $ObjectDepth + 1, 1, $MaxDepth + 1);
+ } else
+ if ($property->isPublic()) {
+ $return[$name] = $this->encodeObject($property->getValue($Object), $ObjectDepth + 1, 1, $MaxDepth + 1);
+ } else {
+ $return[$name] = '** Need PHP 5.3 to get value **';
+ }
+ }
+ } else {
+ $return[$name] = '** Excluded by Filter **';
+ }
+ }
+
+ // Include all members that are not defined in the class
+ // but exist in the object
+ foreach( $members as $raw_name => $value ) {
+
+ $name = $raw_name;
+
+ if ($name{0} == "\0") {
+ $parts = explode("\0", $name);
+ $name = $parts[2];
+ }
+
+ $plain_name = $name;
+
+ if (!isset($properties[$name])) {
+ $name = 'undeclared:'.$name;
+
+ if (!(isset($this->objectFilters[$class_lower])
+ && is_array($this->objectFilters[$class_lower])
+ && in_array($plain_name,$this->objectFilters[$class_lower]))) {
+
+ $return[$name] = $this->encodeObject($value, $ObjectDepth + 1, 1, $MaxDepth + 1);
+ } else {
+ $return[$name] = '** Excluded by Filter **';
+ }
+ }
+ }
+
+ array_pop($this->objectStack);
+
+ } elseif (is_array($Object)) {
+
+ if ($ArrayDepth > $this->options['maxArrayDepth']) {
+ return '** Max Array Depth ('.$this->options['maxArrayDepth'].') **';
+ }
+
+ foreach ($Object as $key => $val) {
+
+ // Encoding the $GLOBALS PHP array causes an infinite loop
+ // if the recursion is not reset here as it contains
+ // a reference to itself. This is the only way I have come up
+ // with to stop infinite recursion in this case.
+ if ($key=='GLOBALS'
+ && is_array($val)
+ && array_key_exists('GLOBALS',$val)) {
+ $val['GLOBALS'] = '** Recursion (GLOBALS) **';
+ }
+
+ $return[$key] = $this->encodeObject($val, 1, $ArrayDepth + 1, $MaxDepth + 1);
+ }
+ } else {
+ if (self::is_utf8($Object)) {
+ return $Object;
+ } else {
+ return utf8_encode($Object);
+ }
+ }
+ return $return;
+ }
+
+ /**
+ * Returns true if $string is valid UTF-8 and false otherwise.
+ *
+ * @param mixed $str String to be tested
+ * @return boolean
+ */
+ protected static function is_utf8($str)
+ {
+ if(function_exists('mb_detect_encoding')) {
+ return (mb_detect_encoding($str) == 'UTF-8');
+ }
+ $c=0; $b=0;
+ $bits=0;
+ $len=strlen($str);
+ for($i=0; $i<$len; $i++){
+ $c=ord($str[$i]);
+ if ($c > 128){
+ if (($c >= 254)) return false;
+ elseif ($c >= 252) $bits=6;
+ elseif ($c >= 248) $bits=5;
+ elseif ($c >= 240) $bits=4;
+ elseif ($c >= 224) $bits=3;
+ elseif ($c >= 192) $bits=2;
+ else return false;
+ if (($i+$bits) > $len) return false;
+ while($bits > 1){
+ $i++;
+ $b=ord($str[$i]);
+ if ($b < 128 || $b > 191) return false;
+ $bits--;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Converts to and from JSON format.
+ *
+ * JSON (JavaScript Object Notation) is a lightweight data-interchange
+ * format. It is easy for humans to read and write. It is easy for machines
+ * to parse and generate. It is based on a subset of the JavaScript
+ * Programming Language, Standard ECMA-262 3rd Edition - December 1999.
+ * This feature can also be found in Python. JSON is a text format that is
+ * completely language independent but uses conventions that are familiar
+ * to programmers of the C-family of languages, including C, C++, C#, Java,
+ * JavaScript, Perl, TCL, and many others. These properties make JSON an
+ * ideal data-interchange language.
+ *
+ * This package provides a simple encoder and decoder for JSON notation. It
+ * is intended for use with client-side Javascript applications that make
+ * use of HTTPRequest to perform server communication functions - data can
+ * be encoded into JSON notation for use in a client-side javascript, or
+ * decoded from incoming Javascript requests. JSON format is native to
+ * Javascript, and can be directly eval()'ed with no further parsing
+ * overhead
+ *
+ * All strings should be in ASCII or UTF-8 format!
+ *
+ * LICENSE: Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met: Redistributions of source code must retain the
+ * above copyright notice, this list of conditions and the following
+ * disclaimer. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * @category
+ * @package Services_JSON
+ * @author Michal Migurski
+ * @author Matt Knapp
+ * @author Brett Stimmerman
+ * @author Christoph Dorn
+ * @copyright 2005 Michal Migurski
+ * @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $
+ * @license http://www.opensource.org/licenses/bsd-license.php
+ * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198
+ */
+
+
+ /**
+ * Keep a list of objects as we descend into the array so we can detect recursion.
+ */
+ private $json_objectStack = array();
+
+
+ /**
+ * convert a string from one UTF-8 char to one UTF-16 char
+ *
+ * Normally should be handled by mb_convert_encoding, but
+ * provides a slower PHP-only method for installations
+ * that lack the multibye string extension.
+ *
+ * @param string $utf8 UTF-8 character
+ * @return string UTF-16 character
+ * @access private
+ */
+ private function json_utf82utf16($utf8)
+ {
+ // oh please oh please oh please oh please oh please
+ if (function_exists('mb_convert_encoding')) {
+ return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
+ }
+
+ switch(strlen($utf8)) {
+ case 1:
+ // this case should never be reached, because we are in ASCII range
+ // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ return $utf8;
+
+ case 2:
+ // return a UTF-16 character from a 2-byte UTF-8 char
+ // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ return chr(0x07 & (ord($utf8{0}) >> 2))
+ . chr((0xC0 & (ord($utf8{0}) << 6))
+ | (0x3F & ord($utf8{1})));
+
+ case 3:
+ // return a UTF-16 character from a 3-byte UTF-8 char
+ // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ return chr((0xF0 & (ord($utf8{0}) << 4))
+ | (0x0F & (ord($utf8{1}) >> 2)))
+ . chr((0xC0 & (ord($utf8{1}) << 6))
+ | (0x7F & ord($utf8{2})));
+ }
+
+ // ignoring UTF-32 for now, sorry
+ return '';
+ }
+
+ /**
+ * encodes an arbitrary variable into JSON format
+ *
+ * @param mixed $var any number, boolean, string, array, or object to be encoded.
+ * see argument 1 to Services_JSON() above for array-parsing behavior.
+ * if var is a strng, note that encode() always expects it
+ * to be in ASCII or UTF-8 format!
+ *
+ * @return mixed JSON string representation of input var or an error if a problem occurs
+ * @access public
+ */
+ private function json_encode($var)
+ {
+
+ if (is_object($var)) {
+ if (in_array($var,$this->json_objectStack)) {
+ return '"** Recursion **"';
+ }
+ }
+
+ switch (gettype($var)) {
+ case 'boolean':
+ return $var ? 'true' : 'false';
+
+ case 'NULL':
+ return 'null';
+
+ case 'integer':
+ return (int) $var;
+
+ case 'double':
+ case 'float':
+ return (float) $var;
+
+ case 'string':
+ // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
+ $ascii = '';
+ $strlen_var = strlen($var);
+
+ /*
+ * Iterate over every character in the string,
+ * escaping with a slash or encoding to UTF-8 where necessary
+ */
+ for ($c = 0; $c < $strlen_var; ++$c) {
+
+ $ord_var_c = ord($var{$c});
+
+ switch (true) {
+ case $ord_var_c == 0x08:
+ $ascii .= '\b';
+ break;
+ case $ord_var_c == 0x09:
+ $ascii .= '\t';
+ break;
+ case $ord_var_c == 0x0A:
+ $ascii .= '\n';
+ break;
+ case $ord_var_c == 0x0C:
+ $ascii .= '\f';
+ break;
+ case $ord_var_c == 0x0D:
+ $ascii .= '\r';
+ break;
+
+ case $ord_var_c == 0x22:
+ case $ord_var_c == 0x2F:
+ case $ord_var_c == 0x5C:
+ // double quote, slash, slosh
+ $ascii .= '\\'.$var{$c};
+ break;
+
+ case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
+ // characters U-00000000 - U-0000007F (same as ASCII)
+ $ascii .= $var{$c};
+ break;
+
+ case (($ord_var_c & 0xE0) == 0xC0):
+ // characters U-00000080 - U-000007FF, mask 110XXXXX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
+ $c += 1;
+ $utf16 = $this->json_utf82utf16($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+
+ case (($ord_var_c & 0xF0) == 0xE0):
+ // characters U-00000800 - U-0000FFFF, mask 1110XXXX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c,
+ ord($var{$c + 1}),
+ ord($var{$c + 2}));
+ $c += 2;
+ $utf16 = $this->json_utf82utf16($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+
+ case (($ord_var_c & 0xF8) == 0xF0):
+ // characters U-00010000 - U-001FFFFF, mask 11110XXX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c,
+ ord($var{$c + 1}),
+ ord($var{$c + 2}),
+ ord($var{$c + 3}));
+ $c += 3;
+ $utf16 = $this->json_utf82utf16($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+
+ case (($ord_var_c & 0xFC) == 0xF8):
+ // characters U-00200000 - U-03FFFFFF, mask 111110XX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c,
+ ord($var{$c + 1}),
+ ord($var{$c + 2}),
+ ord($var{$c + 3}),
+ ord($var{$c + 4}));
+ $c += 4;
+ $utf16 = $this->json_utf82utf16($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+
+ case (($ord_var_c & 0xFE) == 0xFC):
+ // characters U-04000000 - U-7FFFFFFF, mask 1111110X
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c,
+ ord($var{$c + 1}),
+ ord($var{$c + 2}),
+ ord($var{$c + 3}),
+ ord($var{$c + 4}),
+ ord($var{$c + 5}));
+ $c += 5;
+ $utf16 = $this->json_utf82utf16($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+ }
+ }
+
+ return '"'.$ascii.'"';
+
+ case 'array':
+ /*
+ * As per JSON spec if any array key is not an integer
+ * we must treat the the whole array as an object. We
+ * also try to catch a sparsely populated associative
+ * array with numeric keys here because some JS engines
+ * will create an array with empty indexes up to
+ * max_index which can cause memory issues and because
+ * the keys, which may be relevant, will be remapped
+ * otherwise.
+ *
+ * As per the ECMA and JSON specification an object may
+ * have any string as a property. Unfortunately due to
+ * a hole in the ECMA specification if the key is a
+ * ECMA reserved word or starts with a digit the
+ * parameter is only accessible using ECMAScript's
+ * bracket notation.
+ */
+
+ // treat as a JSON object
+ if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
+
+ $this->json_objectStack[] = $var;
+
+ $properties = array_map(array($this, 'json_name_value'),
+ array_keys($var),
+ array_values($var));
+
+ array_pop($this->json_objectStack);
+
+ foreach($properties as $property) {
+ if ($property instanceof Exception) {
+ return $property;
+ }
+ }
+
+ return '{' . join(',', $properties) . '}';
+ }
+
+ $this->json_objectStack[] = $var;
+
+ // treat it like a regular array
+ $elements = array_map(array($this, 'json_encode'), $var);
+
+ array_pop($this->json_objectStack);
+
+ foreach($elements as $element) {
+ if ($element instanceof Exception) {
+ return $element;
+ }
+ }
+
+ return '[' . join(',', $elements) . ']';
+
+ case 'object':
+ $vars = self::encodeObject($var);
+
+ $this->json_objectStack[] = $var;
+
+ $properties = array_map(array($this, 'json_name_value'),
+ array_keys($vars),
+ array_values($vars));
+
+ array_pop($this->json_objectStack);
+
+ foreach($properties as $property) {
+ if ($property instanceof Exception) {
+ return $property;
+ }
+ }
+
+ return '{' . join(',', $properties) . '}';
+
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * array-walking function for use in generating JSON-formatted name-value pairs
+ *
+ * @param string $name name of key to use
+ * @param mixed $value reference to an array element to be encoded
+ *
+ * @return string JSON-formatted name-value pair, like '"name":value'
+ * @access private
+ */
+ private function json_name_value($name, $value)
+ {
+ // Encoding the $GLOBALS PHP array causes an infinite loop
+ // if the recursion is not reset here as it contains
+ // a reference to itself. This is the only way I have come up
+ // with to stop infinite recursion in this case.
+ if ($name=='GLOBALS'
+ && is_array($value)
+ && array_key_exists('GLOBALS',$value)) {
+ $value['GLOBALS'] = '** Recursion **';
+ }
+
+ $encoded_value = $this->json_encode($value);
+
+ if ($encoded_value instanceof Exception) {
+ return $encoded_value;
+ }
+
+ return $this->json_encode(strval($name)) . ':' . $encoded_value;
+ }
+}
diff --git a/src/application/code/test/Legacies/Core/LayoutTest.php b/src/application/code/test/Legacies/Core/LayoutTest.php
new file mode 100644
index 0000000..1e2a2fd
--- /dev/null
+++ b/src/application/code/test/Legacies/Core/LayoutTest.php
@@ -0,0 +1,41 @@
+markTestIncomplete();
+ /*
+ $layoutDir = vfsStreamWrapper::getContent('');
+ vfsStream::addStructure(array());
+
+ $this->_object = new Legacies_Core_Layout();
+ */
+ }
+
+ /**
+ * Tears down the fixture, for example, closes a network connection.
+ * This method is called after a test is executed.
+ */
+ protected function tearDown()
+ {
+ }
+
+ public function testEmpty()
+ {
+
+ }
+}
diff --git a/src/application/code/test/Legacies/Empire/Model/BuilderTest.php b/src/application/code/test/Legacies/Empire/Model/BuilderTest.php
new file mode 100644
index 0000000..45b7013
--- /dev/null
+++ b/src/application/code/test/Legacies/Empire/Model/BuilderTest.php
@@ -0,0 +1,237 @@
+_planet = new Legacies_Empire_Model_Planet(array(
+ 'id' => 1,
+ 'id_owner' => 1
+ ));
+
+ $this->_user = new Legacies_Empire_Model_User(array(
+ 'id' => 1
+ ));
+
+ $this->_planet->setUser($this->_user);
+
+ $this->_user->setCurrentPlanet($this->_planet);
+ $this->_user->setHomePlanet($this->_planet);
+
+ $this->_queueItemsData = array(
+ 'IDX0001' => array(
+ 'item_id' => 1,
+ 'level' => 1,
+ 'created_at' => 0,
+ 'updated_at' => 0
+ ),
+ 'IDX0002' => array(
+ 'item_id' => 1,
+ 'level' => 2,
+ 'created_at' => 100,
+ 'updated_at' => 100
+ ),
+ 'IDX0003' => array(
+ 'item_id' => 1,
+ 'level' => 3,
+ 'created_at' => 150,
+ 'updated_at' => 150
+ )
+ );
+ }
+
+ protected function _getMockedInstance($planet, $user, $methods = array())
+ {
+ $reflector = new ReflectionClass($this->_class);
+
+ foreach ($reflector->getMethods() as $method) {
+ if ($method->isAbstract()) {
+ $methods[] = $method->getName();
+ }
+ }
+
+ if (empty($methods)) {
+ $methods = null;
+ }
+
+ return $this->getMock($this->_class, $methods, array($planet, $user));
+ }
+
+ /**
+ * Tears down the fixture, for example, closes a network connection.
+ * This method is called after a test is executed.
+ */
+ protected function tearDown()
+ {
+ }
+
+ public function testInit()
+ {
+ $stub = $this->getMockBuilder('Legacies_Empire_Model_BuilderAbstract')
+ ->disableOriginalConstructor()
+ ->setMethods(array('init', '_initItem', 'updateQueue', 'appendQueue', 'getResourcesNeeded', 'getBuildingTime'))
+ ->getMock();
+
+ $stub->expects($this->once())
+ ->method('init')
+ ->will($this->returnValue($stub));
+
+ $stub->expects($this->never())
+ ->method('_serializeQueue')
+ ->will($this->returnValue($stub));
+
+ $stub->expects($this->never())
+ ->method('_unserializeQueue')
+ ->will($this->returnValue($stub));
+
+ $stub->__construct($this->_planet, $this->_user);
+ }
+
+ public function testSerializingQueue()
+ {
+ $items = array(
+ 'IDX0001' => array(
+ 'item_id' => 1,
+ 'level' => 1,
+ 'created_at' => 0,
+ 'updated_at' => 0
+ ),
+ 'IDX0002' => array(
+ 'item_id' => 1,
+ 'level' => 2,
+ 'created_at' => 100,
+ 'updated_at' => 100
+ ),
+ 'IDX0003' => array(
+ 'item_id' => 1,
+ 'level' => 3,
+ 'created_at' => 150,
+ 'updated_at' => 150
+ )
+ );
+
+ $stub = $this->_getMockedInstance($this->_planet, $this->_user, array('_generateIndex'));
+
+ $stub->expects($this->exactly(3))
+ ->method('_initItem')
+ ->will($this->onConsecutiveCalls(
+ new Legacies_Empire_Model_Builder_Item($this->_queueItemsData['IDX0001']),
+ new Legacies_Empire_Model_Builder_Item($this->_queueItemsData['IDX0002']),
+ new Legacies_Empire_Model_Builder_Item($this->_queueItemsData['IDX0003'])
+ ));
+
+ $stub->expects($this->exactly(3))
+ ->method('_generateIndex')
+ ->will($this->onConsecutiveCalls(
+ 'IDX0001',
+ 'IDX0002',
+ 'IDX0003'
+ ));
+
+ $stub->enqueue($this->_queueItemsData['IDX0001']);
+ $stub->enqueue($this->_queueItemsData['IDX0002']);
+ $stub->enqueue($this->_queueItemsData['IDX0003']);
+
+ $this->assertEquals(serialize($this->_queueItemsData), $stub->serialize());
+ }
+
+ public function testUnSerializingQueue()
+ {
+ $serializedData = serialize($this->_queueItemsData);
+
+ $stub = $this->_getMockedInstance($this->_planet, $this->_user, array('_generateIndex'));
+
+ $stub->expects($this->exactly(3))
+ ->method('_initItem')
+ ->will($this->onConsecutiveCalls(
+ new Legacies_Empire_Model_Builder_Item($this->_queueItemsData['IDX0001']),
+ new Legacies_Empire_Model_Builder_Item($this->_queueItemsData['IDX0002']),
+ new Legacies_Empire_Model_Builder_Item($this->_queueItemsData['IDX0003'])
+ ));
+
+ $stub->expects($this->never())
+ ->method('_generateIndex');
+
+ $stub->unserialize($serializedData);
+
+ $this->assertAttributeNotEmpty('_queue', $stub);
+
+ $this->assertEquals(serialize($this->_queueItemsData), $stub->serialize());
+ }
+
+ public function testUnSerializingQueueWithInvalidData()
+ {
+ $serializedData = '';
+
+ $stub = $this->_getMockedInstance($this->_planet, $this->_user, array('_generateIndex'));
+
+ $stub->expects($this->never())
+ ->method('_initItem');
+
+ $stub->expects($this->never())
+ ->method('_generateIndex');
+
+ $stub->unserialize($serializedData);
+
+ $this->assertAttributeEmpty('_queue', $stub);
+
+ $this->assertEquals('a:0:{}', $stub->serialize());
+ }
+
+ public function testInitItemReturningNull()
+ {
+ $serializedData = serialize($this->_queueItemsData);
+
+ $stub = $this->_getMockedInstance($this->_planet, $this->_user, array('_generateIndex'));
+
+ $stub->expects($this->exactly(3))
+ ->method('_initItem')
+ ->will($this->returnValue(null));
+
+ $stub->unserialize($serializedData);
+
+ $this->assertAttributeEmpty('_queue', $stub);
+
+ $this->assertEquals('a:0:{}', $stub->serialize());
+ }
+
+ public function testCheckAvailability()
+ {
+ $serializedData = serialize($this->_queueItemsData);
+
+ $stub = $this->_getMockedInstance($this->_planet, $this->_user, array('_generateIndex'));
+
+ $stub->expects($this->any())
+ ->method('_initItem')
+ ->will($this->onConsecutiveCalls(
+ new Legacies_Empire_Model_Builder_Item($this->_queueItemsData['IDX0001'])
+ ));
+
+ $this->assertTrue($stub->checkAvailability(Legacies_Empire::ID_BUILDING_METAL_MINE));
+ $this->assertTrue($stub->checkAvailability(Legacies_Empire::ID_BUILDING_CRISTAL_MINE));
+ $this->assertTrue($stub->checkAvailability(Legacies_Empire::ID_BUILDING_DEUTERIUM_SYNTHETISER));
+ $this->assertTrue($stub->checkAvailability(Legacies_Empire::ID_BUILDING_FUSION_REACTOR));
+ }
+}
diff --git a/src/application/code/test/Legacies/ObjectTest.php b/src/application/code/test/Legacies/ObjectTest.php
new file mode 100644
index 0000000..234f744
--- /dev/null
+++ b/src/application/code/test/Legacies/ObjectTest.php
@@ -0,0 +1,205 @@
+_object = new Wootook_Object();
+ }
+
+ /**
+ * Tears down the fixture, for example, closes a network connection.
+ * This method is called after a test is executed.
+ */
+ protected function tearDown()
+ {
+ }
+
+ /**
+ * @todo Implement testSetData().
+ */
+ public function testSetData()
+ {
+ $this->assertAttributeEmpty('_data', $this->_object);
+
+ $this->_object->setData('test', true);
+ $expected = array('test' => true);
+ $this->assertAttributeEquals($expected, '_data', $this->_object);
+
+ $this->_object->setData('test', 'testing');
+ $expected = array('test' => 'testing');
+ $this->assertAttributeEquals($expected, '_data', $this->_object);
+ }
+
+ /**
+ * @requires testSetData
+ */
+ public function testGetData()
+ {
+ $this->_object->setData('test', 'testing');
+
+ $this->assertEquals('testing', $this->_object->getData('test'));
+
+ $this->_object->setData('test', true);
+ $this->assertTrue($this->_object->getData('test'));
+
+ $this->assertNull($this->_object->getData('testing'));
+ }
+
+ /**
+ * @requires testSetData
+ * @requires testGetData
+ */
+ public function testGetAllDatas()
+ {
+ $this->_object->setData('test', 'testing');
+
+ $expected = array('test' => 'testing');
+ $this->assertEquals($expected, $this->_object->getAllDatas());
+
+ $this->_object->setData('test', true);
+ $expected = array('test' => true);
+ $this->assertEquals($expected, $this->_object->getAllDatas());
+ }
+
+ /**
+ * @requires testSetData
+ * @requires testGetData
+ */
+ public function testHasData()
+ {
+ $this->_object->setData('test', 'testing');
+
+ $this->assertTrue($this->_object->hasData('test'));
+ $this->assertFalse($this->_object->hasData('testing'));
+ }
+
+ /**
+ * @requires testSetData
+ */
+ public function testAddData()
+ {
+ $this->_object->setData('test', 'testing');
+
+ $expected = array(
+ 'test' => 'testing',
+ 'testing' => true,
+ 'legacies' => false
+ );
+
+ $this->_object->addData(array(
+ 'testing' => true,
+ 'legacies' => false
+ ));
+ $this->assertAttributeEquals($expected, '_data', $this->_object);
+
+ $expected = array(
+ 'test' => 'legacies',
+ 'testing' => false,
+ 'legacies' => 'Wootook_Object'
+ );
+
+ $this->_object->addData($expected);
+ $this->assertAttributeEquals($expected, '_data', $this->_object);
+ }
+
+ /**
+ * @requires testSetData
+ */
+ public function testUnsetData()
+ {
+ $this->_object->setData('test', 'testing');
+ $this->_object->setData('testing', true);
+ $this->_object->setData('removed', 'me!');
+ $this->_object->setData('legacies', false);
+
+ $expected = array(
+ 'test' => 'testing',
+ 'testing' => true,
+ 'legacies' => false
+ );
+
+ $this->_object->unsetData('removed');
+ $this->assertAttributeEquals($expected, '_data', $this->_object);
+ }
+
+ /**
+ * @todo Implement testClearData().
+ */
+ public function testClearData()
+ {
+ $this->_object->setData('test', 'testing');
+ $this->_object->setData('testing', true);
+ $this->_object->setData('removed', 'me!');
+ $this->_object->setData('legacies', false);
+
+ $expected = array(
+ 'test' => 'testing',
+ 'testing' => true,
+ 'legacies' => false
+ );
+
+ $this->_object->clearData();
+ $this->assertAttributeEmpty('_data', $this->_object);
+ }
+
+ /**
+ * @requires testSetData
+ * @requires testHasData
+ */
+ public function testOffsetExists()
+ {
+ $this->_object->setData('test', 'testing');
+
+ $this->assertTrue(isset($this->_object['test']));
+ }
+
+ /**
+ * @requires testSetData
+ * @requires testGetData
+ */
+ public function testOffsetGet()
+ {
+ $this->_object->setData('test', 'testing');
+
+ $this->assertEquals('testing', $this->_object['test']);
+ }
+
+ /**
+ * @requires testGetData
+ * @requires testSetData
+ */
+ public function testOffsetSet()
+ {
+ $this->_object['test'] = 'testing';
+
+ $this->assertEquals('testing', $this->_object->getData('test'));
+ }
+
+ /**
+ * @requires testSetData
+ * @requires testGetData
+ */
+ public function testOffsetUnset()
+ {
+ $this->_object->setData('test', 'testing');
+
+ unset($this->_object['test']);
+
+ $this->assertAttributeEmpty('_data', $this->_object);
+ $this->assertNull($this->_object->getData('test'));
+ }
+}
diff --git a/src/application/code/test/WootookTest.php b/src/application/code/test/WootookTest.php
new file mode 100644
index 0000000..8962684
--- /dev/null
+++ b/src/application/code/test/WootookTest.php
@@ -0,0 +1,119 @@
+setData('success', true);
+ }
+
+ public static function staticListener($observer)
+ {
+ $observer->setData('success', true);
+ }
+
+ public function testRegisteringNonStaticEvent()
+ {
+ Wootook::registerListener('testing', array($this, 'nonStaticListener'));
+
+ $observer = Wootook::dispatchEvent('testing', array('success' => false));
+
+ $this->assertInstanceOf('Legacies_Core_Event', $observer);
+ $this->assertTrue($observer->getData('success'));
+ }
+
+ public function testRegisteringStaticEvent()
+ {
+ Wootook::registerListener('testing', array(get_class($this), 'staticListener'));
+
+ $observer = Wootook::dispatchEvent('testing', array('success' => false));
+
+ $this->assertInstanceOf('Legacies_Core_Event', $observer);
+ $this->assertTrue($observer->getData('success'));
+ }
+
+ public function testDispatchNonExistingEvent()
+ {
+ $observer = Wootook::dispatchEvent('testing', array('success' => true));
+
+ $this->assertInstanceOf('Legacies_Core_Event', $observer);
+ $this->assertTrue($observer->getData('success'));
+ }
+
+ /**
+ * @depends testRegisteringNonStaticEvent
+ */
+ public function testUnregisteringNonStaticEvent()
+ {
+ Wootook::registerListener('testing', array($this, 'nonStaticListener'));
+
+ Wootook::clearEventListeners('testing');
+
+ $observer = Wootook::dispatchEvent('testing', array('success' => false));
+
+ $this->assertInstanceOf('Legacies_Core_Event', $observer);
+ $this->assertFalse($observer->getData('success'));
+ }
+
+ /**
+ * @depends testRegisteringStaticEvent
+ */
+ public function testUnregisteringStaticEvent()
+ {
+ Wootook::registerListener('testing', array(get_class($this), 'staticListener'));
+
+ Wootook::clearEventListeners('testing');
+
+ $observer = Wootook::dispatchEvent('testing', array('success' => false));
+
+ $this->assertInstanceOf('Legacies_Core_Event', $observer);
+ $this->assertFalse($observer->getData('success'));
+ }
+
+ public function testGetSession()
+ {
+ $this->markTestSkipped('Sessions could not be tested in CLI.');
+ $this->assertInstanceOf('Legacies_Core_Model_Session', Wootook::getSession('test'));
+ }
+
+ public function testGetTranslator()
+ {
+ $this->assertInstanceOf('Legacies_Core_Model_Translator', Wootook::getTranslator('test'));
+
+ $this->assertInstanceOf('Legacies_Core_Model_Translator', Wootook::getTranslator());
+ }
+
+ public function testTranslate()
+ {
+ $this->assertEquals('My testing message!', Wootook::translate('test', 'My %s message!', array('testing')));
+ }
+
+ public function testTranslateGettextStyle()
+ {
+ $this->assertEquals('My testing message!', Wootook::__('My %s message!', 'testing'));
+ }
+
+ public function testSetDefaultLocale()
+ {
+ Wootook::setDefaultLocale('test');
+
+ $this->assertAttributeEquals('test', '_defaultLocale', 'Beyond');
+ }
+
+ /**
+ *
+ * @requires testSetDefaultLocale
+ */
+ public function testGetDefaultLocale()
+ {
+ Wootook::setDefaultLocale('test');
+
+ $this->assertEquals('test', Wootook::getDefaultLocale());
+ }
+}
diff --git a/src/application/code/test/bootstrap.php b/src/application/code/test/bootstrap.php
new file mode 100644
index 0000000..b304533
--- /dev/null
+++ b/src/application/code/test/bootstrap.php
@@ -0,0 +1,66 @@
+ array(
+ 'application' => array(
+ 'code' => array(
+ 'community' => array(),
+ 'core' => array(),
+ 'libraries' => array(),
+ 'local' => array(),
+ ),
+ 'design' => array(
+ 'layouts' => array(),
+ 'scripts' => array()
+ )
+ ),
+ 'data' => array(
+ 'combat.php' => ' ' ' ' ' ' ' ' ' array(
+ 'date' => array(
+ 'timezone' => 'Europe/Paris'
+ ),
+ 'database' => array(
+ 'engine' => 'mysql',
+ 'options' => array(
+ 'hostname' => 'localhost',
+ 'username' => 'root',
+ 'password' => '',
+ 'database' => 'db_xnova'
+ ),
+ 'table_prefix' => 'game_',
+ ),
+ 'layout' => array(
+ 'page' => 'page.php',
+ 'empire' => 'empire.php'
+ )
+ )
+ ), true) . ';'
+ ), 'root', 644);
+
+define('ROOT_PATH', vfsStream::url(''));
+define('APPLICATION_PATH', vfsStream::url('includes/application'));
+
diff --git a/src/application/design/backend/base/default/layouts/admin.xml b/src/application/design/backend/base/default/layouts/admin.xml
new file mode 100644
index 0000000..18fde20
--- /dev/null
+++ b/src/application/design/backend/base/default/layouts/admin.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+ system
+ System
+
+
+ players
+ Player Accounts
+
+
+
+
+
diff --git a/src/application/design/frontend/base/default/layouts/empire.xml b/src/application/design/frontend/base/default/layouts/empire.xml
index 9fca984..f18da5b 100644
--- a/src/application/design/frontend/base/default/layouts/empire.xml
+++ b/src/application/design/frontend/base/default/layouts/empire.xml
@@ -1,8 +1,6 @@
-
-
@@ -186,23 +184,44 @@
+
+
+
+
+
+
+
-
+
+
+ overview
+
+
+
-
+
+
+
+ player/overview/fleet/item.phtml
+
+
+ empire/overview.fleet.list.item
+
+
-
+
+
@@ -210,7 +229,8 @@
-
+
+
@@ -218,6 +238,7 @@
+
@@ -242,6 +263,7 @@
+
@@ -276,6 +298,7 @@
+
diff --git a/src/application/design/frontend/base/default/layouts/page.xml b/src/application/design/frontend/base/default/layouts/page.xml
index 53a6c80..b2975e7 100644
--- a/src/application/design/frontend/base/default/layouts/page.xml
+++ b/src/application/design/frontend/base/default/layouts/page.xml
@@ -59,8 +59,6 @@
-
-
public
@@ -90,6 +88,7 @@
+
@@ -103,6 +102,7 @@
+
diff --git a/src/application/design/frontend/base/default/layouts/player.xml b/src/application/design/frontend/base/default/layouts/player.xml
index 19b1e65..16bd812 100644
--- a/src/application/design/frontend/base/default/layouts/player.xml
+++ b/src/application/design/frontend/base/default/layouts/player.xml
@@ -1,6 +1,7 @@
+
@@ -24,6 +25,7 @@
+
@@ -47,6 +49,7 @@
+
@@ -68,21 +71,4 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- Overview
-
-
-
-
\ No newline at end of file
+
diff --git a/src/application/design/frontend/base/default/scripts/empire/planet/buildings/queue.phtml b/src/application/design/frontend/base/default/scripts/empire/planet/buildings/queue.phtml
index d11b574..0549d6c 100644
--- a/src/application/design/frontend/base/default/scripts/empire/planet/buildings/queue.phtml
+++ b/src/application/design/frontend/base/default/scripts/empire/planet/buildings/queue.phtml
@@ -1,6 +1,6 @@
isEmpty()):?>
__('Work in progress')?>
-getPartial('item-list')->render() ?>
+renderPartial('item-list') ?>
-
\ No newline at end of file
+
diff --git a/src/application/design/frontend/base/default/scripts/empire/topnav.phtml b/src/application/design/frontend/base/default/scripts/empire/topnav.phtml
index ab4f285..cd3877b 100644
--- a/src/application/design/frontend/base/default/scripts/empire/topnav.phtml
+++ b/src/application/design/frontend/base/default/scripts/empire/topnav.phtml
@@ -7,11 +7,11 @@
escape($planet->getName())?>
getMoon()) !== null): ?>
-
+
-
+
diff --git a/src/application/design/frontend/base/default/scripts/page/2columns-left.phtml b/src/application/design/frontend/base/default/scripts/page/2columns-left.phtml
index 2a5d895..c2a4134 100644
--- a/src/application/design/frontend/base/default/scripts/page/2columns-left.phtml
+++ b/src/application/design/frontend/base/default/scripts/page/2columns-left.phtml
@@ -7,11 +7,14 @@
-
- left->render()?>
-
-
- content->render()?>
+
+
+ left->render()?>
+
+
+ content->render()?>
+
+