Как вставить (внедрить?) Существующее приложение React (просто пользовательский интерфейс без внутреннего интерфейса) в макет страницы SilverStripe? - PullRequest
1 голос
/ 18 апреля 2019

Мой вопрос: Я читал документацию SilverStripe 4, чтобы найти способ вставить существующее приложение React (просто пользовательский интерфейс вложенных компонентов React без внутреннего интерфейса) в макет страницы SilverStripe. Возможно ли это и как убедиться, что SilverStripe имеет правильные зависимости?

Мое исследование до сих пор пытается ответить на этот вопрос: Поскольку традиционный проект React использует NPM (менеджер пакетов узлов) для получения всех правильных зависимостей и Node.js в качестве сервера, мне интересно, как это сделать, когда мой проект SilverStripe выполняется на сервере Apache. Я нашел этот пакет, мне нужно добавить его в мой проект? https://www.npmjs.com/package/@silverstripe/webpack-config

Самая близкая статья, которую я встречал, - это статья о включении компонентов React в проект SilverStripe, в которой обсуждается настройка интерфейса администратора CMS. Вместо этого я хочу показать компоненты React на общедоступной странице сайта. https://docs.silverstripe.org/en/4/developer_guides/customising_the_admin_interface/reactjs_redux_and_graphql/

В этой статье упоминается инфраструктура на стороне клиента, имеющая собственную реализацию внедрения зависимостей, известную как Injector. Нет другой документации, которую я могу найти по этому поводу.

У меня есть класс PageController, который в настоящее время имеет только требования (JavaScript и css), относящиеся к SilverStripe. Это было сделано после уроков SilverStripe 1 -4.

<?php

namespace {

    use SilverStripe\CMS\Controllers\ContentController;

    use SilverStripe\View\Requirements;

    class PageController extends ContentController
    {

        private static $allowed_actions = [];

        protected function init()
        {
            parent::init();
            // You can include any CSS or JS required by your project here.
            // See: https://docs.silverstripe.org/en/developer_guides/templates/requirements/
                Requirements::css('css/bootstrap.min.css');
                Requirements::css('css/style.css');
                Requirements::javascript('javascript/common/modernizr.js');
                Requirements::javascript('javascript/common/jquery-1.11.1.min.js');
                Requirements::javascript('javascript/common/bootstrap.min.js');
                Requirements::javascript('javascript/common/bootstrap-datepicker.js');
                Requirements::javascript('javascript/common/chosen.min.js');
                Requirements::javascript('javascript/common/bootstrap-checkbox.js');
                Requirements::javascript('javascript/common/nice-scroll.js');
                Requirements::javascript('javascript/common/jquery-browser.js');
                Requirements::javascript('javascript/scripts.js');
        }
    }
}

У меня также есть класс ReactPageController, который расширяет класс PageController. Я включаю требования (зависимости?) Для React здесь?

<?php
namespace SilverStripe\Lessons;

use PageController;    

class ReactPageController extends PageController 
{
//include another init method here?
}
?>

Затем мне нужно как-то внедрить компонент React в макете для ReactPage.ss (класс 'ReactPage.php' расширяет класс 'Page.php'). Примечание. Макет для Page.ss включает в себя простую панель навигации, верхний и нижний колонтитулы, которые будут наследовать ReactPage.ss.

Шаблон ReactPage.ss

<!-- BEGIN CONTENT -->
        <div class="content">
            <div class="container">
                <div class="row">
                    <div class="main col-sm-8"> 
                        <div>
                           <!-- INSERT REACT CONTENT HERE:replace Hello World!-->
                           <h1>Hello World!</h1>
                        </div>                  

                    </div>

                    <div class="sidebar gray col-sm-4">
                        <% if $Menu(2) %>
                        <h3>In this section</h3>
                            <ul class="subnav">  
                                <% loop $Menu(2) %>
                                    <li><a class="$LinkingMode" 
                                     href="$Link">$MenuTitle</a></li>
                                <% end_loop %>
                            </ul>
                        <% end_if %>
                    </div>
                </div>
            </div>
        </div>
        <!-- END CONTENT -->

