0 Пользователей и 1 Гость просматривают эту тему.
  • 36 Ответов
  • 3383 Просмотров
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Создание компонента MVC
« : 13.03.2015, 21: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

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Создание компонента MVC
« Ответ #1 : 13.03.2015, 21:31:44 »
главным является контроллер, который определяется через маршрут - путем анализа REQUEST_URI по регулярному вырожению.
Далее в контролере я определяю модель, получаю данные и передаю их в вид
Да, так и должно быть.
Приведу код входной точки com_content
Код: php-brief
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

  • Гуру
  • 6915
  • 415 / 4
Re: Создание компонента MVC
« Ответ #2 : 13.03.2015, 21:41:33 »
В форме, в поле, где указываете task, вам по условию необходимо указывать нужный контроллер.метод. Для этого вы можете из реквеста считывать &controller=bmw&task=customAction и указывать их, либо указывать предполагаемое значение по умолчанию. Но так обычно не делают. Зачем вам плодить 100500 контроллеров для одного вида? Делайте все в одном, вызывайте один метод, а уж в нем распарсиваете реквест и, в зависимости от значения присутствующих/отсутствующих параметров вызываете в том же контроллере соседний метод.

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

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Создание компонента MVC
« Ответ #3 : 13.03.2015, 21:45:42 »
в Joomla алгоритм действий переключают через task(задача)
передаете ?option=com_autocatalog&task=myTask
и в вашем контроллере дефолтном пишите:
public function myTask(){
//и тут можете вызвать модель или написать нужную вам логику
}

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

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Создание компонента MVC
« Ответ #4 : 13.03.2015, 21:51:42 »
borodatych, не заморачивайтесь. IMHO, Joomla отличается от других CMS только своей API. Пишите, как вам удобнее - я так делаю :), придерживаясь принципов:
1. экономия ресурсов
2. минимум кода
3. удобочитаемость кода
« Последнее редактирование: 13.03.2015, 21:55:53 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: Создание компонента MVC
« Ответ #5 : 13.03.2015, 21: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

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: Создание компонента MVC
« Ответ #6 : 13.03.2015, 22:01:01 »
AlekVolsk
То есть единственный выход - в виде обрабатывать переменные и на их основе уже дальше рулить?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Создание компонента MVC
« Ответ #7 : 13.03.2015, 22:03:02 »
Благодарю за ответ, robert, не помогло...

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

потому что вызов должен быть: index.php?option=com_autocatalog&task=bmw.customAction
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: Создание компонента MVC
« Ответ #8 : 13.03.2015, 22:10:36 »
Istaan
Премного благодарен, пока достаточно.
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: Создание компонента MVC
« Ответ #9 : 13.03.2015, 22: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

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Создание компонента MVC
« Ответ #10 : 13.03.2015, 22:34:00 »
Попробуйте так
Код: php-brief
    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, 22:59:40 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Создание компонента MVC
« Ответ #11 : 13.03.2015, 22:37:00 »
ну для начала вы неправильно думаете что сделав так  ?option=com_autodealer&view=bmw&controller=bmw&task=bmw.customAction
вы вызовите отображение вида bmw!
На самом деле у вас выполнится только то что тут:
 public function customAction(){
        $this->customAction =  'custom action bmw';
    }
и все..
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Создание компонента MVC
« Ответ #12 : 13.03.2015, 22:41:44 »
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Создание компонента MVC
« Ответ #13 : 13.03.2015, 22:46:10 »
Вам нужно так:
Код: php
public function customAction(){		
$view = $this->getView('bmw', 'html');
$view->customAction =  'custom action bmw';
$view->display();
}
И тогда передасца в вид значение!
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Создание компонента MVC
« Ответ #14 : 13.03.2015, 22:57:12 »
Код: php
public function customAction(){
$view->customAction =  'custom action bmw';
}
Да.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: Создание компонента MVC
« Ответ #15 : 14.03.2015, 21:08:31 »
ну для начала вы неправильно думаете
Понял. Действительно сейчас путь можно сделать короче - ?option=com_autodealer&task=bmw.models

Вам нужно так:
Код: php
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

  • Живу я здесь
  • 3590
  • 247 / 9
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: Создание компонента MVC
« Ответ #17 : 14.03.2015, 21:48:36 »
@borodatych
переводите 2.5* на 3* версию
Если честно, как то сыкотно. В свое время обновлял 1.5....было тяжело...
*

flyingspook

  • Живу я здесь
  • 3590
  • 247 / 9
