Skip to content

Commit

Permalink
Dev: refactored the php menucreation system
Browse files Browse the repository at this point in the history
Provided foundation for top-bar menu rendering
  • Loading branch information
lacrioque committed Jul 20, 2017
1 parent 73d669e commit 2aedcf8
Show file tree
Hide file tree
Showing 24 changed files with 892 additions and 600 deletions.
2 changes: 1 addition & 1 deletion application/config/version.php
Expand Up @@ -13,7 +13,7 @@

$config['versionnumber'] = '3.0.0-beta.1'; //The current version of this branch
$config['masterversion'] = '2.62.2'; //The current masters version merged into this branch
$config['dbversionnumber'] = 304;
$config['dbversionnumber'] = 305;
$config['buildnumber'] = '';
$config['updatable'] = true;
$config['assetsversionnumber'] = '2900';
Expand Down
10 changes: 5 additions & 5 deletions application/controllers/admin/database.php
Expand Up @@ -979,7 +979,7 @@ private function actionUpdateSurveyLocaleSettings($iSurveyID)
{
// Preload survey
$oSurvey=Survey::model()->findByPk($iSurveyID);

$aOldAttributes = $oSurvey->attributes;
// Save plugin settings : actually leave it before saving core : we are sure core settings is saved in LS way.
$pluginSettings = App()->request->getPost('plugin', array());
foreach($pluginSettings as $plugin => $settings)
Expand Down Expand Up @@ -1091,7 +1091,7 @@ private function actionUpdateSurveyLocaleSettings($iSurveyID)
$event = new PluginEvent('beforeSurveySettingsSave');
$event->set('modifiedSurvey', $oSurvey);
App()->getPluginManager()->dispatchEvent($event);

$aAfterApplyAttributes = $oSurvey->attributes;
if ($oSurvey->save())
{
Yii::app()->setFlashMessage(gT("Survey settings were successfully saved."));
Expand Down Expand Up @@ -1181,7 +1181,7 @@ private function actionUpdateSurveyLocaleSettings($iSurveyID)
'data' => [
'success' => true,
'updated'=> $updatedFields,
'DEBUG' => [$_POST,$oSurvey->attributes]
'DEBUG' => ['POST'=>$_POST,'reloaded'=>$oSurvey->attributes, 'initial'=>$aOldAttributes, 'afterApply'=>$aAfterApplyAttributes]
],
),
false,
Expand Down Expand Up @@ -1231,8 +1231,8 @@ private function _filterEmptyFields(&$oSurvey, $fieldArrayName, $newValue=null){
$options = $this->updateableFields[$fieldArrayName];
switch($options['type']){
case 'yesno':
if($newValue != 'Y' || $newValue != 'N')
$newValue = ($newValue=='1' || $newValue==true ) ? 'Y' : 'N';
if($newValue != 'Y' && $newValue != 'N')
$newValue = ($newValue=='1') ? 'Y' : 'N';
break;
case 'Int' :
$newValue = (int) $newValue;
Expand Down
29 changes: 27 additions & 2 deletions application/helpers/update/updatedb_helper.php
Expand Up @@ -235,8 +235,8 @@ function db_upgrade_all($iOldDBVersion, $bSilent=false) {
if ($iOldDBVersion < 296) {
$oTransaction = $oDB->beginTransaction();

$oDB->createCommand()->addColumn('{{surveymenu}}', 'user_id', "int DEFAULT NULL");
$oDB->createCommand()->addColumn('{{surveymenu_entries}}', 'user_id', "int DEFAULT NULL");
addColumn('{{surveymenu}}', 'user_id', "int DEFAULT NULL");
addColumn('{{surveymenu_entries}}', 'user_id', "int DEFAULT NULL");

$oDB->createCommand()->insert('{{surveymenu}}', array('id' => 2,'parent_id' => NULL,'survey_id' => NULL,'order' => 1,'level' => 0,'title' => 'quickmenu','description' => 'Quickmenu', 'position'=>'collapsed', 'changed_at' => date('Y-m-d H:i:s'),'changed_by' => 0,'created_at' => date('Y-m-d H:i:s'),'created_by' => 0));

Expand Down Expand Up @@ -291,6 +291,31 @@ function db_upgrade_all($iOldDBVersion, $bSilent=false) {
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>304),"stg_name='DBVersion'");
}

/**
* Update to sidemenu rendering
*/
if ($iOldDBVersion < 305) {
$oTransaction = $oDB->beginTransaction();
$oDB->createCommand()->update('{{surveymenu_entries}}',
array('data'=> "{\"render\": {\"link\": {\"external\": true, \"data\": {\"sid\": [\"survey\",\"sid\"], \"newtest\": \"Y\", \"lang\": [\"survey\",\"language\"]}}}}"),
"id=17"
);
$oDB->createCommand()->update('{{surveymenu_entries}}',
array('data'=> "{\"render\": { \"link\": {\"data\": {\"surveyid\": [\"survey\",\"sid\"]}} } }"),
"id IN (1,4,7,9,10,12,18,19,21,22,23,24,25)"
);
$oDB->createCommand()->update('{{surveymenu_entries}}',
array('data'=> "{\"render\": {\"isActive\": false, \"link\": {\"data\": {\"surveyid\": [\"survey\",\"sid\"]}}}}"),
"id IN (15,30)"
);
$oDB->createCommand()->update('{{surveymenu_entries}}',
array('data'=> "{\"render\": {\"isActive\": true, \"link\": {\"data\": {\"surveyid\": [\"survey\",\"sid\"]}}}}"),
"id=16"
);
$oTransaction->commit();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>305),"stg_name='DBVersion'");
}

}
catch(Exception $e)
{
Expand Down
59 changes: 13 additions & 46 deletions application/models/Survey.php
Expand Up @@ -585,44 +585,6 @@ public function getGoogleanalyticsapikey(){
}
}

