вторник, 3 сентября 2013 г.

Chess on JS, warior class

Всем привет. Продолжаем о шахматах.
Мною был написан класс "пешка" и создано правило движения: - одна клетка вперед. При организации логики, возникла следующая проблема. Нужно было написать универсальный метод/функцию которая бы выполняла ход фигуры. Так же нужна была проверка, можно ли фигуре ходить в заданную клетку, в случае неправильного хода, возвращать фигуру назад.
Рассматривалось несколько вариантов, от создания объекта под каждую фигуру и в свойствах хранить все возможные варианты до создания класса описывающего основные свойства фигуры. Такие как старое местоположение, новое местоположение и метод возвращающий массив с координатами "разрешенных" для хода клеток из старой позиции. На этом варианте я и остановился. Возможно это и ошибочный путь, время покажет.

Вот собственно и код с описанием.

/*

* класс пешка, с методом стандартного хода

*/

var wariorClass = function(old_pos, new_pos) {

    this.old_pos = old_pos;
    this.new_pos = new_pos;

    this.getStdMove = function () {
        var alfa = this.old_pos[0],
            num = this.old_pos[1];

        return [alfa + ( parseInt(num)+1)];
    };
}

Весь код целиком вы как обычно можете посмотреть на https://github.com/Fariah/chess

понедельник, 2 сентября 2013 г.

How I make a chess in JS

Возвращаюсь к написанию постов в блоге. В этот раз я расскажу не о Zend Framework, а том как я пытался воссоздать древнюю игру - шахматы на JS.

Собственно сами шахматы в самой последней версии вы можете найти на https://github.com/Fariah/chess

Здесь же я опишу то новое, что узнал пока создавал эту игру.

1. Это классы в JS. До этого я использовал только функции. Но проектируя приложения понял, что пора делать шаг вперед. Собственно вот так это делается

var myClass = function() { // создаем класс myClass

    return {

        createAlert: function(elem) { // создаем метод createAlert

             alert(elem); // который возвращает параметр elem алертом

        }

    }

}

var obj = new myClass(); // создаем обьект класса

obj.createAlert('someElem');  // вызываем метод класса с параметром

пятница, 21 июня 2013 г.

git branch in command prompt, only for linux

Захотелось мне удобства с работой в командной строке. В недавнем проекте мы использовали Git и решил я вывести название ветки в командной строки, да еще и выделить все разными цветами.

php@php-MS-7597:~/work/php/sobranie (master)$

А сделал я это достаточно просто. Есть такой файл: .bashrc
Берем и дописываем в самом низу такое:

function parse_git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

RED="\[\033[0;31m\]"
YELLOW="\[\033[0;33m\]"
GREEN="\[\033[0;32m\]"
NO_COLOR="\[\033[0m\]"

PS1="$GREEN\u@\h$NO_COLOR:\w$YELLOW\$(parse_git_branch)$NO_COLOR\$ "

После этого в командной строке выполняем: source ~/.bashrc
И все, теперь у нас красивая командная строка =)

четверг, 20 июня 2013 г.

ACL, закрываем доступ к роутам в зависимости от настроенных ролей

Тут показан пример того как я закрыл доступ неавторизированным пользователям к внутренним разделам сайта при помощи ACL. Код был успешно скопипастен с http://ivangospodinow.com за что ему огромное спасибо.

Для начала создаем файл: module/Frontend/config/module.acl.roles.php

<?php
//module/Frontend/config/module.acl.roles.php
return array(
    'guest'=> array(
        'index',
        'register',
    ),
    'auth'=> array(
        'about',
        'inquiry',
    ),
);

'index', 'register' и т.д. - это роуты контроллеров для которых я устанавливаю правила.   Далее в файле module.php прописываем следуещее:
 
    public function onBootstrap(MvcEvent $e)
    {
        // common code.... 
        $this -> initAcl($e);
        $e->getApplication()
            ->getEventManager()
            ->attach('route', array($this, 'checkAcl'));
    } 
    public function initAcl(MvcEvent $e) {
        $acl = new \Zend\Permissions\Acl\Acl();
        $roles = include __DIR__ . '/config/module.acl.roles.php';
        $allResources = array();
        foreach ($roles as $role => $resources) {

            $role = new \Zend\Permissions\Acl\Role\GenericRole($role);
            $acl -> addRole($role);

            $allResources = array_merge($resources, $allResources);

            //adding resources
            foreach ($resources as $resource) {
                $acl -> addResource(new \Zend\Permissions\Acl\Resource\GenericResource($resource));
            }
            //adding restrictions
            foreach ($allResources as $resource) {
                $acl -> allow($role, $resource);
            }
        }
        $e -> getViewModel() -> acl = $acl;

    }

    public function checkAcl(MvcEvent $e) {
        $route = $e -> getRouteMatch() -> getParam('__CONTROLLER__');

        //you set your role
        $userRole = 'guest';

        if ($e -> getViewModel() -> acl ->hasResource($route) && !$e -> getViewModel() -> acl -> isAllowed($userRole, $route)) {
            $response = $e -> getResponse();
            //location to page or what ever
            $response -> getHeaders() -> addHeaderLine('Location', $e -> getRequest() -> getBaseUrl() . '/');
            $response -> setStatusCode(303);

        }
    }
 
собственно из самого кода многое становится понятным и модифицировать его под себя не составит труда.

P.S. Прошу прощение за форматирование кода, в ближайшее время настрою скрипты.

вторник, 18 июня 2013 г.

Zend\Session\Container

Возможно кому то пригодится пример работы с сессиями:

Для создания сессии

- для работы нам понадобится создать псевдоним имени:


use Zend\Session\Container;


- потом, создаем экземпляр класса с нужным неймспейсом(user)

$user_session = new Container('user');


- задаем параметры для этой сессии

$user_session->setExpirationSeconds(72000);
$user_session->username = 'Nickolay';
$user_session->auth = 1;


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

$new_obj = new Container('user');

 if($new_obj->auth) { ....... }


- для того что бы очистить сессию

$new_obj = new Container('user');

$new_obj->getManager()->getStorage()->clear('user');

Child routing in ZF2

Возникла трудность с пониманием в работе с child_routes в zf2. Приведу пример:

'router' => array(
    'routes' => array(
        'backend' => array(
            'type'    => 'Literal',
            'options' => array(
                'route'    => '/backend',
                'defaults' => array(
                    '__NAMESPACE__' => 'Backend\Controller',
                    'controller'    => 'Auth',
                    'action'        => 'login',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'admin' => array(
                    'type'    => 'Segment',
                    'options' => array(
                        'route'    => '/[:controller[/:action]]',
                        'constraints' => array(
                            'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                        ),
                        'defaults' => array(
                        ),
                    ),
                ),
            ),
        ),
    ),
),

 Это роут описывает работу админки теоретического сайта. По умолчанию, когда мы заходим на http://domen/backend мы попадаем в контроллер Auth и вызываем в нем метод login.

Что бы использовать другие методы внутри родительского роута /backend нужно сделать следующее:

$this->url('backend/admin', array(
    'controller' => 'auth',
    'action' => 'authenticate'
));

При этом у нас в первом параметре хелпера передается: родительский_роут/child_роут, а потом уже как обычно все остальные параметры.

Create Full URLs in ZF2 Views

Нашел интересный блог по zf2. Информация по созданию url

http://codingexplained.com/coding/php/zend-framework/create-full-urls-in-zf2-views

// Using a route with the name "register" and the route "/register"
echo $this->url('register', array(), array('force_canonical' => true));  
// Output: http://mydomain.com/register

echo $this->serverUrl(); // Output: http://mydomain.com


// Current URL: http://mydomain.com/register
echo $this->serverUrl(true); // Output: http://mydomain.com/register



// The "register" route has the following route: /register
echo $this->serverUrl($this->url('register'));  
// Output: http://mydomain.com/register