Добрый день. Вообщем начал писать небольшие плюшки на PHP. Стараюсь писать по модели mvc, поэтому возникли небольшие проблемы с выводом обработаного цикла. Итак, суть проблемы, у меня есть контроллер в котором обрабатывается sql-запрос, все выодится как нужно, но мне необходимо выводить ключевые слова, тайтл страницы и т.д. к определенной странице. Так вот у меня есть папка template, где имеются файлы - основной шаблон(main.php), шаблон короткой новости(short-news.php, который подключает вид). Дело в том, что я подключаю в body шаблоне этот обработанный цикл, а доступа к изменению head не имею, так вот как лучше реализовать данный способ, чтобы можно было подключать другие ключи массива именно в head?
было бы неплохо, если бы еще тут свой код написали, а то представлять его я думаю нету ни у кого желания
За код сильно не ругать, только учусь.
Файл mnews.php(модель)
<?php
require_once "{$_SERVER['DOCUMENT_ROOT']}/config/database.php" ;
class mNews extends Database {
public function return_news($url) {
if($url) {
settype($url, "string") ;
$sql = "SELECT * FROM news WHERE url = '{$url}' LIMIT 1" ;
$result = $this->sql($sql) ;
}
if(!$url) {
$sql = "SELECT * FROM news";
$result = $this->sql($sql) ;
}
return $result ;
}
}
?>
Файл cnews.php(контроллер)
<?php
require_once "{$_SERVER['DOCUMENT_ROOT']}/modules/news/mnews.php" ;
class cNews extends mNews {
function short_news($url) {
if(!$url) {
$res = $this->return_news($url) ;
while ($to_print = mysql_fetch_assoc($res)) {
echo "<h2>"."<a href=\"?url={$to_print['url']}\">{$to_print['title']}</a>"."</h2>" ;
echo $to_print["text"] ;
echo "<br /><br />" ;
}
}
if($url) {
$res = $this->return_news($url) ;
while ($to_print = mysql_fetch_assoc($res)) {
echo $to_print["title"] ;
}
}
}
}
$news = new cNews() ;
?>
Файл vnews.php(вид)
<?php
$url = $_GET["url"] ;
require_once "{$_SERVER['DOCUMENT_ROOT']}/modules/news/cnews.php" ;
$news->short_news($url) ;
?>
Файл main.php
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>First test CMS</title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<link rel="stylesheet" href="/template/css/style.css" type="text/css" media="screen, projection" />
</head>
<body>
<div id="wrapper">
<header id="header">
<h1>Header of Blog</h1><?php echo $_SERVER["DOCUMENT_ROOT"];?>
</header><!-- #header-->
<section id="middle">
<div id="container">
<div id="content">
<?php require_once "shortnews.php" ; ?>
</div><!-- #content-->
</div><!-- #container-->
<aside id="sideRight">
<strong>Right Sidebar:</strong> Integer velit. Vestibulum nisi nunc, accumsan ut, vehicula sit amet, porta a, mi. Nam nisl tellus, placerat eget, posuere eget, egestas eget, dui. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In elementum urna a eros. Integer iaculis. Maecenas vel elit.
</aside><!-- #sideRight -->
</section><!-- #middle-->
</div><!-- #wrapper -->
<footer id="footer">
<strong>Footer:</strong> Mus elit Morbi mus enim lacus at quis Nam eget morbi. Et semper urna urna non at cursus dolor vestibulum neque enim. Tellus interdum at laoreet laoreet lacinia lacinia sed Quisque justo quis. Hendrerit scelerisque lorem elit orci tempor tincidunt enim Phasellus dignissim tincidunt. Nunc vel et Sed nisl Vestibulum odio montes Aliquam volutpat pellentesque. Ut pede sagittis et quis nunc gravida porttitor ligula.
</footer><!-- #footer -->
</body>
</html>
Файл shortnews.php
<?php
require_once "{$_SERVER['DOCUMENT_ROOT']}/modules/news/vnews.php" ;
?>
Немного посидел. порефакторил пока не надоело...
<?php
// попробуйте избавится от следующей строки ниже. Желательно это делать аутолоадом.
require_once("{$_SERVER['DOCUMENT_ROOT']}/config/database.php"); //require это функция. Давайте придерживатсья стандартного вызова функций.
class Model_News extends Config_Database { //Класы, по этикету. следует называть с большой буквы. Подумайте над аутолоадом
//Модель не должен заботит урл. Попытайтесь избавится от урл в модели, используйте индексные поля в бд.
public function getNews($url) { //Название должно начинаться с 'get' 'set' 'is' etc.. в зависимости от логики
if($url) // полиморфизмом попахивало, поправил.
return $this->sql("SELECT * FROM news WHERE url = '{$url}' LIMIT 1"); //не инициадизируйе новую переменную, если она используется один раз. минимум два.
return$this->sql("SELECT * FROM news") ;
}
}
//Закрывайте пхп тег только в шаблонах, чтобы предотвратитть headers already sent.
контроллер не до конца досотрел. заметьте, у вас два цыкла, и два ифа. плохо. html должен быть в шаблонах, попытайтесь избавится от него.
<?php
require_once "{$_SERVER['DOCUMENT_ROOT']}/modules/news/mnews.php";// если сделать аутолоад этой строки не будет
class Controller_News extends Model_News {//подход не правильный. Создайте абстрактный контроллер класс, который будет опреелять какую модель подгружать, соответственно екстендится нужно будет от него.
function getShortNews($url) { //переименовал
// опять полиморфизм. Избавтесь от ифов, количество логических ошибок = "количество ифов"^2
if(!$url) {
$model = $this->return_news($url) ;//название
while ($to_print = mysql_fetch_assoc($model)) {
//Ужас... В приложении должен быть один echo!!! +используйте сборшик вывода.
//дальше надоело
echo "<h2>"."<a href=\"?url={$to_print['url']}\">{$to_print['title']}</a>"."</h2>" ;
echo $to_print["text"] ;
echo "<br /><br />" ;
}
}
if($url) {
$res = $this->return_news($url) ;
while ($to_print = mysql_fetch_assoc($res)) {
echo $to_print["title"] ;
}
}
}
}
$news = new cNews() ;
Добавлено через 7 минут, 20 секунд:Ещё, по поводу модели. Сделайте две функции, гетОднуНовость и гетНовости, урл проверяйте в контроллере, и вызывайте нужный метод модели
Дочитал до конца код.
У вас не MVC, А уж извините жопа. Вид должен быть конечной точкой а не стартовой как у вас.
Для начала прочитайте про единую точку входа. потом вот это
Метт Зандстра, PHP. Объекты, шаблоны и методики программирования - она у меня вместо библии, хотя несомненно есть спорные вопросы с автором.
Ещё, примерная схема мвс приложения должна быть следующая (может отличатся немного взависимости от религии програмиста)
1. Единая точка входа. (index.php)
2. Аутолоад
3. Роутер класс (основной (абстрактный) контроллер)
- смотрит урл, и вызывает соответствующий чаилд контроллер или 404 ошибку
4. Чаилд контроллер (контроллер конкретного модуля)
- достает даные с модели (своей или с абстрактной) чтото делает
- передаёт результат в абстрактный класс темплейт,
5. абстрактный класс темплейт собирает куски даных для разных блоков, которые выполнились ранее, сетит им темлейты, генерирует общий хтмл. выводит его.
Flyn, я так понимаю что Вы хотите научиться писать модули для Eleanor?
wormen, есть такое. Но сначала хочу помучать себя написанием простой цмски для блога.
termit, спасибо Вам, что не пожалели своего времени и разобрали мой код по крупицам, а также дали дельные советы. Хотелось бы также услышать советы от Александра, о том как реализовать такой вывод, который я описал.
Flynt, Я же писал, для того чтобы организовать такой вывод, вам нужно просто правильно сделать мвс. Котроллер->Модель->Вид
Я конечно не говорю за Александра, но мвц как таковой в Элеаноре в чистом её виде мало, потому что Элеанора, скорее сервис ореонтированая цмс, чем мвц. В этом есть её прелесть и быстродействие.
termit, весьма хорошо описал что не так. Любая мвц всегда подрузумевает три абстрактных класса модели, контроллера и представления. Шаблонизатор лучше какой нибудь подрубить уже, хотя можно конечно набрасать свой. Я то юзаю фраемворк Симфони и мне очень понравился Twig шаблонизатор, надо максимально избавляться от писание в шаблоне всякой логики.
Просто пример автолоудера. Если будет пхп 5.4 можно сделать всё лямда функцией(анонимной функцией)
<?php
function super_puper_autoload($className)
{
$path = dirname(__FILE__) . '/classes/' . $className . '.php';
if (file_exists($path)) {
require $path;
}
}
spl_autoload_register('super_puper_autoload');
И чисто идеологический вопрос, почему стринги в двойных кавычках? Как я помню в пхп 5.2 если строка чуть длинее то это весьма влияло на производительность когда она парсилась, тут контактенация лучше вроде как
Мне например больше нравится HMVC, и зендовский подход к "нейспейсам" + аутолоад.
Djadka, А за новость про анонимную функцию, спасибо, её прям в spl функции юзать можно, или в магическом методе тоже?
Намеспайсы вообще тема, потому что когда юзаешь куча готовых классов в случае как с Симфони и плюс ещё название классов пересекаются то намеспайсы спасают, HMVC нынче почти в каждом фраемворки есть, можно и самому накатать всё зависит как ты пишешь и какой у тебя толщины контроллер, но всё равно модель должна быть соответсвующий и тут лучше юзать Doctrine. Да если пхп 5.4 то вроде как можно сразу пихать или с 5.3, точно не помню, а то сегодня я уже перешёл на пхп 5.5 как на впс так и на компах. Надо будет потестить производительность.
О, мсье знает толк =)
По поводу пхп5.5, Вы компилировали или гдето нарыле репозитарий с ним? (очень хочется yield попробывать)
Если компилировали, то поделитесь плиз мануалом, или строкой конфигурации (.. ./configure .....)
А то я на работе пытался завести, теперь у меня в консоле 5.5 (без модулей) под апачем 5.4.9. Как cgi не вариант.
Также интересует один вопрос по поводу json.
насколько я понял что то сделали с json_encode и json_decode. Изменили внутрений механиз или же заменили функции, и если да, то остадись ли они как deprecated?
Сам сижу на Убунте 13.04. По первости комплил отдельно а сейчас подсоединил через ппа
https://launchpad.net/~ondrej/+archive/php5 от этого человечка, кстати на Debiane тоже катит. Но сразу предупреждаю, если обновляете со стондартного репозитория будьте готовы переписавать апач конфиги, ибо он обновляет апач сразу на 2.4. Версия апача 5.4.9 вообще существует?! По поводу json не знаю официальные доки нечего не говорят об изменения в сторону устаревших.
По поводу тестов памяти жрёт в 4 раза меньше чем 5.3. Я элю запустил решил протестить.
Цитата (termit @ 2024-10-13 19:29)
под апачем - php 5.4.9. Как cgi не вариант.
извини, тире пропустил =))
А за инфу спасибо. Конфиги вируальных хостов заменяются или остаются? А то у меня там много чего за год понасобиралось, жаль потом терять время на перенастройку.
Цитата (termit @ 2013-09-22, 2:53)
извини, тире пропустил =))
А за инфу спасибо. Конфиги вируальных хостов заменяются или остаются? А то у меня там много чего за год понасобиралось, жаль потом терять время на перенастройку.
Если убунту или дебиан, то уже через a2ensite не покатит создать симлинки, надо всё будет клепать уже sites-enabled если много сайтов то не советую. а то потом пол вечера отсидеть перписывать все конфиги у них там команды ещё поменялись, если только не написать какой баш скриптик который найдёт всё и поменяет. Конечно если вы сидите через гуи то можно просто через какой редактор сделать быстро. В моё случае хосто было не много но стоял ещё редмайн, который требует рубивский модуль passenger вот с ним я помучился, что бы его нормально скомпилить для apache 2.4.6 а так почти всё гладко прошлё. Только времени заняло много, модули уже почти все есть, и вроде всё очень хорошо совместимо с 5.5 пхп
а то представлять его я думаю нету ни у кого желания
____________________
Fifa 15 Coins
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.