Routing в своем приложении

Уважаемые разработчики и знающие люди, растолкуйте пожалуйста мне про внутренний роутинг своего приложения.

Ситуация следующая:

1)Создал бекенд - все работает(записи записываются, модули дизайна и тд работают)

2)Создал фронтенд - файлы (index.html, main.html, contents.html) в файле индекс подключается файл main в котором в свою очередь вывод для всех страниц и {$content}

3)создал роутинг


<?php
return array(
    // login form
    // форма логина
    'login/' => 'login',
    // password recovery
    // восстановление пароля
    'forgotpassword/' => 'forgotpassword',
    // registration form
    // форма регистрации
    'signup/' => 'signup',
    // new user email address confirmation
    // подтверждение email нового пользователя
    'confirm/' => 'frontend/confirm',
    'page/<url>/' => array(
            'module' => 'frontend',
            'action' => 'pages, 
        ),
    '' => 'frontend',
    
);

4) файл appFrontend.action.php


<?php 

class appFrontendAction extends waViewAction
{
  public function execute()
       {
        $title = waRequest::param('title');
        if (!$title) {
            $app = wa()->getAppInfo();
            $title = $app['name'];
        }
        $this->getResponse()->setTitle($title);
        $this->getResponse()->setMeta('keywords', waRequest::param('meta_keywords'));
        $this->getResponse()->setMeta('description', waRequest::param('meta_description'));
        $template = 'index.html';
        $this->setThemeTemplate($template);
             if (waRequest::method() == 'post') {
            $this->add();
        }
    }

 protected function add()
    { логика если отправлена форма
}
}

5)Файл appFrontedPages.action.php (вот тут мне кажется и кроется вся проблема)


<?php

class appFrontendPagesAction extends waViewAction
{
  public function execute()
    {
        $this->setLayout(new appFrontendLayout());
        $pages_model = new shopProductModel();
        $pages = $pages->getByField('url', waRequest::param('pages_url'));
        if (!$apartament) {
            throw new waException('Product not found', 404);
        }
    
        $pages = new appPages($pages, true);
        $this->setThemeTemplate('contents.html');
    }
}

Собственно говоря суть в том, что я пытаюсь добиться - Главная страница home.html второстепенные contents.html бьюсь четвертый день не как не могу понять логику процесса. Помогите христа ради а то скоро глаз задергается.


