Помогите. Не могу разобарться с классами.

onix-la2

Новичок
Я пока только обучаюсь, стараюсь обучиться, добрался до темы ООП, но столкнулся с проблемамы в самом начале уже (( Прошу помочь разобраться.

Браузер выдает такую ошибку: Notice: Undefined variable: articles in C:\xampp\htdocs\www\mysite\dz2\dz4\v\v_index.php on line 2

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\www\mysite\dz2\dz4\v\v_index.php on line 2

и так файл c_model.php
Код:
<?php
include_once('c/Controller.php');
//include_once('m/startup.php');


function articles_all()
    {
    // Запрос.
    $query = "SELECT * FROM articles ORDER BY id_article DESC";
    $result = mysql_query($query);
                           
    if (!$result)
        die(mysql_error());
   
    // Извлечение из БД.
    $n = mysql_num_rows($result);
    $articles = array();

    for ($i = 0; $i < $n; $i++)
    {
        $row = mysql_fetch_assoc($result);       
        $articles[] = $row;
    }
   
    return $articles;
    }

    function articles_intro($article)
    {
    if (strlen($article['content'])>13)
        return substr($article['content'],0,13);
    else
        return $article ['content'];
    }
function articles_get($id_article)
{
    $result = mysql_query('SELECT * FROM articles WHERE id_article =' . $_GET['id']);

    if (!$result)
        die(mysql_error());
       
       
    $row = mysql_fetch_assoc($result);       

    return $row;
       

}

//
// Добавить статью
//
function articles_new($title, $content)
{
    // Подготовка.
    $title = trim($title);
    $content = trim($content);

    // Проверка.
    if ($title == '')
        return false;
       
   
// Запрос.
    $t = "INSERT INTO articles (title, content) VALUES ('%s', '%s')";
   
    $query = sprintf($t,
                    mysql_real_escape_string($title),
                    mysql_real_escape_string($content));
   
    $result = mysql_query($query);
                       
    if (!$result)
        die(mysql_error());
       
    return true;
}

//
// Изменить статью
//
Collector.php
Код:
<?php
//
// Базовый класс контроллера.
//
abstract class Controller
{
    //
   
    // Конструктор.
    //
    function __construct()
    {       
    }
   
    //
    // Полная обработка HTTP запроса.
    //
    public function Request()
    {
        $this->OnInput();
        $this->OnOutput();
    }
   
    //
    // Виртуальный обработчик запроса.
    //
    protected function OnInput()
    {
    }
   
    //
    // Виртуальный генератор HTML.
    //   
    protected function OnOutput()
    {
    }
   
    //
    // Запрос произведен методом GET?
    //
    protected function IsGet()
    {
        return $_SERVER['REQUEST_METHOD'] == 'GET';
    }

    //
    // Запрос произведен методом POST?
    //
    protected function IsPost()
    {
        return $_SERVER['REQUEST_METHOD'] == 'POST';
    }

    //
    // Генерация HTML шаблона в строку.
    //
    public function view_include($fileName, $vars = array())
    {
        // Установка переменных для шаблона.
       
       
        foreach ($vars as $k => $v)
        {
            $$k = $v;
        }
       
       
       
        // Генерация HTML в строку.
        ob_start();
        include $fileName;
        return ob_get_clean();   
    }   
   
}
index.php
Код:
<?php
include_once('c/c_index.php');
include_once('v/v_index.php');
include_once('m/startup.php');





$controller = new c_index();
$controller->Request();

?>
v_index.php
Код:
<ul>
        <?foreach($articles as $article):?>
            <li>
                <?=$article['id_article']?>.
                <a href="article.php?id=<?=$article['id_article']?>">
                    <?=$article['title']?>
                </a>
                </br>   
                    <?=$article['content']=articles_intro($article)?>
            </li>
            <?endforeach?>       
    </ul>
c_base.php
Код:
<?php
include_once('c/Controller.php');

// Базовый контроллер сайта.
//
abstract class c_base extends Controller
{
    protected $title;        // заголовок страницы
    protected $content;   
    public $articles;
   
    //
    // Конструктор.
    //
    function __construct()
    {       
    }
   
    //
    // Виртуальный обработчик запроса.
    //
    protected function OnInput()
    {
        startup();
    }
   
    //
    // Виртуальный генератор HTML.
    //   
    protected function OnOutput()
    {
        $vars = array('title' => $this->title, 'content' => $this->content);   
        $page = $this->view_include('v/v_main.php', $vars);               
        echo $page;
    }   
}
c_index.php
Код:
<?
include_once('c/c_model.php');
include_once('c/c_base.php');
include_once('m/startup.php');

class c_index extends c_base{
               
    function __construct()
    {       
    }
   
       
   
    protected function OnInput()
    {
        parent::OnInput();
        $this->articles = articles_all();
   
       
       
       
    }
   
    //
    // Виртуальный генератор HTML.
    //   
    protected function OnOutput()
    {
       
        $vars = array('articles' => $this ->articles);
        $articles = $this->view_include('v/v_index.php', $vars);
           
        parent::OnOutput();
       
       
    }   
   
}
 

HORO

Новичок
ошибку выдает из-за инклюда v_index.php, тк не определена переменная
Код:
include_once('c/c_index.php');
include_once('v/v_index.php');
 

onix-la2

Новичок
Ээ, он как бы помещает в HTML интерфейс статьи из базы данных
 

onix-la2

Новичок
покажи include_once('m/startup.php');
PHP:
<?php

function startup()
{
    // Настройки подключения к БД.
    $hostname = 'localhost';
    $username = 'root';
    $password = '';
    $dbName = 'articles';
   
    // Языковая настройка.
    setlocale(LC_ALL, 'ru_RU.CP1251');   
   
    // Подключение к БД.
    mysql_connect($hostname, $username, $password) or die('No connect with data base');
    mysql_query('SET NAMES cp1251');
    mysql_select_db($dbName) or die('No data base');

    // Открытие сессии.
    session_start();
       
}
 

WMix

герр M:)ller
Партнер клуба
PHP:
<?php
abstract class Controller{}
function articles_all(){}
function articles_get($id_article){}
function articles_new($title, $content){}

abstract class c_base extends Controller{}

function startup(){}
class c_index extends c_base{}
?>
<ul>
        <?foreach($articles as $article):?>
            <li>
                <?=$article['id_article']?>.
                <a href="article.php?id=<?=$article['id_article']?>">
                    <?=$article['title']?>
                </a>
                </br>
                    <?=$article['content']=articles_intro($article)?>
            </li>
            <?endforeach?>    
    </ul>
...
и чему равен $articles?
 

HORO

Новичок
так вот же инклюд есть уже
PHP:
 protected function OnOutput()
    {
    
        $vars = array('articles' => $this ->articles);
        $articles = $this->view_include('v/v_index.php', $vars);
        
        parent::OnOutput();
    
    
    }
нужно наверное добавить print $articles;
а этот инклюд убрать include_once('v/v_index.php');

Но вообще, все запутано )
 

