core/modules/node/NodeController.php

Summary

Maintainability
D
2 days
Test Coverage
<?php

class NodeController extends Ajde_Controller
{
    /**
     * @var NodeModel
     */
    protected $node;

    public function getCanonicalUrl()
    {
        if ($this->node->hasLoaded()) {
            return config('i18n.enabled') ?
                Ajde_Lang::getInstance()->getShortLang().'/'.$this->node->getSlug() :
                $this->node->getSlug();
        }

        return '';
    }

    public function beforeInvoke()
    {
        return true;
    }

    public function view()
    {
        // we want to display published nodes only
        if (!(UserModel::getLoggedIn() && UserModel::getLoggedIn()->isAdmin())) {
            Ajde::app()->getRequest()->set('filterPublished', true);
        }

        // get the current slug
        $slug = $this->getSlug();

        $node = new NodeModel();
        $node->loadBySlug($slug);
        $this->node = $node;

        if ($node->checkPublished() === false) {
            Ajde_Dump::warn('Previewing unpublished node');
        }

        // check if we have a hit
        if (!$node->hasLoaded()) {
            Ajde::app()->getResponse()->redirectNotFound();
        }

        Ajde_Event::trigger($this, 'onAfterNodeLoaded', [$node]);

        // update cache
        Ajde_Cache::getInstance()->updateHash($node->hash());
        Ajde_Cache::getInstance()->updateHash($node->getChildren()->hash());
        Ajde_Cache::getInstance()->addLastModified(strtotime($node->updated));

        // set title
        if (!Ajde::app()->getDocument()->hasNotEmpty('title')) {
            Ajde::app()->getDocument()->setTitle($node->getTitle());
        }
        // set summary
        if ($node->summary) {
            Ajde::app()->getDocument()->setDescription($node->summary);
        }
        // set author
        $node->loadParent('user');
        /** @var UserModel $owner */
        $owner = $node->getUser();
        Ajde::app()->getDocument()->setAuthor($owner->getFullname());

        // set template
        $nodetype = $node->getNodetype();
        $action = str_replace(' ', '_', strtolower($nodetype->get($nodetype->getDisplayField())));
        $this->setAction($action);

        // featured image
        if ($image = $node->featuredImage()) {
            Ajde::app()->getDocument()->setFeaturedImage($image);
        }

        // pass node to document, only first
        $layout = Ajde::app()->getDocument()->getLayout();
        if (!$layout->hasAssigned('node')) {
            $layout->assign('node', $node);
        }

        // pass node to view
        $this->getView()->assign('node', $node);

        // render the temnplate
        return $this->render();
    }

