[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регистрация с использование класса
m4a1fox
Итак, у кого плохое настроение и кто не занят - прошу. Будем разговор делать... ну или как вы пожелаете. Итак, отходя от процедуры, и прикасаясь к классам. Нужны ваши отзывы вот по вот такому классу. Класс - нубский, до ужаса. Но. Мне вот что интересно - где, и как его можно, ну что-ли, капельку улучшить. Представим на минутку, что я, в голове, логически понимаю, необходимость абстрактных классов, наследования и инкапсуляции, с полиморфизмом сложнее.... но все же. Как все это можно тут применить? Итак...
класс регистрации
Свернутый текст


<?php
class
Registration {

private $login; // login - начинается с символа @
private $name; // name - имя
private $surname; // surname - фамилия
private $day; // date - дата рождения
private $month; // month - месяц рождения
private $year; // year - год рождения
private $sex; // male - пол
private $email; // email - реальный email
private $pass; // pass - пароль
private $confirmPass; // confirmpass - пароль еще раз
private $encodedPass; // encodedpass - зашифрованный пароль

protected $salt1 = '!@#$'; // salt1 - в начало пароля
protected $salt2 = '%^&*'; // salt2 - в конец пароля

private $errors; // errors - массив? ошибок
private $token; // token - уникаьный токен для каждого запроса

public function __construct(){

$this->errors = array();

$this->login = $this->filter($_POST['login']);
$this->name = $this->filter($_POST['name']);
$this->surname = $this->filter($_POST['surname']);
$this->day = $this->filter($_POST['day']);
$this->month = $this->filter($_POST['month']);
$this->year = $this->filter($_POST['year']);
$this->sex = $this->filter($_POST['sex']);
$this->email = $this->filter($_POST['email']);
$this->pass = $this->filter($_POST['pass']);
$this->confirmPass = $this->filter($_POST['confirmPass']);

$this->token = $_POST['token'];

$this->encodedPass = md5($this->salt1.$this->pass.$this->salt2);


}

public function process(){
if($this->validToken() && $this->validData())
$this->register();

return count($this->errors) ? 0 : 1;
}

public function filter($var){
return htmlspecialchars($var);
}

public function register(){
// connect to db
mysql_connect("localhost", "root", "") or die();
mysql_select_db("wyd") or die();

mysql_query("INSERT INTO `user` SET
`login` = '"
.mysql_real_escape_string($this->login)."',
`name` = '"
.mysql_real_escape_string($this->name)."',
`surname` = '"
.mysql_real_escape_string($this->surname)."',
`dayOfBirth` = '"
.mysql_real_escape_string($this->day)."',
`monthOfBirth` = '"
.mysql_real_escape_string($this->month)."',
`yearOfBirth` = '"
.mysql_real_escape_string($this->year)."',
`sex` = '"
.mysql_real_escape_string($this->sex)."',
`email` = '"
.mysql_real_escape_string($this->email)."',
`pass` = '"
.mysql_real_escape_string($this->pass)."',
`encodedPass` = '"
.mysql_real_escape_string($this->encodedPass)."'
"
) or die("Ошибка - ".mysql_error());

if(mysql_affected_rows() < 1)
$this->errors[] = 'Could not precess the form';
}



public function showErrors(){
echo '<h1>ERRORS</h1>';
foreach($this->errors as $key=>$value){
echo $value.'<br />';
}
}


public function validData(){
if(empty($this->login))
$this->errors[] = 'Invalid login';
if(empty($this->name))
$this->errors[] = 'Invalid name';
if(empty($this->surname))
$this->errors[] = 'Invalid surname';
if(empty($this->day))
$this->errors[] = 'Invalid day';
if(empty($this->month))
$this->errors[] = 'Invalid month';
if(empty($this->year))
$this->errors[] = 'Invalid year';
if(empty($this->sex))
$this->errors[] = 'Invalid sex';
if(empty($this->email))
$this->errors[] = 'Invalid email';
if(empty($this->pass))
$this->errors[] = 'Invalid pass';
if(empty($this->confirmPass))
$this->errors[] = 'Invalid confirmPass';

return count($this->errors) ? 0 : 1;
}

public function validToken(){
if(!isset($_SESSION['token']) || $this->token != $_SESSION['token']){
$this->errors[] = 'Invalid submission';
}

return count($this->errors) ? 0 : 1;
}
}

?>



Ах да, соединение с БД тоже тут.... но это я в курсе что нельзя.... просто для наглядность....

Ну и форма (а вдруг понадобиться)
Свернутый текст


<?php session_start();
error_reporting(E_ALL);

function __autoload($classname){
include './class/class.'.$classname.'.php';
}
if(isset($_POST['send'])){
$reg = new Registration();

if($reg->process())
echo 'Success';
else
$reg->showErrors();
}
$token = $_SESSION['token']= md5(uniqid(mt_rand(), true));

?>


<form action="" method="post">
<table
cellpadding="7" class="reg-content" cellspacing="0" width="700px" align="center" border="0">
<tr>
<th>

Логин:
</th>
<td>
<input
type="m4a1fox" class="log-left-part" readonly="readonly" value="@" />
<input
type="text" name="login" rel="login" maxlength="30" />
</td>
</tr>

<tr>
<th>

Имя:
</th>
<td>
<input
type="text" name="name" rel="input" maxlength="30" />
</td>
</tr>

<tr>
<th>

Фамилия:
</th>
<td>
<input
type="text" name="surname" rel="input" maxlength="30" />
</td>
</tr>

<tr>
<th>

День рождение:
</th>
<td>
<select
name="day" id="day">
<option
value="1">День:</option>
<?php

for($i=1; $i<=31; $i++){
echo '<option value="'.$i.'">'.$i.'</option>';
}
?>
</select>

<select
name="month" style="border:1px;" id="day" style="width: 100px;">
<option
value="">Месяц:</option>
<option
value="01">Январь</option>
<option
value="02">Февраль</option>
<option
value="03">Март</option>
<option
value="04">Апрель</option>
<option
value="05">Май</option>
<option
value="06">Июнь</option>
<option
value="07">Июль</option>
<option
value="08">Август</option>
<option
value="09">Сентябрь</option>
<option
value="10">Октябрь</option>
<option
value="11">Ноябрь</option>
<option
value="12">Декабрь</option>
</select>

<select
name="year" id="day">
<option
value="">Год:</option>
<?php

for($i=date('Y'); $i>=1901; $i--){
echo '<option value="'.$i.'">'.$i.'</option>';
}
?>
</select>
</td>
</tr>

<tr>
<th>

Пол:
</th>
<td>
<select
name="sex" id="day" style="width: 150px;">
<option
value="">Выберите пол:</option>
<option
value="male">Мужской</option>
<option
value="female">Женский</option>
</select>
</td>
</tr>

<tr>
<th>

Email:
</th>
<td>
<input
type="text" name="email" rel="input" maxlength="30" />
</td>
</tr>

<tr>
<th>

Пароль:
</th>
<td>
<input
type="password" name="pass" rel="input" maxlength="30" />
</td>
</tr>

<tr>
<th>

Пароль еще раз:
</th>
<td>
<input
type="password" name="confirmPass" rel="input" maxlength="30" />
<input
type="hidden" name="token" value="<?php echo $token;?>" />
</td>
</tr>

<tr>
<th>
</th>
<td>
<input
type="submit" name="send" value="Регистрация" />
</td>
</tr>
</table>
</form>




Наверно... мое предположение, можно вынести ошибки в отдельный файл, Ну это так, выстрел наугад... и все.... больше просто не вижу... опыта нет... а теория суха.... так что шишки свои себе сам ставить буду. Спасибо все кто откликнеться... ибо надо правильно делать или не делать ни как.



Спустя 28 минут, 4 секунды (31.10.2011 - 19:20) Семён написал(а):
Говнокод)))))

Спустя 7 минут, 26 секунд (31.10.2011 - 19:27) m4a1fox написал(а):
Семён
Согласен! полностью индуский но все же... как реализовать систему авторизации - правильно согласно концепту ООП. Гугл на эту тему молчит, в сети только процедуры - но это не интересно... интересно правильно сделать...

Спустя 22 секунды (31.10.2011 - 19:28) Семён написал(а):
1) Класс нужно использовать примерно в таком ключе:
$reg = new Registration($_POST['form']);
$reg->validate(array(
'user_password'=>array('digits','not_empty'),
'user_email'=>array('email','not_empty')
));

if($reg->process()) : $reg->save();
else:
echo $reg->showErrors();
endif;


2) Не имеет смысла жёстко привязываться к передаваемым данным:
  private $login;             // login - начинается с символа @