6 ответов

  • 1
    Михаил Проектов 7 ноября 2016 13:41 #

    Поясните более подробно какие именно URL работают не так как Вы ожидаете?
    Что получается на выходе?

    Что это такое?

    waRequest::param('pages_url')

    Подозреваю, что там согласно представленному файлу маршрутов должно быть

    waRequest::param('url')


  • 1
    Fedoric 7 ноября 2016 13:57 #

    Вчера вечером мудрил мудрил и перемудрил теперь фронт пустая.

    Если не трудно помогите пошагово.

    1)appFronted.action.html выводит index.html в нем подключается main.html (по аналогии с дефолтными шаблонами любого приложения) И уже в нем {$cоntent) который если я еще что то понимаю выводит контент сформированный например в appFrontendPages.action.php или я что то еще упустил?

  • 1
    Fedoric 7 ноября 2016 14:08 #

    И что то не как не пойму как прописать что главная страница это {$content} подтягивает home.html Конечно можно в шаблоне сделать условие {if $wa->currentUrl() == $wa_app_url} блок для главной {else} {$content} {/if} но мне кажется это не совсем правильно.

  • 1
    Rat 7 ноября 2016 15:23 #
    2)Создал фронтенд - файлы (index.html, main.html, contents.html) в файле индекс подключается файл main в котором в свою очередь вывод для всех страниц и {$content}

    На всякий случай уточню: файлы index.html, main.html, contents.html вы создали в рамках темы дизайна для своего приложения? И настроили поселение для своего приложения в разделе "Структура" приложения Сайт?

    3)создал роутинг
    ...
    4) файл appFrontend.action.php

    В вашем файле маршрутизации я не вижу правила для подключения контроллера appFrontend.action.php. Оно должно быть таким:

    '' => 'frontend',

    Т. е. в корне поселения приложения отрабатывает контроллер с пустым action_id, который в вашем случае должен быть описан в файле appFrontend.action.php.

    • +1
      Fedoric Fedoric 7 ноября 2016 16:11 #

      2) Разумеется в теме дизайна. И поселение в приложении сайт site.ru/app/*

      4)как же не видите самое последнее


        'confirm/' => 'frontend/confirm',
          'page/<url>/' => array(
                  'module' => 'frontend',
                  'action' => 'pages, 
              ),
          '' => 'frontend',
      • +1
        Rat Rat 7 ноября 2016 18:03 #

        Да, точно, простите, не заметил. А в чём именно сейчас проблема? У вас там что-то менялось, я вижу:

        Вчера вечером мудрил мудрил и перемудрил теперь фронт пустая.
  • 1
    Fedoric 7 ноября 2016 18:36 #

    Проблема в непонимании ))) Как сделать стартовую страницу фронтэнда home.html через main.html ( в котором {$content} ) и далее страницы которые создаются в бекэнд с выводом site.ru/url страницы тоже через {$content}

    • +1
      Rat Rat 8 ноября 2016 12:07 #

      Есть в вашей теме main.html или нет — это непринципиально. Если вам очень уж нужно иметь main.html (хотя это скорее вопрос удобства организации кода темы дизайна), то включите его в index.html с помощью {include file="..."}. Вообще main.html — это просто вынесенная в отдельный файл часть шаблона index.html.

      Поэтому в итоге в index.html (а если у вас кусок этого файла вынесен в main.html, то, значит, в main.html) должна присутствовать переменная {$content} для отображения результата, который формирует экшен.

      У вас есть экшен appFrontendAction. В нём в качестве шаблона устанавливается файл темы index.html. Это неправильно, потому что это будет означать отображение index.html, внутри которого должен отработать index.html, внутри которого... и так до бесконечности, т. е. возникает бесконечная рекурсия. Наверное, поэтому главная страница фронтенда у вас и не отображается. Вместо index.html в этом экшене вам нужно указать файл-шаблон для главной страницы. Обычно его называют home.html. Ну и, конечно, в теме должен присутствовать такой файл.

      Для формирования содержимого экшеном appFrontendPagesAction у вас используется использоваться другой шаблон. Сформированное этим шаблоном содержимое, подготовленное экшеном, тоже будет вставлено в index.html (напрямую либо опосредованно — через main.html) вместо переменной {$content}.

      А index.html в качестве шаблона нужно использовать только в классе макета, унаследованного от waLayout.

  • 1
    Fedoric 8 ноября 2016 12:21 #

    Уважаемый rat! Спасибо что уделяете время на мою проблему.

    По поводу файла main.html вы совершенно правы это сделано ради удобства конечного пользователи и естественно он подключается инклудом из index и соответственно уже в main есть контент который отображается на всех страницах и после него {$content} - по поводу реализации фронтенд шаблона вообще нет проблем не в понимании не в реализации.

    Так следовательно мне в appFrontendAction

    следует прописать home.html , но если я это делаю то фронтед выводит шаблон home.html минуя index.html

    • +1
      Rat Rat 8 ноября 2016 12:33 #

      Чтобы результат каждого экшена отображался с использованием шаблона index.html, можно создать класс экшена, унаследованный от системного waViewAction (например, myappFrontendAction), и в его конструкторе добавить создание макета:

      $this->setLayout(new myappFrontendLayout());

      У себя в приложении создайте такой класс макета (myappFrontendLayout) и в его методе execute() укажите использование шаблона index.html:

      $this->setThemeTemplate('index.html');

      Каждый свой экшен фронтенда наследуйте не от системного waViewAction, а от своего myappFrontendAction.

      Получится, что при выполнении любого вашего экшена фронтенда будет использоваться конструктор родительского класса myappFrontendAction, в котором устанавливается макет, использующий в качестве шаблона index.html.

      • +1
        Fedoric Fedoric 8 ноября 2016 13:37 #

        Огромное спасибо! Ну что то началось проясняться. Даже получаться! )))

        Теперь вопрос года )

        далее прописываю в роутинг что куда должно направляться. Создаю экшены и радуюсь ?

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите