Как вызвать из одного контроллера другой контроллер?

Вопросы об установке, настройке и работе самого фреймворка

Как вызвать из одного контроллера другой контроллер?

Сообщение riskk » 30 авг 2008, 15:20

Как вызвать из одного контроллера другой контроллер? Как бы переадресовать. У меня через роутинг все вызовы приходят к одному контроллеру, а оттуда надо передать управление другому контроллеру.
riskk
 
Сообщения: 5
Зарегистрирован: 29 авг 2008, 10:27

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение pirrat » 30 авг 2008, 15:39

http://codeigniter.com/wiki/Modular_Extensions_-_HMVC/
либо писать свою библиотеку, что я собственно и сделал =)
CI(3проекта) -> Kohana (5 проектов) -> Yii (0)
pirrat
 
Сообщения: 114
Зарегистрирован: 02 фев 2009, 21:09

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение riskk » 30 авг 2008, 17:02

Я решил проблему таким образом.
Код: Выделить всё
$route['default_controller'] = "main_page";
$route['scaffolding_trigger'] = "";

$dir = opendir (APPPATH.'controllers');

while ($file = readdir ($dir))
{
    $ipos = strpos($file, '.php');
    if ($ipos!=0) {
        $module = substr($file, 0, $ipos);
        $route[$module] = $module;
        $route[$module.'/(.*)'] = $module.'/$1';
    }
}
closedir ($dir);

$route['admin'] = "admin";
$route['admin/(.+)'] = "admin/$1";

$route['(\S+)'] = 'page404';
$route['(\S+)/(.+)'] = 'page404/$1';


Теперь думаю роут прописывать только для вызванного контроллера. Теперь спрашиваеться как узнать из урла первый сегмент. Я думаю такой вызов
Код: Выделить всё
$CI->uri->segment(1)

не доступен в роутинге.
riskk
 
Сообщения: 5
Зарегистрирован: 29 авг 2008, 10:27

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение Антон Исайкин » 31 авг 2008, 14:58

При хорошем проектировании у вас не должно возникнуть необходимости использовать два контроллера для одного реквеста.
Аватара пользователя
Антон Исайкин
Администратор
 
Сообщения: 127
Зарегистрирован: 16 апр 2008, 19:11
Откуда: Санкт-Петербург

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение AndrewWB » 05 сен 2008, 16:49

вся логика выносится в модели... Никаких контроллеров )) Контроллер от слова КОНТРОЛЬ и занимается только распределением запросов пользователя между вьювером и моделью конкретной части приложения. Подключай модели дополнительные, которые тебе нужны и работай с ними.
----------------------
Изображение

http://openim.com.ua/ - Обои для рабочего стола 3000+ (поиск по цвету, мобильный, аватар)
Аватара пользователя
AndrewWB
 
Сообщения: 129
Зарегистрирован: 29 июн 2008, 12:07
Откуда: Киев

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение pirrat » 05 сен 2008, 18:43

вот мне интересно мнение Сообщества по такому (сзвязанному с темой) вопросу!
есть такое понятие во многих CMS как блоки, т.е. это какой то кусок кода, который выводит определенную информацию, и может быть как на всех так и на нескольких млм даже одной странице сайты...
Чисто с точки зрения MVC и CI в частности, как такие блоки(куски кода) лучше оформить по ваему мнению?
как варианты вижу, -
1)в контроллерах создавать метод, который потом будет вызываться в других контроллерах или на прямую из отображения(как это сделано в HMVC)
2)ввести новое понятие в систему как blocks, они будут лежать как отдельные файлы и представлять собой одну функцию,и так же как и контроллеры они будут брать инфу из моделей и передавать их во VIEW, а из контроллеров мы уже их будем вызывать там где нам надо!
3)в каждом контроллере писать код блока

Как вы делаете и как считаете наиболее правильным?
мне кажется 2 вариант!
CI(3проекта) -> Kohana (5 проектов) -> Yii (0)
pirrat
 
Сообщения: 114
Зарегистрирован: 02 фев 2009, 21:09

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение Sam Dark » 06 сен 2008, 13:59

Я для этого как раз HMVC использую.
Аватара пользователя
Sam Dark
 
Сообщения: 824
Зарегистрирован: 16 апр 2008, 19:23
Откуда: Воронеж

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение AndrewWB » 06 сен 2008, 16:15

pirrat писал(а):вот мне интересно мнение Сообщества по такому (сзвязанному с темой) вопросу!
есть такое понятие во многих CMS как блоки, т.е. это какой то кусок кода, который выводит определенную информацию, и может быть как на всех так и на нескольких млм даже одной странице сайты...
Чисто с точки зрения MVC и CI в частности, как такие блоки(куски кода) лучше оформить по ваему мнению?
как варианты вижу, -
1)в контроллерах создавать метод, который потом будет вызываться в других контроллерах или на прямую из отображения(как это сделано в HMVC)
2)ввести новое понятие в систему как blocks, они будут лежать как отдельные файлы и представлять собой одну функцию,и так же как и контроллеры они будут брать инфу из моделей и передавать их во VIEW, а из контроллеров мы уже их будем вызывать там где нам надо!
3)в каждом контроллере писать код блока