private $name; // name - имя
private $surname; // surname - фамилия
private $day; // date - дата рождения
private $month; // month - месяц рождения
private $year; // year - год рождения

Предоставь это валидатору, которому ты передашь правила для переменных, тогда класс станет не привязанным к передаваемым данным

Спустя 1 минута, 52 секунды (31.10.2011 - 19:30) Игорь_Vasinsky написал(а):
Семён
чёт я не понял почему говнокод? добавь комментов.

Спустя 40 секунд (31.10.2011 - 19:30) alex12060 написал(а):
m4a1fox

http://www.google.com/search?client=ubuntu...=utf-8&oe=utf-8

Гугл не молчит, просто поискать нужно.

Спустя 11 секунд (31.10.2011 - 19:30) imbalance_hero написал(а):
m4a1fox
А теперь тебе надо добавить 1 поле, что ты предлагаешь? ПОЛНОСТЬЮ класс переписывать? Особенностью работы классов заключается в том, что создание онного занимает 90% всего времени, а вот весь класс упрощает добавление и удаление элементов форм. Допустим вставить на страницу инпут должен быть в 1-2 строчки не задевая класс в целом.

Вроде 1000 раз о безопасности говорили, SQL-inj на лицо, где защита от mysql_real_escape_string ?
htmlspecialchars - не подходит! К тому же обработку mysql_real_escape_string (и (или) htmlspecialchars) можно использовать прям ВНУТРИ запроса, тем самым сократишь данный код в 100 раз!

Спустя 5 секунд (31.10.2011 - 19:30) m4a1fox написал(а):
Семён
Цитата
$reg->validate(array(
    'user_password'=>array('digits','not_empty'),
    'user_email'=>array('email','not_empty')
));

Ага... теперь бы логически допереть это... и понять что к чему...

Спустя 1 минута, 36 секунд (31.10.2011 - 19:32) m4a1fox написал(а):
imbalance_hero
Цитата
Вроде 1000 раз о безопасности говорили, SQL-inj на лицо, где защита от mysql_real_escape_string ?
htmlspecialchars - не подходит! К тому же обработку mysql_real_escape_string (и (или) htmlspecialchars) можно использовать прям ВНУТРИ запроса, тем самым сократишь данный код в 100 раз!

точняк. Извините, мое упущение.... уже правлю....
Цитата
А теперь тебе надо добавить 1 поле, что ты предлагаешь? ПОЛНОСТЬЮ класс переписывать? Особенностью работы классов заключается в том, что создание онного занимает 90% всего времени, а вот весь класс упрощает добавление и удаление элементов форм. Допустим вставить на страницу инпут должен быть в 1-2 строчки не задевая класс в целом.

тут полностью и однозначно согласен с Вами...

Спустя 3 минуты, 37 секунд (31.10.2011 - 19:36) m4a1fox написал(а):
Семён
Цитата
Предоставь это валидатору, которому ты передашь правила для переменных, тогда класс станет не привязанным к передаваемым данным

Я так понимаю просить расшифровать - бессмысленно... поэтому - ссылочкой, где про это сказано - не поделитесь?

Спустя 10 минут, 23 секунды (31.10.2011 - 19:46) RCuPeR написал(а):
Цитата (m4a1fox @ 31.10.2011 - 16:30)
Семён
Цитата
$reg->validate(array(
    'user_password'=>array('digits','not_empty'),
    'user_email'=>array('email','not_empty')
));

Ага... теперь бы логически допереть это... и понять что к чему...

Судя по всему, с валидацией во фреймворках никогда не работал ?

Спустя 54 секунды (31.10.2011 - 19:47) m4a1fox написал(а):
RCuPeR
Цитата
Судя по всему, с валидацией во фреймворках никогда не работал ?

Да нет, не работал sad.gif Судя по всему - зря...

Спустя 3 минуты, 5 секунд (31.10.2011 - 19:50) RCuPeR написал(а):
Цитата (m4a1fox @ 31.10.2011 - 16:47)
RCuPeR
Цитата
Судя по всему, с валидацией во фреймворках никогда не работал ?

Да нет, не работал sad.gif Судя по всему - зря...

Верно подметил.
Не знаю, как в других, но в Kohana и ZendF (могу ошибаться) схожая система валидации.

Спустя 1 минута (31.10.2011 - 19:51) Игорь_Vasinsky написал(а):
RCuPeR
в Yii роюсь щась - аналогичная карусель.

Спустя 6 секунд (31.10.2011 - 19:51) Семён написал(а):
m4a1fox
Ну блин, валидатор - объект который отвечает за проверку данных, сама проверка данных называется валидацией. (вики)
Ты указываешь классу (не в классе, а именно при создании класса) имена ключей, которые тебе нужно использовать при регистрации, т.е.

Создаёшь и указываешь передаваемый массив
$reg = new Registration($_POST['form']);


Указываешь какие данные ты будешь использовать (массив колонка=>значения) (грубый пример привожу)
$reg->values = array("login", "username"); //указал что в post данных придёт login и его нужно в таблице присвоить колонке username
$reg->values = array("password", "pass");


ну или просто, если совпадает с базой.

$reg->values = array("login","password","email")


Затем делаешь подкласс (может просто сделай функцию для проверки данных по определённым фильтрам и правилам: не пусто, только_цифры, емейл, только буквы и т.д.
Затем вызываешь её и указываешь правила для каждого значения которое ты передал
$reg->validate(array(
'login'=>array('char','not_empty'),
'password'=>array('digits','not_empty')
));


Смысл понятен?

Спустя 1 минута, 12 секунд (31.10.2011 - 19:52) RCuPeR написал(а):
Вот, посмотри. Очень толково сделано. Если нужно будет - смогу скинуть класс $post = new Validation($_POST);

Спустя 43 секунды (31.10.2011 - 19:53) m4a1fox написал(а):
Блин.... очень жаль... что ж, тогда, судя по всему - возвращаемся к мат. части, ибо, знаний, как оказалось - блин, ноль однако! smile.gif Ладно, как говорят злые гении, я еще вернусь. smile.gif

Спустя 4 минуты, 41 секунда (31.10.2011 - 19:58) m4a1fox написал(а):
RCuPeR
Спасибо, пробежался по тексту, более подробно - ночью рассмотрю, ибо нужно вникать, а на работе это вряд-ли получится. smile.gif Но все. Как я считаю, мой ступор, ну кроме кода конечно smile.gif , заключается в том что я не могу сформировать в голове 2 позиции. То есть это то, что тормозит меня до ужаса - 1. Как выводить ошибки при не заполненных полях. 2 - заносить данные в БД...

Спустя 19 минут, 13 секунд (31.10.2011 - 20:17) RCuPeR написал(а):
Цитата
1. Как выводить ошибки при не заполненных полях

Так не пропускай пустые поля еще "на подходе к серверу". Проверяй средствами JS валидацию, тут можно опустить ООП.

Спустя 1 минута, 58 секунд (31.10.2011 - 20:19) imbalance_hero написал(а):
RCuPeR
Что за глупый совет... а как же спам-боты? Ручная отправка? JS - это лишь красивая оболочка, ему доверять нельзя.

Спустя 45 секунд (31.10.2011 - 20:20) Семён написал(а):
+ imbalance_hero

Спустя 2 минуты, 49 секунд (31.10.2011 - 20:23) m4a1fox написал(а):
RCuPeR
Извините, но imbalance_hero прав. А еще, если отрубить js на компе.... тю тю... тогда уж красиво можно сделать и применив jQuery.

Спустя 16 минут, 7 секунд (31.10.2011 - 20:39) RCuPeR написал(а):
Не подумал. Прошу прощения.

Спустя 2 минуты, 51 секунда (31.10.2011 - 20:41) m4a1fox написал(а):
Ладно, хватит работать. Я домой (просто что бы были в курсе если не буду отвечать), но эту тему буду развивать, пока не добьюсь правильного решения....

Спустя 27 минут, 30 секунд (31.10.2011 - 21:09) Игорь_Vasinsky написал(а):

Спустя 22 минуты, 29 секунд (31.10.2011 - 21:31) RCuPeR написал(а):
Ну вот, в Yii, в принципе, такая же проверка. Я бы даже сказал, проще чем в Kohana.

Спустя 1 час, 25 минут, 19 секунд (31.10.2011 - 22:57) bodja написал(а):
m4a1fox
Ну не принимайте ,так близко к сердцу вышесказаное ;)
Вот моя проверка ,некритичных данных.

function adduser() {
var sub=true;
if (!document.getElementById('check_add_user').checked) {
alert('Вы не приняли правила !');
sub=false;
}
var len=document.getElementById('login').value.length;
if ((len<3)||(len>20)) {
alert('Длина логина должна быть не менее 3 и не более 20 символов !');
sub=false;
}
if (document.getElementById('pass').value!=document.getElementById('pass2').value) {
alert('Несовпадение паролей !');
sub=false;
}
var len=document.getElementById('pass').value.length;
if ((len<3)||(len>20)) {
alert('Длина пароля должна быть не менее 3 и не более 20 символов !');
sub=false;
}
var email=document.getElementById('email').value;
email = email.replace(/^\s+|\s+$/g, '');
if (!(/^([a-z0-9_\-]+\.)*[a-z0-9_\-]+@([a-z0-9][a-z0-9\-]*[a-z0-9]\.)+[a-z]{2,4}$/i).test(email)) {
alert('Неверно заполнен e-mail !');
sub=false;
}
if(sub) {document.getElementById('formadduser').submit();}
}


Как видим ,юзеру ,мы кое в чем поможем заполнить правильно поля.
Ну а, что пришло в обход,это уже проблемы ботов и хацкеров,
просто убираем горячо любимые символы и обрезаем до нужного размера.

Спустя 6 минут, 58 секунд (31.10.2011 - 23:04) imbalance_hero написал(а):
bodja
Данный код надо дублировать так же и на ПХП, на всякий случай, если человек обойдет эту защиту.

Спустя 17 минут, 21 секунда (31.10.2011 - 23:21) bodja написал(а):
Зачем?
Если человек захочет обойти эту защиту,для него как и для нас эти поля все равно будут фиктивными.
Смысл рассказывать им например ,что они неправильно ввели емайл smile.gif ?
У спамера все равно найтется пару сотен валидных ящиков,ну а хакер вообще преследует совсем другую цель.
Ну естественно ко всему этому никто не отменял ,проверку на уже зарегеный логин и мыло,
капчу и\или подтверждение через мыло.

Спустя 4 минуты, 27 секунд (31.10.2011 - 23:26) Семён написал(а):
bodja, кто-то отключил JS и нет проверок.

Спустя 2 минуты, 45 секунд (31.10.2011 - 23:28) Игорь_Vasinsky написал(а):
ну тогда можно submit() и return false на submit...

хотя чё мудрить...

Спустя 4 минуты, 20 секунд (31.10.2011 - 23:33) m4a1fox написал(а):
И так. Я дома и я снова про регистрацию...
bodja
Хм... Ну это только не обязательные поля.... Кажется?!

Спустя 3 минуты, 6 секунд (31.10.2011 - 23:36) bodja написал(а):
Да,ладно - это уже холиварский спор. biggrin.gif

Цитата
document.getElementById('formadduser').submit()

отправки тоже не будет,параноики идут гулять на другой сайт. wink.gif

Спустя 1 минута, 35 секунд (31.10.2011 - 23:37) Игорь_Vasinsky написал(а):
m4a1fox
Давай вместе познавать Yii, он полностью ООПэшный, а то чёт одному не прёт...
http://phpforum.su/index.php?showtopic=52995

там целый набор валидаторов wink.gif

Спустя 1 минута, 18 секунд (31.10.2011 - 23:39) imbalance_hero написал(а):
bodja
То есть ты предлагаешь открыть спамерам прямой доступ, пусть спамят тебя на здоровье, забивают БД пустыми записями, без паролей, без логинов с кривыми е-мейлами, а потом будешь плакать, когда на 10 000 записей - надо будет почистить сайт от 5 000 пустышек.

Спустя 1 минута, 3 секунды (31.10.2011 - 23:40) bodja написал(а):
Цитата
Хм... Ну это только не обязательные поля.... Кажется?!

Ну вы сами решайте ,какие для вас обязательны.
Это проверка,что бы чисто не гонять шарика между тупым юзером и серваком biggrin.gif

Спустя 4 минуты, 4 секунды (31.10.2011 - 23:44) bodja написал(а):
imbalance_hero
Ну я же писал

Цитата
Ну естественно ко всему этому никто не отменял ,проверку на уже зарегеный логин и мыло,
капчу и\или подтверждение через мыло.

Просто не всегда есть смысл всю банальщину вешать на сервак.

Спустя 4 минуты, 3 секунды (31.10.2011 - 23:48) m4a1fox написал(а):
И все таки думаю что правильно использовать класса ибо все равно это необходимо да и хочется познать... Так что буду мучаться дальше...

Спустя 9 часов, 23 минуты, 3 секунды (1.11.2011 - 09:11) VolDroN написал(а):
я не читал все ответы, но:

смысл этого?:
$this->errors       = array();

лучше вынести из конструктора в объявление:
private $errors = array();


Поля легче вынести в массив, т.е. будет что то наподобие array('login' => 'admin', 'pass' => 'sdfsdfsdf', 'email' => 'email@email.ru');
А потом с помощью foreach проходиться и создавать запрос.

Если нужны какие то специфичные функции для какого то поля, достаточно написать:
if(isset($this->fields['phone']))
$this->phoneFormat(&$this->fields['phone']);

Спустя 1 час, 8 минут, 9 секунд (1.11.2011 - 10:19) m4a1fox написал(а):
VolDroN
Спасибо! Буду экспериментировать!

Спустя 1 день, 11 часов, 37 минут, 8 секунд (2.11.2011 - 21:56) SlavaFr написал(а):
в глаза сразу бросается то, что этому класу собственно нет не какого применения кроме конкретного случачая. его методы которые содержат глобальные переменные и жостко кодированные соединения с бд. делают его обсалютно бесполезным в других случаях. для меня это просто main метод в котором куски линейного кода распиханы внутри класса. k сожалению будет не возможно в рамках этого подраздела описать все напутствия и пожелания по применению oop.

Спустя 13 дней, 16 часов, 15 минут, 53 секунды (16.11.2011 - 14:12) m4a1fox написал(а):
SlavaFr
Цитата
в глаза сразу бросается то, что этому класу собственно нет не какого применения кроме конкретного случачая. его методы которые содержат глобальные переменные и жостко кодированные соединения с бд. делают его обсалютно бесполезным в других случаях. для меня это просто main метод в котором куски линейного кода распиханы внутри класса. k сожалению будет не возможно в рамках этого подраздела описать все напутствия и пожелания по применению oop.
Однозначно Вы тут полностью правы.

Можно просто порассуждать. Не решился создавать отдельную тему, т.к. по сути все тоже самое. А вот что спросить хотел. Как вариант попробовать сделать так. Отделить сперва такие процессы, как класс для проверки значений и работа с ними от класса с ошибками. Т.е. как я это понимаю. Сделать, своего рода - кажется это называется агрегация . Т.е. я смогу отделить ошибки, и когда они появляются, я объявляю класс, передаю в его конструктор - ошибку, класс ее обрабатывает и выдает строку с ошибкой... какие преимущества это мне даст. Как мне кажется, это позволит создать класс ошибок, который будет сам по себе и к которому я смогу обращаться в дальнейшем - изменять - добавлять при этом не затрагивая класс авторизации...

Итак - бред это все, что выше написано, или имеет смысл попробовать, или ваш вариант?!

Спустя 6 часов, 25 минут, 35 секунд (16.11.2011 - 20:38) vital написал(а):
Цитата
Как мне кажется, это позволит создать класс ошибок, который будет сам по себе и к которому я смогу обращаться в дальнейшем - изменять - добавлять при этом не затрагивая класс авторизации.


Верно. Самостоятельно дошел до давно придуманного wink.gif Во избежание велосипедов - для этого в пхп есть класс Exception (емнип), от которого можешь наследовать свои классы ошибок.

Спустя 3 часа, 11 минут, 26 секунд (16.11.2011 - 23:49) m4a1fox написал(а):
vital
Цитата
Самостоятельно дошел до давно придуманного

Важно было самому понять это! Но есть одно но! Дело в том, что класс Exception делает исключительные ситуации....а пустое поле не есть исключение. Скорее банальной ошибкой! Но попробую сегодня завтра - и отпишусь!

Спустя 1 час, 2 минуты, 36 секунд (17.11.2011 - 00:52) vital написал(а):
Ну вот отнаследуй эксепшн, и в разных ситуациях его при меняй - когда надо throw, когда надо ретурн.

Спустя 13 часов, 45 секунд (17.11.2011 - 13:52) m4a1fox написал(а):
vital
Цитата
отнаследуй эксепшн

Отнаследовать не получится smile.gif Если я правильно понимаю имеется ввиду extends Exception.... а вот инициализировать объект в классе - получится!

Спустя 1 час, 55 минут, 9 секунд (17.11.2011 - 15:48) vital написал(а):
Цитата (m4a1fox @ 17.11.2011 - 12:52)
vital
Цитата
отнаследуй эксепшн

Отнаследовать не получится smile.gif Если я правильно понимаю имеется ввиду extends Exception.... а вот инициализировать объект в классе - получится!

Ccылка раз
наследуем ексепшн ссылка два



Спустя 1 минута, 37 секунд vital написал(а):
try{
//...
}catch(fileModuleException $e){
switch($e->getCode()){//так делать не надо
case 1: echo 'file not found';
case 2: echo 'file not readable';
//...
}
}

кусок кода из второй статьи ^
Твой ведь случай, верно?)

Спустя 1 час, 16 минут, 58 секунд (17.11.2011 - 17:04) m4a1fox написал(а):
vital
Свернутый текст


<?php

class
Registration extends connectDb {

public $login; // login - начинается с символа @
public $name; // name - имя
public $surname; // surname - фамилия
public $day; // date - дата рождения
public $month; // month - месяц рождения
public $year; // year - год рождения
public $sex; // male - пол
public $email; // email - реальный email
public $pass; // pass - пароль
public $confirmPass; // confirmpass - пароль еще раз
public $encodedPass; // encodedpass - зашифрованный пароль

protected $salt1 = '!@#$'; // salt1 - в начало пароля
protected $salt2 = '%^&*'; // salt2 - в конец пароля

private $errors; // errors - массив? ошибок
private $token; // token - уникальный токен для каждого запроса

public function __construct(){
if(isset($_POST['send'])){
$this->errors = array();

$this->login = $this->filter($_POST['login']);
$this->name = $this->filter($_POST['name']);
$this->surname = $this->filter($_POST['surname']);
$this->day = $this->filter($_POST['day']);
$this->month = $this->filter($_POST['month']);
$this->year = $this->filter($_POST['year']);
$this->sex = $this->filter($_POST['sex']);
$this->email = $this->filter($_POST['email']);
$this->pass = $this->filter($_POST['pass']);
$this->confirmPass = $this->filter($_POST['confirmPass']);

$this->token = $_POST['token'];

$this->encodedPass = md5($this->salt1.$this->pass.$this->salt2);
}
}


public function process(){
if($this->validToken() && $this->validData() && $this->EqualPass())
if($this->validDate())
if($this->checkUser())
$this->register();
return count($this->errors) ? 0 : 1;
}

public function filter($var){
$var = str_replace("`", "", $var);
$var = str_replace("'", "", $var);
return htmlspecialchars($var);
}

public function register(){
$sql = ("INSERT INTO `user` SET
`login` = '"
.mysql_real_escape_string($this->login)."',
`name` = '"
.mysql_real_escape_string($this->name)."',
`surname` = '"
.mysql_real_escape_string($this->surname)."',
`dayOfBirth` = '"
.mysql_real_escape_string($this->day)."',
`monthOfBirth` = '"
.mysql_real_escape_string($this->month)."',
`yearOfBirth` = '"
.mysql_real_escape_string($this->year)."',
`sex` = '"
.mysql_real_escape_string($this->sex)."',
`email` = '"
.mysql_real_escape_string($this->email)."',
`pass` = '"
.mysql_real_escape_string($this->pass)."',
`encodedPass` = '"
.mysql_real_escape_string($this->encodedPass)."'
"
) or die("Ошибка- ".mysql_error());
//echo $sql;
connectDb::sql($sql);

if(mysql_affected_rows() < 1)
$this->errors[] = 'Could not precess the form';
}

public function checkUser(){
$sql = "SELECT `id` FROM `user` WHERE `login` = '".$this->login."' AND `email` = '".$this->email."' LIMIT 1";
//echo $sql;
$data = connectDb::sql($sql);
if(mysql_num_rows($data) > 0)
$this->errors[] = 'User is isset on the table';
return count($this->errors) ? 0 : 1;
}

public function showErrors(){
echo '<h1>ERRORS</h1>';
foreach($this->errors as $key=>$value){
echo '<span style="padding:5px; border: 1px solid #2d2d2d; background: #4d4d4d; color: #f6d000;">'.$value.'</span>';
}
}


public function validDate(){
if(empty($this->day) || empty($this->month) || empty($this->year))
$this->errors[] = 'Please, check the date';
return count($this->errors) ? 0 : 1;
}

public function validData(){
if(empty($this->login) || empty($this->name) || empty($this->surname) ||
empty($this->sex) || empty($this->pass) ||
!
filter_var($this->email, FILTER_VALIDATE_EMAIL) || empty($this->confirmPass))
$this->errors[] = 'Please fiels all rows to continue';
return count($this->errors) ? 0 : 1;
}

public function EqualPass(){
if($this->pass != $this->confirmPass)
$this->errors[] = 'The password mustn\'t be a equal';
return count($this->errors) ? 0 : 1;
}

public function validToken(){
if(!isset($_SESSION['token']) || $this->token != $_SESSION['token']){
$this->errors[] = 'Invalid submission';
}
return count($this->errors) ? 0 : 1;
}
}



?>


Класс по сути полная фигня, он не применим нигде больше, кроме как только для конкретного случая - это факт! И тем не менее.
Вызывается он вот так
Свернутый текст


<?php session_start();
error_reporting(E_ALL);

function __autoload($classname){
include './class/class.'.$classname.'.php';
}
$con = new connectDb();

$reg = new Registration();
if(isset($_POST['send'])){
if($reg->process()){
header($_SERVER['PHP_SELF']);
}else{
$reg->showErrors();
}
}

$token = $_SESSION['token']= md5(uniqid(mt_rand(), true));

?>
<form action="" method="post">
<
table cellpadding="7" class="reg-content" cellspacing="0" width="700px" align="center" border="0">
<
tr>
<
th>
Логин:
</
th>
<
td>
<
input type="m4a1fox" class="log-left-part" readonly="readonly" value="@" />
<
input type="text" name="login" rel="login" maxlength="30" value="<?php echo $reg->login;?>" />
</
td>
</
tr>

<
tr>
<
th>
Имя:
</
th>
<
td>
<
input type="text" name="name" rel="input" maxlength="30" value="<?php echo $reg->name;?>" />
</
td>
</
tr>

<
tr>
<
th>
Фамилия:
</
th>
<
td>
<
input type="text" name="surname" rel="input" maxlength="30" value="<?php echo $reg->surname;?>" />
</
td>
</
tr>

<
tr>
<
th>
День рождение:
</
th>
<
td>
<
select name="day" id="day">
<
option value="">День:</option>
<?php
for($i=1; $i<=31; $i++){
if(!empty($reg->day))
echo '<option selected="selected" value="'.$reg->day.'">'.$reg->day.'</option>';
else
echo '<option value="'.$i.'">'.$i.'</option>';
}
?>
</select>

<
select name="month" style="border:1px;" id="day" style="width: 100px;">
<
option value="">Месяц:</option>
<
option value="01">Январь</option>
<
option value="02">Февраль</option>
<
option value="03">Март</option>
<
option value="04">Апрель</option>
<
option value="05">Май</option>
<
option value="06">Июнь</option>
<
option value="07">Июль</option>
<
option value="08">Август</option>
<
option value="09">Сентябрь</option>
<
option value="10">Октябрь</option>
<
option value="11">Ноябрь</option>
<
option value="12">Декабрь</option>
</
select>

<
select name="year" id="day">
<
option value="">Год:</option>
<?php
for($i=date('Y'); $i>=1901; $i--){
if(!empty($reg->year))
echo '<option selected="selected" value="'.$reg->year.'">'.$reg->year.'</option>';
else
echo '<option value="'.$i.'">'.$i.'</option>';
}
?>
</select>
</
td>
</
tr>

<
tr>
<
th>
Пол:
</
th>
<
td>
<
select name="sex" id="day" style="width: 150px;">
<
option value="">Выберите пол:</option>
<
option value="male">Мужской</option>
<
option value="female">Женский</option>
</
select>
</
td>
</
tr>

<
tr>
<
th>
Email:
</
th>
<
td>
<
input type="text" name="email" value="<?php echo $reg->email;?>" rel="input" maxlength="30" />
</
td>
</
tr>

<
tr>
<
th>
Пароль:
</
th>
<
td>
<
input type="password" name="pass" rel="input" maxlength="30" />
</
td>
</
tr>

<
tr>
<
th>
Пароль еще раз:
</
th>
<
td>
<
input type="password" name="confirmPass" rel="input" maxlength="30" />
<
input type="hidden" name="token" value="<?php echo $token;?>" />
</
td>
</
tr>

