We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 36604
    • 268 Posts
    Hi,

    I just saw there's no more element tree in my own site. Never had such issue on this site running since may be 3 years.
    I've updated to 226 in January, but did not noticed then any issue (but not absolutely sure this is not connected to).

    Tried to flush/clear everything with no results.

    There's this new error in the error.log:
     [2013-02-08 10:40:06] (ERROR @ /connectors/workspace/packages.php) Impossible d'ouvrir le fichier pour lire: taglister-1.1.7-pl.transport.zip?revolution_version=Revolution-2.2.6-pl
    [2013-02-08 10:40:06] (ERROR @ /connectors/workspace/packages.php) MODX could not download the file. You must enable allow_url_fopen, cURL or fsockopen to use remote transport packaging.
    [2013-02-08 10:40:06] (ERROR @ /connectors/workspace/packages.php) Impossible de transférer le paquet taglister-1.1.7-pl.transport.zip vers /home/dzineo/www/core/packages/.
    [2013-02-08 11:07:20] (ERROR @ /connectors/element/template.php) Error caching lexicon topic lexicon/fr/core/template


    I did not tried to manipulate any packages before... and of course this server has been running for years...
    I tried to reinstall Articles, and it ran ok.
    I re ran the setup again and it worked fine but still no element tree!


    Thank you
      • 3749
      • 24,544 Posts
      Try deleting all files in the core/cache directory.

        Did I help you? Buy me a beer
        Get my Book: MODX:The Official Guide
        MODX info for everyone: http://bobsguides.com/modx.html
        My MODX Extras
        Bob's Guides is now hosted at A2 MODX Hosting
        • 36604
        • 268 Posts
        Hi,

        A friend and partner had a look to the whole site and finally found a corrupted php file!
        /www/core/model/modx/processors/element/getnodes.class.php

        This one was shorter than normal (16k vs 20) but had not any strange date. Though, the hacking hypothesis is not kept.
        this is weird because I re run the setup to try to solve this issue. But the install procedure did not wrote over this file.

        We had to change it manually by ftp sending the one from the zip.
        Now it's all good.

        But really puzzling.

        her's the php file contained into the corrupted files, just in case:
        <?php
        /**
         * Grabs all elements for element tree
         *
         * @param string $id (optional) Parent ID of object to grab from. Defaults to 0.
         *
         * @package modx
         * @subpackage processors.layout.tree.element
         */
        class modElementGetNodesProcessor extends modProcessor {
            public $typeMap = array(
                'template' => 'modTemplate',
                'tv' => 'modTemplateVar',
                'chunk' => 'modChunk',
                'snippet' => 'modSnippet',
                'plugin' => 'modPlugin',
                'category' => 'modCategory',
            );
            public $actionMap = array();
            
            public function checkPermissions() {
                return $this->modx->hasPermission('element_tree');
            }
            public function getLanguageTopics() {
                return array('category','element');
            }
        
            public function initialize() {
                $this->setDefaultProperties(array(
                    'stringLiterals' => false,
                    'id' => 0,
                ));
                return true;
            }
        
            public function process() {
                $this->getActions();
                $map = $this->getMap();
        
                /* load correct mode */
                switch ($map[0]) {
                    case 'type': /* if in the element, but not in a category */
                        $nodes = $this->getTypeNodes($map);
                        break;
                    case 'root': /* if clicking one of the root nodes */
                        $nodes = $this->getRootNodes($map);
                        break;
                    case 'category': /* if browsing categories */
                        $nodes = $this->getCategoryNodes($map);
                        break;
                    default: /* if clicking a node in a category */
                        $nodes = $this->getInCategoryNodes($map);
                        break;
                }
        
                if ($this->getProperty('stringLiterals',false)) {
                    return $this->modx->toJSON($nodes);
                } else {
                    return $this->toJSON($nodes);
                }
            }
        
            public function getActions() {
                $actions = $this->modx->request->getAllActionIDs();
                $this->actionMap = array(
                    'template' => $actions['element/template/update'],
                    'tv' => $actions['element/tv/update'],
                    'chunk' => $actions['element/chunk/update'],
                    'snippet' => $actions['element/snippet/update'],
                    'plugin' => $actions['element/plugin/update'],
                );
            }
        
            public function getMap() {
                /* process ID prefixes */
                $id = $this->getProperty('id');
                $id = empty($id) ? 0 : (substr($id,0,2) == 'n_' ? substr($id,2) : $id);
                /* split the array */
                return explode('_',$id);
            }
        
            public function getRootNodes(array $map) {
                $elementType = ucfirst($map[0]);
                $nodes = array();
        
                /* templates */
                if ($this->modx->hasPermission('view_template')) {
                    $class = 'icon-template';
                    $class .= $this->modx->hasPermission('new_template') ? ' pnew' : '';
                    $class .= $this->modx->hasPermission('new_category') ? ' pnewcat' : '';
        
                    $nodes[] = array(
                        'text' => $this->modx->lexicon('templates'),
                        'id' => 'n_type_template',
                        'leaf' => false,
                        'cls' => $class,
                        'page' => '',
                        'classKey' => 'root',
                        'type' => 'template',
                        'draggable' => false,
                    );
                }
        
                /* TVs */
                if ($this->modx->hasPermission('view_tv')) {
                    $class = 'icon-tv';
                    $class .= $this->modx->hasPermission('new_tv') ? ' pnew' : '';
                    $class .= $this->modx->hasPermission('new_category') ? ' pnewcat' : '';
        
                    $nodes[] = array(
                        'text' => $this->modx->lexicon('tmplvars'),
                        'id' => 'n_type_tv',
                        'leaf' => false,
                        'cls' => $class,
                        'page' => '',
                        'classKey' => 'root',
                        'type' => 'tv',
                        'draggable' => false,
                    );
                }
        
                /* chunks */
                if ($this->modx->hasPermission('view_chunk')) {
                    $class = 'icon-chunk';
                    $class .= $this->modx->hasPermission('new_chunk') ? ' pnew' :'';
                    $nodes = array();
                $categories = $this->modx->getCollection('modCategory',$c);
                /** @var modCategory $category */
                foreach ($categories as $category) {
                    if (!$category->checkPolicy('list')) continue;
                
                    $idNote = $this->modx->hasPermission('tree_show_element_ids') ? ' (' . $category->get('id') . ')' : '';
                    $nodes[] = array(
                        'text' => strip_tags($category->get('category')).$idNote,
                        'id' => 'n_category_'.$category->get('id'),
                        'pk' => $category->get('id'),
                        'data' => $category->toArray(),
                        'category' => $category->get('id'),
                        'leaf' => false,
                        'cls' => $class,
                        'page' => '',
                        'classKey' => 'modCategory',
                        'type' => 'category',
                    );
                }
              }  
                return $nodes;
            }
            
            public function getInCategoryNodes(array $map) {
                $nodes = array();
                /* 0: type,  1: element/category  2: elID  3: catID */
                $categoryId = isset($map[3]) ? $map[3] : ($map[1] == 'category' ? $map[2] : 0);
                $elementIdentifier = $map[0];
                $elementType = ucfirst($elementIdentifier);
                $elementClassKey = $this->typeMap[$elementIdentifier];
                
                /* first handle subcategories */
                $c = $this->modx->newQuery('modCategory');
                $c->select($this->modx->getSelectColumns('modCategory','modCategory'));
                $c->select('COUNT('.$elementClassKey.'.id) AS elementCount');
                $c->leftJoin($elementClassKey,$elementClassKey,$elementClassKey.'.category = modCategory.id');
                $c->where(array(
                    'parent' => $categoryId,
                ));
                $c->groupby($this->modx->getSelectColumns('modCategory','modCategory'));
                $c->sortby($this->modx->getSelectColumns('modCategory','modCategory','',array('category')),'ASC');
                $categories = $this->modx->getCollection('modCategory',$c);
                
                /* set permissions as css classes */
                $class = array('icon-category','folder');
                $types = array('template','tv','chunk','snippet','plugin');
                foreach ($types as $type) {
                    if ($this->modx->hasPermission('new_'.$type)) {
                        $class[] = 'pnew_'.$type;
                    }
                }
                if ($this->modx->hasPermission('new_category')) $class[] = 'pnewcat';
                if ($this->modx->hasPermission('edit_category')) $class[] = 'peditcat';
                if ($this->modx->hasPermission('delete_category')) $class[] = 'pdelcat';
                $class = implode(' ',$class);
                
                /* loop through categories */
                /** @var modCategory $category */
                foreach ($categories as $category) {
                    if (!$category->checkPolicy('list')) continue;
                    if ($category->get('elementCount') <= 0) continue;
                
                    $nodes[] = array(
                        'text' => strip_tags($category->get('category')) . ' (' . $category->get('elementCount') . ')',
                        'id' => 'n_'.$map[0].'_category_'.($category->get('id') != null ? $category->get('id') : 0),
                        'pk' => $category->get('id'),
                        'category' => $category->get('id'),
                        'data' => $category->toArray(),
                        'leaf' => false,
                        'cls' => $class,
                        'classKey' => 'modCategory',
                        'elementType' => $elementType,
                        'page' => '',
                        'type' => $elementIdentifier,
                    );
                }
                
                /* all elements in category */
                $c = $this->modx->newQuery($elementClassKey);
                $c->where(array(
                    'category' => $categoryId
                ));
                $c->sortby($elementIdentifier == 'template' ? 'templatename' : 'name','ASC');
                $elements = $this->modx->getCollection($elementClassKey,$c);
                
                /* do permission checks */
                $canNewElement = $this->modx->hasPermission('new_'.$elementIdentifier);
                $canEditElement = $this->modx->hasPermission('edit_'.$elementIdentifier);
                $canDeleteElement = $this->modx->hasPermission('delete_'.$elementIdentifier);
                $canNewCategory = $this->modx->hasPermission('new_category');
                $showElementIds = $this->modx->hasPermission('tree_show_element_ids');
                
                /* loop through elements */
                /** @var modElement $element */
                foreach ($elements as $element) {
                    if (!$element->checkPolicy('list')) continue;
                    $name = $elementIdentifier == 'template' ? $element->get('templatename') : $element->get('name');
                
                    $class = array('icon-'.$elementIdentifier);
                    if ($canNewElement) $class[] = 'pnew';
                    if ($canEditElement && $element->checkPolicy(array('save' => true, 'view' => true))) $class[] = 'pedit';
                    if ($canDeleteElement && $element->checkPolicy('remove')) $class[] = 'pdelete';
                    if ($canNewCategory) $class[] = 'pnewcat';
                    if ($element->get('locked')) $class[] = 'element-node-locked';
                    if ($elementClassKey == 'modPlugin' && $element->get('disabled')) {
                        $class[] = 'element-node-disabled';
                    }
                
                    $idNote = $showElementIds ? ' (' . $element->get('id') . ')' : '';
                    $nodes[] = array(
                        'text' => strip_tags($name) . $idNote,
                        'id' => 'n_'.$elementIdentifier.'_element_'.$element->get('id').'_'.$element->get('category'),
                        'pk' => $element->get('id'),
                        'category' => $categoryId,
                        'leaf' => 1,
                        'name' => $name,
                        'cls' => implode(' ',$class),
                        'page' => 'index.php?a='.$this->actionMap[$elementIdentifier].'&id='.$element->get('id'),
                        'type' => $elementIdentifier,
                        'elementType' => $elementType,
                        'classKey' => $elementClassKey,
                        'active' => !$element->get('disabled'),
                        'qtip' => strip_tags($element->get('description')),
                    );
                }
                
                return $nodes;
            }
            
            public function getTypeNodes(array $map) {
                $nodes = array();
                $elementType = ucfirst($map[1]);
                $elementClassKey = $this->typeMap[$map[1]];
                
                /* get elements in this type */
                $c = $this->modx->newQuery('modCategory');
                $c->select($this->modx->getSelectColumns('modCategory','modCategory'));
                $c->select('
                    COUNT('.$this->modx->getSelectColumns($elementClassKey,$elementClassKey,'',array('id')).') AS elementCount,
                    COUNT('.$this->modx->getSelectColumns('modCategory','Children','',array('id')).') AS childrenCount
                ');
                $c->leftJoin($elementClassKey,$elementClassKey,$this->modx->getSelectColumns($elementClassKey,$elementClassKey,'',array('category')).' = '.$this->modx->getSelectColumns('modCategory','modCategory','',array('id')));
                $c->leftJoin('modCategory','Children');
                $c->where(array(
                    'modCategory.parent' => 0,
                ));
                $c->sortby($this->modx->getSelectColumns('modCategory','modCategory','',array('category')),'ASC');
                $c->groupby($this->modx->getSelectColumns('modCategory','modCategory'));
                $categories = $this->modx->getCollection('modCategory',$c);
                
                /* set permissions as css classes */
                $class = 'icon-category folder';
                $types = array('template','tv','chunk','snippet','plugin');
                foreach ($types as $type) {
                    if ($this->modx->hasPermission('new_'.$type)) {
                        $class .= ' pnew_'.$type;
                    }
                }
                $class .= $this->modx->hasPermission('new_category') ? ' pnewcat' : '';
                $class .= $this->modx->hasPermission('edit_category') ? ' peditcat' : '';
                $class .= $this->modx->hasPermission('delete_category') ? ' pdelcat' : '';
                
                /* loop through categories with elements in this type */
                /** @var modCategory $category */
                foreach ($categories as $category) {
                    if (!$category->checkPolicy('list')) continue;
                    $elCount = (int)$category->get('elementCount');
                    $catCount = (int)$category->get('childrenCount');
                    if ($elCount < 1 && $catCount < 1 && $category->get('id') != 0) {
                        continue;
                    }
                    $cc = $elCount > 0 ? ' ('.$elCount.')' : '';
                
                    $nodes[] = array(
                        'text' => strip_tags($category->get('category')).$cc,
                        'id' => 'n_'.$map[1].'_category_'.($category->get('id') != null ? $category->get('id') : 0),
                        'pk' => $category->get('id'),
                        'category' => $category->get('id'),
                        'data' => $category->toArray(),
                        'leaf' => false,
                        'cls' => $class,
                        'page' => '',
                        'classKey' => 'modCategory',
                        'elementType' => $elementType,
                        'type' => $map[1],
                    );
                    unset($elCount,$childCats);
                }
                
                /* now add elements in this type without a category */
                $c = $this->modx->newQuery($elementClassKey);
                $c->where(array(
                    'category' => 0,
                ));
                $c->sortby($elementClassKey == 'modTemplate' ? 'templatename' : 'name','ASC');
                $elements = $this->modx->getCollection($elementClassKey,$c);
                
                /* do permission checks */
                $canNewCategory = $this->modx->hasPermission('new_category');
                $canEditElement = $this->modx->hasPermission('edit_'.$map[1]);
                $canDeleteElement = $this->modx->hasPermission('delete_'.$map[1]);
                $canNewElement = $this->modx->hasPermission('new_'.$map[1]);
                $showElementIds = $this->modx->hasPermission('tree_show_element_ids');
                
                /* loop through elements */
                /** @var modElement $element */
                foreach ($elements as $element) {
                    if (!$element->checkPolicy('list')) continue;
                    /* handle templatename case */
                    $name = $elementClassKey == 'modTemplate' ? $element->get('templatename') : $element->get('name');
                
                    $class = array('icon-'.$map[1]);
                    if ($canNewElement) $class[] = 'pnew';
                    if ($canEditElement && $element->checkPolicy(array('save' => true,'view' => true))) $class[] = 'pedit';
                    if ($canDeleteElement && $element->checkPolicy('remove')) $class[] = 'pdelete';
                    if ($canNewCategory) $class[] = 'pnewcat';
                    if ($element->get('locked')) $class[] = 'element-node-locked';
                    if ($elementClassKey == 'modPlugin' && $element->get('disabled')) {
                        $class[] = 'element-node-disabled';
                    }
                    if (!empty($scriptProperties['currentElement']) && $scriptProperties['currentElement'] == $element->get('id') && $scriptProperties['currentAction'] == $this->actionMap[$map[1]]) {
                        $class[] = 'active-node';
                    }
                
                    $idNote = $showElementIds ? ' (' . $element->get('id') . ')' : '';
                    $nodes[] = array(
                        'text' => strip_tags($name) . $idNote,
                        'id' => 'n_'.$map[1].'_element_'.$element->get('id').'_0',
                        'pk' => $element->get('id'),
                        'category' => 0,
                        'leaf' => true,
                        'name' => $name,
                        'cls' => implode(' ',$class),
                        'page' => '?a='.$this->actionMap[$map[1]].'&id='.$element->get('id'),
                        'type' => $map[1],
                        'elementType' => $elementType,
                        'classKey' => $elementClassKey,
                        'active' => !$element->get('disabled'),
                        'qtip' => strip_tags($element->get('description')),
                    );
                }
                return $nodes;
            }
        }
        return 'modElementGetNodesProcessor';
          • 3749
          • 24,544 Posts
          Did you transfer the files individually with FTP? Corrupted and/or missing files are fairly common if you do that.
            Did I help you? Buy me a beer
            Get my Book: MODX:The Official Guide
            MODX info for everyone: http://bobsguides.com/modx.html
            My MODX Extras
            Bob's Guides is now hosted at A2 MODX Hosting
            • 36604
            • 268 Posts
            Do you mean when I updated to 2.26 in January ?
            I've probably used FTP yes. But did not noticed the issue right after.
            ..