Перейти к содержанию
Официальный форум поддержки Simpla

Email для каждого менеджера


Рекомендуемые сообщения

Добавил поле под email

 

1. файл api/Managers.php

 

<?php


require_once('Simpla.php');


class Managers extends Simpla
{
    public $permissions_list = array('products', 'categories', 'brands', 'features', 'orders', 'labels',
        'users', 'groups', 'pages', 'blog', 'comments', 'feedbacks', 'import', 'export',
        'backup', 'stats', 'design', 'settings', 'currency', 'delivery', 'payment', 'managers');


    public $passwd_file = "simpla/.passwd";


    public function __construct()
    {
        // Для совсестимости с режимом CGI
        if (isset($_SERVER['REDIRECT_REMOTE_USER']) && empty($_SERVER['PHP_AUTH_USER']))
        {
            $_SERVER['PHP_AUTH_USER'] = $_SERVER['REDIRECT_REMOTE_USER'];
        }
    }


    public function get_managers()
    {
        $lines = explode("\n", @file_get_contents($this->passwd_file));
        $managers = array();
        foreach($lines as $line)
        {
            if(!empty($line))
            {
                $manager = null;
                $fields = explode(":", $line);
                $manager = new stdClass();
                $manager->login = trim($fields[0]);
                $manager->email = trim($fields[2]);
                $manager->permissions = array();
                if(isset($fields[3]))
                {
                    $manager->permissions = explode(",", $fields[3]);
                    foreach($manager->permissions as &$permission)
                        $permission = trim($permission);
                }
                else
                    $manager->permissions = $this->permissions_list;


                $managers[] = $manager;
            }
        }
        return $managers;
    }


    public function count_managers($filter = array())
    {
        return count($this->get_managers());
    }


    public function get_manager($login = null)
    {
        // Если не запрашивается по логину, отдаём текущего менеджера или false
        if(empty($login))
            if(!empty($_SERVER['PHP_AUTH_USER']))
                $login = $_SERVER['PHP_AUTH_USER'];
            else
            {
                // Тестовый менеджер, если отключена авторизация
                $m->login = 'manager';
                $m->email = 'manager@site.com';
                $m->permissions = $this->permissions_list;
                return $m;
            }


        foreach($this->get_managers() as $manager)
        {
            if($manager->login == $login)
                return $manager;
        }
        return false;
    }


    public function add_manager($manager)
    {
        $manager = (object)$manager;
        if(!empty($manager->login))
            $m[0] = $manager->login;
        if(!empty($manager->password))
        {
            // захешировать пароль
            $m[1] = $this->crypt_apr1_md5($manager->password);
        }
        else
        {
            $m[1] = "";
        }
        if(!empty($manager->email))
            $m[2] = $manager->email;
        if(is_array($manager->permissions))
        {
            if(count(array_diff($this->permissions_list, $manager->permissions))>0)
            {
                $m[3] = implode(",", $manager->permissions);
            }
            else
            {
                unset($m[3]);
            }
        }
         $line = implode(":", $m);
        file_put_contents($this->passwd_file, @file_get_contents($this->passwd_file)."\n".$line);
        if($m = $this->get_manager($manager->login))
            return $m->login;
        else
            return false;
    }


    public function update_manager($login, $manager)
    {
        $manager = (object)$manager;
        // Не допускаем двоеточия в логине
        if(!empty($manager->login))
            $manager->login = str_replace(":", "", $manager->login);
        if(!empty($manager->email))
            $manager->email = str_replace(":", "", $manager->email);


        $lines = explode("\n", @file_get_contents($this->passwd_file));
        $updated_flag = false;
        foreach($lines as &$line)
        {
            $m = explode(":", $line);
            if($m[0] == $login)
            {
                if(!empty($manager->login))
                    $m[0] = $manager->login;
                if(!empty($manager->password))
                {
                    // захешировать пароль
                    $m[1] = $this->crypt_apr1_md5($manager->password);
                }
                if(!empty($manager->email))
                    $m[2] = $manager->email;
                if(isset($manager->permissions) && is_array($manager->permissions))
                {
                    if(count(array_diff($this->permissions_list, $manager->permissions))>0)
                    {
                        $m[3] = implode(",", array_intersect($this->permissions_list, $manager->permissions));
                    }
                    else
                    {
                        unset($m[3]);
                    }
                }
                $line = implode(":", $m);
                $updated_flag = true;
            }
        }
        if($updated_flag)
        {
            file_put_contents($this->passwd_file, implode("\n", $lines));
            if($m = $this->get_manager($manager->login))
                return $m->login;
        }
        return false;
    }


    public function delete_manager($login)
    {
        $lines = explode("\n", @file_get_contents($this->passwd_file));
        foreach($lines as $i=>$line)
        {
            $m = explode(":", $line);
            if($m[0] == $login)
                unset($lines[$i]);
        }
        file_put_contents($this->passwd_file, implode("\n", $lines));
        return true;
    }


