modxcms/revolution

View on GitHub
manager/controllers/default/resource/create.class.php

Summary

Maintainability
D
2 days
Test Coverage
<?php
/*
 * This file is part of MODX Revolution.
 *
 * Copyright (c) MODX, LLC. All Rights Reserved.
 *
 * For complete copyright and license information, see the COPYRIGHT and LICENSE
 * files found in the top-level directory of this distribution.
 */

require_once dirname(__FILE__).'/resource.class.php';
/**
 * Loads the create resource page
 *
 * @package modx
 * @subpackage manager.controllers
 */
class ResourceCreateManagerController extends ResourceManagerController {

    /**
     * Check for any permissions or requirements to load page
     * @return bool
     */
    public function checkPermissions() {
        return $this->modx->hasPermission('new_document');
    }

    /**
     * Register custom CSS/JS for the page
     * @return void
     */
    public function loadCustomCssJs() {
        $mgrUrl = $this->modx->getOption('manager_url',null,MODX_MANAGER_URL);
        $this->addJavascript($mgrUrl.'assets/modext/widgets/element/modx.panel.tv.renders.js');
        $this->addJavascript($mgrUrl.'assets/modext/widgets/resource/modx.grid.resource.security.local.js');
        $this->addJavascript($mgrUrl.'assets/modext/widgets/resource/modx.panel.resource.tv.js');
        $this->addJavascript($mgrUrl.'assets/modext/widgets/resource/modx.panel.resource.js');
        $this->addJavascript($mgrUrl.'assets/modext/sections/resource/create.js');
        $this->addHtml('
        <script>
        // <![CDATA[
        MODx.config.publish_document = "'.$this->canPublish.'";
        MODx.onDocFormRender = "'.$this->onDocFormRender.'";
        MODx.ctx = "'.$this->ctx.'";
        Ext.onReady(function() {
            MODx.load({
                xtype: "modx-page-resource-create"
                ,record: '.$this->modx->toJSON($this->resourceArray).'
                ,publish_document: "'.$this->canPublish.'"
                ,canSave: "'.($this->modx->hasPermission('save_document') ? 1 : 0).'"
                ,show_tvs: '.(!empty($this->tvCounts) ? 1 : 0).'
                ,mode: "create"
            });
        });
        // ]]>
        </script>');
        /* load RTE */
        $this->loadRichTextEditor();
    }

    /**
     * Custom logic code here for setting placeholders, etc
     * @param array $scriptProperties
     * @return mixed
     */
    public function process(array $scriptProperties = array()) {
        $placeholders = array();
        $reloadData = $this->getReloadData();

        /* handle template inheritance */
        if (!empty($this->scriptProperties['parent'])) {
            $this->parent = $this->modx->getObject('modResource',$this->scriptProperties['parent']);
            if (!$this->parent->checkPolicy('add_children')) return $this->failure($this->modx->lexicon('resource_add_children_access_denied'));
        } else {
            $this->parent = $this->modx->newObject('modResource');
            $this->parent->set('id',0);
            $this->parent->set('template',$this->modx->getOption('default_template',null,1));
        }
        $placeholders['parent'] = $this->parent;

        $this->setContext();
        if (!$this->context) { return $this->failure($this->modx->lexicon('context_err_nf')); }

        /* handle custom resource types */
        $this->resource = $this->modx->newObject($this->resourceClass);
        $this->resource->set('id',0);
        $this->resource->set('context_key',$this->context->get('key'));
        $placeholders['resource'] = $this->resource;
        $this->resourceArray = array();

        $placeholders['parentname'] = $this->setParent();
        $this->fireOnRenderEvent();

        /* set template */
        if (!is_null($this->resource->get('template')) && $this->resource->get('template') !== 0) {
            $this->scriptProperties['template'] = $this->resource->get('template');
        }

        /* check permissions */
        $this->setPermissions();

        /* initialize FC rules */
        $overridden = array();

        /* set default template */
        if (empty($reloadData)) {
            $defaultTemplate = $this->getDefaultTemplate();
            $this->resourceArray = array_merge($this->resourceArray,array(
                'template' => $defaultTemplate,
                'content_type' => $this->context->getOption('default_content_type',1,$this->modx->_userConfig),
                'class_key' => $this->resourceClass,
                'context_key' => $this->ctx,
                'parent' => $this->parent->get('id'),
                'richtext' =>  $this->context->getOption('richtext_default', true, $this->modx->_userConfig),
                'hidemenu' => $this->context->getOption('hidemenu_default', 0, $this->modx->_userConfig),
                'published' => $this->context->getOption('publish_default', 0, $this->modx->_userConfig),
                'searchable' => $this->context->getOption('search_default', 1, $this->modx->_userConfig),
                'cacheable' => $this->context->getOption('cache_default', 1, $this->modx->_userConfig),
                'syncsite' => $this->context->getOption('syncsite_default', 1, $this->modx->_userConfig),
                'alias_visible' => $this->context->getOption('alias_visible_default', 1, $this->modx->_userConfig),
            ));

            // Allow certain fields to be prefilled from the OnDocFormRender plugin event
            $newValuesArr = array();
            $allowedFields = array('pagetitle','longtitle','description','introtext','content','link_attributes','alias','menutitle');
            foreach ($allowedFields as $field) {
                $value = $this->resource->get($field);
                if (!empty($value)) {
                    $newValuesArr[$field] = $value;
                }
            }
            $this->resourceArray = array_merge($this->resourceArray, $newValuesArr);

            $this->parent->fromArray($this->resourceArray);
            $this->parent->set('template',$defaultTemplate);
            $this->resource->set('template',$defaultTemplate);
            $this->getResourceGroups();

            /* check FC rules */
            $overridden = $this->checkFormCustomizationRules($this->resource);
        } else {
            $this->resourceArray = array_merge($this->resourceArray, $reloadData);
            $this->resourceArray['resourceGroups'] = array();
            $this->resourceArray['resource_groups'] = $this->modx->getOption('resource_groups',
                $this->resourceArray, array());
            $this->resourceArray['resource_groups'] = is_array($this->resourceArray['resource_groups']) ?
                $this->resourceArray['resource_groups'] :
                $this->modx->fromJSON($this->resourceArray['resource_groups']);
            if (is_array($this->resourceArray['resource_groups'])) {
                foreach ($this->resourceArray['resource_groups'] as $resourceGroup) {
                    $this->resourceArray['resourceGroups'][] = array(
                        $resourceGroup['id'],
                        $resourceGroup['name'],
                        $resourceGroup['access'],
                    );
                }
            }
            unset($this->resourceArray['resource_groups']);
            $this->resource->fromArray($reloadData); // We should have in Reload Data everything needed to do form customization checkings

            /* check FC rules */
            $overridden = $this->checkFormCustomizationRules($this->resource);
        }

        /* apply FC rules */
        $this->resourceArray = array_merge($this->resourceArray,$overridden);

        /* handle checkboxes and defaults */
        $this->resourceArray['published'] = isset($this->resourceArray['published']) && intval($this->resourceArray['published']) == 1 ? true : false;
        $this->resourceArray['hidemenu'] = isset($this->resourceArray['hidemenu']) && intval($this->resourceArray['hidemenu']) == 1 ? true : false;
        $this->resourceArray['isfolder'] = isset($this->resourceArray['isfolder']) && intval($this->resourceArray['isfolder']) == 1 ? true : false;
        $this->resourceArray['richtext'] = isset($this->resourceArray['richtext']) && intval($this->resourceArray['richtext']) == 1 ? true : false;
        $this->resourceArray['searchable'] = isset($this->resourceArray['searchable']) && intval($this->resourceArray['searchable']) == 1 ? true : false;
        $this->resourceArray['cacheable'] = isset($this->resourceArray['cacheable']) && intval($this->resourceArray['cacheable']) == 1 ? true : false;
        $this->resourceArray['deleted'] = isset($this->resourceArray['deleted']) && intval($this->resourceArray['deleted']) == 1 ? true : false;
        $this->resourceArray['uri_override'] = isset($this->resourceArray['uri_override']) && intval($this->resourceArray['uri_override']) == 1 ? true : false;
        $this->resourceArray['syncsite'] = isset($this->resourceArray['syncsite']) && intval($this->resourceArray['syncsite']) == 1 ? true : false;
        $this->resourceArray['alias_visible'] = isset($this->resourceArray['alias_visible']) && (int)$this->resourceArray['alias_visible'] === 1;
        if (!empty($this->resourceArray['parent'])) {
            if ($this->parent->get('id') == $this->resourceArray['parent']) {
                $this->resourceArray['parent_pagetitle'] = $this->modx->stripTags($this->parent->get('pagetitle'));
            } else {
                /** @var modResource $overriddenParent */
                $overriddenParent = $this->modx->getObject('modResource',$this->resourceArray['parent']);
                if ($overriddenParent) {
                    $this->resourceArray['parent_pagetitle'] = $this->modx->stripTags($overriddenParent->get('pagetitle'));
                }
            }
        }

        /* get TVs */
        $this->loadTVs($reloadData);

        /* single-use token for creating resource */
        $this->setResourceToken();

        return $placeholders;
    }

    /**
     * Return the default template for this resource
     *
     * @return int
     */
    public function getDefaultTemplate() {
        $defaultTemplate = $this->context->getOption('default_template', 0, $this->modx->_userConfig);
        if (isset($this->scriptProperties['template'])) {
            $defaultTemplate = $this->scriptProperties['template'];
        } else {
            switch ($this->context->getOption('automatic_template_assignment', 'parent', $this->modx->_userConfig)) {
                case 'parent':
                    if (!empty($this->parent->id))
                        $defaultTemplate = $this->parent->get('template');
                    break;
                case 'sibling':
                    if (!empty($this->parent->id)) {
                        $c = $this->modx->newQuery('modResource');
                        $c->where(array('parent'=>$this->parent->id, 'context_key'=>$this->ctx));
                        $c->sortby('id', 'DESC');
                        $c->limit(1);
                        $siblings = $this->modx->getCollection('modResource', $c);
                        if (!empty($siblings)) {
                            foreach ($siblings as $sibling){
                                $defaultTemplate = $sibling->get('template');
                            }
                        }else{
                            if (!empty($this->parent->id))
                                $defaultTemplate = $this->parent->get('template');
                        }
                    }
                    break;
                case 'system':
                    /* already established */
                    break;
            }
        }
        $userGroups = $this->modx->user->getUserGroups();
        $c = $this->modx->newQuery('modActionDom');
        $c->innerJoin('modFormCustomizationSet','FCSet');
        $c->innerJoin('modFormCustomizationProfile','Profile','FCSet.profile = Profile.id');
        $c->leftJoin('modFormCustomizationProfileUserGroup','ProfileUserGroup','Profile.id = ProfileUserGroup.profile');
        $c->leftJoin('modFormCustomizationProfile','UGProfile','UGProfile.id = ProfileUserGroup.profile');
        $c->where(array(
            'modActionDom.action' => 'resource/create',
            'modActionDom.name' => 'template',
            'modActionDom.container' => 'modx-panel-resource',
            'modActionDom.rule' => 'fieldDefault',
            'modActionDom.active' => true,
            'FCSet.active' => true,
            'Profile.active' => true,
        ));

        $criteriaUserGroups = [];

        if(!empty($userGroups)){
            $criteriaUserGroups['ProfileUserGroup.usergroup:IN'] = $userGroups;
        }

        $criteriaUserGroups[] = array(
            'OR:ProfileUserGroup.usergroup:IS' => null,
            'AND:UGProfile.active:=' => true,
        );

        $c->where(array(
            $criteriaUserGroups,
            'OR:ProfileUserGroup.usergroup:=' => null,
        ),xPDOQuery::SQL_AND,null,2);
        /** @var modActionDom $fcDt see http://tracker.modx.com/issues/9592 */
        $fcDtColl = $this->modx->getCollection('modActionDom',$c);
        if ($fcDtColl) {
            if ($this->parent) { /* ensure get all parents */
                $p = $this->parent ? $this->parent->get('id') : 0;
                $parentIds = $this->modx->getParentIds($p,10,array(
                    'context' => $this->parent->get('context_key'),
                ));
                $parentIds[] = $p;
                $parentIds = array_unique($parentIds);
            } else {
                $parentIds = array(0);
            }
            /* Check for any FC rules relevant to this page's parents */
            foreach ($fcDtColl as $fcDt) {
                $constraintField = $fcDt->get('constraint_field');
                if (($constraintField == 'id' || $constraintField == 'parent') && in_array($fcDt->get('constraint'),$parentIds)) {
                    $defaultTemplate = $fcDt->get('value');
                } else if (empty($constraintField)) {
                    $defaultTemplate = $fcDt->get('value');
                }
            }
        }

        return $defaultTemplate;
    }

    /**
     * Return the pagetitle
     *
     * @return string
     */
    public function getPageTitle() {
        return $this->modx->lexicon('document_new');
    }

    /**
     * Return the location of the template file
     * @return string
     */
    public function getTemplateFile() {
        return 'resource/create.tpl';
    }
}

class DocumentCreateManagerController extends ResourceCreateManagerController {}