Форум русской поддержки Joomla!® CMS
10.12.2016, 12:57:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1] 2  Все   Вниз
  Добавить закладку  |  Печать  
Автор

Создание компонента MVC

 (Прочитано 880 раз)
0 Пользователей и 1 Гость смотрят эту тему.
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« : 13.03.2015, 22:21:39 »

Доброго времени суток.

Начну с того я в основном работал с такими FW как Yii, Zend, Kohana.
В итоге у меня образовалось не понимание платформы Joomla, расхождение паттернов или как там оно по умному...

На текущий момент выпала задачка поработать с Joomla версии 2.5.х - нужно создать компонент для магазина автозапчастей.
Прочитал порядка 4-6 туториалов с разных на вроде как вменяемых сайтах.
Все они приводят одни и теже примеры, с разными пояснениями - один вид, контроллер по дефолту и модель с таки же именем как вид.

В случае использованных мною ранее FW, главным является контроллер, который определяется через маршрут - путем анализа REQUEST_URI по регулярному вырожению.
Далее в контролере я определяю модель, получаю данные и передаю их в вид, по дефолту с таким де именем как контроллер(ну почти).
В Joomla, как я понял, главным является вид, то что в GET переменой view, если не юзать ЧПУ(не знаю даже если оно тут).
И далее от нее все пляшет - это как я понял, возможно Неправильно.

Все в принципе работает, но не хочется плодить бесконечное кол-во таких ячеек/частей, хочется как то сгруппировать.

У меня получилось вывести ?option=com_autocatalog&view=marks
Далее идет ?option=com_autocatalog&view=model&mark=ID
И все работает, но у некотрых каталогов нужно переключить, так скажем, интерфейс, или по другому(может правильному) контроллер (алгоритм, ход мыслей).

В итоге я формирую такой url: ?option=com_autocatalog&view=bmw&controller=bmw&task=customAction
controller=bmw - должен вроде отрабатывать по умолчанию, но решил "перебздеть"

Метод customAction присутвтует в контроллере в site/controller/bmw.php, но он не отрабатыват.
Делаю "ход конем" добавлю этот же метод:

Код:
public function customAction(){
    echo  'custom action bmw';
}

В site/autocatalog.php, перепаковываю->заливаю и вижу искомую надпись.

Что я Неправильно делал, почему в site/controller/bmw.php не отработало?

В итоге мне нужно получить такую схему:

?option=com_autocatalog
&interface=(bmw|toyota)
&method=(getMarkets|getModel|...)


Надеюсь получилось объяснить. Если что спрашивайте дополню, не знаю что излить еще нужно...
Благодарю за внимание.
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #1 : 13.03.2015, 22:31:44 »

главным является контроллер, который определяется через маршрут - путем анализа REQUEST_URI по регулярному вырожению.
Далее в контролере я определяю модель, получаю данные и передаю их в вид
Да, так и должно быть.
Приведу код входной точки com_content
Код
defined('_JEXEC') or die;
 
require_once JPATH_COMPONENT.'/helpers/route.php';
require_once JPATH_COMPONENT.'/helpers/query.php';
 
$controller = JControllerLegacy::getInstance('Content');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
 
Откройте код какого-нибудь стандартного компонента и посмотрите.
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6461



« Ответ #2 : 13.03.2015, 22:41:33 »

В форме, в поле, где указываете task, вам по условию необходимо указывать нужный контроллер.метод. Для этого вы можете из реквеста считывать &controller=bmw&task=customAction и указывать их, либо указывать предполагаемое значение по умолчанию. Но так обычно не делают. Зачем вам плодить 100500 контроллеров для одного вида? Делайте все в одном, вызывайте один метод, а уж в нем распарсиваете реквест и, в зависимости от значения присутствующих/отсутствующих параметров вызываете в том же контроллере соседний метод.

Хотя все это справедливо, если в виде вы формируете одно и тоже содержимое, иначе - а зачем все в одном виде тогда компонуете? один вид - одно содержимое, если часть его должна формироваться в зависимости от определенного условия - внутри вида подключайте необходимые соседние виды/слои, обработкой содержимого которых будут заниматься их собственные контроллеры/единый контроллер с кучей методов под каждый случай (вариантов много).
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #3 : 13.03.2015, 22:45:42 »

