Контроллер плагинов CakePHP 2 не загружает модель плагинов - PullRequest
0 голосов
/ 29 декабря 2018

Мой плагин-контроллер «PagesController.php» не хочет загружать связанную модель.Я всегда получал следующую ошибку:

Database Error
Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'getPageById' at line 1

SQL Query: getPageById

Notice: If you want to customize this error message, create app\View\Errors\pdo_error.ctp

Плагин, о котором я говорю, называется 'CoasterCms'.Вот дерево с самыми важными папками и файлами в нем:

-- Plugin
---- CoasterCms    
------ Controller
-------- CoasterCmsAppController.php
-------- NewsArticlesController.php
-------- PagesController.php
------ Model
-------- CoasterCmsAppModel.php
-------- NewsArticle.php
-------- Page.php
------ View
-------- NewsArticles
---------- add.ctp
---------- edit.ctp
---------- delete.ctp

Плагины 'PagesController.php':

<?php

class PagesController extends CoasterCmsAppController
{
    public function index()
    {
        ...
    }

    public function add()
    {
        ...
    }

    public function edit($id = null)
    {
        $this->Page->getPageById(1);
    }

    public function delete($pageId = null)
    {
        ...
    }
}

Плагины 'CoasterCmsAppController.php':

<?php

class CoasterCmsAppController extends Controller {
    public $helpers = array(
        'Html',
        'Form',
        'Session',
        'CoasterCms.CmsMenu'
    );

    public $components = array(
        'Session',
        'Flash',
        'Paginator',
        'Auth' => array(
            'loginAction' => array(
                'plugin' => 'coaster_cms',
                'controller' => 'users',
                'action' => 'login'
            ),
            'loginRedirect' => array(
                'plugin' => 'coaster_cms',
                'controller' => 'menus',
                'action' => 'index'
            ),
            'authenticate' => array(
                'Form' => array(
                    'passwordHasher' => 'Blowfish'
                )
            ),
            'authError' => 'You have no rights.'
        )
    );

    public function beforeRender()
    {
        parent::beforeRender();

        ...
    }
}

Плагины 'Page.php':

<?php

class Page extends CoasterCmsAppModel
{
    public $actsAs = array(
        'Slugable.Slugable' => array(
            'name' => 'slug'
        )
    );

    public $hasOne = array(
        'ModuleActionModule' => array(
            'className' => 'CoasterCms.ModuleActionModule',
            'foreignKey' => 'module_action_module_id'
        )
    );

    public $hasMany = array(
        'MenuPageLink' => array(
            'className' => 'CoasterCms.MenuPageLink',
            'foreignKey' => 'page_id'
        )
    );

    public $validate = array(
        ...
    );

    /**
     * Get a page.
     * 
     * @param int $id Pagina id.
     * @throws NotFoundException If id type is not numeric.
     * @throws NotFoundException If page doesn't exists.
     * @return array Pagina.
     */
    public function getPageById ($id) {
        if (!$id || !is_numeric($id)) {
            throw new NotFoundException(
                __('Invalid id.')
            );
        }

        $page = $this->find('first', array(
            'recursive' => -1,
            'fields' => array(
                'Module.id',
                'Module.name',
                'Module.controller'
            ),
            'contain' => array(
                'ModuleActionModule' => array(
                    'fields' => array(
                        'ModuleActionModule.id',
                        'ModuleActionModule.module_id',
                        'ModuleActionModule.module_action_id'
                    ),
                    'ModuleAction' => array(
                        'fields' => array(
                            'ModuleAction.name',
                        ),
                        'order' => array(
                            'ModuleAction.name' => 'asc'
                        )
                    )
                )
            ),
            'conditions' => array(
                'Module.id' => $id
            )
        ));

        if (!$page) {
            throw new NotFoundException(
                __('Invalid page.')
            );
        }

        return($page);
    }
}

Плагины 'CoasterCmsAppModel.php':

<?php

class CoasterCmsAppModel extends Model {
    public $actsAs = array(
        'Containable'
    );
}

У меня болит голова с этой проблемой, так какмои соглашения об именах в порядке.Кто-нибудь, кто может помочь мне, пожалуйста?

Большое спасибо!

1 Ответ

0 голосов
/ 29 декабря 2018

Кажется, ваш объект модели использует модель по умолчанию, созданную cakephp, а не плагином.Если вы не загрузили модель плагина в ваш файл контроллера.Пиз попробуйте использовать public $uses = array('CoasterCms.Page'); для загрузки модели плагина.

<?php

    class PagesController extends CoasterCmsAppController
    {
       public $uses = array('CoasterCms.Page');
    ....

    }

Ссылка: https://book.cakephp.org/2.0/en/plugins/how-to-create-plugins.html#plugin-controllers

...