<
tr>
<
th>
</
th>
<
td>
<
input type="submit" name="send" value="Регистрация" />
</
td>
</
tr>
</
table>
</
form>


vital, я понял что вы хотели сказать. Но навряд ли у меня получится это сделать на данном этапе (знаний по сути ноль). Я думал, что получится сделать отдельный класс для ошибок, а не для исключений (пожалуйста, не думай что я игнорирую твои посты). Просто опыта мало очень... не обессудь. Так вот. Когда появляется ошибка, а именно метод, например вот этот


public function validData(){
if(empty($this->login) || empty($this->name) || empty($this->surname) ||
empty($this->sex) || empty($this->pass) ||
!
filter_var($this->email, FILTER_VALIDATE_EMAIL) || empty($this->confirmPass))
$this->errors[] = 'Please fiels all rows to continue';
return count($this->errors) ? 0 : 1;
}

возвращает TRUE, то происходит, приблизительно следующее


public function validData(){
if(empty($this->login) || empty($this->name) || empty($this->surname) ||
empty($this->sex) || empty($this->pass) ||
!
filter_var($this->email, FILTER_VALIDATE_EMAIL) || empty($this->confirmPass))
$this->errors[] = new errorReport('1041');
return count($this->errors) ? 0 : 1;
}

$this->errors[] вернет объект нового класса, кот. в свою очередь, по идее, должен будет вернуть, уже сформулированную строку с ошибкой... в общем где то так. Так можно или нет? Вот что меня интересует. То есть, чисто на программном уровне, это будет считаться ошибкой?



Спустя 52 минуты, 36 секунд m4a1fox написал(а):
Итак, идея провалилась! Надо искать другие варианты!

Спустя 14 дней, 20 часов, 49 минут, 12 секунд (2.12.2011 - 13:54) minor написал(а):
Мой вариант валидации данных, наверно можно было сделать лучше=)

Создаем обьект валидации (data это данные которые приходят из формы)
  
$valid = new My_Libs_Validator($data);
$valid->setValids('nameElementForm', array('isNumeric', 'notEmpty'),array('message1', 'message2'));

Метод проверки валидности
$valid->isValid()

Метод получения сообщения ошибок валидации
$valid->getMessages();


Все основанно сделано на неявном вызови функции тоесть
call_user_func_array(array($this, $key), array($value, $valParam, $message));

И пишем такой метод под каждую валидацию, на пример на проверку пустоту
 
protected function notEmpty()
{
$args = func_get_args();
$value = $args[0];
$message = $args[2];

if(!trim($value)) {
$this->setMessage($message);
}
}



Это удобно юзать с ооп оберткой для создания html форм, которую писал по типу zend_form, а то если зендовкую в свой проект подключать тянуть пол фреймверка нужно.

Спустя 9 минут, 18 секунд (2.12.2011 - 14:03) m4a1fox написал(а):
minor
Спасибо за предоставленную информацию. Но сходу понять что у вас происходит в классе, увы не получилось! Меня больше интересует, как данные попадают в ваш класс...

Спустя 15 минут, 23 секунды (2.12.2011 - 14:18) minor написал(а):
Цитата
Спасибо за предоставленную информацию. Но сходу понять что у вас происходит в классе, увы не получилось! Меня больше интересует, как данные попадают в ваш класс...

Через конструктор
$valid = new My_Libs_Validator($data);

Передаем в конструктор данные пришедшие от юзера , после на каждый элемент пишем валидацию и сообщение.
 
public function __construct($dataForm)
{
$this->_dataForm = $dataForm;
}

public function setValid($elementName, $method, $message)
{
if(array_key_exists($elementName, $this->_dataForm)) {

...................




Спустя 7 минут, 27 секунд minor написал(а):
Ну еше раз возможно сделать лучше наверно =) как сделанно в топ фреймверках, я старался как проще и что бы легко добавить методы валидации которые понадобится.

Спустя 8 минут, 47 секунд (2.12.2011 - 14:27) m4a1fox написал(а):
minor
То есть вы массивом обрабатываете?! В конструктор у вас попадает массив?!

Спустя 2 минуты, 26 секунд (2.12.2011 - 14:30) minor написал(а):
Да массив прешедший из формы.

Спустя 24 дня, 22 часа, 4 минуты, 9 секунд (27.12.2011 - 12:34) m4a1fox написал(а):
Итак я продолжаю измываться над ооп, или он надо мной :) В общем родилось следующее. Сразу вопрос. Где в логике ошибка.
Итак скрипты.
Первый. Регистрация. Только html. Показываю навсякий.
Свернутый текст

<table cellpadding="0" cellspacing="0" id="reg" align="center" border="0">
<tr
class="top">
<td
class="reg-logo">
<img
src="<?php echo M4A1_HOST?>public/img/logo.png" />
</td>

<td
class="registration">
Регистрация
</td>

</tr>
</table>

<table
cellpadding="7" class="reg-content" cellspacing="0" width="700px" align="center" border="0">
<form
action="<?php echo M4A1_HOST?>registration/run" method="post">
<tr>
<td
colspan="2" align="center">
</td>
</tr>
<tr>
<th>

Логин:
</th>
<td>
<input
type="m4a1fox" class="log-left-part" readonly="readonly" value="@" />
<input
type="text" name="login" rel="login" maxlength="30" value="<?php echo Session::getOne('AR', 'login')?>" />
</td>
</tr>

<tr>
<th>

Имя:
</th>
<td>
<input
type="text" name="name" rel="input" maxlength="30" value="<?php echo Session::getOne('AR', 'name')?>" />
</td>
</tr>

<tr>
<th>

Фамилия:
</th>
<td>
<input
type="text" name="surname" rel="input" maxlength="30" value="<?php echo Session::getOne('AR', 'surname')?>" />
</td>
</tr>

<tr>
<th>

День рождение:
</th>
<td>
<select
name="day" id="day">
<option
value="">День:</option>
<?php

for($i=1; $i<=31; $i++){
if(!empty($reg->day))
echo '<option selected="selected" value="'.$reg->day.'">'.$reg->day.'</option>';
else
echo '<option value="'.$i.'">'.$i.'</option>';
}
?>
</select>

<select
name="month" style="border:1px;" id="day" style="width: 100px;">
<option
value="">Месяц:</option>
<option
value="01">Январь</option>
<option
value="02">Февраль</option>
<option
value="03">Март</option>
<option
value="04">Апрель</option>
<option
value="05">Май</option>
<option
value="06">Июнь</option>
<option
value="07">Июль</option>
<option
value="08">Август</option>
<option
value="09">Сентябрь</option>
<option
value="10">Октябрь</option>
<option
value="11">Ноябрь</option>
<option
value="12">Декабрь</option>
</select>

<select
name="year" id="day">
<option
value="">Год:</option>
<?php

for($i=date('Y'); $i>=1901; $i--){
if(!empty($reg->year))
echo '<option selected="selected" value="'.$reg->year.'">'.$reg->year.'</option>';
else
echo '<option value="'.$i.'">'.$i.'</option>';
}
?>
</select>
</td>
</tr>

<tr>
<th>

Пол:
</th>
<td>
<select
name="sex" id="day" style="width: 150px;">
<option
value="">Выберите пол:</option>
<option
value="male">Мужской</option>
<option
value="female">Женский</option>
</select>
</td>
</tr>

<tr>
<th>

Email:
</th>
<td>
<input
type="text" name="email" value="<?php echo Session::getOne('AR', 'email')?>" rel="input" maxlength="30" />
</td>
</tr>

<tr>
<th>

Пароль:
</th>
<td>
<input
type="password" name="pass" rel="input" value="<?php echo Session::getOne('AR', 'pass')?>" maxlength="30" />
</td>
</tr>

<tr>
<th>

Пароль еще раз:
</th>
<td>
<input
type="password" name="confirmPass" rel="input" maxlength="30" />
<input
type="hidden" name="token" value="<?php echo $_SESSION['token']= md5(uniqid(mt_rand(), true));?>" />
</td>
</tr>

<tr>
<th>
</th>
<td>
<input
type="submit" name="send" value="Регистрация" />
</td>
</tr>
</form>
</table>



Далее (даже не знаю как назвать это.) В общем скажем модель.

<?php

class
Registration extends Controller{
function __construct(){
parent::__construct();
}

function index(){
$this->view->render('registration/index');
}

function run(){
$this->model->run();

$array = array(
'login' => 'Логин',
'name' => 'Имя',
'surname' => 'Фамилия',
'day' => 'День рождения',
'month' => 'Месяц рождения',
'year' => 'Год рождения',
'sex' => 'Пол',
'email' => 'Email',
'pass' => 'Пароль',
'confirmPass' => 'Повтор пароля',
'token' => 'Токен'
);


foreach($array as $key=>$value){
$this->model->getString($key, $value, true, $_POST[$key]);
}
$this->model->checkForEmpty();
}

function sing(){
$this->model->sing();
}
}


Что есть в этом классе. Как видим мы подключаем файл controller и вызываем его метод __construct
Класс Controller.php
Свернутый текст

<?php

class
Controller{

function __construct(){
$this->view = new View();
}

public function loadModel($name){
$file = './models/' . $name . '_model.php';
if(file_exists($file)){
require './models/' . $name . '_model.php';
$modelName = $name . 'Model';

$this->model = new $modelName();
}
}
}


В конструкторе класса Controoler создается новый объект класса View.


Его код на всякий случай. В принципе тут он не важен.
Свернутый текст

<?php

class
View{
function __construct(){
//echo 'This is view<br />';
}

public function render($name, $noInclude = false){
if($noInclude === true){
require 'views/' . $name . '.php';
}else{
require './views/header.php';
require 'views/' . $name . '.php';
require './views/footer.php';
}


}
}


тут как бы тоже не сложно.


Но вернемся к классу Registration. В нем происходит следующее.
Конкретно интересует метод run. Он из класса RegistrationModel вызывает следующее методы:
  • $this->model->run();
  • $this->model->getString($key, $value, true, $_POST[$key]);
  • $this->model->checkForEmpty();
А вот эти метода только из класса RegistrationModel, откуда собственно они и вызываются:
$this->model->run();
Свернутый текст

public function run(){
Session::set('AR', $_POST); // тут в сессию вносятся все пост
}


$this->model->getString($key, $value, true, $_POST[$key]);
Свернутый текст

public function getString($name, $caption, $is_required, $value){
$this->name = $name;
$this->caption = $caption;
$this->is_required = $is_required;
$this->value = $value;


$this->value = htmlspecialchars($this->value);
// Если поле обязательно для заполнения
if($this->is_required){
// Проверяем, не пусто ли оно
return (empty($this->value)) ? ($this->empty[$this->name] = 'Поле "'.$this->caption.'" не заполнено!') : ($this->full[$this->name] = $this->value);
}
}


$this->model->checkForEmpty();
Свернутый текст

public function checkForEmpty(){
if(!empty($this->empty)){

header("Location: /registration");
}else{
if($this->full['pass'] == $this->full['confirmPass'])
header("Location: /index");
else
header("Location: /registration");
}
}


Собственно пока что это все. Вывод. Что получилось сделать. Так как все поля обязательны для заполнения, то вот эта конструкция

foreach($array as $key=>$value){
$this->model->getString($key, $value, true, $_POST[$key]);
}

выполянется правильно. То есть в итоге, стало, на данном этапе, возможно, отделить заполненные поля от не заполненных. Составить массив данных с заполненными полями, где ключ - это поле, а значение - это значение вводимых даных.

А теперь гнобите, и не стесняйтесь. :) Спасибо за выдержку! :)

P.S. Ах да, забыл про вкусное написать. Теперь что бы добавить еще один input достаточно сделать это в html коде, после в массив

$array = array(
'login' => 'Логин',
'name' => 'Имя',
'surname' => 'Фамилия',
'day' => 'День рождения',
'month' => 'Месяц рождения',
'year' => 'Год рождения',
'sex' => 'Пол',
'email' => 'Email',
'pass' => 'Пароль',
'confirmPass' => 'Повтор пароля',
'token' => 'Токен'
);

добавить его, и создать строку в таблице БД... и все.... она будет обрабатываться и корректно работать.

Спустя 2 часа, 44 секунды (27.12.2011 - 14:34) vital написал(а):
Цитата
Спасибо за выдержку! smile.gif

Не осилил)

Спустя 3 минуты, 20 секунд (27.12.2011 - 14:38) m4a1fox написал(а):
vital
Понимаю! Ладно, чего уж там.

Спустя 2 минуты, 35 секунд (27.12.2011 - 14:40) vital написал(а):
Цитата
В общем скажем модель.

Цитата
class Registration extends Controller{

После этого уже пост вызывает когнитивный диссонанс



Спустя 2 минуты, 5 секунд vital написал(а):
Цитата
public function loadModel($name){
  $file = './models/' . $name . '_model.php';
  if(file_exists($file)){
  require './models/' . $name . '_model.php';
  $modelName = $name . 'Model';
 
  $this->model = new $modelName();
  }
}

Бред сивой кобылы.
Читай про http://php.net/manual/en/language.oop5.autoload.php



Спустя 1 минута, 18 секунд vital написал(а):
Цитата
function __construct(){
  parent::__construct();
}

Бред сивой кобылы.
зачем это писать если ты ничего не добавляешь в код? Оно и без тебя само вызовет парент.



Спустя 4 минуты, 17 секунд vital написал(а):
Цитата
public function render($name, $noInclude = false){
  if($noInclude === true){
  require 'views/' . $name . '.php';
  }else{
  require './views/header.php';
  require 'views/' . $name . '.php';
  require './views/footer.php';
  }
 
 
}

внутри else бред сивой кобылы.
Посмотри как в нормальных фреймоврках\шаблонизаторах делают layout-ы.

Между прочим - этот код яркая демонстрация того, что перед тем как писать свой велосипед, надо этисамые велосипеды поюзать. Не помню с кем спорил. С инпостом что ли..



Спустя 5 минут, 35 секунд vital написал(а):
Цитата
function sing(){
  $this->model->sing();
}

Зачем классу петь? wink.gif



Спустя 7 минут, 22 секунды vital написал(а):
Цитата
foreach($array as $key=>$value){
            $this->model->getString($key, $value, true, $_POST[$key]);
        }

Из 15 полей формы, 2 не реквайред, а опциональны. Щито делать? wink.gif

Спустя 11 минут, 1 секунда (27.12.2011 - 14:51) m4a1fox написал(а):
vital
Цитата

Бред сивой кобылы.
Читай про http://php.net/manual/en/language.oop5.autoload.php

Согласен! С autoload станет гораздо легче. Исправлю.

Цитата
Бред сивой кобылы.
зачем это писать если ты ничего не добавляешь в код? Оно и без тебя само вызовет парент.

Так же согласен! Тут без надобности. Но вдруг в будущем пригодится. Хотя стоит убрать.

Цитата

внутри else бред сивой кобылы.
Посмотри как в нормальных фреймоврках\шаблонизаторах делают layout-ы.

Насчет подключения html шапки и футера, и по поводу того, как это работает в других фреймоврках, полностью прав. Не видел как это в другом месте работает. Надо разобраться.

Цитата
Зачем классу петь?

метод просто так написан! Удалю!

Цитата

Из 15 полей формы, 2 не реквайред, а опциональны. Щито делать?

Тут не совсем понял, в смысле они не не обязательны для заполнения? Это имеется ввиду?

Спустя 2 минуты, 54 секунды (27.12.2011 - 14:54) vital написал(а):
Цитата
Тут не совсем понял, в смысле они не не обязательны для заполнения? Это имеется ввиду?

Да, ты жестко ставишь всем isRequired true в цикле.



Спустя 4 минуты, 41 секунда vital написал(а):
Ну вобщем правь пока. А потом вернемся к архитектуре и перепишем заново wink.gif

Спустя 8 минут, 45 секунд (27.12.2011 - 15:03) m4a1fox написал(а):
vital
Цитата
Да, ты жестко ставишь всем isRequired true в цикле.

Верно! Но! Есть другой вариант, но увеличивается кол-во кода. Вот так

$this->model->getString($login, 'Логин', true, $_POST[$key]);
$this->model->getString($name, 'Имя', true, $_POST[$key]);
........

и так далее до 15 штук.

А можно и так сделать

foreach($array as $key=>$value){
if($value == 'Email')
$this->model->getString($key, $value, false, $_POST[$key]);
else
$this->model->getString($key, $value, true, $_POST[$key]);
}

Как пример!

Спустя 2 минуты, 37 секунд (27.12.2011 - 15:06) vital написал(а):
Цитата (m4a1fox @ 27.12.2011 - 14:03)
vital
Цитата
Да, ты жестко ставишь всем isRequired true в цикле.

Верно! Но! Есть другой вариант, но увеличивается кол-во кода. Вот так

$this->model->getString($login, 'Логин', true, $_POST[$key]);
$this->model->getString($name, 'Имя', true, $_POST[$key]);
........

и так далее до 15 штук.

А можно и так сделать

foreach($array as $key=>$value){
if($value == 'Email')
$this->model->getString($key, $value, false, $_POST[$key]);
else
$this->model->getString($key, $value, true, $_POST[$key]);
}

Как пример!

А можно сделать ваще по другому, как делают нормальные люди wink.gif
Но ты еще не додумался wink.gif

Спустя 3 минуты (27.12.2011 - 15:09) m4a1fox написал(а):
vital
Цитата
А можно сделать ваще по другому, как делают нормальные люди wink.gif
Но ты еще не додумался

Не спорю! Намекни!

Спустя 6 минут, 1 секунда (27.12.2011 - 15:15) vital написал(а):
Ну..
Вот я хочу что бы примерно так:

$rules = array(
array('field' => 'name', array('required' => true, 'minlength' => 3, 'maxlength'=>10,'escape_html'=>false)),
array('field'=>'email', array('required' => true, 'minlength' => 3, 'maxlength'=>10, 'filter'=>'email'))
);


И т.п.
И еще легко свои кастомные валидаторы добавлять. ;)