Результатом будет страница, где вместо жестко закодированного «Hello World!» Будет корневой компонент с множеством вложенных компонентов. Вложенное приложение React будет иметь ту же функциональность, что и автономное приложение React.

Спасибо, что уделили время на чтение моего длинного вопроса. Любые ответы будут с благодарностью. Я только изучаю React и SilverStripe, мой вопрос также может быть запутанным или плохо сформулированным, поэтому извините, если это так. Еще раз спасибо: -).

1 Ответ

0 голосов
/ 18 апреля 2019

Вы можете добавить пакет приложений внешнего интерфейса, используя вызовы Requirements::javascript() в своем контроллере, или из своего шаблона, используя вызовы <% require %>. Фундаментальная концепция заключается в том, чтобы «добавить свои JavaScript (и / или CSS) пакеты в мой внешний вид». С этого момента ваш пакет должен инициировать себя, учитывая, что пакеты доступны на странице.


Вот легкий пример, добавленный к теме:

  • Добавить папку темы, например themes/my-theme
  • Включите его, добавив к app/_config/theme.yml
  • Добавление макета ReactPage (примечание: макет - это раздел содержимого, а не полный макет страницы)
# File: ./themes/my-theme/templates/Layout/ReactPage.ss
<div id="my-react-app">
    If you can see this, your React app hasn't initialised yet
</div>
  • Очистить (?flush в вашем браузере) кеш

Если вы добавите ReactPage в CMS, а затем откроете его на своем веб-интерфейсе, вы должны увидеть сообщение о том, что ваше приложение React еще не инициализировано. Это работает, потому что SilverStripe будет искать цепочку наследования страниц, чтобы найти ту, которая имеет шаблон, соответствующий его имени класса. Обратите внимание, что это включает в себя пространство имен класса, поэтому, если у вашего класса оно есть, оно должно быть, например, templates/Foo/Bar/Layout/ReactPage.ss.

Теперь инициализируйте демонстрационное приложение React:

  • cd themes/my-theme && create-react-app js
  • cd js && yarn build

Теперь вам нужно указать SilverStripe «выставить» ресурсы вашей темы , которые будут символически связывать их (по умолчанию) с каталогом public/resources, чтобы вы могли получить к ним доступ через webroot (* 1042) * папка).

# File: ./composer.json
...
"extra": {
    "expose": [
        "themes/my-theme/build/static/js/bundle.js"
    ]
}

Запустите composer vendor-expose из корневой папки проекта, чтобы повторно открыть все ваши ресурсы.

Наконец, добавьте ваши требования к шаблону SilverStripe или контроллеру. Вы можете сделать это с помощью метода init() контроллера или непосредственно в шаблоне:

# File: ReactPageController.php (note that this may not exist and doesn't need to necessarily)
use SilverStripe\View\Requirements;

// ...

protected function init()
{
    parent::init();

    Requirements::javascript('themes/my-theme/js/build/static/js/main.ad956de7.chunk.js');
    Requirements::javascript('themes/my-theme/js/build/static/js/2.6efc73d3.chunk.js');
    Requirements::javascript('themes/my-theme/js/build/static/js/runtime~main.a8a9905a.js');
    Requirements::css('themes/my-theme/js/build/static/css/main.5c68d653.chunk.css');
}

Для целей этого примера я использовал хеш-имена файлов, которые были созданы create-react-app. Было бы проще интегрировать в SilverStripe, если у вас есть согласованное имя файла, например bundle.js или что-то в этом роде.

Вы также можете сделать это в своем шаблоне:

# File: ./themes/my-theme/templates/Layout/ReactPage.ss
...
<% require javascript('themes/my-theme/js/build/static/js/main.ad956de7.chunk.js') %>
<% require javascript('themes/my-theme/js/build/static/js/2.6efc73d3.chunk.js') %>
<% require javascript('themes/my-theme/js/build/static/js/runtime~main.a8a9905a.js') %>
<% require css('themes/my-theme/js/build/static/css/main.5c68d653.chunk.css') %>

Загрузите ваш браузер сейчас, и вы увидите, что приложение React работает. Он будет немного сломан, но для примера достаточно показать, как запустить приложение React на вашей странице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...