Вопрос по вызову Экшена Модуля

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
cajoy
Сообщения: 5
Зарегистрирован: 2010.12.21, 21:26

Вопрос по вызову Экшена Модуля

Сообщение cajoy »

Сегодня только второй день разбираюсь с YII, и у меня возник вопрос, как автоматически вызывать акшены/контроллеры модулей, т.е.

Есть страницы за которыми закрпелены модули (инфа о страницах и модулях хранится в БД), типа
about_us = pages
some_text = pages
news = news
basket = basket

Весь урл хочу обрабатывать через controllers/SiteController.php

т.е. если вызывают страницу http://example.com/some_text/ , мне надо вызывать и обрабатывать экшн из папки modules/pages/controllers/DefaultController.php

Верней первый вызывается controllers/SiteControllers.php в котором в функции вызывается modules/pages/controllers/DefaultController.php

Примерно функция должна фуглядеть так:

Код: Выделить всё


<?php
class SiteController extends Controller
{
    /**
     * This is the default 'index' action that is invoked
     * when an action is not explicitly requested by users.
     */
    public function actionIndex()
    { 
        PagesModule::DefaultController->test();
    }
};
 
Как собственно вызывать Контроллер модуля из Главного контроллера?

Заранее спасибо..
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: Вопрос по вызову Экшена Модуля

Сообщение AbS_ »

cajoy писал(а):Сегодня только второй день разбираюсь с YII, и у меня возник вопрос, как автоматически вызывать акшены/контроллеры модулей, т.е.

Есть страницы за которыми закрпелены модули (инфа о страницах и модулях хранится в БД), типа
about_us = pages
some_text = pages
news = news
basket = basket

Весь урл хочу обрабатывать через controllers/SiteController.php

т.е. если вызывают страницу http://example.com/some_text/ , мне надо вызывать и обрабатывать экшн из папки modules/pages/controllers/DefaultController.php

Верней первый вызывается controllers/SiteControllers.php в котором в функции вызывается modules/pages/controllers/DefaultController.php

Примерно функция должна фуглядеть так:

Код: Выделить всё


<?php
class SiteController extends Controller
{
    /**
     * This is the default 'index' action that is invoked
     * when an action is not explicitly requested by users.
     */
    public function actionIndex()
    { 
        PagesModule::DefaultController->test();
    }
};
 
Как собственно вызывать Контроллер модуля из Главного контроллера?

Заранее спасибо..
Что бы при обращении к http://example.com/some_text/ вызывался modules/pages/controllers/DefaultController.php читайте про urlManager.

А так:
Верней первый вызывается controllers/SiteControllers.php в котором в функции вызывается modules/pages/controllers/DefaultController.php
вообще делать не стоит. Это не правильно.
Если надо что бы перед каждым обращением к любому контроллеру или модулю, выполнялся один и тот же код, то нужно воспользоваться наследованием.
cajoy
Сообщения: 5
Зарегистрирован: 2010.12.21, 21:26

Re: Вопрос по вызову Экшена Модуля

Сообщение cajoy »

Про urlManager читал, если ясная структура сайта, то делается это элементарно, с этим проблем нет...

Но дело в том, что я переделываю ЦМС..

И структура сайта, так же как и Френдли Урл и глубина вложений может быть различна от сайта к сайту, и все это перепрописывать в роутах неудобно и ко всему этому, при смене структуры, френдли урл через админку, придется переписывать конфиги.

Проще к каждой странице назначить обрабатываемый ее модуль.
Вот и интерисует решение типа:
1) Если страница не прописана в роутах, переходим к п.2
2) Ищем в базе "Страниц", страницу и назначенный ей модуль, вызываем назначенный ей модуль (контроллер)
3) Если нет ничего в п2. то возвращаем 404.

Вот и интересно, как правильней реализовать п.2, т.е. заранее неизвестно урл, по которому будет вызываться Контроллер, информация об этом хранится в БД.

Может есть проще и интересней решение, чем вызывать контроллеры модулей из главного контроллера?! (И вобщемто вопрос, как вызывать эти кнтроллеры модулей из главного контроллера?)
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Вопрос по вызову Экшена Модуля

Сообщение slavcodev »

допиши свой urlManager подключи его в конфиге приложения, который достанет с базы урл, и создаст нужный роут
Жду Yii 3!
cajoy
Сообщения: 5
Зарегистрирован: 2010.12.21, 21:26

Re: Вопрос по вызову Экшена Модуля

Сообщение cajoy »

допиши свой urlManager подключи его в конфиге приложения, который достанет с базы урл, и создаст нужный роут
Что то у меня не получается, как подключить свой УРЛ менеджер?

создал для пробы protected/components/urlManager2.php

С кодом:

Код: Выделить всё

class urlManager2 extends CUrlManager
{
.........
}
 
В конфиге поменял urlManager на urlManager2

Код: Выделить всё

    'components'=>array(
        
        'urlManager2'=>array(
            'urlFormat'=>'path',
            'rules'=>array(
                '<controller:\w+>/<id:\d+>'=>'<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',                
                '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
            ),
        ),
 
В итоге урлменеджер не работает, а скрипт с классом urlManager2 даже не подключается... :(

Как его переписать єтот урл менеджер?

Заранее спасибо...
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Вопрос по вызову Экшена Модуля

Сообщение slavcodev »

не-не ))

Код: Выделить всё

'components'=>array(
        
        'urlManager'=>array(
            'class'=>'UrlManager2'
            'urlFormat'=>'path',
            'rules'=>array(
                '<controller:\w+>/<id:\d+>'=>'<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',                
                '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
            ),
        ), 
Жду Yii 3!
cajoy
Сообщения: 5
Зарегистрирован: 2010.12.21, 21:26

Re: Вопрос по вызову Экшена Модуля

Сообщение cajoy »

Огромнейшее спасибо, заработало!! ))
cajoy
Сообщения: 5
Зарегистрирован: 2010.12.21, 21:26

Re: Вопрос по вызову Экшена Модуля

Сообщение cajoy »

Еще один вопрос, надеюсь последний,

Есть два модуля и два дефолтных контроллера:

modules/news/contollers/DefaultController.php

Код: Выделить всё

class DefaultController extends Controller
{
    public function actionIndex()
    {
                echo "должно выводиться это сообщение, но...";
        //$this->render('index');
    }
 
и
modules/area/contollers/DefaultController.php

Код: Выделить всё

class DefaultController extends Controller
{
    public function actionIndex()
    {
        Yii::app()->runController("news");
                echo "Зацикливается на этом экшене";
        //$this->render('index');
    }
 
Как собстенно вызвать экшн (News) с другого акшена(area) ?!... Заранее спасибо
Ответить