    private function crypt_apr1_md5($plainpasswd) {
        $salt = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789"), 0, 8);
        $len = strlen($plainpasswd);
        $text = $plainpasswd.'$apr1$'.$salt;
        $bin = pack("H32", md5($plainpasswd.$salt.$plainpasswd));
        for($i = $len; $i > 0; $i -= 16) { $text .= substr($bin, 0, min(16, $i)); }
        for($i = $len; $i > 0; $i >>= 1) { $text .= ($i & 1) ? chr(0) : $plainpasswd{0}; }
        $bin = pack("H32", md5($text));
        for($i = 0; $i < 1000; $i++) {
            $new = ($i & 1) ? $plainpasswd : $bin;
            if ($i % 3) $new .= $salt;
            if ($i % 7) $new .= $plainpasswd;
            $new .= ($i & 1) ? $bin : $plainpasswd;
            $bin = pack("H32", md5($new));
        }
        $tmp = '';
        for ($i = 0; $i < 5; $i++) {
            $k = $i + 6;
            $j = $i + 12;
            if ($j == 16) $j = 5;
            $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp;
        }
        $tmp = chr(0).chr(0).$bin[11].$tmp;
        $tmp = strtr(strrev(substr(base64_encode($tmp), 2)),
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
        "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
        return "$"."apr1"."$".$salt."$".$tmp;
    }


    public function access($module)
    {
        $manager = $this->get_manager();
        if(is_array($manager->permissions))
            return in_array($module, $manager->permissions);
        else
            return false;
    }
}

2. файл simpla/ManagerAdmin.php

 

<?PHP
require_once('api/Simpla.php');


class ManagerAdmin extends Simpla
{
    public function fetch()
    {
        if($this->request->method('post'))
        {
            $manager = new stdClass();
            $manager->old_login = $this->request->post('old_login');
            $manager->login = $this->request->post('login');
            $manager->email = $this->request->post('email');


            if(!is_writable($this->managers->passwd_file))
            {
                $this->design->assign('message_error', 'not_writable');
            }
            elseif(empty($manager->login))
            {
                $this->design->assign('message_error', 'empty_login');
            }
            elseif($this->managers->get_manager($manager->login) && $manager->login!=$manager->old_login)
            {
                  $manager->login = $manager->old_login;
                  $manager->permissions = (array)$this->request->post('permissions');
                  $this->design->assign('message_error', 'login_exists');
            }
            elseif(empty($manager->email))
            {
                $this->design->assign('message_error', 'empty_email');
            }
            else
            {
                if($this->request->post('password') != "")
                    $manager->password = $this->request->post('password');


                // Обновляем права только другим менеджерам
                $current_manager = $this->managers->get_manager();
                if($manager->old_login != $current_manager->login)
                    $manager->permissions = (array)$this->request->post('permissions');


                if(empty($manager->old_login))
                {
                    $manager->login = $this->managers->add_manager($manager);
                      $this->design->assign('message_success', 'added');
                  }
                else
                {
                    $manager->login = $this->managers->update_manager($manager->old_login, $manager);
                      $this->design->assign('message_success', 'updated');
                  }
                $manager = $this->managers->get_manager($manager->login);


            }
        }
        else
        {
            $login = $this->request->get('login');
            if(!empty($login))
                $manager = $this->managers->get_manager($login);
        }


        if(!empty($manager))
        {
            $this->design->assign('m', $manager);
        }


           return $this->design->fetch('manager.tpl');
    }


}
3. файл simpla/design/html/managers.tpl
заменить
                <div class="user_email cell">
                    <a href="mailto:{$user->name|escape}<{$user->email|escape}>">{$user->email|escape}</a>
                </div>
на
                <div class="user_email cell">
                    <a href="mailto:{$m->name|escape}<{$m->email|escape}>">{$m->email|escape}</a>
                </div>
4. файл simpla/design/html/manager.tpl
заменить
    {if $message_error=='login_exists'}Менеджер с таким логином уже существует
    {elseif $message_error=='empty_login'}Введите логин
    {elseif $message_error=='not_writable'}Установите права на запись для файла /simpla/.passwd
    {else}{$message_error|escape}{/if}

на

    {if $message_error=='login_exists'}Менеджер с таким логином уже существует
    {elseif $message_error=='empty_login'}Введите логин
    {elseif $message_error=='empty_email'}Введите email
    {elseif $message_error=='not_writable'}Установите права на запись для файла /simpla/.passwd
    {else}{$message_error|escape}{/if}

ниже после

        <input class="name" name="login" type="text" value="{$m->login|escape}" maxlength="32"/>

добавить

<input name="email" class="name" type="text" value="{$m->email|escape}" />

5. в файле simpla/.passwd

нужно отсортировать положение содержимого:

0 - логин
1 - пароль
2 - email
3 - права доступа

пример

admin:$apr2$tad31c5n$m8qE.pkzKS3RrJGkHHtk3.:admin@site.com:products,categories,brands,features,orders,labels,users,groups,pages,blog,comments,feedbacks,import,export,backup,stats,design,settings,currency,delivery,payment,managers

список менеджеров

 

 

редактирование менеджера

 

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...