private function _getValueFromEntryArray($valueArray)
{
if($valueArray[0] == "this"){
return $this[$valueArray[1]];
} else {
return @call_user_func_array([$this, array_shift($valueArray)], $valueArray);
}
}

private function _parseSurveyMenuData($dataAttribute)
{
$aData = json_decode(stripcslashes($dataAttribute),true);

$aData['aLinkCreator'] = ['surveyid'=> $this->sid];
$aData['noRender'] = false;
$aData['linkExternal'] = false;
if(isset($aData['render']))
{
if(isset($aData['render']['link']))
{
$aData['aLinkCreator'] = [];
foreach($aData['render']['link']['data'] as $key => $value){
if(is_array($value)){
$value= $this->_getValueFromEntryArray($value);
}
$aData['aLinkCreator'][$key] = $value;
}
$aData['linkExternal'] = isset($aData['render']['link']['external']) ? $aData['render']['link']['external'] : false;
}
if(isset($aData['render']['isActive']))
{
$aData['noRender'] = ($this->active && $aData['render']['isActive']);
}

}

return (object) ($aData);
}

private function _createSurveymenuArray($oSurveyMenuObjects)
{
Expand All @@ -631,24 +593,29 @@ private function _createSurveymenuArray($oSurveyMenuObjects)
$aResultCollected = [];
foreach($oSurveyMenuObjects as $oSurveyMenuObject){
$entries = [];
$defaultMenuEntries = $oSurveyMenuObject->surveymenuEntries;
$aMenuEntries = $oSurveyMenuObject->surveymenuEntries;
$submenus = $this->_getSurveymenuSubmenus($oSurveyMenuObject);
foreach($defaultMenuEntries as $menuEntry){
foreach($aMenuEntries as $menuEntry){
$aEntry = $menuEntry->attributes;
//Skip menu if no permission
if(
(!empty($entry['permission']) && !empty($entry['permission_grade'])
&& !Permission::model()->hasSurveyPermission($this->sid,$entry['permission'],$entry['permission_grade']))
) {continue;}
//parse the render part of the data attribute
$oDataAttribute = $this->_parseSurveyMenuData($menuEntry->data);
if($oDataAttribute->noRender){continue;}
$oDataAttribute = new SurveymenuEntryData();
$oDataAttribute->apply($menuEntry, $this->sid);

if($oDataAttribute->isActive !== null){
if(($oDataAttribute->isActive==true && $this->active == 'N') || ($oDataAttribute->isActive==false && $this->active == 'Y')){
continue;
}
}

$aEntry['link'] = $aEntry['menu_link']
? App()->getController()->createUrl($aEntry['menu_link'],$oDataAttribute->aLinkCreator)
: App()->getController()->createUrl("admin/survey/sa/rendersidemenulink",['surveyid' => $this->sid, 'subaction' => $aEntry['name'] ]);
$aEntry['link'] = $oDataAttribute->linkCreator();
$aEntry['link_external'] = $oDataAttribute->linkExternal;
$aEntry['debugData'] = $oDataAttribute;
$aEntry['debugData'] = $oDataAttribute->attributes;

$entries[$aEntry['id']] = $aEntry;
}
$aResultCollected[$oSurveyMenuObject->id] = [
Expand Down
106 changes: 106 additions & 0 deletions application/models/SurveymenuEntryData.php
@@ -0,0 +1,106 @@
<?php

class SurveymenuEntryData extends CFormModel {

public $rawData = null;
public $render = null;
public $link = "admin/survey/sa/rendersidemenulink";
public $linkData = array();
public $linkExternal = false;
public $surveyid = 0;
public $menuEntry = null;
public $isActive = null;

public function apply($menuEntry, $surveyid){
$this->surveyid = $surveyid;
$this->menuEntry = $menuEntry;

$oData = json_decode(stripcslashes($this->menuEntry->data));
$jsonError = json_last_error();
if($jsonError){
$this->rawData = [];
} else {
$this->rawData = $oData;
$this->_parseDataAttribute();
}
$this->_parseLink();
}

public function linkCreator(){
$returnLink = Yii::app()->getController()->createUrl($this->link, $this->linkData);
return $returnLink;
}

private function _parseDataAttribute(){

$this->isActive = $this->_recursiveIssetWithDefault($this->rawData , array('render','isActive'), 0, $this->isActive);
$this->linkExternal = $this->_recursiveIssetWithDefault($this->rawData , array('render', 'link','external'), 0, $this->linkExternal);
$alinkData = $this->_recursiveIssetWithDefault($this->rawData , array('render', 'link','data'), 0, $this->linkData);

foreach($alinkData as $key => $value){
if(is_array($value)){
$value= $this->_getValueForLinkData($value);
}
$this->linkData[$key] = $value;
}
}

private function _parseLink(){

if(empty($this->menuEntry->menu_link)){
$this->linkData['subaction'] = $this->menuEntry->name;
$this->linkData['surveyid'] = $this->surveyid;
} else {
$this->link = $this->menuEntry->menu_link;
}

}

private function _recursiveIssetWithDefault ($variable, $checkArray, $i=0, $fallback=null) {
$default = null;
if(is_array($variable) && array_key_exists($checkArray[$i], $variable))
$default = $variable[$checkArray[$i]];
else if(is_object($variable) && property_exists($variable, $checkArray[$i]))
$default = $variable->{$checkArray[$i]};
if(!isset($default))
return $fallback;

else if(count($checkArray) > $i + 1)
return $this->_recursiveIssetWithDefault($default, $checkArray, $i+1, $fallback);
else
return $default;

}

private function _getValueForLinkData($getDataPair)
{

$oSurvey = Survey::model()->findByPk($this->surveyid);
list($type,$attribute) = $getDataPair;
$oTypeObject = null;
switch($type){
case 'survey':
$oTypeObject = &$oSurvey;
break;
case 'template':
$oTypeObject = Template::model()->findByPk($oSurvey->template);
break;
case 'questiongroup':
if(isset($_REQUEST['gid'])){
$oTypeObject = QuestionGroup::model()->getByPk(((int) $_REQUEST['gid']));
}
break;
case 'question':
if(isset($_REQUEST['qid'])){
$oTypeObject = QuestionGroup::model()->getByPk(((int) $_REQUEST['qid']));
}
break;
}

$result = $oTypeObject != null ? $oTypeObject->{$attribute} : null;
return $result;
}

}

?>
8 changes: 6 additions & 2 deletions application/views/admin/survey/surveybar_view.php
Expand Up @@ -6,8 +6,11 @@
* @var Survey $oSurvey
*/
?>


<?php
/*
<topbar></topbar>
*/
?>
<div class='menubar surveybar' id="surveybarid">
<div class='row container-fluid row-button-margin-bottom'>

Expand Down Expand Up @@ -657,6 +660,7 @@
</a>
<?php endif;?>
*/ ?>

</div>
</div>
</div>

0 comments on commit 2aedcf8

Please sign in to comment.