Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: ООП пытаюсь писать [5]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (5): « 1 2 3 4 [5]   

> Описание: Посмотрите, это ООП или ГК...?
Hapson
Отправлено: 09 Августа, 2013 - 21:19:36
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


DelphinPRO
DelphinPRO пишет:
Пожалуйста - стартуйте только для тех, кто ошибся.

Действительно, что-то я...
Если есть ошибка, то старт сессии, а в классе отлова ошибок тоже старт сессии.

caballero
Конечно же читал. Читаю в основном мануалы на php.net. Доходит просто не сразу))) А метод тыка - есть практика
(Добавление)
Еще такой вопрос. Вот все мучаю модуль добавления статей. Получилось как-то мудрено.
Есть модуль, класс Articles и класс Validator.
Модуль проверяет, пришли ли постом все поля (вдруг юзер вырезал некоторые поля из html), далее вызывается статический метод класса Articles - saveArticle. В этом методе создается новый объект класса Validator и в конструктор передается ассоциативный массив с полями формы. Конструктор в свою очередь вызывает метод класса Validator - validateForm. В это метод передается этот же массив с полями формы. В методе validateForm выполняется foreach по массиву с вложенным switch по названию полей. В классе Validator есть свойства $error и $correct - оба массивы. В $correct пишутся поля, прошедшие валидацию - массив также ассоциативный. В $error пишутся все ошибки - массив типа список.
Далее метод saveArticle смотрит - есть ли что-то в $error, и если есть, то ничего не сохраняется, делается редирект на форму и вываливаются все ошибки. Ну и все введенные юзером данные вставляются в поля.

Ну вот как-то так.
Приведу код для наглядности. Результирующие действия тестовые (var_dump())

PHP:
скопировать код в буфер обмена
  1.  
  2. //form.php
  3. <?PHP
  4.  
  5. if(isset($_GET['option']) && $_GET['option'] == 'add'){
  6.         if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['add_article'])){
  7.                 if(isset($_POST['id_category']) && isset($_POST['title'])    &&
  8.                         isset($_POST['alias'])       && isset($_POST['article'])  &&
  9.                         isset($_POST['status'])      && isset($_POST['year'])     &&
  10.                         isset($_POST['month'])       && isset($_POST['day'])      &&
  11.                         isset($_POST['hour'])        && isset($_POST['minute'])   &&
  12.                         isset($_POST['description']) && isset($_POST['keywords']) &&
  13.                         isset($_POST['robot'])){
  14.                         $data = array(  'id_category' => $_POST['id_category'],
  15.                                                                 'title' => $_POST['title'],
  16.                                                                 'alias' => $_POST['alias'],
  17.                                                                 'article' => $_POST['article'],
  18.                                                                 'status' => $_POST['status'],
  19.                                                                 'created' => array(     'year' => $_POST['year'],
  20.                                                                                                                         'month' => $_POST['month'],
  21.                                                                                                                         'day' => $_POST['day'],
  22.                                                                                                                         'hour' => $_POST['hour'],
  23.                                                                                                                         'minute' => $_POST['minute'],
  24.                                                                                                                         'second' => date("s")),
  25.                                                                 'description' => $_POST['description'],
  26.                                                                 'keywords' => $_POST['keywords'],
  27.                                                                 'robot' => $_POST['robot']);
  28.                         $result = Articles::saveArticle($data);
  29.                         if(!$result){
  30.                                 var_dump($_SESSION['tmp_error']);
  31.                         }else{
  32.                                 echo "<pre>";
  33.                                 var_dump($_SESSION['art']);
  34.                                 echo "</pre>";
  35.                         }
  36.                 }else{
  37.                         echo "<h1>Новая статья</h1>";
  38.                         include_once(ROOT .'/mod/articles/articles_form_add.php');
  39.                 }
  40.         }else{
  41.                 echo "<h1>Новая статья</h1>";
  42.                 include_once(ROOT .'/mod/articles/articles_form_add.php');
  43.         }
  44. }else{
  45.         echo "<h1>Управление контентом</h1>";
  46. }
  47. ?>
  48.  


PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. <?PHP
  4. //Article.class.php
  5. class Articles{
  6.        
  7.         static function saveArticle($form){
  8.                 if(is_array($form) && count($form) > 0){
  9.                         $validate = new Validator($form);
  10.                         if(count($validate->error) > 0){
  11.                                 $_SESSION['tmp_error'] = $validate->error;
  12.                                 return false;
  13.                         }else{
  14.                                 $_SESSION['art'] = $validate->correct;
  15.                                 return true;
  16.                         }
  17.                 }
  18.         }
  19. }
  20. ?>
  21.  


PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. //Validator.class.php
  4.  
  5. class Validator{
  6.        
  7.         public $error = array();
  8.         public $correct = array();
  9.        
  10.         function __construct($data){
  11.                 $this->validateForm($data);
  12.         }
  13.        
  14.         private function validateForm($form){
  15.                 foreach($form as $k => $v){
  16.                         switch($k){
  17.                                 case 'id_category':
  18.                                         $db = DB::getDB();
  19.                                         $sql = "SELECT `id_category` FROM `". DB_PREFIX ."category` WHERE `id_category` = {?}";
  20.                                         $test = $db->selectOneValue($sql, array($v));
  21.                                         if(!$test){
  22.                                                 $this->error[] = 'Укажите категорию.';
  23.                                         }else{
  24.                                                 $this->correct[$k] = $v;
  25.                                         }
  26.                                         break;
  27.                                 case 'title':
  28.                                         $title = $this->cleanTag($v);
  29.                                         if((mb_strlen($title, 'UTF-8') < 10) || (mb_strlen($title, 'UTF-8') > 100)){
  30.                                                 $this->error[] = 'Длина заголовка от 10 до 100 символов.';
  31.                                         }else{
  32.                                                 $this->correct[$k] = $title;
  33.                                         }
  34.                                         break;
  35.                                 case 'alias':
  36.                                         $alias = $this->cleanTag($v);
  37.                                         if((mb_strlen($alias, 'UTF-8') < 10) || (mb_strlen($alias, 'UTF-8') > 100) || (preg_match("/[a-z0-9-]+/", $alias) != 1)){
  38.                                                 $this->correct[$k] = $this->translit($form['title']);
  39.                                         }else{
  40.                                                 $this->correct[$k] = $v;
  41.                                         }
  42.                                         break;
  43.                                 case 'article':
  44.                                         $article = $this->cleanTag($v);
  45.                                         if(mb_strlen($article, 'UTF-8') < 500){
  46.                                                 $this->error[] = 'Длина статьи не менее 500 символов.';
  47.                                         }else{
  48.                                                 $this->correct[$k] = $v;
  49.                                         }
  50.                                         break;
  51.                                 case 'status':
  52.                                         $status = $this->cleanTag($v);
  53.                                         if($v == 'ok'){
  54.                                                 $this->correct[$k] = 1;
  55.                                         }else{
  56.                                                 $this->correct[$k] = 3;
  57.                                         }
  58.                                         break;
  59.                                 case 'created':
  60.                                         $created = $this->cleanTag($v);
  61.                                         if(checkdate($created['month'], $created['day'], $created['year']) && ($created['hour'] <= 23 && $created['hour'] >= 0) && ($created['minute'] <= 59 && $created['minute'] >= 0)){
  62.                                                 $this->correct[$k] = $v['year'] .'-'. $v['month'] .'-'. $v['day'] .' '. $v['hour'] .':'. $v['minute'] .':'. $v['second'];
  63.                                         }else{
  64.                                                 $this->correct[$k] = date("Y-m-d H:i:s");
  65.                                         }
  66.                                         break;
  67.                                 case 'description':
  68.                                         $description = $this->cleanTag($v);
  69.                                         if(mb_strlen($description, 'UTF-8') > 140){
  70.                                                 $description = $this->textTrim($description, 140);
  71.                                                 $this->correct[$k] = $description;
  72.                                         }else{
  73.                                                 $this->correct[$k] = $description;
  74.                                         }
  75.                                         break;
  76.                                 case 'keywords':
  77.                                         $keywords = $this->cleanTag($v);
  78.                                         $arr_key = explode(",", $keywords);
  79.                                         if(count($arr_key) > 3){
  80.                                                 $arr_key = array_slice($arr_key, 0, 3);
  81.                                                 $this->correct[$k] = implode(", ", $arr_key);
  82.                                         }elseif(((count($arr_key) > 0) && (count($arr_key) <= 3)) || ((count($arr_key) == 0) && (gettype($keywords) == 'string'))){
  83.                                                 $this->correct[$k] = $keywords;
  84.                                         }
  85.                                         break;
  86.                                 case 'robot':
  87.                                         $robot = (int)$v;
  88.                                         if($robot < 1 || $robot > 4){
  89.                                                 $this->correct[$k] = 1;
  90.                                         }else{
  91.                                                 $this->correct[$k] = $robot;
  92.                                         }
  93.                                         break;
  94.                         }
  95.                 }
  96.         }
  97.        
  98.         private function translit($str){
  99.                 $str = mb_strtolower($str, 'UTF-8');
  100.                 $abc = array(   'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd',
  101.                                                         'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i',
  102.                                                         'й' => 'j', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n',
  103.                                                         'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't',
  104.                                                         'у' => 'u', 'ф' => 'f', 'х' => 'kh', 'ц' => 'ts', 'ч' => 'ch',
  105.                                                         'ш' => 'sh', 'щ' => 'shh', 'ъ' => ' ', 'ы' => 'y', 'ь' => ' ',
  106.                                                         'э' => 'e', 'ю' => 'yu', 'я' => 'ya', ' ' => '-',
  107.                                                 );
  108.                 $result = iconv('UTF-8', 'UTF-8//TRANSLIT', strtr($str, $abc));
  109.                 $result = preg_replace("/[^a-z0-9-]/", "", $result);
  110.                 $result = preg_replace("/-{2,}/", "-", $result);
  111.                 $result = trim($result, '-');
  112.                 return $result;
  113.         }
  114.        
  115.         private function textTrim($text, $length, $points = false){
  116.                 /*
  117.                 ** $text   - усекаемый текст
  118.                 ** $length - необходимая длина текста
  119.                 ** $points - окончание (...)
  120.                 ** Возвращает
  121.                 **  - урезанный текст
  122.                 **  - или пустую строку
  123.                 */
  124.                 $text_cut = mb_substr($text, 0, $length, 'utf-8');
  125.                 $text_cut = mb_strrichr($text_cut, " ", true, 'utf-8');
  126.                 $lc = mb_substr($text_cut, -1, 1, 'utf-8');
  127.                 while(preg_match("/[a-z]|[а-я]|[0-9]/ui", $lc) != 1){
  128.                         $text_cut = rtrim($text_cut, $lc);
  129.                         $lc = mb_substr($text_cut, -1, 1, 'utf-8');
  130.                 }
  131.                 if(!$text_cut){
  132.                         return "";
  133.                 }else{
  134.                         if($points && (gettype($points) == 'string')){
  135.                                 return $text_cut . $points;
  136.                         }else{
  137.                                 return $text_cut;
  138.                         }
  139.                 }
  140.         }
  141.        
  142.         private function cleanTag($val){
  143.                 if(is_array($val) && count($val) > 0){
  144.                         foreach($val as $k => $v){
  145.                                 $val[$k] = trim(preg_replace("/\n|\r|\n\r|\r\n/", " ", strip_tags($v)));
  146.                         }
  147.                 }else{
  148.                         $val = trim(preg_replace("/\n|\r|\n\r|\r\n/", " ", strip_tags($val)));
  149.                 }
  150.                 return $val;
  151.         }
  152. }
  153. ?>
  154.  


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
caballero
Отправлено: 09 Августа, 2013 - 21:55:47
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