Как вы делаете и как считаете наиболее правильным?
мне кажется 2 вариант!


2) наверное лучше будет...

а вообще можешь в хелперах создать папку блоки... или в плагинах... )) и организовать как хелпер или плагин...
----------------------
Изображение

http://openim.com.ua/ - Обои для рабочего стола 3000+ (поиск по цвету, мобильный, аватар)
Аватара пользователя
AndrewWB
 
Сообщения: 129
Зарегистрирован: 29 июн 2008, 12:07
Откуда: Киев

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение pirrat » 09 сен 2008, 12:29

спасибо за подсказку, я почти всегда из модели возвращал либо объект либо массив, но в данном случае думал в другом направлении,вобщем вот что вышло:

расширил CI_Controller и добавил метод :
Код: Выделить всё
 function SetBlocks ($blocks) {
     if (!is_array($blocks)) { 
     show_error
('аргумент должен быть массивом');
     }
     foreach ($blocks as $block => $model) {
     $this->load->model($model);
     $data_model = array();
     if (method_exists($this->$model, $block)) {
     $data_model = $this->$model->$block();
     }
     $this->parser->setGlobal('block_'.$block, $this->parser->parse('block_'.$block, $data_model, TRUE )); 
     
}
   
    
} 


в методах или конструкторе контроллера, нам всего нужно добавить вызов этого метода
Код: Выделить всё
 $this->SetBlocks(array(
      'b3' => 'test_model',
      'b2' => 'test_model'
      ));

где ключ массива, названием блока и название метода модели из которого будут браться значения для блока,а значение - имя модели!

т.е. в главном шаблоне я прописываю переменные
Код: Выделить всё
{block_b3}
{block_b2}


создаю отображения для этих блоков с названиями
block_b3.php и block_b2.php

а в модели test_model создаю два метода b3 и b2 которые нам возвращают массив значений!

Наприсал на коленке за 5 минут, так что особо не тестировал, но первые тесты прошли удачно и все отрабатывает так как и нужно!
CI(3проекта) -> Kohana (5 проектов) -> Yii (0)
pirrat
 
Сообщения: 114
Зарегистрирован: 02 фев 2009, 21:09

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение AndrewWB » 12 сен 2008, 00:10

а я заюзал через хелперы.

И хелперы в виже классов пишу..

Если например в админке нужно добавить возможность указание вывода готовго блока, например последнии новости, то мы указываем название хелпера в внешний источник (грубо говоря), и когда пользователь указывает что в этом блоке нужно отобразить последнии новости, система подключает нужный хелпер и обращается к классу хелпера, название которого совпадает с названием хелпера. Он возвращает результат. В самом хелпере подключается нужная моделька и обрабатываются данные в нужный нам шаблон блока.
----------------------
Изображение

http://openim.com.ua/ - Обои для рабочего стола 3000+ (поиск по цвету, мобильный, аватар)
Аватара пользователя
AndrewWB
 
Сообщения: 129
Зарегистрирован: 29 июн 2008, 12:07
Откуда: Киев

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение pirrat » 12 сен 2008, 10:43

я тоже думал в направлении хелперов, но передумал,так как решил что хелперы это вспомогательные функции или классы(решают задачи по обработке, форматированию итд данных) , но не должны манипулироать конкретными данными (не должны получать данные из бд и тд) (как и задумывалось разработчиками)...
пока я реализовал так как написал выше, в дальнейшем все же наверное введу в систему понятия блоков , как уже выше описывал, чтоб была возможность манипулировать их выводом из админки, хотя ещё подумаю...
ИМХО
CI(3проекта) -> Kohana (5 проектов) -> Yii (0)
pirrat
 
Сообщения: 114
Зарегистрирован: 02 фев 2009, 21:09

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение AndrewWB » 12 сен 2008, 13:46

а данные получает модель, не хелпер ))) Хелпер манипулирует ими ))
----------------------
Изображение

http://openim.com.ua/ - Обои для рабочего стола 3000+ (поиск по цвету, мобильный, аватар)
Аватара пользователя
AndrewWB
 
Сообщения: 129
Зарегистрирован: 29 июн 2008, 12:07
Откуда: Киев

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение pirrat » 12 сен 2008, 14:34

ну да но потом отдает в отображение, а я хочу чтоб он только обрабатывал(форматировал) данные и не более =)
CI(3проекта) -> Kohana (5 проектов) -> Yii (0)
pirrat
 
Сообщения: 114
Зарегистрирован: 02 фев 2009, 21:09

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение enshteyns » 13 ноя 2008, 19:05

Строчка:

