Я мучаюсь уже дней 5, не понимаю в чем дело... Может быть кто-нибудь мне подскажет, что я делаю не так. В общем, пишу админку для своего компонента. Есть один контроллер, вот такой fields.php Код (PHP): defined( '_JEXEC' ) or die( 'Restricted access' ); jimport('joomla.application.component.controller'); /** * Controller */ class ZetFormsControllerFields extends JController { function __construct() { parent::__construct(); $this->registerTask( 'add' , 'edit' ); $this->registerTask( 'apply', 'save' ); } function edit( ) { JRequest::setVar( 'view', 'field' ); JRequest::setVar( 'layout', 'form' ); JRequest::setVar( 'hidemainmenu', 1 ); parent::display(); } function save() { $model = & $this->getModel('field'); $data = JRequest::get('POST', JREQUEST_ALLOWHTML); if ($model->store($data)) { $msg = JText::_( 'SAVED' )." !"; } else { $msg = JText::_( 'ERROR SAVED' ); } $link = 'index.php?option=com_zetforms&view=fields'; $this->setRedirect($link, $msg); } function remove() { $model = $this->getModel('field'); if(!$model->delete()) { $msg = JText::_( 'ERROR DELETED' ); } else { $msg = JText::_( 'FILES DELETED' ); } $this->setRedirect( 'index.php?option=com_zetforms&view=fields', $msg ); } function cancel() { $model = $this->getModel( 'field' ); $model->checkin(); $this->setRedirect( 'index.php?option=com_zetforms&view=fields' ); } } И есть 2 представления, точнее 4, но в данном случае задействованы два: field и fields соответственно: Код (PHP): class ZetFormsViewField extends JView { function display($tpl = null) { $fieldedit = $this->get('Data'); $isNew = ($fieldedit->id < 1); $text = $isNew ? JText::_( 'New' ) : JText::_( 'Edit' ); JToolBarHelper::title( JText::_( 'ZetForms' ).': <small><small>[ ' . $text.' ]</small></small>' ); JToolBarHelper::save(); if ($isNew) { JToolBarHelper::cancel(); } else { JToolBarHelper::cancel( 'cancel', 'Close' ); } $this->assignRef('fieldedit', $fieldedit); parent::display($tpl); } } и Код (PHP): class ZetformsViewFields extends JView { function display($tpl = null) { $document = & JFactory::getDocument(); $cssFile = JURI::base(true).'/components/com_zetforms/assets/css/zetformsadmin.css'; $document->addStyleSheet($cssFile, 'text/css', null, array()); //Create Toolbars JToolBarHelper::title( JText::_( 'ABOUT' ), 'abouticon ' ); JToolBarHelper::deleteList(); JToolBarHelper::editListX(); JToolBarHelper::addNewX(); //Create Submenu JSubMenuHelper::addEntry( JText::_( 'CONTROL PANEL' ), 'index.php?option=com_zetforms'); JSubMenuHelper::addEntry( JText::_( 'FORMS' ), 'index.php?option=com_zetforms&view=forms'); JSubMenuHelper::addEntry( JText::_( 'FIELDS'), 'index.php?option=com_zetforms&view=fields', true); JSubMenuHelper::addEntry( JText::_( 'ABOUT' ), 'index.php?option=com_zetforms&view=about'); $items = $this->get( 'Data'); $this->assignRef('items', $items); parent::display($tpl); } } Представление fields отвечает за вывод данных из базы, а field отображает форму редактирования/добавления новой записи в базу. Но кнопка "saved" почему то не работает, то есть данные в базу не добавляются. У меня такое ощущение, что контроллеру вообще не передается управление, потому как в представлении field, файл шаблона имеет имя default.php, а в контроллере есть строчки: Код (PHP): JRequest::setVar( 'view', 'field' ); JRequest::setVar( 'layout', 'form' ); И ему глубоко по барабану на них, вместо того, чтобы запускать шаблон form.php он все равно запускает default.php. Что не так, подскажите, пожалуйста. А то я в панике уже. Заранее спасибо.
Посмотри пример хеллоуворлда. Там есть определенные правила именования классов. Возможно поэтому не работает. То есть, типа того, что fields.php должен иметь только fieldsController и никак иначе. Это примерно, я уже не помню сейчас. Просто как вариант.
проверьте <input type="hidden" name="task" value="" /> task должен быть пустой в форме <form action="index.php?option=com_zetforms&controller=название контролера" method="post" name="adminForm" id="adminForm">
Судя по коду наоборот! : fields - за редактирование и все такое, а вот field - просто вывод! Проблема скорее всего в этих строках $isNew - переменная содержит не один объект а группу объектов... Напишите подробнее когда и в какой монент не идет "передача" в контроллер!? P.S. Это распрастраненный ошибочный пример создания компонента в рунете! его еще дорабатывать надо в моделе компонента немного!
Всем большое спасибо за советы. Даже не ожидал. Однако, проблему пока что так и не решил. Да я знаю про эти правила наименования классов и файлов. Возможно, у меня действительно где-то какая-то опечатка, но пока я ее не нашел. Проверил, здесь у меня все верно. Нет, посмотрите по внимательней, все именно так, как я написал в первом своем посте. Про переменную $isNew можете написать подробнее? Я не очень понял, где у меня могла быть ошибка. Да если бы я знал в какой именно момент у меня возникает проблема, я бы тему может и не создавал бы. =))
Вопрос к топик-стартеру: у вас получилось решить проблему? Если да - поделитесь, пожалуйста, у меня похожий затык: есть общий контроллер: admin/controller.php он ссылается на вьюер/модель projects (отображает список проектов) следующим образом: Код (PHP): class ProcreateController extends JController { /** * Constructor * @access private * @subpackage procreate */ function __construct() { //Get View if(JRequest::getCmd('view') == '') { JRequest::setVar('view', 'projects'); } $this->item_type = 'Default'; parent::__construct(); } } и есть связка: 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 должно выполнять указаный контроллер. Второй день бьюсь
Посмотри во входном файле как контроллеры подключаются. Загляни в входные файлы других компонентов и сделай по аналогии.
О, видимо это оно. То есть во входной точке нужно вручную вычленить имя контроллера из параметров и загрузить соответствующий файл (по крайней мере, так это происходит в других компонентах, сама ЦМС этим не занимается.
Секундочку ... для того, что бы реализовать работу с несколькими контроллерами необходимо: - при создании классов дочерних контроллеров, необходимо расширять не JController, а класс вашего родительского контроллера компоннета Код (PHP): myHelloControlleritems extends myMainHelloController - также, при передачи управления из одного контроллера в другой, необходимо в форме шаблона, через который осуществляется передача, добавить еще одного скрытое поле: Код (html): <input type="hidden" name="controller" value="items" />