Re: Создание компонента MVC
« Ответ #18 : 14.03.2015, 21:59:33 »
Если честно, как то сыкотно. В свое время обновлял 1.5....было тяжело...
уже все равно придется, аккуратно со всеми бэкапами не спеша и все будет нормально
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: Создание компонента MVC
« Ответ #19 : 14.03.2015, 22:05:36 »
уже все равно придется, аккуратно со всеми бэкапами не спеша и все будет нормально
Хорошо. То что мне хочется в 2.5 не сделать?
*

flyingspook

  • Живу я здесь
  • 3590
  • 247 / 9
Re: Создание компонента MVC
« Ответ #20 : 14.03.2015, 22:09:44 »
Хорошо. То что мне хочется в 2.5 не сделать?
Сделать, но потом не обновить, а если обновить то переделывать.
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: Создание компонента MVC
« Ответ #21 : 14.03.2015, 22: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

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: Создание компонента MVC
« Ответ #23 : 15.03.2015, 00:53:28 »
Код: php
$model = $this->getModel();
$view->data = $model->getData();

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

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Создание компонента MVC
« Ответ #24 : 15.03.2015, 01: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

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: Создание компонента MVC
« Ответ #25 : 15.03.2015, 02:12:49 »
@Istaan
Если компоненту указать view это будет значить что дефолтный контроллер вызовет метод display!
Да, именно про это и гласят все уроки, как в частности:
Начните с этого: Создание компонента для Joomla 2.5

Но у меня очень много видов получается.
Как минимум для BMW - марок, рынка, модели, модификации, года выпуска, коробка, и тд
Поэтому мне захотелось как то их сгруппировать.
Если я пошел не верным путем, и у вас есть лучшие идеи, будет просто здорово, хочется сделать правильно, а не чтоб работало.
..для чтоб работало, я бы не задавал вопросов вообще..
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Создание компонента MVC
« Ответ #26 : 15.03.2015, 02:25:05 »
Как минимум для BMW - марок, рынка, модели, модификации, года выпуска, коробка, и тд
Поэтому мне захотелось как то их сгруппировать.
Если я пошел не верным путем, и у вас есть лучшие идеи, будет просто здорово, хочется сделать правильно, а не чтоб работало.
Скажите а вы что собираетесь для каждой модели авто новый вид и задачу делать?)
Вам нужен для вашей задачи только один вид - вид списка (где вы выберете все записи)! А дальше вам банально прикручивать переменные!
Например:
?option=com_autodealer&view=autos&dealer=bmw&year=2012&korobka=auto&....&...
где вы в модели просто считаете эти переменные из $_REQUESR и на основании их уже сформируете условия для выборки из базы!
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: Создание компонента MVC
« Ответ #27 : 15.03.2015, 03:09:17 »
?option=com_autocatalog&view=autos&dealer=bmw&year=2012&korobka=auto&....&...
где вы в модели просто считаете эти переменные из $_REQUESR и на основании их уже сформируете условия для выборки из базы!
Думал об этом, но у файла тогда потенциал большой. Поэтому в принципе и затеял группировку.
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: Создание компонента MVC
« Ответ #28 : 15.03.2015, 03:10:55 »
...был дубль, из-за связи...
« Последнее редактирование: 15.03.2015, 03:39:43 от borodatych »
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Создание компонента MVC
« Ответ #29 : 15.03.2015, 14:38:44 »
Думал об этом, но у файла тогда потенциал большой. Поэтому в принципе и затеял группировку.
Затеяли что то вы нескладное! Вам нужен всего один вид, и фильтры!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Подскажите как сделать русификацию компонента)

Автор stardel

Ответов: 4
Просмотров: 6486
Последний ответ 08.04.2015, 09:08:00
от oxotnikkz
Документация по созданию компонента для Joomla 2.5

Автор Sulpher

Ответов: 74
Просмотров: 55285
Последний ответ 17.11.2014, 13:43:07
от limon142
Как использовать облачные хранилища при создание пакета расширений?

Автор Aspik

Ответов: 4
Просмотров: 1440
Последний ответ 12.09.2014, 16:57:59
от Aspik
Вывод макета компонента в расширении XML

Автор DimkaJack

Ответов: 5
Просмотров: 1313
Последний ответ 21.08.2014, 19:05:24
от DimkaJack
Форма редактирования элемента компонента

Автор popoff17

Ответов: 5
Просмотров: 1338
Последний ответ 17.04.2014, 12:34:43
от b2z