Практическое задание №2 (первая CMS). Как выполнять задание?

Здравствуйте.
При попытке выполнить задание, столкнулся с тем, что непонятно как реализовать поставленную задачу. Файлов в cms много и какие действия над ними нужно совершить с трудом понимаю.
Видео-пояснение к заданию неоднократно смотрел, пока, не помогает.
В пояснении к задаче, дальше этого пункта не могу сдвинуться:

Добавить поле/колонку active в таблицу статей и в модель Article -- с возможным значение 0 или 1 (по умолчанию 1 -- т.е. активна) -- т.е. подготовить SQL, который модифицирует таблицу

Какие первые шаги вижу:
1. Зайти в Нетбинсе в файл Article.php и добавить в class Article строку свойство:

public $activity = null;

2. ...

Дальше непонятно, что делать...

Key Words for FKN + antitotal forum (CS VSU):

vedro-compota's picture

Добавьте пожалуйста ссылку на задачу.

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

этого пункта не могу сдвинуться:

это сделали? если да то что именно непонятно и по какому следующему пункту?

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

Видео из раздела подсказок изучалось: http://fkn.ktu10.com/?q=node/9897 ?

_____________
матфак вгу и остальная классика =)

Здравствуйте. Мне не хватает знаний выполнить задание №2 по простой cms. А именно, в файле Article.php, изменить код в стр. 145 (public static function getList), чтобы добавить столбец в админку. Сделайте, пожалуйста, подсказку.
В процессе изучения кода сделал в файле Article.php такие изменения:

В класс Aticle (стр. 43) добавил:

public $active = true;

В конструктор (стр. 65)

public function __construct($data=array())

добавил:

if (isset($data['active'])) {
          $this->active = $data['active']; 

В методе

public static function getList

сделал изменения (привожу часть кода метода, где сделал измения):

    public static function getList($numRows=1000000, 
            $categoryId=null, $order="publicationDate DESC",$active = false) 
    {
        $activeClause = '';       
        if ($active !== false) {
            $activeClause = ' active = :active';
        }
        
        $conn = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
        $categoryClause = $categoryId ? "categoryId = :categoryId" : "";
        
        $clause = false;
        
        if (!empty($activeClause or $categoryClause)) {
           $clause = 'WHERE' . $activeClause . 'AND' . $categoryClause;
        }

Верно сделал или нет?
Что дальше делать?

vedro-compota's picture

Верно сделал или нет?
Что дальше делать?

У вас должна работать система - верно ли это или нет я не знаю, задавайте вопросы из серии "как сделать" и "почему не работает".

В задаче, даже написаны пункты по которым надо идти и выполнять их.

_____________
матфак вгу и остальная классика =)

В задании написано:

Добавить поле/колонку active в таблицу статей

Это делать нужно через терминал?
В теме есть подсказка, что давать надо такую команду:

ALTER TABLE 'articles'
ADD COLUMN 'active'
TINYINT(1) NOT NULL
DEFAULT '0'
COMMENT 'По умолчанию 0 запрет на просмотр для пользователя иначе1 никаких ограничений';

Я затрудняюсь сделать эту команду через терминал. Натолкните на мысль, пожалуйста, как это сделать?

vedro-compota's picture

Я затрудняюсь сделать эту команду через терминал

это не конкретный вопрос. Если вы вообще не даже не можете предположить что нужно сделать, то следует вернуться к 7-ому пункту программы, в частности может помочь этот урок - работаете либо с командной строкой либо с heisiSQL.

_____________
матфак вгу и остальная классика =)

С этим вопросом я разобрался. Спасибо за подсказку.

Разбираясь с файлом

index.php

, возникли трудности с пониманием записи:

    $results['articles'] = $data['results'];
    $results['totalRows'] = $data['totalRows'];

Полный текс кода, где эта запись, стр. 12, 13:

function archive() 
{
    $results = [];
    
    $categoryId = ( isset( $_GET['categoryId'] ) && $_GET['categoryId'] ) ? (int)$_GET['categoryId'] : null;
    
    $results['category'] = Category::getById( $categoryId );
    
//    $data = Article::getList( 100000, $results['category'] ? $results['category']->id : null );
    $data = Article::getList(100000, $categoryId, 1);
    
    $results['articles'] = $data['results'];
    $results['totalRows'] = $data['totalRows'];
    
    
    
    $data = Category::getList();
    $results['categories'] = array();
    
    foreach ( $data['results'] as $category ) {
        $results['categories'][$category->id] = $category;
    }
    
    $results['pageHeading'] = $results['category'] ?  $results['category']->name : "Article Archive";
    $results['pageTitle'] = $results['pageHeading'] . " | Widget News";
    
    require( TEMPLATE_PATH . "/archive.php" );
}

Я правильно понимаю, что запись

$results['articles'] = $data['results'];

надо читать так:
Значение массива

$data

с ключом

results

присваивается массиву

$results

с ключом

articles

?