Спустя 5 минут, 25 секунд (27.12.2011 - 15:20) m4a1fox написал(а):
vital
Цитата
$rules = array(
          array('field' => 'name', array('required' => true, 'minlength' => 3,  'maxlength'=>10,'escape_html'=>false)),
        array('field'=>'email', array('required' => true, 'minlength' => 3,  'maxlength'=>10, 'filter'=>'email'))
);

Все как по учебнику smile.gif почти все... понятно что собственно происходит, значит нужен новый метод, кот. будет принимать массив и вложенный массив и разбивая работать с полученными данными. Понятно. Спасибо. Буду исправлять. Но думаю, что так как у тебя, навряд ли получится сходу сделать. Поэтому, сначала исправлю ошибки что выше были.

Спустя 1 час, 9 минут, 27 секунд (27.12.2011 - 16:30) vital написал(а):
Цитата (m4a1fox @ 27.12.2011 - 14:20)
vital
Цитата
$rules = array(
          array('field' => 'name', array('required' => true, 'minlength' => 3,  'maxlength'=>10,'escape_html'=>false)),
         array('field'=>'email', array('required' => true, 'minlength' => 3,  'maxlength'=>10, 'filter'=>'email'))
);

Все как по учебнику smile.gif почти все... понятно что собственно происходит, значит нужен новый метод, кот. будет принимать массив и вложенный массив и разбивая работать с полученными данными. Понятно. Спасибо. Буду исправлять. Но думаю, что так как у тебя, навряд ли получится сходу сделать. Поэтому, сначала исправлю ошибки что выше были.

Никогда не стоит соимневаться в себе.
Просто бери и делай.

Спустя 2 минуты, 55 секунд (27.12.2011 - 16:32) Oyeme написал(а):
spl_autoload_register() provides a more flexible alternative for autoloading classes. For this reason, using __autoload() is discouraged and may be deprecated or removed in the future.

Спустя 3 минуты, 22 секунды (27.12.2011 - 16:36) m4a1fox написал(а):
Oyeme
Епс.... то есть использовать функцию spl_autoload_register()

Спустя 3 минуты, 29 секунд (27.12.2011 - 16:39) Oyeme написал(а):
Да,это очень практично.Вам не нужно "каждый раз писать что и как подгружать".
http://www.php.net/manual/en/function.spl-...ad-register.php

Спустя 4 минуты, 22 секунды (27.12.2011 - 16:44) m4a1fox написал(а):
Oyeme
Ух ты как прикольно! __NAMESPACE__ я еще ни разу не использовал!

Есть тупичок, ну я так думаю. Вот так выглядит index

<?php session_start();
/**
* -----M4A1_FOX-----
* site - WWW.WYD.COM
* We establish the charset and level of errors
*/

header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);

require './libs/Bootstrap.php';
require './libs/Controller.php';
require './libs/View.php';
require './libs/Model.php';


require './libs/Database.php';
require './libs/Registry.php';
require './libs/Session.php';
require './libs/Cookie.php';


require './config/paths.php';
require './config/database.php';

Registry::set('DB', new Database());

$app = new Bootstrap();
?>


Знаю что так не делается.... что нужно использовать __autoload() но это поправимо. Вот теперь нужно применить не __autoload(), а spl_autoload_register().

Спустя 14 минут, 49 секунд (27.12.2011 - 16:59) Oyeme написал(а):
Создайте файл для конфигов.И туда выносите все конфигурации.

Example:

define('APP_ROOT',dirname(__FILE__).DIRECTORY_SEPARATOR); 
define('APP_LIBS',APP_ROOT.'libs'.DIRECTORY_SEPARATOR);

set_include_path(get_include_path().PATH_SEPARATOR.APP_LIBS);
spl_autoload_register();


Я думаю идея Вам понятна.С путями сами разберитесь.

Спустя 8 минут, 43 секунды (27.12.2011 - 17:07) m4a1fox написал(а):
Oyeme
Едрид мадрид.... спс! И подключив только этот файл (config.php) он вызывает необходимые для работы файлы и подключает их!?

Спустя 54 минуты, 29 секунд (27.12.2011 - 18:02) m4a1fox написал(а):
Я тут в сети полазил.... вот что нарыл! Сделал в общем так.
index.php

<?php session_start();
/**
* -----M4A1_FOX-----
* site - WWW.WYD.COM
* We establish the charset and level of errors
*/

header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);

require './config/paths.php';
require './config/database.php';

spl_autoload_register ('autoload');

Registry::set('DB', new Database());

$app = new Bootstrap();
?>


path.php

<?php
/**
* Establishes a physical path to a root directory of a script
* Устанавливает физический путь до корневой директории скрипта
*/

define('M4A1_ROOT', str_replace('\\', '/', $_SERVER['DOCUMENT_ROOT']) .'/');

/**
* Establishes a path to a script root for HTTP
* Устанавливает путь до корневой директории скрипта
* по протоколу HTTP
*/

define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');

spl_autoload_register ('autoload');
function autoload ($className) {
$fileName = APP_LIBS . $className . '.php';
include $fileName;
}


И database.php

<?php

define('M4A1_DB_TYPE', '------');
define('M4A1_DB_HOST', '-------');
define('M4A1_DB_NAME', '-------');
define('M4A1_DB_USER', '-------');
define('M4A1_DB_PASS', '--------');

Спустя 3 минуты, 40 секунд (27.12.2011 - 18:05) m4a1fox написал(а):
А вот когда несколько папок, становится проблематично не использовать include или reqiure

Спустя 18 минут, 50 секунд (27.12.2011 - 18:24) Oyeme написал(а):
Этого не должно быть:
function autoload ($className) {
$fileName = APP_LIBS . $className . '.php';
include $fileName;
}


;)

Для установления других папок используйте:
set_include_path();

Спустя 8 минут, 9 секунд (27.12.2011 - 18:32) m4a1fox написал(а):
теперь index.php имеет вид

<?php session_start();
/**
* -----M4A1_FOX-----
* site - WWW.WYD.COM
* We establish the charset and level of errors
*/

header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);

function autoload ($className) {
$arr = array(M4A1_LIBS.$className . '.php', M4A1_CONTR.$className . '.php', M4A1_MODELS.$className . '.php');
foreach($arr as $val){ if(file_exists($val)) include $val;}
}


require './config/database.php';

define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');
define('M4A1_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('M4A1_LIBS', M4A1_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('M4A1_CONTR', M4A1_ROOT.'controllers'.DIRECTORY_SEPARATOR);
define('M4A1_MODELS', M4A1_ROOT.'models'.DIRECTORY_SEPARATOR);
spl_autoload_register('autoload');

Registry::set('DB', new Database());

$app = new Bootstrap();
?>

Спустя 3 минуты, 28 секунд (27.12.2011 - 18:36) m4a1fox написал(а):
Уважаемый, Oyeme я прочитал что вы написали, но ситуация такова, что, я практически и теоретически понимаю что должна делать эта строчка

set_include_path(get_include_path().PATH_SEPARATOR.APP_LIBS);

Она устанавливает и переопределяет папку из кот. ведется подключение(include) файлов. Но к сожалению она у меня не работает. То есть у меня постоянно выдает вот такой путь : .;/usr/local/php5/PEAR , насколько я понимаю он должен меняться. А он не меняется. И еще, а как же тогда сделать подключения других файлов не из папки libs?

Спустя 11 минут, 8 секунд (27.12.2011 - 18:47) m4a1fox написал(а):
То есть так выглядит! :)
<?php session_start();
/**
* -----M4A1_FOX-----
* site - WWW.WYD.COM
* We establish the charset and level of errors
*/

header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);

