Joomla 1.5 Почему-то не передается управление в нужный контроллер

Тема в разделе "Создание расширений для Joomla", создана пользователем Schemer, 07.08.2009.

  1. Schemer
    Offline

    Schemer Недавно здесь

    Регистрация:
    26.11.2007
    Сообщения:
    49
    Симпатии:
    1
    Пол:
    Мужской
    Я мучаюсь уже дней 5, не понимаю в чем дело... Может быть кто-нибудь мне подскажет, что я делаю не так.

    В общем, пишу админку для своего компонента.
    Есть один контроллер, вот такой fields.php
    Код (PHP):
    1. defined( '_JEXEC' ) or die( 'Restricted access' );
    2.  
    3. jimport('joomla.application.component.controller');
    4.  
    5. /**
    6.  *  Controller
    7.  */
    8. class ZetFormsControllerFields extends JController
    9. {
    10.     function __construct()
    11.     {
    12.         parent::__construct();
    13.  
    14.         $this->registerTask( 'add'  ,   'edit' );
    15.         $this->registerTask( 'apply', 'save' );
    16.     }
    17.  
    18.     function edit( )
    19.     {
    20.         JRequest::setVar( 'view', 'field' );
    21.         JRequest::setVar( 'layout', 'form'  );
    22.         JRequest::setVar( 'hidemainmenu', 1 );
    23.  
    24.         parent::display();
    25.     }
    26.    
    27.     function save()
    28.     {
    29.  
    30.         $model = & $this->getModel('field');
    31.  
    32.         $data = JRequest::get('POST', JREQUEST_ALLOWHTML);
    33.  
    34.         if ($model->store($data)) {
    35.             $msg = JText::_( 'SAVED' )." !";
    36.         } else {
    37.             $msg = JText::_( 'ERROR SAVED' );
    38.         }
    39.  
    40.         $link = 'index.php?option=com_zetforms&view=fields';
    41.        
    42.         $this->setRedirect($link, $msg);
    43.     }
    44.    
    45.     function remove()
    46.     {
    47.         $model = $this->getModel('field');
    48.         if(!$model->delete()) {
    49.             $msg = JText::_( 'ERROR DELETED' );
    50.         } else {
    51.             $msg = JText::_( 'FILES DELETED' );
    52.         }
    53.  
    54.         $this->setRedirect( 'index.php?option=com_zetforms&view=fields', $msg );
    55.     }
    56.    
    57.     function cancel()
    58.     {
    59.         $model = $this->getModel( 'field' );
    60.         $model->checkin();
    61.  
    62.         $this->setRedirect( 'index.php?option=com_zetforms&view=fields' );
    63.     }
    64.    
    65. }


    И есть 2 представления, точнее 4, но в данном случае задействованы два:
    field и fields
    соответственно:
    Код (PHP):
    1. class ZetFormsViewField extends JView
    2. {
    3.     function display($tpl = null)
    4.     {
    5.  
    6.         $fieldedit = $this->get('Data');
    7.         $isNew  = ($fieldedit->id < 1);
    8.    
    9.         $text = $isNew ? JText::_( 'New' ) : JText::_( 'Edit' );
    10.         JToolBarHelper::title(   JText::_( 'ZetForms' ).': <small><small>[ ' . $text.' ]</small></small>' );
    11.         JToolBarHelper::save();
    12.         if ($isNew)  {
    13.             JToolBarHelper::cancel();
    14.         } else {
    15.             JToolBarHelper::cancel( 'cancel', 'Close' );
    16.         }
    17.  
    18.         $this->assignRef('fieldedit', $fieldedit);
    19.  
    20.         parent::display($tpl);
    21.     }
    22.  
    23. }

    и
    Код (PHP):
    1. class ZetformsViewFields extends JView
    2. {
    3.     function display($tpl = null) {
    4.         $document   = & JFactory::getDocument();
    5.    
    6.         $cssFile = JURI::base(true).'/components/com_zetforms/assets/css/zetformsadmin.css';
    7.         $document->addStyleSheet($cssFile, 'text/css', null, array());
    8.    
    9.         //Create Toolbars
    10.         JToolBarHelper::title(   JText::_( 'ABOUT' ), 'abouticon ' );
    11.             JToolBarHelper::deleteList();
    12.             JToolBarHelper::editListX();
    13.             JToolBarHelper::addNewX();
    14.  
    15.         //Create Submenu
    16.         JSubMenuHelper::addEntry( JText::_( 'CONTROL PANEL' ), 'index.php?option=com_zetforms');
    17.         JSubMenuHelper::addEntry( JText::_( 'FORMS' ), 'index.php?option=com_zetforms&view=forms');
    18.         JSubMenuHelper::addEntry( JText::_( 'FIELDS'), 'index.php?option=com_zetforms&view=fields', true);
    19.         JSubMenuHelper::addEntry( JText::_( 'ABOUT' ), 'index.php?option=com_zetforms&view=about');
    20.  
    21.             $items = $this->get( 'Data');
    22.             $this->assignRef('items', $items);
    23.    
    24.         parent::display($tpl);
    25.     }
    26. }


    Представление fields отвечает за вывод данных из базы, а field отображает форму редактирования/добавления новой записи в базу. Но кнопка "saved" почему то не работает, то есть данные в базу не добавляются.

    У меня такое ощущение, что контроллеру вообще не передается управление, потому как в представлении field, файл шаблона имеет имя default.php, а в контроллере есть строчки:
    Код (PHP):
    1. JRequest::setVar( 'view', 'field' );
    2.         JRequest::setVar( 'layout', 'form'  );

    И ему глубоко по барабану на них, вместо того, чтобы запускать шаблон form.php он все равно запускает default.php.

    Что не так, подскажите, пожалуйста. А то я в панике уже.

    Заранее спасибо.
     
    Последнее редактирование: 07.08.2009
  2.  
  3. Dead Krolik
    Offline

    Dead Krolik Недавно здесь => Cпециалист <=

    Регистрация:
    13.04.2007
    Сообщения:
    3 685
    Симпатии:
    101
    Пол:
    Мужской
    Посмотри пример хеллоуворлда. Там есть определенные правила именования классов. Возможно поэтому не работает. То есть, типа того, что fields.php должен иметь только fieldsController и никак иначе. Это примерно, я уже не помню сейчас. Просто как вариант.
     
  4. Offline

    oppo Недавно здесь

    Регистрация:
    02.08.2006
    Сообщения:
    9
    Симпатии:
    0
    Пол:
    Мужской
    проверьте
    <input type="hidden" name="task" value="" /> task должен быть пустой
    в форме <form action="index.php?option=com_zetforms&controller=название контролера" method="post" name="adminForm" id="adminForm">
     
  5. Tureckiy
    Offline

    Tureckiy Недавно здесь => Cпециалист <=

    Регистрация:
    11.04.2009
    Сообщения:
    423
    Симпатии:
    30
    Пол:
    Мужской
    Судя по коду наоборот! : fields - за редактирование и все такое, а вот field - просто вывод! Проблема скорее всего в этих строках

    $isNew - переменная содержит не один объект а группу объектов... Напишите подробнее когда и в какой монент не идет "передача" в контроллер!?

    P.S. Это распрастраненный ошибочный пример создания компонента в рунете! его еще дорабатывать надо в моделе компонента немного! :)
     
  6. Schemer
    Offline

    Schemer Недавно здесь

    Регистрация:
    26.11.2007
    Сообщения:
    49
    Симпатии:
    1
    Пол:
    Мужской
    Всем большое спасибо за советы. Даже не ожидал.

    Однако, проблему пока что так и не решил.

    Да я знаю про эти правила наименования классов и файлов. Возможно, у меня действительно где-то какая-то опечатка, но пока я ее не нашел.

    Проверил, здесь у меня все верно.

    Нет, посмотрите по внимательней, все именно так, как я написал в первом своем посте.

    Про переменную $isNew можете написать подробнее? Я не очень понял, где у меня могла быть ошибка.

    Да если бы я знал в какой именно момент у меня возникает проблема, я бы тему может и не создавал бы. =))
     
  7. Offline

    seeeking Недавно здесь

    Регистрация:
    28.11.2010
    Сообщения:
    4
    Симпатии:
    0
    Пол:
    Мужской
    Вопрос к топик-стартеру: у вас получилось решить проблему? Если да - поделитесь, пожалуйста, у меня похожий затык:

    есть общий контроллер:
    admin/controller.php
    он ссылается на вьюер/модель projects (отображает список проектов) следующим образом:
    Код (PHP):
    1. class ProcreateController extends JController {
    2.     /**
    3.      * Constructor
    4.      * @access private
    5.      * @subpackage procreate
    6.      */
    7.     function __construct() {
    8.         //Get View
    9.         if(JRequest::getCmd('view') == '') {
    10.             JRequest::setVar('view', 'projects');
    11.         }
    12.         $this->item_type = 'Default';
    13.                        
    14.         parent::__construct();
    15.                
    16.     }
    17. }


    и есть связка:
    admin/controllers/project.php
    admin/models/project.php
    admin/views/project/default.php


    ссылка вида index.php?option=com_procreate&controller=project&task=edit&cid[]=1 почему-то не передаёт управление на контроллер project, исполняется всё то же самое, что и по ссылке index.php?option=com_procreate, то есть дефолтный контроллер и всё из него вытекающее.

    Если перенести функции из controllers/project.php в controller.php, то всё работает, но это не то, что мне нужно, мне нужны разные контроллеры для разных отображений! :(

    Что я делаю не так? Вроде бы обращение вида index.php?option=com_name&controller=controller_name&task=task_name должно выполнять указаный контроллер.

    Второй день бьюсь :(
     
  8. Offline

    botanist Активист => Cпециалист <=

    Регистрация:
    15.02.2009
    Сообщения:
    461
    Симпатии:
    49
    Пол:
    Мужской
    Посмотри во входном файле как контроллеры подключаются. Загляни в входные файлы других компонентов и сделай по аналогии.
     
  9. Offline

    seeeking Недавно здесь

    Регистрация:
    28.11.2010
    Сообщения:
    4
    Симпатии:
    0
    Пол:
    Мужской
    О, видимо это оно.

    То есть во входной точке нужно вручную вычленить имя контроллера из параметров и загрузить соответствующий файл (по крайней мере, так это происходит в других компонентах, сама ЦМС этим не занимается.
     
  10. omfgpanda
    Offline

    omfgpanda Недавно здесь => Cпециалист <=

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской
    Секундочку ... для того, что бы реализовать работу с несколькими контроллерами необходимо:
    - при создании классов дочерних контроллеров, необходимо расширять не JController, а класс вашего родительского контроллера компоннета
    Код (PHP):
    1. myHelloControlleritems extends myMainHelloController

    - также, при передачи управления из одного контроллера в другой, необходимо в форме шаблона, через который осуществляется передача, добавить еще одного скрытое поле:
    Код (html):
    1. <input type="hidden" name="controller" value="items" />
     

Поделиться этой страницей

Загрузка...