проше валидировать в одном месте
а то в одном поля валидируются в другом некий валидатор


проверили создали екземпляр класса и сунули в БД

(Отредактировано автором: 09 Августа, 2013 - 22:01:23)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 09 Августа, 2013 - 22:28:54
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


caballero
caballero пишет:
проше валидировать в одном месте
а то в одном поля валидируются в другом некий валидатор

То есть проверять поля непосредственно в классе Articles?

caballero пишет:
проверили создали екземпляр класса и сунули в БД

Проверил поля, создал объект $article класса Articles и его в БД? Зачем так, ведь на момент создания статьи ее еще нет, а значит по логике и объекта быть не должно. Вот при просмотре статей да - они есть, значит можно делать $article = new Articles();

Или не так?
(Добавление)
PS
то есть вы предлагаете запихать весь код класса Validator в класс Articles?
В классе Articles описать свойства одноименные полям в БД. В процессе проверки валить корректные данные в свойства, а ошибки в свойство $error - которое массив. Ну конечно же перед этим создавать объект и если в $error ничего нет, то писать полученный объект в БД?
(Добавление)
PPS
Точнее так:

1. Проверяем - все ли поля пришли
2. Передаем ассоциативный массив с полями формы в класс Articles::saveArticle($array)
3. Метод saveArticle вызывает метод validate - self::validate($array)
4. В методе validate есть два массива: $correct и $error - изначально пустые. В процессе проверки метод валит в массивы ошибки и корректные поля. Если в массиве $error хоть что-то оказалось, то возвращается он, если нет, то массив $correct.
5. получив массив $correct, метод saveArticle просто пишет его в БД.

Зачем создавать объект?


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
caballero
Отправлено: 09 Августа, 2013 - 22:52:25
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Зачем так, ведь на момент создания статьи ее еще нет

ну если создали статью то значит и создали объект.
логичнее вместо
Articles::saveArticle($data);
писать

$article = new Article($data);

$article->save();

паттерн Active record вам в помощь.

в этот же класс можно добавить валидацию перед сохранением


и вообще у вас куча какого то непонятного кода - какие то очистители тегов и прочее
обычно достаточно пары стандартных функций
(Добавление)
Цитата:
Зачем создавать объект?

ну вы либо используйте ООП либо тогда не используйте и нет проблем.