в Joomla алгоритм действий переключают через task(задача)
передаете ?option=com_autocatalog&task=myTask
и в вашем контроллере дефолтном пишите:
public function myTask(){
//и тут можете вызвать модель или написать нужную вам логику
}

Так же можете вызвать задачу в  контроллере из папки controllers для этого нужно написать ?option=com_autocatalog&task=controllerName.taskName&...
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #4 : 13.03.2015, 22:51:42 »

borodatych, не заморачивайтесь. IMHO, Joomla отличается от других CMS только своей API. Пишите, как вам удобнее - я так делаю Azn, придерживаясь принципов:
1. экономия ресурсов
2. минимум кода
3. удобочитаемость кода
« Последнее редактирование: 13.03.2015, 22:55:53 от robert » Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #5 : 13.03.2015, 22:58:49 »

Благодарю за ответ, robert, не помогло...

url: /index.php?option=com_autocatalog&view=bmw&controller=bmw&task=customAction

Точка входа:
Код:
<?php defined('_JEXEC') or die;

JLog::addLogger(
    ['text_file' => 'com_autodealer.php'],
    JLog::ALL,
    ['com_autodealer']
);

JError::$legacy = false;

JLoader::register('AutoDealerCFG', dirname(__FILE__). '/helpers/cfg.php');
JLoader::register('AutoDealerLNG', dirname(__FILE__). '/helpers/lng.php');
JLoader::register('AutoDealerAPI', dirname(__FILE__). '/helpers/lib.php');

$doc =& JFactory::getDocument();
$doc->addStyleSheet( '/media/com_autodealer/css/main.css' );
$doc->addStyleSheet( '/media/com_autodealer/css/fw.css' );
$doc->addStyleSheet( '/media/com_autodealer/css/style.css' );

jimport('joomla.application.component.controller');

$controller = JControllerLegacy::getInstance('AutoDealer');
$input = JFactory::getApplication()->input;
///$controller->execute($input->getCmd('task', 'display'));
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();


dev/autocatalog/site/controllers/bmw.php:
Код:
<?php defined('_JEXEC') or die;

jimport('joomla.application.component.controller');

class AutocatalogControllerBmw extends JControllerLegacy {

    public function customAction(){
        echo  'custom action bmw';
    }

}


dev/autocatalog/site/models/bmw.php:
Код:
<?php defined('_JEXEC') or die;

jimport('joomla.application.component.modelitem');

class AutocatalogModelBmw extends JModelItem{

    public function getTypes(){
        if( !isset($this->_object) ){
            $this->_object = 'BMW Types';
        }
        return $this->_object;
    }

}

dev/autocatalog/site/views/bmw/view.html.php:
Код:
<?php defined('_JEXEC') or die;

jimport('joomla.application.component.view');

class AutocatalogViewBmw extends JViewLegacy{

    protected $types;

    public function display($tpl = null){
        $this->types = $this->get('Types');
        parent::display($tpl);
    }
    
}


dev/autocatalog/site/views/bmw/tmpl/default.php:
Код:
<?php defined('_JEXEC') or die;

print'<pre>';
print_r([
    'types'  => $this->types,
    'models' => $this->sModels
]);
print'</pre>';



Результат:
Код:
Array
(
    [types] => BMW Types
    [models] =>
)
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #6 : 13.03.2015, 23:01:01 »

AlekVolsk
То есть единственный выход - в виде обрабатывать переменные и на их основе уже дальше рулить?
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #7 : 13.03.2015, 23:03:02 »

Благодарю за ответ, robert, не помогло...

url: /index.php?option=com_autocatalog&view=bmw&controller=bmw&task=customAction

потому что вызов должен быть: index.php?option=com_autocatalog&task=bmw.customAction
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #8 : 13.03.2015, 23:10:36 »

Istaan
Премного благодарен, пока достаточно.
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #9 : 13.03.2015, 23:20:20 »

Прошу прощения, поторопился с выводами...

url: ?option=com_autodealer&view=bmw&controller=bmw&task=bmw.customAction

Все без изменений кроме:

dev/autocatalog/site/controllers/bmw.php:
Код:
<?php defined('_JEXEC') or die;

jimport('joomla.application.component.controller');

class AutoDealerControllerBmw extends JControllerLegacy {

    public function customAction(){
        $this->customAction =  'custom action bmw';
    }

}