vedro-compota's picture

Я правильно понимаю, что запись

$results['articles'] = $data['results'];

надо читать так:
Значение массива
data
с ключом
results
присваивается массиву
results
с ключом
articles

да, понимаете правильно. А какая ещё может быть трактовка в данном случае?

_____________
матфак вгу и остальная классика =)

Создал новую статью через админку, но не выбрал категорию (осталось "none"). При выводе списка статей на главной странице и в админке, появилась в строке новой статью вывод ошибки:

Notice: Trying to get property of non-object in /var/www/my-first-cms/templates/admin/listArticles.php on line 40

Notice: Undefined offset: 0 in /var/www/my-first-cms/templates/admin/listArticles.php on line 40

В указанном файле поменял запись:

 if(isset ($article->categoryId) ) {

на:

if(isset ($article->categoryId) && ($article->categoryId != 0)) {

Часть кода:

<?php 
               
                if(isset ($article->categoryId) && ($article->categoryId != 0)) {
                    echo $results['categories'][$article->categoryId]->name;                        
                }
                else {
                echo "Без категории";
                }?>

Ошибка из админки ушла, но осталась на домашней странице:

Notice: Undefined offset: 0 in /var/www/my-first-cms/templates/homepage.php on line 19

Notice: Trying to get property of non-object in /var/www/my-first-cms/templates/homepage.php on line 19

В стр. 15 также добавил условие:

&& ($article->categoryId != 0) 

а именно:

if(isset ($article->categoryId) && ($article->categoryId != 0)) {

Запись об ошибке тоже ушла.

vedro-compota's picture

if(isset ($article->categoryId) && ($article->categoryId != 0)) {
  1. а каким образом туда попадает ноль? что вызвало необходимость этой проверки?
  2. в чем вопрос (если он был) - или вопрос в том правильно ли это? тогда см. п.1

_____________
матфак вгу и остальная классика =)

Я досконально не разбирался с этим вопросом, хотя желание было...
Я понял, что, если не выбрать имя категории, т.е. остается "none", то categoryId присваивается значение "0". И нуль этот "не нравился" коду, выдавая ошибку. Меня это тоже удивило...

Обратил внимание на особенность вызова метода.
Разбираясь с файлом Article.php, а конкретно с методом getList,

public static function getList($numRows=1000000, 
                                   $categoryId= null, 
                                   $useActiveValue = false, 
                                   $order="publicationDate DESC")

обратил внимание, что меняя аргументы метода getList файла Article.php, работа кода не меняется.
Если поменять аргументы в файле Index.php, в котором есть обращение к методу getList класса Article

$data = Article::getList(100000, $categoryId, 1);

где этот метод вызывается, то работа кода меняется.

Вопросы:
1. Если в файле есть обращение к методу класса БЕЗ аргументов, то принимаются (по умолчанию) аргументы, перечисленные в самом методе класса?
2. А если в файле есть обращение к методу класса С аргументами, то аргументы в методе класса не принимаются в расчет?

vedro-compota's picture

1. Если в файле есть обращение к методу класса БЕЗ аргументов, то принимаются (по умолчанию) аргументы, перечисленные в самом методе класса?
2. А если в файле есть обращение к методу класса С аргументами, то аргументы в методе класса не принимаются в расчет?

Аргументы по умолчанию используются, если на их место ничего не передано. Можно передать все аргументы, а можно лишь часть, тогда для оставшихся будут использовать значения по умолчанию.

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

И нуль этот "не нравился" коду, выдавая ошибку. Меня это тоже удивило...

ну так с этим надо разобраться - почему не нравится, от чего ошибка ,почему там не оказывается объект и т.д.

_____________
матфак вгу и остальная классика =)

Добавил поле activeArticle в таблицу статей

http://my-first-cms.loc/admin.php

, но сам столбец неактивен. Подскажите, в каком файле его надо править, чтобы от так же был активен: строки чередовались по цвету, строки в новом поле "нажимались"?
фото

vedro-compota's picture

, но сам столбец неактивен. Подскажите, в каком файле его надо править, чтобы от так же был активен: строки чередовались по цвету, строки в новом поле "нажимались"?

в каком файле можно узнать с помощью отладчика. Судя по разметке вы добавили просто ещё один пункт в шапку, но он никак не выводится в строках, даже в пустом виде. Т.е. у вас разметка шапки не соответствует разметке тела таблицы.

_____________
матфак вгу и остальная классика =)

У меня отладчик начинает работу с файла index.php. Я пытаюсь его запустить с точки в файле listAticles.php, но отладчик переходит в начало файла индекс.пхп.
Надо разобраться с работой Xdebuga.

vedro-compota's picture

но отладчик переходит в начало файла индекс.пхп.

при настройках по умолчанию нетбинс там стваит точку останова по умолчанию, это можно выключить. см. видео, приведенные в конце этой заметки: http://fkn.ktu10.com/?q=node/10198

_____________
матфак вгу и остальная классика =)