Как получить массив всех страниц из всех поселений Сайт?
Добрый день!
У меня есть несколько поселений Сайт, в каждом несколько страниц. Хочу сделать меню состоящее из нескольких определенных ссылок на страницы находящихся в разных поселениях Сайт.
Приписываю таким страницам в «Дополнительные параметры страницы» 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 ответов
Придется немного поплясать с бубном: создаем хэлпер .../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())}
Спасибо за ответ, но он проливает свет только на половину вопроса — как взять таблицу со станицами. А таблица параметров же отдельно хранится.
В вашем запросе нет ни слова о таблице site_page_params в которой хранятся приписанные ключи, и разумеется {var_dump(shopPageHelper::getAllPages())} не показывает ключа toolbar_link который я приписал к страницам. В отличии от {var_dump($wa->site->pages())}, который собирает и из site_page_params.
Хочу сделать правильно, не сочинять на ощупь то, что уже есть в движке (на свой лад и добавляя ещё два запроса к БД) — я вижу, что в движке же есть эта функция, но не могу её найти (Ох, да, нам всем тут очень не хватает справочника по классам и функциям, я не первый :).
Скажите, пожалуйста, как правильно получить массив всех страниц из всех поселений со всеми параметрами относящимися к странице, включая ключи?
Или в каком файле написано про $wa->site->pages(), чтоб посмотреть как она устроена?
(Ещё я не понял почему путь к хэлперу в вашем примере /shop/, файл назван shopPayment, а класс shopPageHelper если речь о страницах Сайта. Но это не важно.)
>>> Или в каком файле написано про $wa->site->pages(), чтоб посмотреть как она устроена?
wa-system/view/waAppViewHelper.class.php
Получилось ли у Вас получить такой массив? Очень надо)
Не получилось. Уже стёр, что писал, и вставил ссылки руками.
Массив получилось сделать, но он превращался в список только из ссылкок поселения первого по индексу в базе, это я не поборол.
да, дебильная система
Так выведет все страницы в массиве, исключая Неопубликованные страницы + дополнительные параметры к странице. Наверное можно как-то сделать при помощи фишек фреймворка, но я честно говоря не знаю как)
<?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;
}
}
Скажите, а к чему такие сложности?
Судя по этому
задача не "в получить массив всех страниц из всех поселений".
Можно создавать вложенные страницы и их адрес будет повторять то, что вы сделали отдельными поселениями. Например создать страницу "about" c url "about/" - выставить статут "Черновик".
Потом внутрь about добавить нужные страницы, например "компания" с url "company/" - полный урл такой страницы будет about/company/
При этом страница about не будет видна нигде, но её вложенные страницы будут работать. По прямым ссылкам. Которые вы можете вставить куда угодно.
Можно about и не делать черновиком - использовать доп.параметры для её скрытия, если она не нужна.
В принципе, с использованием вложенности и доп.парметров страниц, можно вязать любые бантики.
p.s. тфу ты...некрофилией занимаемся -)
Нет, все ещё актуально.
Ответа я так и не нашёл. Нужно получить массив всех страниц из всех поселений, со всеми параметрами относящимися к странице, включая ключи чтобы сделать навигацию по структуре из разных поселений:
site.ru/ — Магазин
site.ru/about/ — Сайт
site.ru/rules/ — Сайт
site.ru/info/ — Сайт
site.ru/contacts/ — Сайт
Как вы предлагаете не подходит – у вложенных страниц в черновик будут НЕ короткие урл.
Владимир, напишите, пожалуйста, подробнее, чего вы хотите (в конечном итоге). Что именно должно быть в меню?
Можно посмотреть ваш сайт, чтобы сообразить что к чему?
Я кажется понял.
По основному url-у у вас поселено приложение "Магазин", а страницы вы заводите в приложении "Сайт".
Но страницы можно заводить и в приложении Магазин(Магазин-Витрина-Страницы), и тогда у них будут нормальные url-ы, от корня домена site.ru
Если это не так, то см. мой предыдущий комментарий - больше подробностей.
P.S. если что, получаются они через {$wa->shop->pages()}
https://developers.webasyst.ru/forum/5745/kak-polu...
Хочу уточнить: пункты меню настраивать планруется вручную? Или автоматом строть по какому-то алгоритму?
В ручную. Хотел уметь делать второе настраиваемое меню в шапке и на некоторых контент-страницах подставлять контролируемый руками блок с меню с ссылками на страницы по теме, типа «Читать далее».
Если вручную, то, тогда вам больше подойдёт способ через создание блоков в приложении сайт.
Делаете блоки menu2, menu3 и т.д. В каждом из них формируете какое-угодно меню и вставляете в шаблон(ы) там, где вам надо {$wa->block("menu2")}.
Это самый простой и нативный способ как мне кажется.
Не нужны никакие доп.параметры. Используйте напрямую url-ы страниц для наполнения меню.
Ох, ну это вы выдали, это не ответ )
Это конечно тоже можно назвать «в ручную», но ничего не упрощает. Разумеется, само меню я хочу чтобы автоматически собиралось. За десятком ваших меню невозможно будет уследить. Думаете, я случайно пытался массив вытянуть – мне не хочется с конкретными названиями, конкретными ссылками и конкретным кодом вывода меню в будущем дело иметь. Это я и пытаюсь автоматизировать. Руками только страницы выбрать, например, ключи у них подписать. А в нужные меню страницы сами попадают.
Ну что же, мне право жаль, но вы изначально очень сильно усложнили себе жизнь раскидав "страницы" по куче поселений.
Одним простым хэлпером тут не обойтись, насколько я помню хэлперы приложений доступны только из самих приложений. Тоже самое обстоит с классами приложений.Можно конечно сделать этакого монстрика, который будет напрямую дёргать все "страницы" из таблиц типа (site|shop|blog|...)_page вместе с параметрами, раскидать его во все используемые приложения. В шаблонах, в зависимости от app_id вызывать нужный, ну и так далее и в том же духе, со всеми вытекающими, типа ошибок при метаобновлениях и прочим.
Может излишне сгущаю краски, но решение будет примерно таким, и конкретно я этим заниматься не хочу.
Простите если обнадёжил.
P.S.Хотя конечно можно попросить разработчиков добавить в waAppViewHelper.class.php параметр в pages() для получения "страниц" всех поселений этого приложения. Или сделать общесистемный метод получения всех "страниц".
Структура у сайта обычная. А другого варианта я не вижу — да, в Магазине есть свои страницы (которые Магазин→Витирина→Страницы), но они и создаются на основе шаблона магазина, они совсем по другому скроены.
Страницы абсолютно идентичны у всех приложений. Внешний вид страниц - это исключительно html и стили темы дизайна. На сами приложения никак не завязаны, кроме самой привязки страниц к приложениям.
Соответственно дизайн любой страницы в любом приложении можно склепать как вам угодно.
Омг, нельзя утверждать что они идентичны, в теме Магазина и в теме Сайта обязательные шаблоны свои у каждого могут быть (page.html, например).
Остановитесь с такими советами, пожалейте тех кто придёт сюда через поиск! За что у вас бэйджики «Эксперт» и «Разработчик», если на вопрос про внутренние команды движка вы мне сначала руками предлагаете в N меню все ссылки руками набирать, а потом ещё во всех темах все шаблоны идентичны и на темы не завязаны.
Это вы сами придумали. Мой пост был немного о другом.
Использование наследуемых тем и начальные знания html и css позволяют сделать однообразный дизайн для всех используемых приложений, так, что пользователь даже не будет замечать перехода из одного приложения в другое.
И прекратите пожалуйста разговаривать в "превосходном тоне" - вы пришли сюда за помощью? Так будьте вежливы. Мне, если честно, уже не хочется с вами общаться. До свидания.
Вам же уже сказали, посмотрите waAppViewHelper.class.php -> pages, там забирается только один $route, вам же нужно перебрать все, если есть навыки, то перенесите код в собственный хелпер
Да, спасибо, я тогда спрашивал, в надежде узнать что существует какой-то параметр недокументированный, который отдаст массив со всех поселений.
Но переписывать хелпер, это значит добавить запросов к базе и не забывать про существование своего кода в будущем. Решил не идти по этому пути ради моих нескольких пунктов в меню на странице, да и может есть причины почему разработчики так не написали сами. А так, думал там параметр добавить, условно:
Мне надо сделать два меню в шапке с простыми урлами (урлы менять нельзя). Магазин на основном поселении. Первое, основное, меню:
Второе меню:
В движке можно делать только одно меню. Хочу иметь универсальный способ делать второе (и любое другое число) меню для вывода на нужных страницах, типа как на вордпрессе, например. Пришёл к тому, что это можно организовать через ключи у страниц, может неудобно, но это же один раз надо сделать. Но как собрать массив из всех страниц из всех поселений, у которых нужный ключ по которму я соберу меню – не осилил. Мне не обязательно именно этот способ с ключами, мне обязательно уметь делать несколько меню через адмнку с какими хочу урлами.