Refactoring Bpmn/Workflow handling layer (1st commit)
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -28,3 +28,4 @@ workflow/public_html/lib/
|
||||
workflow/public_html/lib-dev/
|
||||
session.data
|
||||
behat.yml
|
||||
workflow/engine/src/Tests/config.ini
|
||||
|
||||
@@ -794,7 +794,7 @@ class Bootstrap
|
||||
* @param string $strClass
|
||||
* @return void
|
||||
*/
|
||||
public function LoadClass($strClass)
|
||||
public static function LoadClass($strClass)
|
||||
{
|
||||
$classfile = Bootstrap::ExpandPath("classes") . 'class.' . $strClass . '.php';
|
||||
if (!file_exists($classfile)) {
|
||||
@@ -818,7 +818,7 @@ class Bootstrap
|
||||
* @param string $strClass
|
||||
* @return void
|
||||
*/
|
||||
public function LoadThirdParty($sPath, $sFile)
|
||||
public static function LoadThirdParty($sPath, $sFile)
|
||||
{
|
||||
$classfile = PATH_THIRDPARTY . $sPath . '/' . $sFile . ((substr($sFile, 0, - 4) !== '.php') ? '.php' : '');
|
||||
return require_once ($classfile);
|
||||
@@ -1068,7 +1068,7 @@ class Bootstrap
|
||||
* @param string $strPath
|
||||
* @return string
|
||||
*/
|
||||
public function expandPath($strPath = '')
|
||||
public static function expandPath($strPath = '')
|
||||
{
|
||||
$res = "";
|
||||
$res = PATH_CORE;
|
||||
|
||||
@@ -2078,7 +2078,7 @@ class G
|
||||
* @param eter array data // erik: associative array within data input to replace for formatted string i.e "any messsage {replaced_label} that contains a replace label"
|
||||
* @return string
|
||||
*/
|
||||
public function LoadTranslation ($msgID, $lang = SYS_LANG, $data = null)
|
||||
public static function LoadTranslation ($msgID, $lang = SYS_LANG, $data = null)
|
||||
{
|
||||
global $translation;
|
||||
|
||||
@@ -2746,7 +2746,7 @@ class G
|
||||
* @access public
|
||||
* @return int
|
||||
*/
|
||||
public function generateUniqueID ()
|
||||
public static function generateUniqueID ()
|
||||
{
|
||||
do {
|
||||
$sUID = str_replace( '.', '0', uniqid( rand( 0, 999999999 ), true ) );
|
||||
|
||||
@@ -183,7 +183,7 @@ class Content extends BaseContent
|
||||
* @param string $ConValue
|
||||
* @return variant
|
||||
*/
|
||||
public function addContent ($ConCategory, $ConParent, $ConId, $ConLang, $ConValue)
|
||||
public static function addContent ($ConCategory, $ConParent, $ConId, $ConLang, $ConValue)
|
||||
{
|
||||
try {
|
||||
if ($ConLang != 'en') {
|
||||
|
||||
@@ -869,7 +869,7 @@ class Process extends BaseProcess
|
||||
$limit = 25;
|
||||
$start = 0;
|
||||
|
||||
$memcache = &PMmemcached::getSingleton( SYS_SYS );
|
||||
$memcache = PMmemcached::getSingleton( SYS_SYS );
|
||||
|
||||
for ($start = 0; $start <= 50 - 1; $start ++) {
|
||||
$memkey = "processList-allProcesses-" . ($start * $limit) . "-" . $limit;
|
||||
|
||||
@@ -63,7 +63,7 @@ class ProcessProxy extends HttpProxyController
|
||||
|
||||
$sProUid = $oProcessMap->createProcess( $processData );
|
||||
|
||||
//call plugins
|
||||
//call pluginsx
|
||||
$oData['PRO_UID'] = $sProUid;
|
||||
$oData['PRO_TEMPLATE'] = isset( $httpData->PRO_TEMPLATE ) && $httpData->PRO_TEMPLATE != '' ? $httpData->PRO_TEMPLATE : '';
|
||||
$oData['PROCESSMAP'] = $oProcessMap;
|
||||
|
||||
@@ -499,17 +499,21 @@ class Model
|
||||
|
||||
$result = self::updateDiagram($prjUid, $process->getProUid(), $diff);
|
||||
|
||||
self::log("Method: ".__METHOD__, 'Returns: ', $result);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public static function updateDiagram($prjUid, $proUid, $diff)
|
||||
{
|
||||
self::log('executing: updateDiagram() with params -> ', $prjUid, $proUid, $diff);
|
||||
self::log("Method: ".__METHOD__, 'Params: ', "\$prjUid: $prjUid", "\$proUid: $proUid", "\$diff:", $diff);
|
||||
|
||||
//return false;
|
||||
$uids = array();
|
||||
|
||||
// Updating objects
|
||||
/*
|
||||
* Updating Records
|
||||
*/
|
||||
foreach ($diff['updated'] as $element => $items) {
|
||||
foreach ($items as $data) {
|
||||
$data = array_change_key_case((array) $data, CASE_UPPER);
|
||||
@@ -550,7 +554,37 @@ class Model
|
||||
}
|
||||
}
|
||||
|
||||
// Creating new records
|
||||
/*
|
||||
* Deleting Records
|
||||
*/
|
||||
foreach ($diff['deleted'] as $element => $items) {
|
||||
foreach ($items as $uid) {
|
||||
$data = array_change_key_case((array) $data, CASE_UPPER);
|
||||
|
||||
switch ($element) {
|
||||
case 'laneset':
|
||||
break;
|
||||
case 'lanes':
|
||||
break;
|
||||
case 'activities':
|
||||
$activity = ActivityPeer::retrieveByPK($uid);
|
||||
$activity->delete();
|
||||
break;
|
||||
case 'events':
|
||||
break;
|
||||
case 'gateways':
|
||||
break;
|
||||
case 'flows':
|
||||
break;
|
||||
case 'artifacts':
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Creating new records
|
||||
*/
|
||||
foreach ($diff['new'] as $element => $items) {
|
||||
foreach ($items as $data) {
|
||||
$data = array_change_key_case((array) $data, CASE_UPPER);
|
||||
@@ -586,35 +620,6 @@ class Model
|
||||
}
|
||||
}
|
||||
|
||||
// Creating new records
|
||||
foreach ($diff['deleted'] as $element => $items) {
|
||||
foreach ($items as $uid) {
|
||||
$data = array_change_key_case((array) $data, CASE_UPPER);
|
||||
|
||||
switch ($element) {
|
||||
case 'laneset':
|
||||
break;
|
||||
case 'lanes':
|
||||
break;
|
||||
case 'activities':
|
||||
$activity = ActivityPeer::retrieveByPK($uid);
|
||||
$activity->delete();
|
||||
|
||||
$uidData['new_uid'] = $activity->getActUid();
|
||||
$uids[] = $uidData;
|
||||
break;
|
||||
case 'events':
|
||||
break;
|
||||
case 'gateways':
|
||||
break;
|
||||
case 'flows':
|
||||
break;
|
||||
case 'artifacts':
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $uids;
|
||||
}
|
||||
|
||||
@@ -914,7 +919,7 @@ class Model
|
||||
|
||||
$me = Logger::getInstance();
|
||||
$args = func_get_args();
|
||||
array_unshift($args, 'Class '.__CLASS__.': ');
|
||||
//array_unshift($args, 'Class '.__CLASS__.' ');
|
||||
|
||||
call_user_func_array(array($me, 'setLog'), $args);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
namespace ProcessMaker\Project\Adapter;
|
||||
|
||||
use ProcessMaker\Project\ProjectHandler;
|
||||
|
||||
class BpmnProject extends ProjectHandler
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
namespace ProcessMaker\Project\Adapter;
|
||||
|
||||
use ProcessMaker\Project\Adapter\BpmnHandler;
|
||||
|
||||
class WorkflowBpmnProject extends BpmnHandler
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
namespace ProcessMaker\Project\Adapter;
|
||||
|
||||
use \Process;
|
||||
use \Task;
|
||||
|
||||
use ProcessMaker\Project\ProjectHandler;
|
||||
|
||||
class WorkflowProject extends ProjectHandler
|
||||
{
|
||||
public function create($data)
|
||||
{
|
||||
try {
|
||||
// setting defaults
|
||||
$data['TASKS'] = array_key_exists('TASKS', $data) ? $data['TASKS'] : array();
|
||||
$data['ROUTES'] = array_key_exists('ROUTES', $data) ? $data['ROUTES'] : array();
|
||||
|
||||
// Create project
|
||||
$process = new Process();
|
||||
$proUid = $process->create($data, false);
|
||||
|
||||
// Create project's tasks
|
||||
foreach ($data['TASKS'] as $taskData) {
|
||||
$taskData['PRO_UID'] = $proUid;
|
||||
$task = new Task();
|
||||
$task->create($taskData, false);
|
||||
}
|
||||
|
||||
// Create project's routes
|
||||
foreach ($data['ROUTES'] as $route) {
|
||||
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
//throw new \RuntimeException($e);
|
||||
echo $e->getMessage() . PHP_EOL;
|
||||
echo $e->getTraceAsString() . PHP_EOL;
|
||||
die;
|
||||
}
|
||||
}
|
||||
|
||||
public function update($prjUid, $data)
|
||||
{
|
||||
// TODO: Implement update() method.
|
||||
}
|
||||
|
||||
public function delete($prjUid)
|
||||
{
|
||||
// TODO: Implement delete() method.
|
||||
}
|
||||
|
||||
public function load($prjUid)
|
||||
{
|
||||
// TODO: Implement load() method.
|
||||
}
|
||||
}
|
||||
35
workflow/engine/src/ProcessMaker/Project/ProjectHandler.php
Normal file
35
workflow/engine/src/ProcessMaker/Project/ProjectHandler.php
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
namespace ProcessMaker\Project;
|
||||
|
||||
use ProcessMaker\Util\Logger;
|
||||
|
||||
abstract class ProjectHandler implements ProjectHandlerInterface
|
||||
{
|
||||
public abstract function create($data);
|
||||
public abstract function update($prjUid, $data);
|
||||
public abstract function delete($prjUid);
|
||||
public abstract function load($prjUid);
|
||||
|
||||
/**
|
||||
* Log in ProcessMaker Standard Output if debug mode is enabled.
|
||||
*
|
||||
* @author Erik Amaru Ortiz <aortiz.erik at icloud dot com>
|
||||
* @internal param $args this method receives N-Arguments dynamically with any type, string, array, object, etc
|
||||
* it means that you ca use it by example:
|
||||
*
|
||||
* self::log("Beginning transaction");
|
||||
* self::log("Method: ", __METHOD__, 'Returns: ', $result);
|
||||
*
|
||||
*/
|
||||
public static function log()
|
||||
{
|
||||
if (System::isDebugMode()) {
|
||||
|
||||
$me = Logger::getInstance();
|
||||
$args = func_get_args();
|
||||
//array_unshift($args, 'Class '.__CLASS__.' ');
|
||||
|
||||
call_user_func_array(array($me, 'setLog'), $args);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
namespace ProcessMaker\Project;
|
||||
|
||||
interface ProjectHandlerInterface
|
||||
{
|
||||
public function create($data);
|
||||
public function update($prjUid, $data);
|
||||
public function delete($prjUid);
|
||||
public function load($prjUid);
|
||||
}
|
||||
@@ -38,8 +38,10 @@ class Logger
|
||||
$arg = print_r($arg, true);
|
||||
}
|
||||
|
||||
$stat = fwrite($this->fp, "- " . date('Y-m-d H:i:s') . " " . $arg . PHP_EOL);
|
||||
fwrite($this->fp, "- " . date('Y-m-d H:i:s') . " " . $arg . PHP_EOL);
|
||||
}
|
||||
if (count($args) > 1)
|
||||
fwrite($this->fp, PHP_EOL);
|
||||
}
|
||||
|
||||
public static function log()
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
if (! class_exists("Propel")) {
|
||||
include_once "../../bootstrap.php";
|
||||
}
|
||||
|
||||
use \ProcessMaker\Project\Adapter\WorkflowProject;
|
||||
|
||||
|
||||
class WorkflowProjectTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
protected $workflowProject;
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
$this->workflowProject = new WorkflowProject();
|
||||
}
|
||||
|
||||
public function testCreate()
|
||||
{
|
||||
$data = array(
|
||||
"PRO_UID" => "b72405854591363786050152eabf59dc",
|
||||
"PRO_TITLE" => "Test Project #1",
|
||||
"PRO_DESCRIPTION" => "Description for - Test Project #1",
|
||||
"PRO_CATEGORY" => "",
|
||||
"USR_UID" => "00000000000000000000000000000001",
|
||||
"TASKS" => array(
|
||||
array(
|
||||
"TAS_UID" => "85459136378bf56050152ea9dcb72405",
|
||||
"TAS_TITLE" => "task_1",
|
||||
"TAS_POSX" => "50",
|
||||
"TAS_POSY" => "50",
|
||||
"TAS_WIDTH" => "100",
|
||||
"TAS_HEIGHT" => "25"
|
||||
)
|
||||
),
|
||||
"ROUTES" => array()
|
||||
);
|
||||
|
||||
$result = $this->workflowProject->create($data);
|
||||
|
||||
var_dump($result);
|
||||
}
|
||||
}
|
||||
5
workflow/engine/src/Tests/bootstrap.php
Normal file
5
workflow/engine/src/Tests/bootstrap.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
include "pm-bootstrap.php";
|
||||
|
||||
|
||||
4
workflow/engine/src/Tests/config.ini.dist
Normal file
4
workflow/engine/src/Tests/config.ini.dist
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
pm_home_dir = "/Users/erik/devel/colosa/processmaker"
|
||||
workspace = workflow
|
||||
lang = en
|
||||
138
workflow/engine/src/Tests/pm-bootstrap.php
Normal file
138
workflow/engine/src/Tests/pm-bootstrap.php
Normal file
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
//
|
||||
// pm-bootstrap.php
|
||||
//
|
||||
|
||||
$config = parse_ini_file("config.ini");
|
||||
$workspace = $config['workspace'];
|
||||
$lang = $config['lang'];
|
||||
$processMakerHome = $config['pm_home_dir'];
|
||||
$rootDir = realpath($processMakerHome) . DIRECTORY_SEPARATOR;
|
||||
|
||||
define('SYS_LANG', $lang);
|
||||
define('PATH_SEP', DIRECTORY_SEPARATOR);
|
||||
|
||||
define('PATH_TRUNK', $rootDir . PATH_SEP);
|
||||
define('PATH_OUTTRUNK', realpath($rootDir . '/../') . PATH_SEP);
|
||||
define('PATH_HOME', $rootDir . PATH_SEP . 'workflow' . PATH_SEP);
|
||||
|
||||
define('PATH_HTML', PATH_HOME . 'public_html' . PATH_SEP);
|
||||
define('PATH_RBAC_HOME', PATH_TRUNK . 'rbac' . PATH_SEP);
|
||||
define('PATH_GULLIVER_HOME', PATH_TRUNK . 'gulliver' . PATH_SEP);
|
||||
define('PATH_GULLIVER', PATH_GULLIVER_HOME . 'system' . PATH_SEP); //gulliver system classes
|
||||
define('PATH_GULLIVER_BIN', PATH_GULLIVER_HOME . 'bin' . PATH_SEP); //gulliver bin classes
|
||||
define('PATH_TEMPLATE', PATH_GULLIVER_HOME . 'templates' . PATH_SEP);
|
||||
define('PATH_THIRDPARTY', PATH_GULLIVER_HOME . 'thirdparty' . PATH_SEP);
|
||||
define('PATH_RBAC', PATH_RBAC_HOME . 'engine' . PATH_SEP . 'classes' . PATH_SEP); //to enable rbac version 2
|
||||
define('PATH_RBAC_CORE', PATH_RBAC_HOME . 'engine' . PATH_SEP);
|
||||
define('PATH_CORE', PATH_HOME . 'engine' . PATH_SEP);
|
||||
define('PATH_SKINS', PATH_CORE . 'skins' . PATH_SEP);
|
||||
define('PATH_SKIN_ENGINE', PATH_CORE . 'skinEngine' . PATH_SEP);
|
||||
define('PATH_METHODS', PATH_CORE . 'methods' . PATH_SEP);
|
||||
define('PATH_XMLFORM', PATH_CORE . 'xmlform' . PATH_SEP);
|
||||
define('PATH_CONFIG', PATH_CORE . 'config' . PATH_SEP);
|
||||
define('PATH_PLUGINS', PATH_CORE . 'plugins' . PATH_SEP);
|
||||
define('PATH_HTMLMAIL', PATH_CORE . 'html_templates' . PATH_SEP);
|
||||
define('PATH_TPL', PATH_CORE . 'templates' . PATH_SEP);
|
||||
define('PATH_TEST', PATH_CORE . 'test' . PATH_SEP);
|
||||
define('PATH_FIXTURES', PATH_TEST . 'fixtures' . PATH_SEP);
|
||||
define('PATH_RTFDOCS', PATH_CORE . 'rtf_templates' . PATH_SEP);
|
||||
define('PATH_DYNACONT', PATH_CORE . 'content' . PATH_SEP . 'dynaform' . PATH_SEP);
|
||||
define('SYS_UPLOAD_PATH', PATH_HOME . "public_html/files/" );
|
||||
define('PATH_UPLOAD', PATH_HTML . 'files' . PATH_SEP);
|
||||
define('PATH_WORKFLOW_MYSQL_DATA', PATH_CORE . 'data' . PATH_SEP . 'mysql' . PATH_SEP);
|
||||
define('PATH_RBAC_MYSQL_DATA', PATH_RBAC_CORE . 'data' . PATH_SEP . 'mysql' . PATH_SEP);
|
||||
define('FILE_PATHS_INSTALLED', PATH_CORE . 'config' . PATH_SEP . 'paths_installed.php' );
|
||||
define('PATH_WORKFLOW_MSSQL_DATA', PATH_CORE . 'data' . PATH_SEP . 'mssql' . PATH_SEP);
|
||||
define('PATH_RBAC_MSSQL_DATA', PATH_RBAC_CORE . 'data' . PATH_SEP . 'mssql' . PATH_SEP);
|
||||
define('PATH_CONTROLLERS', PATH_CORE . 'controllers' . PATH_SEP);
|
||||
define('PATH_SERVICES_REST', PATH_CORE . 'services' . PATH_SEP . 'rest' . PATH_SEP);
|
||||
|
||||
require_once PATH_GULLIVER . PATH_SEP . 'class.bootstrap.php';
|
||||
|
||||
spl_autoload_register(array("Bootstrap", "autoloadClass"));
|
||||
|
||||
Bootstrap::registerClass("G", PATH_GULLIVER . "class.g.php");
|
||||
Bootstrap::registerClass("System", PATH_HOME . "engine/classes/class.system.php");
|
||||
|
||||
// define autoloading for others
|
||||
Bootstrap::registerClass("wsBase", PATH_HOME . "engine/classes/class.wsBase.php");
|
||||
Bootstrap::registerClass('Xml_Node', PATH_GULLIVER . "class.xmlDocument.php");
|
||||
Bootstrap::registerClass('XmlForm_Field_TextPM', PATH_HOME . "engine/classes/class.XmlForm_Field_TextPM.php");
|
||||
Bootstrap::registerClass('XmlForm_Field_SimpleText', PATH_GULLIVER . "class.xmlformExtension.php");
|
||||
Bootstrap::registerClass('XmlForm_Field', PATH_GULLIVER . "class.xmlform.php");
|
||||
|
||||
Bootstrap::LoadThirdParty("smarty/libs", "Smarty.class");
|
||||
|
||||
Bootstrap::registerSystemClasses();
|
||||
|
||||
Bootstrap::registerDir('src', PATH_HOME . 'engine/src/');
|
||||
|
||||
$config = System::getSystemConfiguration();
|
||||
|
||||
define('DEBUG_SQL_LOG', $config['debug_sql']);
|
||||
define('DEBUG_TIME_LOG', $config['debug_time']);
|
||||
define('DEBUG_CALENDAR_LOG', $config['debug_calendar']);
|
||||
define('MEMCACHED_ENABLED', $config['memcached']);
|
||||
define('MEMCACHED_SERVER', $config['memcached_server']);
|
||||
define('TIME_ZONE', $config['time_zone']);
|
||||
|
||||
|
||||
// set include path
|
||||
set_include_path(
|
||||
PATH_CORE . PATH_SEPARATOR .
|
||||
PATH_THIRDPARTY . PATH_SEPARATOR .
|
||||
PATH_THIRDPARTY . 'pear' . PATH_SEPARATOR .
|
||||
PATH_RBAC_CORE . PATH_SEPARATOR .
|
||||
get_include_path()
|
||||
);
|
||||
|
||||
|
||||
/*
|
||||
* Setting Up Workspace
|
||||
*/
|
||||
|
||||
// include the server installed configuration
|
||||
require_once FILE_PATHS_INSTALLED;
|
||||
|
||||
define('SYS_SYS', $workspace);
|
||||
|
||||
// defining system constant when a valid server environment exists
|
||||
define( 'PATH_LANGUAGECONT', PATH_DATA . "META-INF" . PATH_SEP );
|
||||
define( 'PATH_CUSTOM_SKINS', PATH_DATA . 'skins' . PATH_SEP );
|
||||
define( 'PATH_TEMPORAL', PATH_C . 'dynEditor/' );
|
||||
define( 'PATH_DB', PATH_DATA . 'sites' . PATH_SEP );
|
||||
|
||||
$workspaceDir = PATH_DB . $workspace;
|
||||
|
||||
// smarty constants
|
||||
define( 'PATH_SMARTY_C', PATH_C . 'smarty' . PATH_SEP . 'c' );
|
||||
define( 'PATH_SMARTY_CACHE', PATH_C . 'smarty' . PATH_SEP . 'cache' );
|
||||
|
||||
|
||||
//***************** PM Paths DATA **************************
|
||||
define('PATH_DATA_SITE', PATH_DATA . 'sites/' . SYS_SYS . '/');
|
||||
define('PATH_DOCUMENT', PATH_DATA_SITE . 'files/');
|
||||
define('PATH_DATA_MAILTEMPLATES', PATH_DATA_SITE . 'mailTemplates/');
|
||||
define('PATH_DATA_PUBLIC', PATH_DATA_SITE . 'public/');
|
||||
define('PATH_DATA_REPORTS', PATH_DATA_SITE . 'reports/');
|
||||
define('PATH_DYNAFORM', PATH_DATA_SITE . 'xmlForms/');
|
||||
define('PATH_IMAGES_ENVIRONMENT_FILES', PATH_DATA_SITE . 'usersFiles' . PATH_SEP);
|
||||
define('PATH_IMAGES_ENVIRONMENT_USERS', PATH_DATA_SITE . 'usersPhotographies' . PATH_SEP);
|
||||
|
||||
if (is_file(PATH_DATA_SITE.PATH_SEP . '.server_info')) {
|
||||
$SERVER_INFO = file_get_contents(PATH_DATA_SITE.PATH_SEP.'.server_info');
|
||||
$SERVER_INFO = unserialize($SERVER_INFO);
|
||||
|
||||
define('SERVER_NAME', $SERVER_INFO ['SERVER_NAME']);
|
||||
define('SERVER_PORT', $SERVER_INFO ['SERVER_PORT']);
|
||||
} else {
|
||||
echo "WARNING! No server info found!";
|
||||
}
|
||||
|
||||
// create memcached singleton
|
||||
Bootstrap::LoadClass( 'memcached' );
|
||||
$memcache = PMmemcached::getSingleton( SYS_SYS );
|
||||
|
||||
Propel::init(PATH_CONFIG . "databases.php");
|
||||
|
||||
Reference in New Issue
Block a user