Есть форма имя, пароль. Наблюдатель должен отследить правильные и не правильные вводы и записать результат в файл
Вот код который я составил
interface Observer{
public function notify( Observable $objSource, $objArguments );
}
interface Observable{
public function addObserver(Observer $objObserver, $strEventType );
public function fireEvent( $strEventType );
}
class FormValidator extends DB implements Observable{
const EVENT_FORM_VALID = 1;
const EVENT_FORM_INVALID = 0;
protected $strName;
protected $arrObserver= array() ;
public function setEmailAddress($strNam) {
$this->strNam = $strNam;
}
public function getEmailAddress() {
return $this->strNam;
}
public function validate() {
if(isset($_POST['name']) && $_POST['name']!='' && isset($_POST['pass']) && $_POST['pass']!=''){
$strEmailAddress=mysql_escape_string(stripslashes(trim(strip_tags($_POST['name']))));;
$pass=mysql_escape_string(stripslashes(trim(strip_tags($_POST['pass']))));;
$this->strNam = $strEmailAddress;
$conn=self::getInstance()->bd();
$result="SELECT name FROM user where name='$strEmailAddress' and pass='$pass'";
$snm=$conn->query($result);
$myrow=$snm->fetch(PDO::FETCH_ASSOC);
if( $myrow{name}==$this->strNam ){
$this->fireEvent( FormValidator::EVENT_FORM_VALID );
} else{
$this->fireEvent( FormValidator::EVENT_FORM_INVALID );
}
}else{echo'Введите логин и пароль';}
}
public function addObserver( Observer $objObserver, $strEventType ) {
$this->arrObserver[] = $objObserver;
}
public function fireEvent( $strEventType ) {
foreach($this->arrObserver as $obj){
$obj->notify($this);
}
}
}
$objValidator = new FormValidator();
$objValidator->validate();
Спустя 24 минуты, 37 секунд (13.05.2012 - 13:31) Markus111 написал(а):
Приведите хотя бы понятный пример, что бы я мог разобраться
Спустя 1 час, 28 минут, 36 секунд (13.05.2012 - 15:00) Oyeme написал(а):
Внутри метода validate,должна быть только проверка валидации,а не выборка с базы.
Замените на:
Этот метод:
На
Метод notify ,как раз разслыает всем оповещения.
У Вас его нет.Вы должны его переопределить.
public function fireEvent( $strEventType ) {
foreach($this->arrObserver as $obj){
$obj->notify($this);
}
}
Замените на:
public function fireEvent( $strEventType ) {
if( is_array( $this->arrObserver [$strEventType] ) )
{
foreach ( $this->arrObserver [$strEventType] as $objObserver )
{
$objObserver->notify( $this, $strEventType );
}
}
}
Этот метод:
public function addObserver( Observer $objObserver, $strEventType ) {
$this->arrObserver[] = $objObserver;
}
На
public function addObserver( IObserver $objObserver, $strEventType )
{
$this->arrObserver[$strEventType][] = $objObserver;
}
Метод notify ,как раз разслыает всем оповещения.
У Вас его нет.Вы должны его переопределить.
Спустя 43 минуты, 53 секунды (13.05.2012 - 15:44) Markus111 написал(а):
Посмотрите на новый код, и скажите я правильно сделал или нет
interface Observer {
function handleEvent($obj,$n,$name);
}
class Cache implements Observer {
public function handleEvent($obj,$n,$name) {
if($obj instanceof Content) {
$this->clear($n,$name);
}
}
public function clear($n,$name) {
if($n==1){
$date=date('Y-m-d G:i:s');
$source = $name."|".$date."| 1\r\n";
$file = "file.txt";
$Saved_File = fopen($file, 'a+');
fwrite($Saved_File, $source);
fclose($Saved_File);
}
if($n==0){
$date=date('Y-m-d G:i:s');
$source = $name."|".$date."| 0\r\n";
$file = "file.txt";
$Saved_File = fopen($file, 'a+');
fwrite($Saved_File, $source);
fclose($Saved_File);
}
}
}
class Content extends DB{
protected $n;
protected $name;
private $observers = array();
public function addObserver(Observer $obj) {
$this->observers[] = $obj;
}
public function removeObserver(Observer $obj) {
$newObservers = array();
foreach ($this->observers as $obs) {
if ($obj !== $obs) {
$newObservers[] = $obs;
}
}
$this->observers = $newObservers;
}
public function notifyObservers() {
foreach($this->observers as $obj) {
$obj->handleEvent($this,$this->n,$this->name);
}
}
public function change() {
if(isset($_POST['name']) && $_POST['name']!='' && isset($_POST['pass']) && $_POST['pass']!=''){
$strEmailAddress=mysql_escape_string(stripslashes(trim(strip_tags($_POST['name']))));;
$pass=mysql_escape_string(stripslashes(trim(strip_tags($_POST['pass']))));;
$this->strNam = $strEmailAddress;
$conn=self::getInstance()->bd();
$result="SELECT name FROM user where name='$strEmailAddress' and pass='$pass'";
$snm=$conn->query($result);
$myrow=$snm->fetch(PDO::FETCH_ASSOC);
if($myrow==true){
echo '1';
$this->name=$strEmailAddress;
$this->n=1;}
else{
echo '0';
$this->name=$strEmailAddress;
$this->n=0;}
}
$this->notifyObservers();
}
}
$content = new Content;
$content->addObserver(new Cache());
$content->change();
Спустя 17 часов, 45 минут, 42 секунды (14.05.2012 - 09:29) Oyeme написал(а):
Почему Вы не хотите использовать уже предложенный интерефейс обсервера? ;)
http://php.net/manual/en/class.splobserver.php
Создайте один общий метод для всех классов,и в каждом классе его переопределяйте.В данном случаи У Вас этот метод clear. Назовите его скажем :update,а метод change уберите.
У Вас должно получиться что-то типо такого:
Название методов у Вас спутанно. ;)
Так будет правильней. ;)
Почитайте то что Я Вам скинул в линке. ;)
http://php.net/manual/en/class.splobserver.php
Создайте один общий метод для всех классов,и в каждом классе его переопределяйте.В данном случаи У Вас этот метод clear. Назовите его скажем :update,а метод change уберите.
У Вас должно получиться что-то типо такого:
$content = new Content;
$content->addObserver(new Cache());
$content->notifyObservers();
Название методов у Вас спутанно. ;)
Так будет правильней. ;)
Почитайте то что Я Вам скинул в линке. ;)
Спустя 49 минут, 43 секунды (14.05.2012 - 10:19) Dezigo написал(а):
Для Вашей цели этот патерн не подходит, так как в обсервер нужно подaвать объекты ,которые будут проверятся.
У Вас только один класс Cache/
Лучше используйте Strategy Pattern.
Пример тут.
http://www.phppatterns.com/docs/design/strategy_pattern
У Вас только один класс Cache/
Лучше используйте Strategy Pattern.
Пример тут.
http://www.phppatterns.com/docs/design/strategy_pattern
_____________
Womans in your town