$this->parser->setGlobal('block_'.$block, $this->parser->parse('block_'.$block, $data_model, TRUE ));


setGlobal это что за метод? видимо был расширен класс Parser, а об этом pirrat забыл упомянуть...
enshteyns
 
Сообщения: 8
Зарегистрирован: 13 ноя 2008, 19:00

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение pirrat » 13 ноя 2008, 22:05

именно, если интересно то вот расширенный парсер

Код: Выделить всё
<?
if (!defined('BASEPATH')) exit('No direct script access allowed');
class MY_Parser extends CI_Parser
{
    /**
     * Enter description here...
     *
     * @var unknown_type
     */
    private $layout     = 'main';
    /**
     * Enter description here...
     *
     * @var unknown_type
     */
    private $theme;
    /**
     * Enter description here...
     *
     * @var unknown_type
     */
    private $layoutVars = array();

    /**
     * Enter description here...
     *
     * @return MY_Parser
     */
    function MY_Parser()
    {

    }

    /**
     * Enter description here...
     *
     * @param unknown_type $template
     * @param unknown_type $data
     * @param unknown_type $return
     * @return unknown
     */
    public function parse($template, $data = array(), $return = FALSE)
    {
        $CI      =&get_instance();
        $template=$CI->load->view($this->theme . $template, $data, TRUE);

        if ( $template == '' )
        {
            return FALSE;
        }

        // $template=$this->_parseBlock($template);

        foreach ( $data as $key => $val )
        {
            if ( is_array($val) )
            {
                $template = $this->_parse_pair($key, $val, $template);
            } else
            {
                $template = $this->_parse_single($key, (string)$val, $template);
            }
        }

        if ( $return == FALSE )
        {
            $CI->output->final_output = $template;
        }

        return $template;
    }

    /**
     * Enter description here...
     *
     * @param unknown_type $template
     * @param unknown_type $data
     */
    public function render($template = '', $data = array())
    {
         $t=$this->getGlobal('content');
         if(empty($t))$this->setGlobal('content', '');
          if(!empty($template)) $this->setGlobal('content', $this->parse($template, $data, true));     
        $this->parse($this->layout, $this->layoutVars); 
    }

    /**
     * Enter description here...
     *
     * @param unknown_type $userthemes
     */
    public function setTheme($userthemes)
    {
        $this->theme = $userthemes . '/';
    }

    /**
     * Enter description here...
     *
     * @param unknown_type $template
     */
    public function setLayout($template)
    {
        $this->layout = $template;
    }

    /**
     * Enter description here...
     *
     * @param unknown_type $varName
     * @param unknown_type $value
     */
    public function setGlobal($varName, $value)
    {
        $this->layoutVars[$varName] = $value;
    }
      public function getGlobal($varName)
    {

        return   @$this->layoutVars[$varName];
    }
   
}

?>

на недописанные коменты не обращайте внимание - лень =)

некторые идеи и реализация была взята с библиотеке VIEW от SAM DARK, с добавлением своих фишек..
Правд я уже придумал другую реализацию работы с блоками, работу парсера и др библиотек, но об этом потом, как реализую все что задумал...
CI(3проекта) -> Kohana (5 проектов) -> Yii (0)
pirrat
 
Сообщения: 114
Зарегистрирован: 02 фев 2009, 21:09

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение bvn » 15 мар 2010, 15:53

А Matchbox это умеет? Вроде нигде не нашел упоминания...
Мой блог: junkabyss.com
Аватара пользователя
bvn
 
Сообщения: 181
Зарегистрирован: 30 авг 2009, 22:39
Откуда: Полтава, Украина

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение Tovit » 15 мар 2010, 18:04

умеет. Это другой подход к HMVC.
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1362
Зарегистрирован: 15 фев 2009, 17:18

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение bvn » 15 мар 2010, 18:21

Tovit писал(а):умеет. Это другой подход к HMVC.

Ну, просто у HMVC есть $this->load->module(), а у Matchbox'а вроде нету такого... и в хэлпе нет упоминания ни о чем таком... Может подскажете как?
Мой блог: junkabyss.com
Аватара пользователя
bvn
 
Сообщения: 181
Зарегистрирован: 30 авг 2009, 22:39
Откуда: Полтава, Украина

Re: Как вызвать из одного контроллера другой контроллер?

Сообщение Fatal Claw » 30 май 2010, 20:12

ответ на пост выше моего не дан?
использую библиотеку view (http://code-igniter.ru/wiki/View). Как в этом случае в $content:
Код: Выделить всё
$this->view->set('content', $content);
$this->view->render('blogcnt');
// или через $this->view->SetGlobal('content', ???????   );
 


выдать результат работы модуля при использовании matchbox ?
Аватара пользователя
Fatal Claw
 
Сообщения: 12
Зарегистрирован: 14 мар 2010, 11:10
Откуда: Моск. обл.

След.

Вернуться в Общие вопросы по фреймворку

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2