dev/autocatalog/site/views/bmw/tmpl/default.php:
Код:
<?php defined('_JEXEC') or die;

AutoDealerAPI::instance()->e([
    'types'  => $this->types,
    'customAction' => $this->customAction
]);

Пусто, но...


С dev/autocatalog/site/controllers/bmw.php:
Код:
<?php defined('_JEXEC') or die;

jimport('joomla.application.component.controller');

class AutoDealerControllerBmw extends JControllerLegacy {

    public function customAction(){
        echo  'custom action bmw';
    }

}

Вывод есть, но мне нужно передать результат в вид...
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #10 : 13.03.2015, 23:34:00 »

Попробуйте так
Код
    public function customAction(){
       $this->customAction =  'custom action bmw';
$view = $this->getView('bmw', 'html');
$view->setLayout('default');
$view->display();
   }
 
Естественно, у вас должен существовать views/bmw/view.html.php с function display($tpl = null).

P.S. См пост от Istaan - тогда не нужно возиться с view.html.php.
« Последнее редактирование: 13.03.2015, 23:59:40 от robert » Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #11 : 13.03.2015, 23:37:00 »

ну для начала вы неправильно думаете что сделав так  ?option=com_autodealer&view=bmw&controller=bmw&task=bmw.customAction
вы вызовите отображение вида bmw!
На самом деле у вас выполнится только то что тут:
 public function customAction(){
        $this->customAction =  'custom action bmw';
    }
и все..
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6461



« Ответ #12 : 13.03.2015, 23:41:44 »

Начните с этого: Создание компонента для Joomla 2.5
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #13 : 13.03.2015, 23:46:10 »

Вам нужно так:
Код
public function customAction(){		
$view = $this->getView('bmw', 'html');
$view->customAction =  'custom action bmw';
$view->display();
}
И тогда передасца в вид значение!
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #14 : 13.03.2015, 23:57:12 »

Код
public function customAction(){
$view->customAction =  'custom action bmw';
}
Да.
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #15 : 14.03.2015, 22:08:31 »

ну для начала вы неправильно думаете
Понял. Действительно сейчас путь можно сделать короче - ?option=com_autodealer&task=bmw.models

Вам нужно так:
Код
public function customAction(){		
$view = $this->getView('bmw', 'html');
$view->customAction =  'custom action bmw';
$view->display();
}
И тогда передасца в вид значение!
Спасибо, то что нужно.

Но пока для счастья не хватает два момента:
1. Как в методе customAction для $view->customAction данные брать с модели по определенному методу, с возможностью передать свои параметры.
Что то типа:
Код:
public function customAction(){
$view = $this->getView('bmw', 'html');
        $myArr = [];
$view->customAction = getData('model','method',$myArr);
$view->display();
}

2. В этом же методе подключить другой шаблон:
Код:
public function customAction(){
$view = $this->getView('bmw', 'html','customAction');
        $myArr = [];
$view->customAction = getData('model','method',$myArr);
$view->display();
}
Записан
flyingspook
Профи
********

Репутация: +226/-9
Offline Offline

Сообщений: 3537


« Ответ #16 : 14.03.2015, 22:15:36 »

@borodatych
переводите 2.5* на 3* версию
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #17 : 14.03.2015, 22:48:36 »

@borodatych
переводите 2.5* на 3* версию
Если честно, как то сыкотно. В свое время обновлял 1.5....было тяжело...
Записан
flyingspook
Профи
********

Репутация: +226/-9
Offline Offline

Сообщений: 3537


« Ответ #18 : 14.03.2015, 22:59:33 »

Если честно, как то сыкотно. В свое время обновлял 1.5....было тяжело...
уже все равно придется, аккуратно со всеми бэкапами не спеша и все будет нормально
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #19 : 14.03.2015, 23:05:36 »

уже все равно придется, аккуратно со всеми бэкапами не спеша и все будет нормально
Хорошо. То что мне хочется в 2.5 не сделать?
Записан
flyingspook
Профи
********

Репутация: +226/-9
Offline Offline

Сообщений: 3537


« Ответ #20 : 14.03.2015, 23:09:44 »

Хорошо. То что мне хочется в 2.5 не сделать?
Сделать, но потом не обновить, а если обновить то переделывать.
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #21 : 14.03.2015, 23:23:37 »