WMix

герр M:)ller
Партнер клуба
так он же вроде там передается, не судите строго, я пока только учусь
я к тому что до include_once('v/v_index.php'); только декларации классов и функций, ни единого вызова. может после и есть, но это уже после
а вобще установи композер, и выкини все include кроме vendor/autoload.php (ну и возможно самой view)

трудно представить начинающего пытающегося писать классами но не поняв как работает include

непонятно зачем c_index наследуется от base который наследуется от controller в таком минималистическом безсмысленом коде
 
Последнее редактирование:

onix-la2

Новичок
нужно наверное добавить print $articles;
а этот инклюд убрать include_once('v/v_index.php');

Но вообще, все запутано )
сделал как вы сказали
получилось вот так :

а должно получиться, вот так


подскажите пожалуйста, где я ещё накосячил

покажу вам ещё код v_mail.php, который прогружается с классмои c_base
PHP:
<html>
<head>
    <title>PHP. Уровень 2</title>
    <meta content="text/html; charset=Windows-1251" http-equiv="content-type">   
    <link rel="stylesheet" type="text/css" media="screen" href="theme/style.css" />
</head>
<body>
    <h1>PHP. Уровень 2</h1>
    <br/>
    <a href="index.php">Главная</a> |
    <a href="editor.php?page=edit">Консоль редактора</a>
    <hr/>
    <?=$content?>
    <hr/>
    <small><a href="http://prog-school.ru">Школа Программирования</a> &copy;</small>           
</body>
</html>
 

onix-la2

Новичок
я к тому что до include_once('v/v_index.php'); только декларации классов и функций, ни единого вызова. может после и есть, но это уже после
а вобще установи композер, и выкини все include кроме vendor/autoload.php (ну и возможно самой view)

трудно представить начинающего пытающегося писать классами но не поняв как работает include

непонятно зачем c_index наследуется от base который наследуется от controller в таком минималистическом безсмысленом коде
эта была моя следующая цель, сейчас очень бы хотелось чтоб код корректно заработал, но пока мои попытки четны ((
 

HORO

Новичок
ну следовательно нужно поменять местами
print $articles; и parent::OnOutput();
Ps. А что за школа программирования? )
 

onix-la2

Новичок
ну следовательно нужно поменять местами
print $articles; и parent::OnOutput();
сделал но пока тоже не по теме(

Ps. А что за школа программирования? )
школа называется, скачай уроки с торрентов и попробуй обучиться по ним, ну очень хочется разобраться в этом языке программирования
 

HORO

Новичок
вот это
$articles = $this->view_include('v/v_index.php', $vars);
можно попробовать на $this->content= $this->view_include('v/v_index.php', $vars); заменить
 

onix-la2

Новичок
вот это
$articles = $this->view_include('v/v_index.php', $vars);
можно попробовать на $this->content= $this->view_include('v/v_index.php', $vars); заменить
сказать честно, мне очень стыдно, но я пока только учусь, и как мне сказали, это нормально такие ошибки допускать, спасибо за помощь, помогло)
 

HORO

Новичок
все таки не стоит с ООП начинать, тем более PHP не объектный язык.
можно проще все делать, типа
index.php
PHP:
<?php
$result=array(); // буфер
$module=empty($_GET['module'])?false:$_GET['module']; // Название модуля. Каждый модуль работает с буфером, например заполняет $result['content']

if($module){
    if(is_file($file="modules/".basename($module.".php"))){ // Если модуль существует в папке modules/
         require $file; // подключаем его
    }else{
         $result['error']="Модуль не сушествует";
    }
}else{
    require "modules/default_module.php"; // модуль по умолчанию
}

print_r($result); // выводим результат. тут можно подключить v_main.php и выводить туда
?>
 
Сверху