Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
rusldv
7 лет назад

PHP Уроки. Соцсеть. Ответы №1

PHP Уроки. Соцсеть. Ответы



Пока я писал курс по разработке своей соцсети, естественно у читателей появились вопросы.
Я решил, что по мере их появления буду писать ответы на них как отдельные уроки.
В этот раз меня просили рассказать про шаблоны, которые я в своих уроках утоил :)
Я привел только несколько примеров шаблонов, так как я знаю, что по верстке у меня рука корявая, к тому же сам по себе шаблон мало относится к PHP. В нем содержится в основном лиш вывод HTML для пользователя и подстановки <?=$var?> и foreach.
Но поскольку задают вопросы я немного расталкую что-же за шаблоны я написал для своей соцсети.
Как помните шаблоны у нас в директории сайта в /sys/templates.

news.tpl.php

<div class="row">
<?if(!$news){?><h3>Новостей еще нет. Подписывайтесь на новых авторов!</h3><?}?>
<?//var_dump($news);?>
<?foreach($news as $mct_post){?>
<p class="mct-post toppost">
<div class="row">
<div class="col-md-offset-1 col-md-1">
<a href="/blog/<?=$mct_post['user_id']?>">
<?if(file_exists('content/'.$mct_post['user_id'].'/s_ava.jpg')){?>
&qt;img class="img-responsive img-circle" src="/content/<?=$mct_post['user_id']?>/s_ava.jpg" alt="" />
<?}else{?>
&qt;img class="img-responsive img-circle" src="/content/default/s_ava.jpg" alt="" />
<?}?>
</a>
</div>
<div class="col-md-8">
<strong><a href="/blog/<?=$mct_post['user_id']?>">
<?=$mct_post['first_name']?> <?=$mct_post['last_name']?> 
</a>
</strong>
<div class="row toppost">
<div class="col-md-3">
<a href="/post/<?=$mct_post['id']?>">
<?if($mct_post['content_time']){?>
&qt;img class="img-responsive img-thumbnail" src="/content/<?=$mct_post['user_id']?>/s_<?=$mct_post['content_time']?>.jpg" alt="" />
<?}else{?>
&qt;img class="img-responsive img-thumbnail" src="/content/default/s_mediamo.jpg" alt="" /></a>
<?}?>
</a>
</div>

<div class="col-md-9">
<a href="/post/<?=$mct_post['id']?>">
<?=annotationStr($mct_post['text'], 380)?>
</a>
<br />
<small><?=$mct_post['post_time']?></small>
</div>
</div>
</div>
</div>
</p>
<br />
<?}?>
</div>

В контроллере в index.php мы инициализируем переменную $news. Теперь в ней хранится массив записей - новостей.
Эти функции были описаны в уроках ранее. Таким образом в шаблоне нам остается только красиво вывести записи из этого массива.
В первую очередь нам надо убедиться, что в массиве (в переменной $news) действительно то что нам нужно.
Для этого мы используем:

<?var_dump($news);?>

Хотя с таким же успехом можно использовать и print_r, но в нашем случае еще выводятся типы данных, а также в случае ошибки выведется NULL, а не пустой массив.
После того как мы убедились, что в массиве все правильно, используем цикл foreach для вывода и конечно разметку HTML:

По сути весь шаблон news - один большой foreach. Как собственно он и выглядит: список новостей сверху вниз.

mct.tpl.php

mct - это медиацентры, аналог сообществ или групп в других соцсетях.
Сам шаблон mct служит для управления пользовательскими медиацентрами: вход и выход, создание и удаление, редактирование информации о медиацентре.

<h2>mct</h2>
<div id="mct_create_form" class="protected">
<p>Название медиацентра:<br />
<input id="mct_name" placeholder="Название медиацентра" />
</p>
<p>Описание медиацентра:<br />
<textarea id="mct_about" placeholder="Описание медиацентра" rows="5" cols="70"></textarea>
</p>
<input id="mct_create" type="submit" value="Создать" />
</div>
<a id="mct_create_button" href="javascript:toggleAndHide('mct_create_button', '', 'mct_create_form');">Создать медиацентр</a>
<hr />
<p>
Ваши медиацентры:
<?foreach($mcts as $mct){?>
    <div>
        <a href="/media/<?=$mct['id']?>"><?=$mct['mct_name']?></a><br />
        <?=$mct['mct_about']?>
    </div>
<?}?>
<p>
<p>
Медиацентры, в которых вы состоите:<br />
<? //var_dump($ins_mcts); ?>
<?foreach($ins_mcts as $ins_mct){?>
    <div>
        <a href="/media/<?=$ins_mct['id']?>"><?=$ins_mct['mct_name']?></a><br />
        <?=$ins_mct['mct_about']?>
    </div>
<?}?>
</p>
<script src="/assets/js/mct.js"></script>

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

media.tpl.php


А это уже непосредственно шаблон, отображающий информацию о конкретном медиацентре.
Как помните в контроллере мы передаем также идентификатор медиацентра, после чего получаем его функцией route() и используем при вызове функций core. Аналогично происходит и при просмотре конкретного блога пользователя.

<div class="row">
<div class="col-md-10">
    <h2><?=$mct_data['mct_name']?></h2>
    <p><?=$mct_data['mct_about']?></p>