function autoload ($className) {
$arr = array(M4A1_LIBS, M4A1_CONTR, M4A1_MODELS);
foreach($arr as $val){ if(file_exists($val . $className . '.php')) include $val . $className . '.php';}
}


require './config/database.php';

define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');
define('M4A1_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('M4A1_LIBS', M4A1_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('M4A1_CONTR', M4A1_ROOT.'controllers'.DIRECTORY_SEPARATOR);
define('M4A1_MODELS', M4A1_ROOT.'models'.DIRECTORY_SEPARATOR);
spl_autoload_register('autoload');




Registry::set('DB', new Database());

$app = new Bootstrap();
?>

Спустя 5 часов, 31 минута, 23 секунды (28.12.2011 - 00:18) Oyeme написал(а):
Сделал для Вас пример.
Подключаем классы из папки libs и models

index.php

<?php

define('APP_ROOT',dirname(__FILE__).DIRECTORY_SEPARATOR);
define('APP_LIBS',APP_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('APP_MODEL',APP_ROOT.'models'.DIRECTORY_SEPARATOR);

set_include_path(get_include_path().PATH_SEPARATOR.APP_LIBS);
set_include_path(get_include_path().PATH_SEPARATOR.APP_MODEL);
spl_autoload_register();


var_dump(new class_1());
var_dump(new class_2());
var_dump(new class_3());
var_dump(new class_4());

?>


libs
class_1.php
<?php
class
class_1 {
function __constructor(){
return this;
}
}

class_2.php
<?php
class
class_2 {
function __constructor(){
return this;
}
}



Models
class_3.php
<?php
class
class_3 {
function __constructor(){
return this;
}
}

?>

class_4.php
<?php
class
class_4 {
function __constructor(){
return this;
}
}


?>


Спустя 13 часов, 19 минут, 22 секунды (28.12.2011 - 13:38) m4a1fox написал(а):
Oyeme
Воспользовался вашей функцией. Честно говоря, она в некотором месте у меня не сработала :( Но в обще - работает! Не могли бы вы описать ее преимущества по сравнению с моей
[more]

<?php session_start();
/**
* -----M4A1_FOX-----
* site - WWW.WYD.COM
* We establish the charset and level of errors
*/

header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);

function autoload ($className) {
$arr = array(M4A1_LIBS, M4A1_CONTR, M4A1_MODELS);
foreach($arr as $val){ if(file_exists($val . $className . '.php')) include $val . $className . '.php';}
}


require './config/database.php';

define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');
define('M4A1_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('M4A1_LIBS', M4A1_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('M4A1_CONTR', M4A1_ROOT.'controllers'.DIRECTORY_SEPARATOR);
define('M4A1_MODELS', M4A1_ROOT.'models'.DIRECTORY_SEPARATOR);
spl_autoload_register('autoload');




Registry::set('DB', new Database());

$app = new Bootstrap();
?>[/more]

Спасибо.

Спустя 12 минут, 56 секунд (28.12.2011 - 13:51) m4a1fox написал(а):
Прикола ради! Ваш скрипт если вывести вот так


define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');
define('M4A1_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('M4A1_LIBS', M4A1_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('M4A1_CONTR', M4A1_ROOT.'controllers'.DIRECTORY_SEPARATOR);
define('M4A1_MODELS', M4A1_ROOT.'models'.DIRECTORY_SEPARATOR);

echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_LIBS);
echo '<br />';
echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_MODELS);
echo '<br />';
echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_CONTR);
echo '<br />';
spl_autoload_register();


на экран выводит следующее

.;/usr/local/php5/PEAR
.;/usr/local/php5/PEAR;Y:\home\www.sitename\www\libs\
.;/usr/local/php5/PEAR;Y:\home\www.sitename\www\libs\;Y:\home\www.sitename\www\models\


Если сделать так

define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');
define('M4A1_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('M4A1_LIBS', M4A1_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('M4A1_CONTR', M4A1_ROOT.'controllers'.DIRECTORY_SEPARATOR);
define('M4A1_MODELS', M4A1_ROOT.'models'.DIRECTORY_SEPARATOR);
//spl_autoload_register('autoload');

echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_CONTR);
echo '<br />';
echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_LIBS);
echo '<br />';
echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_MODELS);
echo '<br />';
echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_CONTR);
echo '<br />';
spl_autoload_register();


То выводится это

.;/usr/local/php5/PEAR
.;/usr/local/php5/PEAR;Y:\home\www.wyd.com\www\controllers\
.;/usr/local/php5/PEAR;Y:\home\www.wyd.com\www\controllers\;Y:\home\www.wyd.com\www\libs\
.;/usr/local/php5/PEAR;Y:\home\www.wyd.com\www\controllers\;Y:\home\www.wyd.com\www\libs\;Y:\home\www.wyd.com\www\models\

То есть как бы пути все на месте. Но вот такой код

if(empty($url[0])){
//include './controllers/index.php';
$controller = new Index();
$controller->main();
return false;
}

Вызывает вот такую ошибку

Fatal error: spl_autoload() [<a href='function.spl-autoload'>function.spl-autoload</a>]: Class Index could not be loaded in Y:\home\www.wyd.com\www\libs\Bootstrap.php on line 14


собственно 14 строчка это объявление класса new Index().
ХЗ почему так, но не хочет правильно работать!

Спустя 1 час, 58 минут, 8 секунд (28.12.2011 - 15:49) Oyeme написал(а):
There is a comment (anonymous) on http://php.net/manual/en/function.spl-autoload-register.php that may apply to your problem: spl_autoload_register() doesn't seem to play nice with camelcase, and in your case could be trying to find request.class.php instead of Request...

У Вас как раз,смените название класса на маленькие буквы.

Спустя 1 час, 4 минуты, 22 секунды (28.12.2011 - 16:53) m4a1fox написал(а):
Oyeme
Цитата
У Вас как раз,смените название класса на маленькие буквы.

да уже и менял, и по другому называл! Один результат! sad.gif

Спустя 19 минут, 13 секунд (28.12.2011 - 17:12) m4a1fox написал(а):
Только что перепроверил! Вот класс

<?php

class
Main extends Controller{
function __construct(){
parent::__construct();
}

function index(){
$this->view->render('index/index');
}

function details(){
$this->view->render('index/index');
}
}


Вот его вызов

if(empty($url[0])){
//include './controllers/index.php';
$controller = new Main();
$controller->index();
return false;
}


Вот код индекс файла

<?php session_start();
/**
* -----M4A1_FOX-----
* site - WWW.WYD.COM
* We establish the charset and level of errors
*/

header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);

require './config/database.php';

define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');
define('M4A1_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('M4A1_LIBS', M4A1_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('M4A1_CONTR', M4A1_ROOT.'controllers'.DIRECTORY_SEPARATOR);
define('M4A1_MODELS', M4A1_ROOT.'models'.DIRECTORY_SEPARATOR);

set_include_path(get_include_path().PATH_SEPARATOR.M4A1_CONTR);
set_include_path(get_include_path().PATH_SEPARATOR.M4A1_LIBS);
set_include_path(get_include_path().PATH_SEPARATOR.M4A1_MODELS);
set_include_path(get_include_path().PATH_SEPARATOR.M4A1_CONTR);

spl_autoload_register();

Registry::set('DB', new Database());
$app = new Bootstrap();
?>

И вот код :( ошибки


Fatal error: spl_autoload() [<a href='function.spl-autoload'>function.spl-autoload</a>]: Class Main could not be loaded in Y:\home\www.wyd.com\www\libs\Bootstrap.php on line 14


Спустя 4 часа, 32 минуты, 22 секунды (28.12.2011 - 21:45) Oyeme написал(а):
Проверте ,работает ли у Вас то что я приложил в архиве.

Спустя 2 часа, 20 минут, 2 секунды (29.12.2011 - 00:05) m4a1fox написал(а):
Oyeme

object(class_1)#1 (0) { } object(class_2)#1 (0) { } object(class_3)#1 (0) { } object(class_4)#1 (0) { } object(stdClass)#1 (1) { ["scalar"]=> string(1) "A" }


Спустя 9 часов, 47 минут, 42 секунды (29.12.2011 - 09:52) Oyeme написал(а):
Работает ведь.Теперь смотрите почему у Вас не работает. wink.gif
Вы указываете папки из которых подгружать классы,и никакого include.

Спустя 4 часа, 19 минут, 23 секунды (29.12.2011 - 14:12) m4a1fox написал(а):
Oyeme
Цитата
Вы указываете папки из которых подгружать классы,и никакого include.

Да, инклюда нет. Все равно с эти заминка... sad.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.