Search
Search
Search
Search
Information
Information
Light
Dark
Open actions menu
Basic upload method
Bypass upload method
Tips!
If you encounter an error (by firewall) while uploading using both methods,
try changing extension of the file before uploading it and rename it right after.
This uploader supports multiple file upload.
Submit
~
var
www
podiocopy.bitkit.dk
httpdocs
app
Modules
Application
File Content:
CalculationAppToAppRepo.php
<?php /** * Created by PhpStorm. * User: jis * Date: 1/6/15 * Time: 5:17 PM */ namespace App\Modules\Application; use Exception; use Log; use MongoDB\BSON\ObjectId; use MongoId; use PodioAppField; class CalculationAppToAppRepo { public function __construct() { $this->podioAppsModel = new PodioAppModel(); } public function updateCalculation($app, $passByApps = null) { //Log::info("updateCalculation: " . $app['app_id']); // $appID, try { if ($passByApps) { if (in_array($app['app_id'], $passByApps)) { // already checked this app //Log::info("already checked this app:" . $app['app_id']); return null; } } $CalculationAppToAppRepo = new CalculationAppToAppRepo(); $missingFields = $this->arrayDiff($app['fields'], $app['new_fields']); foreach ($missingFields as $field) { $newScript = $CalculationAppToAppRepo->getNewScript($app, $field['script'], $passByApps); log::info($newScript); try { $attributes = array("type" => 'calculation', 'config' => array( 'label' => $field['label'], 'delta' => $field['delta'], 'settings' => array('script' => $newScript) )); $resp = PodioAppField::create($app['target_app_id'], $attributes); // update app $appFields = $app['fields']; foreach ($appFields as $appField) { if ($appField['field_id'] . '' == $field['field_id'] . '') { $appField['script_status'] = "updated"; } } $updatedApp = $this->podioAppsModel->findOne(array('_id' => $app['_id'])); $newFields = $updatedApp['new_fields']; $newFields[] = array("type" => 'calculation', 'label' => $field['label'], 'external_id' => $field['external_id'], 'field_id' => intval($resp)); $this->podioAppsModel->update(array('_id' => $app['_id']), array('fields' => $appFields, 'new_fields' => $newFields)); } catch (Exception $e) { log: info($e); $error_messages[] = array('error_message' => $e->getMessage(), 'error_trace' => $e->getTraceAsString()); $error_messages = $app['error_messages']; $this->podioAppsModel->update(array('_id' => $app['_id']), array('error_messages' => $error_messages)); } } } catch (Exception $e) { Log::error($e); } } private function getNewScript($app, $script, $passByApps) { $inAgrExpression = "(in_(min|max|sum)_\\d+_\\d+)"; $outAgrExpression = "(out_(min|max|sum)_\\d+_\\d+)"; $inExpression = "(in_\\d+_\\d+)"; $outExpression = "(out_\\d+_\\d+)"; $fieldExpression = "(field_\\d+)"; $scriptPass = preg_replace('~_(min)~', '', $script); $scriptPass = preg_replace('~_(max)~', '', $scriptPass); if (preg_match_all($inExpression, $scriptPass, $matches) || preg_match_all($inAgrExpression, $scriptPass, $matches)) { foreach ($matches[0] as $match) { $newMatch = $this->makeNewInScript($app, $match, $passByApps); if ($newMatch) { $match = preg_replace('~(in)_~', '', $match); $newMatch = preg_replace('~(in)_~', '', $newMatch); $script = str_replace($match, $newMatch, $script); } } } if (preg_match_all($outExpression, $scriptPass, $matches) || preg_match_all($outAgrExpression, $scriptPass, $matches)) { foreach ($matches[0] as $match) { $newMatch = $this->makeNewOutScript($app, $match, $passByApps); if ($newMatch) { $match = preg_replace('~(out)_~', '', $match); $newMatch = preg_replace('~(out)_~', '', $newMatch); $script = str_replace($match, $newMatch, $script); } } } if (preg_match_all($fieldExpression, $scriptPass, $matches)) { foreach ($matches[0] as $match) { $newMatch = $this->makeNewFieldScript($app, $match, $passByApps); if ($newMatch) { $script = str_replace($match, $newMatch, $script); } } } return $script; } /** * @param $app - original app * @param $match - matched string * @param $passByApps * @return null|string out calculation * out calculation * make new script */ private function makeNewOutScript($app, $match, $passByApps) { //echo "<br/>" . $match; $array = explode('_', $match); if (count($array) < 3) { $field1 = $array[1]; $field2 = $array[2]; // same app field id } else { $field1 = $array[2]; $field2 = $array[3]; // same app field id } $newField1 = $newField2 = null; if (count($app['all_fields'])) { foreach ($app['all_fields'] as $field) { if ($field['field_id'] . '' == $field2 . '') { if (isset($field['config']['settings']['referenced_apps'])) { $newField1 = $field['new_field_id']; $fieldFound = false; //echo "<br/>newField1:$newField1"; foreach ($field['config']['settings']['referenced_apps'] as $rApp) { $appId = $rApp['app_id'] . ''; $relationApp = $this->podioAppsModel->find( array('queue_id' => $app['queue_id'], 'app_id' => $appId), 1); if ($relationApp) { } if (count($relationApp['all_fields'])) { foreach ($relationApp['all_fields'] as $rField) { if ($rField['field_id'] == $field1) { $fieldFound = true; $newField2 = $rField['new_field_id']; break; } } } } if ($newField1 != null && $newField2 == null) { //todo field not found if ($fieldFound && isset($app['calculation_recursion']) && $app['calculation_recursion'] == "not_done") { foreach ($field['relationApps'] as $rApp) { $relationApp = $this->podioAppsModel->find(array('queue_id' => $app['queue_id'], 'app_id' => $rApp['app_id']), 1); $passByApps[] = $relationApp['app_id']; $this->updateCalculation($relationApp, $passByApps); } // all dependency are passed // update app - completed calculation_recursion $this->podioAppsModel->update(array('_id' => $app['_id']), array('calculation_recursion' => "done")); //updated $app = $this->podioAppsModel->findOne(array('_id' => new ObjectId($app['_id']))); $this->makeNewOutScript($app, $match, $passByApps); } } } else { // no relation found } break; } } } if ($newField1 != null && $newField2 != null) { if (count($array) < 3) { return "out_" . $newField2 . "_" . $newField1; } else { return "out_" . $array[1] . "_" . $newField2 . "_" . $newField1; } } else return null; } private function makeNewFieldScript($app, $match, $passByApps) { $array = explode('_', $match); $newField1 = null; if (count($array) > 1) { $field1 = $array[1]; $fieldFound = false; foreach ($app['all_fields'] as $field) { if ($field['field_id'] == $field1) { $fieldFound = true; $newField1 = $field['new_field_id']; } } if ($newField1 != null) { return "field_" . $newField1; } if (!$fieldFound && isset($app['calculation_recursion']) && $app['calculation_recursion'] == "not_done") { // todo field not found } } return null; } /** * @param $app - original app * @param $match - matched string * @param $passByApps * @return null|string In script * In script * make new script */ private function makeNewInScript($app, $match, $passByApps) { $dependencyApps = array(); // 1. find all apps which have this app as dependency $apps = $this->podioAppsModel->find(array('queue_id' => $app['queue_id'], 'app_id' => array('$ne' => $app['app_id']))); if ($apps) { foreach ($apps as $dApp) { if (in_array($app['app_id'], $dApp['dependencies'])) { $dependencyApps[] = $dApp; } } } // 2. if (count($dependencyApps) > 0) { $array = explode('_', $match); if (count($array) < 3) { $field1 = $array[1]; $field2 = $array[2]; // same app field id } else { $field1 = $array[2]; $field2 = $array[3]; // same app field id } $newField1 = $newField2 = null; $fieldFound = false; foreach ($dependencyApps as $dependencyApp) { foreach ($dependencyApp['all_fields'] as $field) { if ($field['field_id'] == $field1) { $fieldFound = true; $newField1 = $field['new_field_id']; } if ($field['field_id'] == $field2) { $fieldFound = true; $newField2 = $field['new_field_id']; } if ($newField1 != null && $newField2 != null) break; } } if ($newField1 != null && $newField2 != null) { if (count($array) < 3) { return "in_" . $newField2 . "_" . $newField1; } else { return "in_" . $array[1] . "_" . $newField2 . "_" . $newField1; } } else { //todo field not found if ($fieldFound && isset($app['calculation_recursion']) && $app['calculation_recursion'] == "not_done") { foreach ($dependencyApps as $dependencyApp) { $passByApps[] = $dependencyApp['app_id']; $this->updateCalculation($dependencyApp, $passByApps); } // all dependency are passed // update app - completed calculation_recursion $this->podioAppsModel->update(array('_id' => $app['_id']), array('calculation_recursion' => "done")); //updated $app = $this->podioAppsModel->findOne(array('_id' => new ObjectId($app['_id']))); $this->makeNewInScript($app, $match, $passByApps); } } } return null; } private function getNewFieldId($externalId, $newFields) { foreach ($newFields as $field) { if ($field['external_id'] == $externalId) { return $field['field_id']; } } return null; } private function arrayDiff($aArray1, $aArray2) { $aReturn = array(); foreach ($aArray1 as $mValue) { if ($this->inArrayCheck($aArray2, $mValue)) { $aReturn[] = $mValue; } } return $aReturn; } private function inArrayCheck($aArray2, $subArray) { foreach ($aArray2 as $mValue) { if ($mValue['type'] == $subArray['type'] && $mValue['external_id'] == $subArray['external_id']) return false; } return true; } }
Edit
Download
Unzip
Chmod
Delete