Статья в данном случае - бизнес-сущность. Поэтому и работать с ней логично как с объектом - екземпляром класса Articles


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 09 Августа, 2013 - 23:12:02
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


caballero пишет:
ну если создали статью то значит и создали объект.
логичнее вместо
Articles::saveArticle($data);
писать

$article = new Article($data);

$article->save();

паттерн Active record вам в помощь.

Ну видимо я все еще не вник в смысл этого паттерна.
Когда мы с вами обсуждали авторизацию пользователя, то ход был таков:
нельзя писать $user = new Users(); так как пока не произошла авторизация юзера еще нет.
Я сделал так: сначала написал Users::auth(), а в статичном методе авторизации написал $user = new Users() только после того, как выяснилось, что этот юзер действительно есть.

Здесь вы предлагаете создавать объект на тот момент, когда еще неизвестно, станет ли он вообще объектом. Может юзер некорректно заполнит какое-то поле в форме, и тогда статья не запишется в БД.

Я вижу это так:
вызвали метод сохранения статьи
это метод передал данные методу валидации
если метод валидации вернул переданные ему данные, то да - эти данные однозначно станут свойствами объекта и запишутся в БД.
если метод валидации вернул массив ошибок, то ничего не запишется в БД и незачем создавать объект, так как не получилось записать все его свойства.

caballero пишет:
и вообще у вас куча какого то непонятного кода - какие то очистители тегов и прочее
обычно достаточно пары стандартных функций


cleanTag - убирает теги, заменяет символы перевода строки на пробелы и убирает пробелы по краям - для подсчета кол-ва символов в тексте. (допустим статья минимум 500 символов - зачем считать теги?)
textTrim - обрезает текст не разрывая слова
translit - формирует alias

Я тоже смотрю на весь этот код, особенно на foreach со switch и как-то неказисто он смотрится. Ну а как иначе, если все поля нужно проверять по-разному. Тайтл - минимальная и максимальная длина, Alias - длина и только анг. символыб цифры и тире, id категории - нужно проверить по БД реально ли есть категория с таким id и т.д...


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
caballero
Отправлено: 09 Августа, 2013 - 23:25:21
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Здесь вы предлагаете создавать объект на тот момент, когда еще неизвестно, станет ли он вообще объектом.

согласен
валидацию можно сделать тоже статическим или просто отдельным методом или функцией методом
и создавать объект если валидация не венула ошибки
(Добавление)
вынесите все эти методы обработки текста в какие нибудь отдельные функции или статический класс типа Utilites

наверняка они еще пригодятся

(Отредактировано автором: 09 Августа, 2013 - 23:27:14)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 09 Августа, 2013 - 23:37:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


caballero пишет:
вынесите все эти методы обработки текста в какие нибудь отдельные функции или статический класс типа Utilites

наверняка они еще пригодятся

Да, вот это точно. Я уже думал о том, что эти функции будет использовать не только этот модуль, но вот не мог определиться, куда их пристроить.
Спасибо за наводку)))


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Hapson
Отправлено: 10 Августа, 2013 - 11:41:08
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Опять у меня вопросы)))
Сделал я авторизацию пользователей. При удачной авторизации я беру объект $user со всеми его свойствами и кладу в $_SESSION['user']. Дальше я могу вызывать свойства так:
$_SESSION['user']->name
$_SESSION['user']->city и т.д...

Но! Я не кладу в сессию два свойства: email и password. Поэтому, чтобы обратиться к ним, нужно будет делать запрос к БД.
Да и вообще, как-то не сильно возбуждает запись $_SESSION['user']->name, хотелось бы проще, например $user->name.

Может быть задействовать для этого метод __get ? Как вообще такое можно реализовать? Или хранение объекта в сессии - нормальная практика?
(Добавление)
Ну например

PHP:
скопировать код в буфер обмена
  1. function __get($val){
  2.         //делаю запрос типа
  3.         $sql = "SELECT $val FROM users WHERE MD5(CONCAT(email, password)) = $_SESSION['user_pid']";
  4.         //в сессии при этом лежит хеш email и password авторизованного юзера
  5.         //и return то что вернул запрос
  6. }


Однако так будет идти запрос при каждом обращении к свойству


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Hapson
Отправлено: 23 Августа, 2013 - 16:42:15
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Скажите, корректно ли проверять наличие $_POST внутри класса?
Пишу я класс Users, который будет работать с пользователями - регистрация, авторизация, аутентификация, редактирование, удаление и прочее...
Так вот, чтобы не писать в index.php много, я хочу перенести проверку $_POST в метод класса. А в коде оставить только

В методе authkUser() проверится, был ли $_POST, если нет, то вызовется метод checkUser, который проверит, аутентифицирован ли пользователь.
Ведь это нужно сделать в первую очередь, до любых других действий


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Страниц (5): « 1 2 3 4 [5]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB