Как определить действие?

#1 1 января 2017 в 00:47
Друзья всех с новым годом!

Друзья создаю компонент, есть категория sport/basketball/1 все работает правильно, но теперь хочу продлить цепочку но уже не знаю как сделать помогите.
Хочу сделать так, sport/basketball/1/1, то есть, например нажимаем на баскетбол там список турниров, далее нажимаем на турнир он перекидывает "id", $id sport/basketball/1 по фильтру. там список, например команд, и теперь хочу при нажатие на команду выводилась страница sport/basketball/1/1 вот это уже не могу сделать страница выводится но без данных, если знаете помогите пожалуйста.

Вот model.php

  1. /* Data Base Sport Tournament */
  2. public function getSportTournament($id){
  3. $sport_tournament = $this->getItemById('sport_tournaments', $id);
  4. $this->filterEqual('id', $id);
  5. $sport_tournament['sports_tournaments'] = $this->get('sport_tournaments');
  6. return $sport_tournament;
  7. }
  8. public function getSportsTournaments(){
  9. return $this->get('sport_tournaments');
  10. }
  11. public function getSportsTournamentsCount(){
  12. return $this->getCount('sport_tournaments');
  13. }
  14. public function getSportTournamentField(){
  15. return $this->get('sport_tournaments');
  16. }
  17. public function deleteSportTournament($id){
  18. return $this->delete('sport_tournaments', $id);
  19. }
  20. public function updateSportTournament($id, $sport_tournament){
  21. return $this->update('sport_tournaments', $id, $sport_tournament);
  22. }
  23. public function addSportTournament($id, $sport_tournament){
  24. return $this->insert('sport_tournaments', $sport_tournament);
  25. }

index.php (sport)

  1. <?php
  2.  
  3. class actionSportIndex extends cmsAction {
  4.  
  5. public function run($id = false){
  6.  
  7. $template = cmsTemplate::getInstance();
  8.  
  9. $sports = $this->model->getSports();
  10.  
  11. $total = $this->model->getSportsCount();
  12.  
  13. $template->render('index', array(
  14. 'sports' => $sports,
  15. 'total' => $total
  16.  
  17. ));
  18.  
  19. }
  20.  
  21. }
Вот sport/basketball.php
  1. <?php
  2.  
  3. class actionSportBasketball extends cmsAction {
  4.  
  5. public function run($id = false) {
  6.  
  7. $sport_tournament = $this->model->getSportTournament($id);
  8.  
  9. if (!$sport_tournament) { cmsCore::error404(); }
  10.  
  11. $tournaments = $this->model->getSportsTournaments();
  12.  
  13. $total = $this->model->getSportsTournamentsCount();
  14.  
  15. $template = cmsTemplate::getInstance();
  16.  
  17. $template->render('basketball', array(
  18. 'total' => $total,
  19. 'tournaments' => $tournaments,
  20. 'sport_tournament' => $sport_tournament
  21. ));
  22.  
  23. }
  24.  
  25. }
Вот basketball.tpl


  1. <?php if ($sport_tournament['sports_tournaments']) { ?>
  2. <h2>Команды</h2>
  3. <?php foreach($sport_tournament['sports_tournaments'] as $sport_tournament) { ?>
  4. <a href="<?php echo $this->href_to('basketball', $sport_tournament['id']); ?>"><?php echo $sport_tournament['tournament_name']; ?></a>
  5. <?php } ?>
  6. <?php } else { ?>
  7. <h2>Турниры</h2>
  8. <?php foreach($tournaments as $tournament) { ?>
  9. <p><a href="<?php echo $this->href_to('basketball', $tournament['id']); ?>"><?php echo $tournament['tournament_name']; ?></a></p>
  10. <?php } ?>
  11.  
  12. <?php } ?>
  13.  
#2 1 января 2017 в 06:59
Вам следует почитать документацию docs.instantcms.ru/dev/controllers тогда сразу все понятно станет.
#3 1 января 2017 в 10:11


Вам следует почитать документацию docs.instantcms.ru/dev/controllers тогда сразу все понятно станет.

kirkr

Я читал и почти делал как там но дальше не понимаю как это сделать =(
#4 1 января 2017 в 13:32
Нико,
public function actionCatalog($do, $id){

в функцию передается два параметра, вы можете передать хоть 50, но они по очереди берутся из адреса

Скопирую вставлю:


Определение действий

Действие контроллера (экшен) — это дочерний метод класса контроллера, обрабатывающий запросы пользователя через URL.

Например, пользователь открывает страницу site.ru/shop/catalog/view/123. Роутер InstantCMS произведет разбор данного адреса на составные части:

shop — компонент, frontend-контроллер которого нужно запустить
catalog — экшен контроллера, который нужно вызвать
все что далее, в нашем случае view и 123 — параметры, которые нужно передать экшену

Таким образом, чтобы обработать подобный URL мы должны создать файл /system/controllers/shop/frontend.php со следующим содержимым:

class shop extends cmsFrontend {

public function actionCatalog($do, $id){
dump("Hello, do = {$do}, id = {$id}");
}

}

В результате, после открытия URL site.ru/shop/catalog/view/123 пользователь увидит в браузере текст:

Hello, do = view, id = 123

Разумеется, в реальности экшен не должен совершать вывод на экран с помощью dump() или echo. Вместо этого используются шаблоны, работа с которыми будет рассмотрена в следующих разделах.


В вашем примере

sport/basketball/1/1

будет
sport — компонент, frontend-контроллер которого нужно запустить
basketball — экшен контроллера, который нужно вызвать
1(первая единица)- параметры, которые нужно передать экшену первым
1(вторая единица)- параметры, которые нужно передать экшену вторым

Так понятнее??? просто вы в функции только один параметр принимаете, сделайте dump как в примере
actionBasketball($do, $id1,$id2)
#5 1 января 2017 в 13:34


Нико,
public function actionCatalog($do, $id){

в функцию передается два параметра, вы можете передать хоть 50, но они по очереди берутся из адреса

Скопирую вставлю:


Определение действий

Действие контроллера (экшен) — это дочерний метод класса контроллера, обрабатывающий запросы пользователя через URL.

Например, пользователь открывает страницу site.ru/shop/catalog/view/123. Роутер InstantCMS произведет разбор данного адреса на составные части:

shop — компонент, frontend-контроллер которого нужно запустить
catalog — экшен контроллера, который нужно вызвать
все что далее, в нашем случае view и 123 — параметры, которые нужно передать экшену

Таким образом, чтобы обработать подобный URL мы должны создать файл /system/controllers/shop/frontend.php со следующим содержимым:

class shop extends cmsFrontend {

public function actionCatalog($do, $id){
dump("Hello, do = {$do}, id = {$id}");
}

}

В результате, после открытия URL site.ru/shop/catalog/view/123 пользователь увидит в браузере текст:

Hello, do = view, id = 123

Разумеется, в реальности экшен не должен совершать вывод на экран с помощью dump() или echo. Вместо этого используются шаблоны, работа с которыми будет рассмотрена в следующих разделах.

kirkr

Я это понял но как его вывести в шаблон во это не могу =(
#6 1 января 2017 в 13:36
В вашем примере

sport/basketball/1/1

будет
sport — компонент, frontend-контроллер которого нужно запустить
basketball — экшен контроллера, который нужно вызвать
1(первая единица)- параметры, которые нужно передать экшену первым
1(вторая единица)- параметры, которые нужно передать экшену вторым

Так понятнее??? просто вы в функции только один параметр принимаете, сделайте dump как в примере
actionBasketball($do, $id1,$id2)
#7 1 января 2017 в 13:41


В вашем примере

sport/basketball/1/1

будет
sport — компонент, frontend-контроллер которого нужно запустить
basketball — экшен контроллера, который нужно вызвать
1(первая единица)- параметры, которые нужно передать экшену первым
1(вторая единица)- параметры, которые нужно передать экшену вторым

Так понятнее??? просто вы в функции только один параметр принимаете, сделайте dump как в примере
actionBasketball($do, $id1,$id2)

kirkr

Я извиняюсь, можете на моем примере кода показать, ни как не могу понять =(
#8 1 января 2017 в 13:46
Нико,
class actionSportBasketball extends cmsAction {

public function run($id = false) {

Вы ждете только один ID, что тут еще ждать то ?=))

т.е. в вашей функции только ожидается одна переменная остальные отрезаются, поэтому и говорю выводите дамп, сразу поймете что увас передается в функцию.
#9 1 января 2017 в 13:56


Нико,
class actionSportBasketball extends cmsAction {

public function run($id = false) {

Вы ждете только один ID, что тут еще ждать то ?=))

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

kirkr

  1. <?php
  2.  
  3. class actionSportBasketball extends cmsAction {
  4.  
  5. public function run($id = false, $do = false) {
  6.  
  7. $sport_tournament = $this->model->getSportTournament($id);
  8.  
  9. if (!$sport_tournament) { cmsCore::error404(); }
  10.  
  11. $tournaments = $this->model->getSportsTournaments();
  12.  
  13. $total = $this->model->getSportsTournamentsCount();
  14.  
  15. $template = cmsTemplate::getInstance();
  16.  
  17. $template->render('basketball', array(
  18. 'total' => $total,
  19. 'tournaments' => $tournaments,
  20. 'sport_tournament' => $sport_tournament
  21. ));
  22.  
  23. }
  24.  
  25. }
Я только что не делала, и так передавала, но не получается, ссылка появляется, все окей, но мне нужно что было так

sport/baksektball ->/ 1(оne) ->/ 2 (two)

То есть где 2 (two) там были отдельные данные из базы, которые будут относится к 1 (one)

sport/basketball ->/ 2(two) ->/(3) (three) там уже относятся к (two) id == do }
#10 1 января 2017 в 14:00
Нико,
dump переменных $total, $tournaments, $sport_tournament
сделайте, все ли есть.

Если не можете, то в личку скайп скиньте и доступ к ftp покажу что не так.
#11 1 января 2017 в 15:04
в догонку, проблема оказалась в отсутствии файла routes.php с описанием:

  1.  
  2. <?php
  3. function routes_content(){
  4. return array(
  5. 'pattern' => '/^([a-z0-9\-_]+)\/([a-zA-Z0-9\-\/]+)$/i',
  6. 'action' => 'baksektball ',
  7. 1 => 'id1',
  8. 2 => 'id2'
  9. ),
  10. );
  11.  
  12. }
  13.  
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.