</div>
<div class="col-md-offset1 col-md-1">
    <b>Основатель</b>
    <a href="/blog/<?=$admin_id?>">
    <p>&qt;img class="img-responsive img-circle" src="/content/<?=$admin_id?>/s_ava.jpg" alt=""></p>
    <b><?=$admin_data['first_name']?>
    <?=$admin_data['last_name']?></b>
    </a>
</div>
</div>

<?//var_dump($is_ins_mct)?>
<?if($this_id){?>
    <?if(!$is_ins_mct){?>
    <a id="mct_insert" class="btn btn-info" href="javascript:void();">Вступить</a>
    <?}else{?>
    <a id="mct_out" class="btn btn-default" href="javascript:void();">Выйти</a>
    <?}?>
    
    <?if($this_id == $admin_id){?>
        <p><br /><a id="mct-settings-btn" href="javascript:toggle('mct-settings-btn', 'mct-settings');">Настройки</a></p>
        <div id="mct-settings" class="protected">
        <form action="" method="post" onsubmit="return false;">
        <p>Название медиацентра<br/>
        <input id="mct-settings-name" type="text" value="<?=$mct_data['mct_name']?>" />
        </p>
        <p>Описание медиацентра<br/>
        <textarea rows="5" cols="80" id="mct-settings-about"><?=$mct_data['mct_about']?></textarea>
        </p>
        <input id="mct-settings-save" type="button" value="Сохранить" />
        </form>
        </div>
        </div>
    <?}?>
<?}?>
<hr />
<h3>Участники медиацентра</h3>
<div class="row">
<?foreach($mct_users as $mct_user){?>
<div class="col-md-1">
<a href="/blog/<?=$mct_user['user_id']?>">
<?if(file_exists('content/'.$mct_user['user_id'].'/s_ava.jpg')){?>
&qt;img class="img-responsive img-circle" src="/content/<?=$mct_user['user_id']?>/s_ava.jpg" alt="" />
<?}else{?>
&qt;img class="img-responsive img-circle" src="/content/default/s_ava.jpg" alt="" />
<?}?>
<br />
<?=$mct_user['first_name']?> <?=$mct_user['last_name']?></a>
</div>
<?}?>
</div>
<hr />
<h3>Новости и статьи</h3>
<br />
<?//print_r($mct_posts);?>
<?foreach($mct_posts as $mct_post){?>
<p class="mct-post toppost">
<div class="row">
<div class="col-md-offset-1 col-md-1">
<a href="/blog/<?=$mct_post['user_id']?>">
<?if(file_exists('content/'.$mct_post['user_id'].'/s_ava.jpg')){?>
&qt;img class="img-responsive img-circle" src="/content/<?=$mct_post['user_id']?>/s_ava.jpg" alt="" />
<?}else{?>
&qt;img class="img-responsive img-circle" src="/content/default/s_ava.jpg" alt="" />
<?}?>
</a>
</div>
<div class="col-md-8">
<a href="/blog/<?=$mct_post['user_id']?>">
<?=$mct_post['first_name']?> <?=$mct_post['last_name']?> 
</a>
<div class="row toppost">
<div class="col-md-3">
<a href="/post/<?=$mct_post['id']?>">
<?if($mct_post['content_time']){?>
&qt;img class="img-responsive img-thumbnail" src="/content/<?=$mct_post['user_id']?>/s_<?=$mct_post['content_time']?>.jpg" alt="" />
<?}else{?>
&qt;img class="img-responsive img-thumbnail" src="/content/default/s_mediamo.jpg" alt="" /></a>
<?}?>
</a>
</div>
<div class="col-md-9">
<a href="/post/<?=$mct_post['id']?>">
<?=annotationStr($mct_post['text'], 380)?>
</a>
<br />
<small><?=$mct_post['post_time']?></small>
</div>
</div>
</div>
</div>
</p>
<br />
<?}?>
<script>
var mct_id = '<?echo route(2);?>';
</script>
<script src="/assets/js/mct.js"></script>

У каждого медиацентра есть создатель. В начале шаблона мы выводим название медиацентра, а также информацию о его создателе.
Затем мы выводим меню для редактирования информации о медиацентре, но не всем, а только его создателю.
Для этого выполняем проверку if($this_id == $admin_id){:

<?if($this_id == $admin_id){?>
        <p><br /><a id="mct-settings-btn" href="javascript:toggle('mct-settings-btn', 'mct-settings');">Настройки</a></p>
        <div id="mct-settings" class="protected">
        <form action="" method="post" onsubmit="return false;">
        <p>Название медиацентра<br/>
        <input id="mct-settings-name" type="text" value="<?=$mct_data['mct_name']?>" />
        </p>
        <p>Описание медиацентра<br/>
        <textarea rows="5" cols="80" id="mct-settings-about"><?=$mct_data['mct_about']?></textarea>
        </p>
        <input id="mct-settings-save" type="button" value="Сохранить" />
        </form>
        </div>
        </div>
    <?}?>

А после собственно тем же foreach-ем выводим список участников и естественно постов медиацентра.


Присылайте ваши вопросы в комментарии или мне в покет-чат. По мере их появления буду писать уроки-ответы.
26
160.481 GOLOS
На Golos с November 2016
Комментарии (7)
Сортировать по:
Сначала старые