    public static function getNodeOptions()
    {
        // show only
        $showOnlyWhenFields = [
            'title',
            'subtitle',
            'content',
            'summary',
            'media',
            'tag',
            'additional_media',
            'children',
            'published',
            'related_nodes',
        ];
        $showOnlyWhen = [];
        $nodetypes = new NodetypeCollection();
        foreach ($nodetypes as $nodetype) {
            foreach ($showOnlyWhenFields as $field) {
                if (!isset($showOnlyWhen[$field])) {
                    $showOnlyWhen[$field] = [];
                }
                if ($nodetype->get($field) == 1) {
                    $showOnlyWhen[$field][] = $nodetype->getPK();
                }
            }
        }

        $options = new Ajde_Crud_Options();
        $options
            ->selectFields()
                ->selectField('slug')
                    ->setHelp('Changing the slug might impact SEO scores and break existing internal links')
                    ->up()
                ->selectField('nodetype')
                    ->setOrderBy('sort')
                    ->setIsRequired(false)
                    ->up()
                ->selectField('title')
                    ->addShowOnlyWhen('nodetype', $showOnlyWhen['title'])
                    ->setFunction('displayTreeName')
                    ->setEmphasis(true)
                    ->up()
                ->selectField('subtitle')
                    ->addShowOnlyWhen('nodetype', $showOnlyWhen['subtitle'])
                    ->up()
                ->selectField('content')
                    ->addShowOnlyWhen('nodetype', $showOnlyWhen['content'])
                    ->up()
                ->selectField('summary')
                    ->addShowOnlyWhen('nodetype', $showOnlyWhen['summary'])
                    ->setDisableRichText(true)
                    ->up()
                ->selectField('media')
                    ->addShowOnlyWhen('nodetype', $showOnlyWhen['media'])
                    ->setShowLabel(false)
                    ->setUsePopupSelector(true)
                    ->setListRoute('admin/media:view.crud')
                    ->setUseImage(true)
                    ->addTableFileField('thumbnail', UPLOAD_DIR)
                    ->setThumbDim(300, 300)
                    ->up()
                ->selectField('tag')
                    ->addShowOnlyWhen('nodetype', $showOnlyWhen['tag'])
                    ->setType('multiple')
                    ->setEditRoute('admin/tag:view.crud')
                    ->setThumbDim(30, 30)
                    ->setShowLabel(false)
                    ->setCrossReferenceTable('node_tag')
                    ->setSimpleSelector(true)
                    ->up()
                ->selectField('parent')
                    ->addShowOnlyWhen('nodetype', $showOnlyWhen['children'])
                    ->setType('fk')
                    ->setModelName('node')
                    ->setShowLabel(true)
                    ->setUsePopupSelector(true)
                    ->setListRouteFunction('listRouteParent')
                    ->up()
                ->selectField('published')
                    ->addShowOnlyWhen('nodetype', $showOnlyWhen['published'])
                    ->setFunction('displayPublished')
                    ->setType('boolean')
                    ->up()
                ->selectField('published_start')
                    ->addShowOnlyWhen('nodetype', $showOnlyWhen['published'])
                    ->up()
                ->selectField('published_end')
                    ->addShowOnlyWhen('nodetype', $showOnlyWhen['published'])
                    ->up()
                ->selectField('sort')
                    ->setType('sort')
                    ->up()
                ->selectField('additional_media')
                    ->addShowOnlyWhen('nodetype', $showOnlyWhen['additional_media'])
                    ->setType('multiple')
                    ->setEditRoute('admin/media:view.crud')
                    ->addTableFileField('thumbnail', UPLOAD_DIR)
                    ->setHideMainColumn(true)
                    ->setUsePopupSelector(true)
                    ->setListRoute('admin/media:view.crud')
                    ->setModelName('media')
                    ->setThumbDim(100, 100)
                    ->addSortField('sort')
                    ->setShowLabel(false)
                    ->setCrossReferenceTable('node_media')
                    ->up()
                ->selectField('children')
                    ->addShowOnlyWhen('nodetype', $showOnlyWhen['children'])
                    ->setModelName('node')
                    ->setParent('parent')
                    ->setHideInIframe(true)
                    ->setType('multiple')
                    ->setEditRouteFunction('editRouteChild')
                    ->addTableField('nodetype')
                    ->addSortField('sort')
                    ->setShowLabel(false)
                    ->up()
                ->selectField('related_nodes')
                    ->addShowOnlyWhen('nodetype', $showOnlyWhen['related_nodes'])
                    ->setType('multiple')
                    ->setEditRoute('admin/node:view.crud')
                    ->setUsePopupSelector(true)
                    ->setListRoute('admin/node:view.crud')
                    ->setModelName('node')
                    ->setSimpleSelector(true)
                    ->addSortField('sort')
                    ->setShowLabel(false)
                    ->setChildField('related')
                    ->setCrossReferenceTable('node_related')
                    ->up()
                ->selectField('added')
                    ->setIsReadonly(true)
                    ->up()
                ->selectField('updated')
                    ->setFunction('displayAgo')
                    ->setIsReadonly(true)
                    ->up()
                ->selectField('lang')
                    ->setFunction('displayLang')
                    ->setType('i18n')
                    ->setCloneFields([
                        'nodetype',
                        'media',
                    ])
                    ->up()
                ->up()
            ->selectList()
                ->selectButtons()
                    ->setNew(true)
                    ->setEdit(true)
                    ->setView(true)
                    ->setViewUrlFunction('getSlug')
                    //            ->addItemButton('view', 'view')
                    ->addItemButton('child', 'addChildButton', 'btn-success add-child', false, true)
                    ->up()
                ->setMain('title')
                    ->setShow(['title', 'lang', 'updated', 'published', 'sort'])
                    ->setThumbDim(50, 50)
                    ->setSearch(true)
                    ->selectView()
                    ->setMainFilter('nodetype')
                    ->setMainFilterGrouper('category')
                    ->setOrderBy('sort')
                    ->up()
                    //                ->setPanelFunction('displayPanel')
                ->up()
            ->selectEdit()
                ->selectLayout()
                    ->addRow()
                        ->addColumn()
                            ->setSpan(8)
                            ->addBlock()
                                ->setShow(['title', 'subtitle', 'content', 'summary'])
                                ->up()
                            ->addBlock()
                                ->setClass('meta')
                                ->up()
                            ->addBlock()
                                ->setClass('')
                                ->setTitle('Child nodes')
                                ->setShow(['children'])
                                ->up()
                            ->up()
                        ->addColumn()
                            ->setSpan(4)
                            ->addBlock()
                                ->setTitle('Featured image')
                                ->setClass('sidebar')
                                ->setShow(['media'])
                                ->up()
                            ->addBlock()
                                ->setTitle('Tags')
                                ->setClass('sidebar')
                                ->setShow(['tag'])
                                ->up()
                            ->addBlock()
                                ->setClass('sidebar')
                                ->setTitle('Additional media')
                                ->setShow(['additional_media'])
                                ->up()
                            ->addBlock()
                                ->setClass('sidebar')
                                ->setTitle('Related nodes')
                                ->setShow(['related_nodes'])
                                ->up()
                            ->addBlock()
                                ->setTitle('Node status')
                                ->setClass('well left')
                                ->setShow(['slug', 'published', 'published_start', 'published_end'])
                                ->up()
                            ->addBlock()
                                ->setTitle('Metadata')
                                ->setClass('well left')
                                ->setShow(['added', 'updated', 'parent', 'user', 'lang'])
        ->finished();

        /* @var $decorator Ajde_Crud_Cms_Meta_Decorator */
        $decorator = new Ajde_Crud_Cms_Meta_Decorator();
        $decorator->setActiveBlock(1);
        $decorator->setOptions($options);
        $decorator->decorateInputs('nodetype_meta', 'nodetype', 'sort', 'nodetype', [
            new Ajde_Filter_Where('target', Ajde_Filter::FILTER_EQUALS, 'node'),
        ]);

        if (Ajde::app()->getRequest()->has('new')) {
            // set owner
            $user = UserModel::getLoggedIn();
            $options->selectFields()->selectField('user')->setValue($user->getPK())->finished();
            $options->selectFields()->selectField('slug')->setIsReadonly(true)->finished();

            if (!UserModel::isAdmin()) {
                $currentUser = UserModel::getLoggedIn();
                $subquery = '(SELECT user_node.user FROM user_node WHERE user_node.node IN (SELECT user_node.node FROM user_node WHERE user_node.user = '.(int) $currentUser->getPK().' GROUP BY user_node.node))';
                $userFilters = [
                    new Ajde_Filter_Where('user.id', Ajde_Filter::FILTER_IN, new Ajde_Db_Function($subquery)),
                ];
                $options->selectFields()->selectField('user')->setAdvancedFilter($userFilters);
            }
        }
        if (Ajde::app()->getRequest()->has('edit')) {
            if (!UserModel::isAdmin()) {
                $options->selectFields()->selectField('user')
                    ->setIsReadonly(true)
                    ->setUsePopupSelector(true)
                    ->finished();
            }
        }

        return $options;
    }
}