Сделать, но потом не обновить, а если обновить то переделывать.
Понимаю, но есть текущая задачка. Если есть подскажите, лишнем не будет.
Модуль потом пойдет в паблик, так что так итак потом под 3.х писать, и потдерживать 2.5.х
Что бы не казаться лентяем...прыгнул в метод getView, и как понял именно в этом методе я могу только сослаться на dev/catalog/site/views/bmw/view.customAction.php, переписав так:
Код:
public function customAction(){
$view = $this->getView('bmw', 'customAction');
        $myArr = [];
$view->customAction = getData('model','method',$myArr);
$view->display();
}
Даже если по другому ни как, ито сойдет.
Но осталось одно - как получить данные с модели по методу, с возможностью передачи своих данных (последнее не обязательно, для образовательных целей)
Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #22 : 15.03.2015, 01:00:18 »

Код
$model = $this->getModel();
$view->data = $model->getData();

Как передать данные из контроллера в модель
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #23 : 15.03.2015, 01:53:28 »

Код
$model = $this->getModel();
$view->data = $model->getData();

Как передать данные из контроллера в модель
Этого более чем достаточно.
А по ссылке все остальное не достающее.
От души!
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #24 : 15.03.2015, 02:41:20 »

Но пока для счастья не хватает два момента:
1. Как в методе customAction для $view->customAction данные брать с модели по определенному методу, с возможностью передать свои параметры.
Зачем вам тогда таск не совсем понятно?!
ведь все что вам нужно сделать делается банально вызовом ?option=com_autodealer&view=bmw!

в Joomla таски не совсем то что в Yii или Zend!
Если компоненту указать view это будет значить что дефолтный контроллер вызовет метод display! в методе dispaly будет подключена вьюха и ко вьюхе будет подключенна модель, которая относится к этой вьюхе!
В вьюхе вы можете дергать любой метод из модели через $this->get('MethodName');  (в модели метод должен называться public funciton getMethodName(); а дальше в шаблоне вьюхи вы выводите все что вам нужно!

Задачи в Joomla обычно юзают например для действий каких то, например удаления, редактирования, изменения! Но для отображения зачем пихать в контроллер не понятно!
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #25 : 15.03.2015, 03:12:49 »

@Istaan
Если компоненту указать view это будет значить что дефолтный контроллер вызовет метод display!
Да, именно про это и гласят все уроки, как в частности:
Но у меня очень много видов получается.
Как минимум для BMW - марок, рынка, модели, модификации, года выпуска, коробка, и тд
Поэтому мне захотелось как то их сгруппировать.
Если я пошел не верным путем, и у вас есть лучшие идеи, будет просто здорово, хочется сделать правильно, а не чтоб работало.
..для чтоб работало, я бы не задавал вопросов вообще..
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #26 : 15.03.2015, 03:25:05 »

Как минимум для BMW - марок, рынка, модели, модификации, года выпуска, коробка, и тд
Поэтому мне захотелось как то их сгруппировать.
Если я пошел не верным путем, и у вас есть лучшие идеи, будет просто здорово, хочется сделать правильно, а не чтоб работало.
Скажите а вы что собираетесь для каждой модели авто новый вид и задачу делать?)
Вам нужен для вашей задачи только один вид - вид списка (где вы выберете все записи)! А дальше вам банально прикручивать переменные!
Например:
?option=com_autodealer&view=autos&dealer=bmw&year=2012&korobka=auto&....&...
где вы в модели просто считаете эти переменные из $_REQUESR и на основании их уже сформируете условия для выборки из базы!
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #27 : 15.03.2015, 04:09:17 »

?option=com_autocatalog&view=autos&dealer=bmw&year=2012&korobka=auto&....&...
где вы в модели просто считаете эти переменные из $_REQUESR и на основании их уже сформируете условия для выборки из базы!
Думал об этом, но у файла тогда потенциал большой. Поэтому в принципе и затеял группировку.
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #28 : 15.03.2015, 04:10:55 »

...был дубль, из-за связи...
« Последнее редактирование: 15.03.2015, 04:39:43 от borodatych » Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #29 : 15.03.2015, 15:38:44 »

Думал об этом, но у файла тогда потенциал большой. Поэтому в принципе и затеял группировку.
Затеяли что то вы нескладное! Вам нужен всего один вид, и фильтры!
Записан
Страниц: [1] 2  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet