Шаблон процесвайр

Dev CMS,CMF IT 18

Processwire -- супер потужний сучасний веб-фреймворк. Останніх років зо два переважно роробляю на ньому. Система, як і має бути у веб-фреймворка, є максимально гнучка, базується на ФІЛДах -- полях, які налаштовуєш і прописуєш у шаблоні. По дефолту шаблон необхідно завантажувати по ftp, але є модуль, який дозволяє налаштовувати їх безпосередньо з адмінки.

ФІЛД -- це властивість сторінки, тому і синтаксис відповідний:

echo $page->title;
echo $page->summary;

$page -- це шаблон сторінки, який налаштовуєш, а title -- у даному випадку назва сторінки. Тобто код $page->title виведе у вказаному мусці заголовок сторінки.

Вивести списком усі дочірні сторінки:

foreach($page->children() as $child) {
    echo '<li>' . $hild->tilte . '</li>';
}

Вивести списком (з посиланнями) усі дочірні сторінки:

foreach($page->children() as $child) {
    echo '<li><a href="' . $child->url . '">' . $hild->tilte . '</a></li>';
}

Те саме тільки у скороченому фірмовому стилі "а ля джейквері":

echo $page->children()->each("<li><a href='{url}'>{title}</a></li>");

Якщо потрібно вивести значення батьківської сторінки. Наприклад, є сторінка "усі новини" і в ній є поле зі значенням фото parent_img, тоді вивести у дочірній сторінці значення цього поля можна так: 

echo $page->parent->parent_img;

Так само це можна зробити і з "дідівською" сторінкою, наприклад, заголовок:

echo $page->parent->parent->title;

Інший "фокус-покус" -- вивести на сторінці дані з якогось конкретного шаблону. Приклад: на сайті є новини, які використовують шаблон "posts" і потрібно вивести на головній анонси цих новин: 

$posts = $pages->get('template=posts');
foreach($posts as $post){
    echo '<li>' . $post->tilte . '</li>';
}

Припустімо, що поле з текстом в новинах у нас називається content, то код може бути такий:

$posts = $pages->get('template=posts');
foreach($posts as $post){
    // обрізаємо анонс до 210 символів
    $prewiev = strip_tags(mb_substr($post->content, 0, 210));
    echo '<li>' . $prewiev . '</li>';
}

Потрібно встановити обмеження на кількість дописів, наприклад, 4:

$posts = $pages->find("template=posts, limit=4");

Сортувати за заголовкoм:

$pages = $pages->find("template=posts, limit=3, sort=title");

Знайти 4 дочірні сторінки, відзначені чекбоксом і відсортувати за датою створення (спершу нові):

$features = $page->children("featured=1, limit=4, sort=-date");

Вивести усі сусідні сторінки без поточної:

foreach($page->siblings as $sibling) {
    if($sibling->id != $page->id) echo "<li>Sibling: {$sibling->path}</li>";
}

Обітнути зображення до вказаних пропорцій (філд має назву image):

echo $page->image->size(800,600)->url;

Якщо ми не знаємо, якого розміру буде зображення і не хочемо примусово масштабувати, то можна вказати параметр, який обріже фото, якщо воно буде більшим і не буде міняти, якщо картинка менша. Встановити максимально можливу ширину:

echo $page->image->maxWidth(950)->url;

Можна примусово встановити ширину:

echo $page->image->width(950)->url;

Або ж висоту (зображення не деформуються):

echo $page->image->height(660)->url;

Вивести опис зображення можна за допомогою:

echo $page->image->description;

Вивід пагінації (посторінкової навігації):

echo $pages->renderPager(array(
        'nextItemLabel' => '>>>',
        'previousItemLabel' => '<<<',
        'listMarkup' => "
            <div class=\"pagination\">
                <ul>{out}</ul>
            </div>
        ",
        'itemMarkup' => "<li class='{class}'>{out}</li>",
        'linkMarkup' => "<a href='{url}'><span>{out}</span></a>"
    ));

Хлібні крихти:

foreach($page->parents() as $item) {
    echo '<li><a href=' . $item->url . '>' . $item->title . '</a></li>';
}

Або ж так:

foreach($page->parents as $parent) {
    echo "<li><a href='{$parent->url}'>{$parent->title}</a></li>";
}

Вивести назву шаблона: 

echo "Назва шаблона: {$page->template->name}";

Вивести усі ФІЛДи, які є на сторінці:

foreach($page->fields as $field) {
    echo "<p>{$field->name}: " . $page->get($field->name) . "</p>";
}

Налаштування шаблону меню (модуль ProcessMenuBuilder):

$menu = $modules->get('MarkupMenuBuilder');
$options = array(
    'wrapper_list_type' => 'ul',// ul, ol, nav, div, etc.
    'list_type' => 'li',// li, a, span, etc.
    'menu_css_id' => '',// a CSS ID for the menu
    'menu_css_class' => '',// a CSS Class for the menu
    'submenu_css_class' => '',// CSS Class for sub-menus
    'has_children_class' => '',// CSS Class for any menu item that has children
    'first_class'=>'',// CSS Class for the first item in
    'last_class' => '',
    'current_class' => '',
    'default_title' => 0,// 0=show saved titles;1=show actual/current titles
    'include_children' => 4,// show 'natural' MB non-native descendant items as part of navigation
    'm_max_level' => 1,// how deep to fetch 'include_children'
    'current_class_level' => 1,// how high up the ancestral tree to apply 'current_class'
    'default_class' => '',// a CSS class to apply to all menu items
);
echo $menu->render(ID, $options); // ID -- має бути число, айді створеного меню