vaflya
@vaflya
Ничего личного, это всего лишь хобби.

Сайт php + AJAX, приехали?

На протяжении всей недели мне помогали ребята, отвечая на мои вопросы (еще раз спасибо Алексей Скобкин, Андрей Суржиков, MaEcTPo!).

Все понял как работает и оно работает, но теперь проблема в реализации. Через пару часов, просто тяжело стало смотреть в код, я даже услышал, как Сатана кричит - "Ты лучший!".

Вобщем код:

<?php

function news(){
    $data = '';
    $data .= '<div style="color: #23374f; font-weight: bold; font-size: 15px; padding: 0 0 20px 10px;">Политика</div><div>';

    $sql = mysql_query("SELECT news_id, title, description, photo FROM news WHERE category='1' ORDER BY news_id DESC LIMIT 10") or die(mysql_error());  
    $kol = mysql_num_rows($sql);
    $margin = 0;
    for ($i=1; $i <= $kol; $i++) {
        $margin++;
        $news = mysql_fetch_assoc($sql);
        if ($margin == 5) {$data .= '<div class="card news fl" style="margin-right: 0;">'; $margin = 0;}
        else {$data .=  '<div class="card news fl">';}
        $data .=  '<div class="newsPhoto">';
        $data .=  '<img src="'.getImgUrl($news['photo']).'">';
        $data .=  '</div>';
        $data .=  '<div class="card_content">';
        $data .=  '<div class="newsTitle">'.$news['title'].'</div>';
        $data .=  '<div class="newsText">'.$news['description'].'</div>';
        $data .=  '</div>';
        $data .=  '</div>';
    }    
        
 
    $data .= '</div>';
    return $data;
}

function news_menu(){   
        $data ='<div class="card" style="height: 30px;">
            <a href="#">Город</a>
            <a href="#">Происшествия</a>
            <a href="#">Закон</a>
            <a href="#">Мероприятия</a>
            <a href="#">Наука и техника</a>
            <a href="#">Игры</a>
            <a href="#">Авто</a>
            <a href="./addNews">[Добавить новость]</a>
        </div>';
    return $data;
            
}

if (isAJAX() == false) {
echo head('Новости',array('common.css', 'news.css'),array('common.js'));
echo body();
echo news_menu();
echo news();
echo footer();
}

else {
    $data = news_menu().news();
    $dataAJAX =  array ('Новости',array('common.css', 'news.css'),array('common.js'),$data);
    echo json_encode($dataAJAX);
}
?>


Как такое можно привести к божескому виду? Пришлось весь HTML код страницы взять в кавычки, чтобы отдать AJAX запросу в json или тупо вывести (по прямому запросу страницы).

p.s. мама, чому я урод.
  • Вопрос задан
  • 415 просмотров
Решения вопроса 2
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Тут очень, очень много чего можно приводить к божескому виду. Вам, наверное, надо попробовать какой-нибудь не очень сложный MVC-фреймворк для начала.
Пока что весь код - сплошная каша, которую чуть проще поддерживать, чем если бы всё было в одном файле, но всё ещё значительно сложнее, чем уже проработанные решения.
$data .=  '<div class="newsPhoto">';
        $data .=  '<img src="'.getImgUrl($news['photo']).'">';
        $data .=  '</div>';
        // ...

Вообще, если вам так хочется всё это делать именно в PHP - можно использовать либо Heredoc/Nowdoc, либо просто записывать в кавычках без лишних конкатенаций кода с самим собой. Хотя лучше, конечно, всё это делать в слое View (см. MVC) - попробовав вы быстро поймёте - насколько это круто, когда логика (операции с данными) и представление (вывод данных) разделены.
$sql = mysql_query("SELECT news_id, title, description, photo FROM news WHERE category='1' ORDER BY news_id DESC LIMIT 10") or die(mysql_error());

Используйте PDO и подготовленные запросы с биндингом параметров.
А ещё у вас везде одинарные кавычки (что хорошо), а тут - двойные. Зачем? Одинарную кавычку можно экранировать с помощью бэкслеша.
if (isAJAX() == false) {
echo head('Новости',array('common.css', 'news.css'),array('common.js'));
echo body();
echo news_menu();
echo news();
echo footer();
}

Это очень мило. Вы почти пришли к шаблонам :)

Могу порекомендовать вам для приобретения понимания как лучше коду выглядеть сделать три вещи:
1. Ознакомиться с PSR-2 как минимум.
2. Прочесть и постараться максимально понять Php The Right Way.
3. Переписать всё это на каком-нибудь более-менее современном, но ещё не очень сложном фреймворке, который из коробки имеет MVC. В памяти пока что всплывает, например, FuelPHP.

Ну и дальше как разберётесь - уже просто набираться опыта, смотреть как делают другие (опенсорс всегда в помощь), пробовать делать какие-то маленькие вещи для себя, чтобы разобраться в чём-то.
Ответ написан
MaEcTPo
@MaEcTPo
Конкретно с этим кодом, с минимальными затратами времени я бы сделал следующее:

1. В функциях я оставил бы только формирование массивов данных. Переименовал бы их в `get_news()`, `get_news_menu()`. Они бы возвращали только массивы данных, например:
$news = [
    0 => [
        'photo' => 'photoValue',
        'title'    => 'Title Value',
        'description' => 'Some long Description',
    ],
    1 => [
        'photo' => 'photoValue',
        'title'    => 'Title Value',
        'description' => 'Some long Description',
    ],
];


С меню так же - возвращаете массив, только вместо photo, title, description уже будут url, title, что-то ещё.

2. Всю HTML-разметку можно вынести в отдельный файл, например, который в данном случае подключить при помощи include(). Но это особо не повлияет на качество кода :)
Саму разметку уже делать подобным способом, на примере с меню:

<div class="card" style="height: 30px;">
    <?php foreach (get_menu_items() as $menuItem) : ?>
        <a href="<?= $menuItem['url'] ?>"><?= $menuItem['title'] ?></a>
    <?php endforeach; ?>
</div>


Потом, с опытом, придёт понимание того, что некоторые части повторяются и их можно и нужно выносить в отдельные блоки (Twig), паршалы (symfony1, zend1).

3. Относительно аякса, то ничто вам не мешает, если это аякс возвращать на клиент json структуры ваших новостей, который клиент уже будет рендерить так, как пожелает. А на сервере это всего лишь `json_encode(get_news());` отправить в браузер.

P.S. мог допустить синтаксических ошибок, так как в IDE не проверял. Надеюсь, что помог.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы