Как получить массив всех страниц из всех поселений Сайт?

Добрый день!

У меня есть несколько поселений Сайт, в каждом несколько страниц. Хочу сделать меню состоящее из нескольких определенных ссылок на страницы находящихся в разных поселениях Сайт.

Приписываю таким страницам в «Дополнительные параметры страницы» toolbar_link=1.

Пытаюсь обойти все страницы через $wa->site->pages() :

{foreach $wa->site->pages() as $p}
{if $p.toolbar_link}
{if $p.id != $page.id}<a href="{$p.url}">{else}<span class="selected">{/if}
{$p.name|escape}
{if $p.id != $page.id}</a>{else}</span>{/if}
{/if}
{/foreach}

Оказывается что $wa->site->pages() берёт только первое поселение, не заглядывая в остальные.

Скажите, пожалуйста, как получить массив всех страниц из всех поселений?


Несколько поселений пришлось завести поскольку важно иметь короткие и красивые URL страниц от корня сайта:
site.ru/ — Магазин

site.ru/about/ — Сайт
site.ru/about/company/
site.ru/about/factories/

site.ru/rules/ — Сайт

site.ru/info/ — Сайт

site.ru/contacts/ — Сайт


25 ответов

  • 1
    info@ravencode.ru 22 августа 2015 19:03 #

    Придется немного поплясать с бубном: создаем хэлпер .../wa-apps/shop/lib/classes/shopPayment.class.php с вот таким кодом:

    <?php
    class shopPageHelper
    {
    public static function getAllPages()
    {
    $model = new sitePageModel();
    $pages = $model->select('id,name,url,full_url,status,route,parent_id')
    ->where('domain_id = ' . siteHelper::getDomainId())
    ->order('parent_id,sort')
    ->fetchAll('id');
    $domain = siteHelper::getDomain();
    foreach ($pages as $key => $value) {
    $pages[$key]['domain'] = $domain;
    }
    return $pages;
    }
    }

    а дальше уже вызываем в шаблоне shopPageHelper::getAllPages() например так {var_dump(shopPageHelper::getAllPages())}

    • +1
      Владимир Владимир 25 августа 2015 06:44 #

      Спасибо за ответ, но он проливает свет только на половину вопроса — как взять таблицу со станицами. А таблица параметров же отдельно хранится.

      В вашем запросе нет ни слова о таблице site_page_params в которой хранятся приписанные ключи, и разумеется {var_dump(shopPageHelper::getAllPages())} не показывает ключа toolbar_link который я приписал к страницам. В отличии от {var_dump($wa->site->pages())}, который собирает и из site_page_params.

      Хочу сделать правильно, не сочинять на ощупь то, что уже есть в движке (на свой лад и добавляя ещё два запроса к БД) — я вижу, что в движке же есть эта функция, но не могу её найти (Ох, да, нам всем тут очень не хватает справочника по классам и функциям, я не первый :).

      Скажите, пожалуйста, как правильно получить массив всех страниц из всех поселений со всеми параметрами относящимися к странице, включая ключи?

      Или в каком файле написано про $wa->site->pages(), чтоб посмотреть как она устроена?


      (Ещё я не понял почему путь к хэлперу в вашем примере /shop/, файл назван shopPayment, а класс shopPageHelper если речь о страницах Сайта. Но это не важно.)

      • +1
        Михаил Ушенин Михаил Ушенин Webasyst 25 августа 2015 07:53 #

        >>> Или в каком файле написано про $wa->site->pages(), чтоб посмотреть как она устроена?

        wa-system/view/waAppViewHelper.class.php

      • +1
        konsalt-optima konsalt-optima 12 ноября 2015 09:42 #

        Получилось ли у Вас получить такой массив? Очень надо)

        • +1
          Владимир Владимир 12 ноября 2015 11:45 #

          Не получилось. Уже стёр, что писал, и вставил ссылки руками.
          Массив получилось сделать, но он превращался в список только из ссылкок поселения первого по индексу в базе, это я не поборол.

  • 2

    Так выведет все страницы в массиве, исключая Неопубликованные страницы + дополнительные параметры к странице. Наверное можно как-то сделать при помощи фишек фреймворка, но я честно говоря не знаю как)

    <?php

    class sitePages

    {

    public static function getAllPages()

    {

    $site_pages_model = new sitePageModel();

    $site_pages_params_model = new sitePageParamsModel();

    $pages = $site_pages_model->select('id,name,url,full_url,status,route,parent_id')

    ->where('domain_id = ' . siteHelper::getDomainId() . ' && status = 1')

    ->order('parent_id,sort')

    ->fetchAll('id');

    $params = $site_pages_params_model->order('page_id ASC')->fetchAll();

    $domain = siteHelper::getDomain();

    foreach ($pages as $key => $value) {

    $pages[$key]['domain'] = $domain;

    foreach ($params as $param) {

    if ($param['page_id'] == $pages[$key]['id']) {

    $pages[$key][$param['name']] = $param['value'];

    }

    }

    }

    return $pages;

    }

    }

  • 0
    Николай Иванов 24 января 2016 07:12 #


    Скажите, а к чему такие сложности?
    Судя по этому

    Несколько поселений пришлось завести поскольку важно иметь короткие и красивые URL страниц от корня сайта:

    задача не "в получить массив всех страниц из всех поселений".

    Можно создавать вложенные страницы и их адрес будет повторять то, что вы сделали отдельными поселениями. Например создать страницу "about" c url "about/" - выставить статут "Черновик".
    Потом внутрь about добавить нужные страницы, например "компания" с url "company/" - полный урл такой страницы будет about/company/

    При этом страница about не будет видна нигде, но её вложенные страницы будут работать. По прямым ссылкам. Которые вы можете вставить куда угодно.
    Можно about и не делать черновиком - использовать доп.параметры для её скрытия, если она не нужна.

    В принципе, с использованием вложенности и доп.парметров страниц, можно вязать любые бантики.


    • +1
      Николай Иванов Николай Иванов 24 января 2016 07:16 #

      p.s. тфу ты...некрофилией занимаемся -)

      • +1
        Владимир Владимир 24 января 2016 07:22 #

        Нет, все ещё актуально.

        Ответа я так и не нашёл. Нужно получить массив всех страниц из всех поселений, со всеми параметрами относящимися к странице, включая ключи чтобы сделать навигацию по структуре из разных поселений:

        site.ru/ — Магазин

        site.ru/about/ — Сайт

        site.ru/rules/ — Сайт

        site.ru/info/ — Сайт

        site.ru/contacts/ — Сайт

        Как вы предлагаете не подходит – у вложенных страниц в черновик будут НЕ короткие урл.

        • +1
          Николай Иванов Николай Иванов 24 января 2016 08:00 #

          Владимир, напишите, пожалуйста, подробнее, чего вы хотите (в конечном итоге). Что именно должно быть в меню?
          Можно посмотреть ваш сайт, чтобы сообразить что к чему?

        • +2
          Николай Иванов Николай Иванов 24 января 2016 08:09 #

          Я кажется понял.
          По основному url-у у вас поселено приложение "Магазин", а страницы вы заводите в приложении "Сайт".
          Но страницы можно заводить и в приложении Магазин(Магазин-Витрина-Страницы), и тогда у них будут нормальные url-ы, от корня домена site.ru
          Если это не так, то см. мой предыдущий комментарий - больше подробностей.

          P.S. если что, получаются они через {$wa->shop->pages()}

            • +1
              Syrnik.com Syrnik.com 24 января 2016 14:28 #

              Хочу уточнить: пункты меню настраивать планруется вручную? Или автоматом строть по какому-то алгоритму?

              • +1
                Владимир Владимир 24 января 2016 14:46 #

                В ручную. Хотел уметь делать второе настраиваемое меню в шапке и на некоторых контент-страницах подставлять контролируемый руками блок с меню с ссылками на страницы по теме, типа «Читать далее».

            • +1
              Николай Иванов Николай Иванов 25 января 2016 00:56 #

              Если вручную, то, тогда вам больше подойдёт способ через создание блоков в приложении сайт.
              Делаете блоки menu2, menu3 и т.д. В каждом из них формируете какое-угодно меню и вставляете в шаблон(ы) там, где вам надо {$wa->block("menu2")}.
              Это самый простой и нативный способ как мне кажется.
              Не нужны никакие доп.параметры. Используйте напрямую url-ы страниц для наполнения меню.

              • +1
                Владимир Владимир 25 января 2016 07:25 #

                Ох, ну это вы выдали, это не ответ )

                Это конечно тоже можно назвать «в ручную», но ничего не упрощает. Разумеется, само меню я хочу чтобы автоматически собиралось. За десятком ваших меню невозможно будет уследить. Думаете, я случайно пытался массив вытянуть – мне не хочется с конкретными названиями, конкретными ссылками и конкретным кодом вывода меню в будущем дело иметь. Это я и пытаюсь автоматизировать. Руками только страницы выбрать, например, ключи у них подписать. А в нужные меню страницы сами попадают.

                • +1
                  Николай Иванов Николай Иванов 25 января 2016 10:08 #

                  Ну что же, мне право жаль, но вы изначально очень сильно усложнили себе жизнь раскидав "страницы" по куче поселений.

                  Одним простым хэлпером тут не обойтись, насколько я помню хэлперы приложений доступны только из самих приложений. Тоже самое обстоит с классами приложений.
                  Можно конечно сделать этакого монстрика, который будет напрямую дёргать все "страницы" из таблиц типа (site|shop|blog|...)_page вместе с параметрами, раскидать его во все используемые приложения. В шаблонах, в зависимости от app_id вызывать нужный, ну и так далее и в том же духе, со всеми вытекающими, типа ошибок при метаобновлениях и прочим.
                  Может излишне сгущаю краски, но решение будет примерно таким, и конкретно я этим заниматься не хочу.

                  Простите если обнадёжил.

                  P.S.Хотя конечно можно попросить разработчиков добавить в waAppViewHelper.class.php параметр в pages() для получения "страниц" всех поселений этого приложения. Или сделать общесистемный метод получения всех "страниц".

                  • +1
                    Владимир Владимир 25 января 2016 10:29 #
                    но вы изначально очень сильно усложнили себе жизнь раскидав "страницы" по куче поселений.

                    Структура у сайта обычная. А другого варианта я не вижу — да, в Магазине есть свои страницы (которые Магазин→Витирина→Страницы), но они и создаются на основе шаблона магазина, они совсем по другому скроены.

                    • +1
                      Николай Иванов Николай Иванов 25 января 2016 10:46 #

                      Страницы абсолютно идентичны у всех приложений. Внешний вид страниц - это исключительно html и стили темы дизайна. На сами приложения никак не завязаны, кроме самой привязки страниц к приложениям.
                      Соответственно дизайн любой страницы в любом приложении можно склепать как вам угодно.

                      • +1
                        Владимир Владимир 25 января 2016 15:00 #

                        Омг, нельзя утверждать что они идентичны, в теме Магазина и в теме Сайта обязательные шаблоны свои у каждого могут быть (page.html, например).
                        Остановитесь с такими советами, пожалейте тех кто придёт сюда через поиск! За что у вас бэйджики «Эксперт» и «Разработчик», если на вопрос про внутренние команды движка вы мне сначала руками предлагаете в N меню все ссылки руками набирать, а потом ещё во всех темах все шаблоны идентичны и на темы не завязаны.

                        • +1
                          Николай Иванов Николай Иванов 25 января 2016 23:43 #

                          а потом ещё во всех темах все шаблоны идентичны и на темы не завязаны.

                          Это вы сами придумали. Мой пост был немного о другом.
                          Использование наследуемых тем и начальные знания html и css позволяют сделать однообразный дизайн для всех используемых приложений, так, что пользователь даже не будет замечать перехода из одного приложения в другое.

                          И прекратите пожалуйста разговаривать в "превосходном тоне" - вы пришли сюда за помощью? Так будьте вежливы. Мне, если честно, уже не хочется с вами общаться. До свидания.




                        • +1
                          Максим Максим Webasyst 26 января 2016 01:50 #

                          Вам же уже сказали, посмотрите waAppViewHelper.class.php -> pages, там забирается только один $route, вам же нужно перебрать все, если есть навыки, то перенесите код в собственный хелпер

                          • +1
                            Владимир Владимир 26 января 2016 09:32 #

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

                            Но переписывать хелпер, это значит добавить запросов к базе и не забывать про существование своего кода в будущем. Решил не идти по этому пути ради моих нескольких пунктов в меню на странице, да и может есть причины почему разработчики так не написали сами. А так, думал там параметр добавить, условно:

                            Как есть
                            63 if ($routes) { $route = end($routes); …}
                            Как хотел if ($routes) { if ($isAllPagesFromAllRoutes) { foreach($routes as $route) {…} …} else {…} …}
  • 1
    Владимир 24 января 2016 08:36 #

    Мне надо сделать два меню в шапке с простыми урлами (урлы менять нельзя). Магазин на основном поселении. Первое, основное, меню:

    • Главная /
    • Новости /blog/
    • О компании /about (тут много подстраниц типа /about/vacancy)
    • Филиалы /office

    Второе меню:

    • Оплата и доставка /rules
    • Контакты /contacts
    • Вакансии /about/vacancy (т.е. это ссылка из глубины поселения «О компании» из первого меню)

    В движке можно делать только одно меню. Хочу иметь универсальный способ делать второе (и любое другое число) меню для вывода на нужных страницах, типа как на вордпрессе, например. Пришёл к тому, что это можно организовать через ключи у страниц, может неудобно, но это же один раз надо сделать. Но как собрать массив из всех страниц из всех поселений, у которых нужный ключ по которму я соберу меню – не осилил. Мне не обязательно именно этот способ с ключами, мне обязательно уметь делать несколько меню через адмнку с какими хочу урлами.

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

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