Template CMS 2.0 - cms работающая на файлах

Awilum

Новичок
Здравствуйте
Разрешите представить свою разработку, над которой работаю в свободное от работы время.
Называется она Template CMS. Была простая идея сделать отечественную быструю и легкую CMS работающую на файлах
и предназначенную для сайтов: сайт-визитка, сайт-домашняя страничка, сателлит, сайт-блог.

Это пока не релиз, но все же кое что она уже умеет.

Основные возможности системы:
- Простота установки, использования и обновления.
- Удобный интерфейс администрирования.
- Минимальные требования к хостингу (без MySQL только PHP)
- Многоязычный интерфейс администрирования.
- Ключевые слова и описание как для каждой страницы так и для всех.
- Удобный редактор страниц (WYSIWYG - What You See Is What You Get)
- Возможность задать индивидуальный шаблон для любой страницы.
- Смена тем оформления в один клик.
- Легкость разработки и интеграции новых тем оформления.
- Расширяемость системы благодаря гибкому и удобному Plugin API
- Поддержка ЧПУ

Template CMS распространяется на условиях GNU GPL 3
Бесплатная и свободная.

Скриншоты:
http://templatecms.webdevart.ru/screenshots

Скачать:
http://rghost.ru/3852750

Google Code
http://code.google.com/p/templatecms/

Просьба оценить Template CMS 2.0 с точки зрения: дизайна, юзабилити, исходного кода и безопасности.
Хотелось бы услышать дельных советов от данного сообщества.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Для сайтов-визиток Modx-а и WP-выше криши.
Ты задавал себе банальные вопросы
"Чем твоой продукт, ну кроме полного остуствия OOП, уникален?
Чем ты можешь сманить к себе "натягивателей" шаблонов на модХ, ВП?

global $lang - это вообще 3.14здец.
На этом я остановился.
Ты учился по книгам из прошлого тысячелетия? Так выкидывай их побыстрее.
Я уже молчу про банальный гет-текст.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Я процитирую твои преимущества
- Простота установки, использования и обновления.
Это есть практически в любой уважающей себя cms
- Удобный интерфейс администрирования.
Смотри п.1
- Минимальные требования к хостингу (без MySQL только PHP)
Я тебя умоляю. Пора хостингов без Mysql канула в прошлом тысячелетии.
- Многоязычный интерфейс администрирования.
Смотри п.1
- Ключевые слова и описание как для каждой страницы так и для всех.
Смотри п.1
- Удобный редактор страниц (WYSIWYG - What You See Is What You Get)
Смотри п.1
- Возможность задать индивидуальный шаблон для любой страницы.
Смотри п.1
- Смена тем оформления в один клик.
Смотри п.1
- Легкость разработки и интеграции новых тем оформления.
Смотри п.1
- Расширяемость системы благодаря гибкому и удобному Plugin API
Смотри п.1
- Поддержка ЧПУ
Смотри п.1

Еще плюсы есть?
Только ненадо щас слюной брызгать.
 

fixxxer

К.О.
Партнер клуба
да ладно... все когда-то писали cms и гордились своим говнокодом, это нормально.

ненормально если через пару лет он будет считать это нормальным =)
 

Awilum

Новичок
Когда я написал это:
Просьба оценить Template CMS 2.0 с точки зрения: дизайна, юзабилити, исходного кода и безопасности.
Хотелось бы услышать дельных советов от данного сообщества.
То не хотел бы что оценка перешла на личности, как ходят слухи про PHPCLUB.


Notice: Undefined offset: 0 in Z:\home\test\www\template_cms\engine\Uri.php on line 87
Notice: Undefined offset: 0 in Z:\home\test\www\template_cms\engine\Uri.php on line 92
есть это проблема, зараза у меня при включенном дебагинге почему то не показалась.


"Чем твоой продукт, ну кроме полного остуствия OOП, уникален?
ООП делает программные продукты уникальными ?
Предпосылками к созданию этой CMS были: на практике освоить php,css,html а затем и js.
Получить опыт программирования на практике. Взял эту тему и веду ее по мере возможности.

global $lang - это вообще 3.14здец.
Аргументы, советы, предложения я могу услышать по этому поводу ?
Я для этого создал тему, что бы услышать советов более опытных программистов.
А не оскорбления в мою сторону..

Я уже молчу про банальный гет-текст.
Можно подробнее, вы про что ?
 

AmdY

Пью пиво
Команда форума
Mr_Max
я подредактировал его заглавный пост, выделил чем отличается от modx и wp - без MySQL. так что вполне найдёт своего пользователя, да и код для того сегмента вполне нормальный.
то, что не используешь классы, возможно, верное решение, но вот объектности добавить бы не помешало, тогда можно было бы делать нормальное АПИ, которое сейчас практически отсутствует.
 

HraKK

Мудак
Команда форума
Awilum
Расслабься и внимай каждому слову что тебе тут скажут, а гордыню свою заткни глубоко подальше. Это так, совет, которого ты не послушаешь.

П.С. и молись чтоб я не скачал )))
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
есть это проблема, зараза у меня при включенном дебагинге почему то не показалась.
Это означает, что он у тебя не включен.
phpfaq.ru/debug

Аргументы, советы, предложения я могу услышать по этому поводу.
Ты все "заворачиваешь" в функции. Ну так заверни языковые переменные в функцию. И по запросу отдавай нужное.
global юзать это последнее дело.

Можно подробнее, вы про что ?
google://gettext

Получить опыт программирования на практике. Взял эту тему и веду ее по мере возможности.
Ну начальный опыт ты получил. Пора двигаться дальше
 

fixxxer

К.О.
Партнер клуба
То не хотел бы что оценка перешла на личности, как ходят слухи про PHPCLUB.
А не оскорбления в мою сторону..
Вот оттуда слухи и идут, что люди считают "твой код - говно" и "ты дурак" идентичными высказываниями :D


Предпосылками к созданию этой CMS были: на практике освоить php,css,html а затем и js.
Дык тогда нормально, че. у меня первое что я писал хуже было намного. :)

Но тут это конечно все будет мало кому интересно. Про ООП поймешь когда будешь делать что-то намного сложнее, чем
сайт-визитка, сайт-домашняя страничка, сателлит, сайт-блог
 

Духовность™

Продвинутый новичок
Mr_Max
Да ладно тебе, человек учится. Он уже написал мало-мальски готовый продукт, уже хорошо. Куда лучше лентяев-халявщиков, пробивающих себе путь в IT посредством чужого труда, чужих продуктов и решений.

Awilum
Молодец, что написал свою CMS. Получил опыт. Теперь откажись от идеи развития этой CMS, она никому кроме тебя не нужна. Хотя бы потому, что не использует СУБД. Сосредоточь свое внимание на архитектуре, на современных тенденциях в области разработки ПО. Это действительно важно. Ты поймешь, почему
global $lang - это вообще 3.14здец.
и научишься делать более качественные вещи. А CMS эту доделывай как хобби, чисто для души, но не питай иллюзий насчет её публичного opensource развития.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Духовность™
Трим, ну вот если не сбежит, и сделает выводы - будет толк с товарища.
В противном случае будет прибавление в кагорте:
То не хотел бы что оценка перешла на личности, как ходят слухи про PHPCLUB
Хотя врядли. :D
ТС тут походу надолго =)))
 

AmdY

Пью пиво
Команда форума
Awilum
если хочешь, можно разобрать какой-нить модуль досконально, а так кода много и проще сказать - всё говно. можешь в скайп постучаться.
 

Awilum

Новичок
по поводу $lang

global $lang;
...
echo $lang['some_text'];

заменить лучше на такой вариант ?

function lang($key) {
global $lang;
return $lang[$key];
}

...

echo lang('some_text');
 

fixxxer

К.О.
Партнер клуба
PHP:
    function readable($file) {
        return is_readable($file);
    }
итп - зачем?
PHP:
   function copyFile($from, $to) {
        if (file_exists($from) && !file_exists($to)) {
            copy($from, $to);
        }
    }
как отличить успешный результат от неуспешного?

PHP:
$zip = new ZipArchive();
global $zip;
первое минимальное улучшение без изменения логики - синглтон:
PHP:
function zip() {
    static $instance;
    if (!isset($instance)) {
        $instance = new ZipArchive;
    }
    return $instance;
}
и %s/$zip->/zip()->/g
но на самом деле непонятно с какой радости у нас тут синглтон
 

Вурдалак

Продвинутый новичок
Либо надо первым параметром передавать $zip, либо смириться с тем, что в процедурном варианте это выглядит неважно.
 

AmdY

Пью пиво
Команда форума
я правда, предлагал расмотреть модуль, чтобы доказать непродуманность апи, но ладно, полезем в ядро
PHP:
<?php  if (!defined('TEMPLATE_CMS_ACCESS')) exit('No direct script access allowed'); // нафик? у тебя всё равно весь код в функциях и ничегно не выполнится


    /**
     *  Filesystem module
     *  @package TemplateCMS
     *  @subpackage Engine
     *  @author Romanenko Sergey / Awilum
     *  @copyright 2010 Romanenko Sergey / Awilum
     *  @version SVN: $Id$
     *  @since 2.0
     *  @license http://opensource.org/licenses/gpl-license.php GNU Public License
     *  TemplateCMS is free software. This version may have been modified pursuant
     *  to the GNU General Public License, and as distributed it includes or
     *  is derivative of works licensed under the GNU General Public License or
     *  other free or open source software licenses.
     *  See COPYING.txt for copyright notices and details.
     *  @filesource 
     */
         


     /**
      * Get list of files in directory
      * @param string $dir directory to scan
      * @param string $type file type
      * @return array $files
      */
     function listFiles($dir, $type=NULL) { // есть такая клёва штука как неймспэйсы, чтобы имена не пересекались 
// например, templatecms_filesystem_listFile()
        $files = array();
        if(is_dir($dir)) {
            $dir = opendir ($dir);
            while (false !== ($file = readdir($dir))) {
                if(($file !=".") && ($file !="..")) {
                    if(isset($type)) {
                        if (strpos($file, $type,1)) {
                            $files[] = $file;
                        }
                    } else {
                        $files[] = $file;
                    }
                }
            }
            closedir($dir);
            return $files;
        } else {
            echo '<span style="color:#9C4F4F;">Error: Wrong directory ( '.$dir.' )</span>'; // здесь должна добавляться ошибка в какой-нить стек, а не делаться сразу вывод пользователю
        }
     }




     /**
      * Create new file
      * @param string $filename filename
      * @param string $content content to save
      * @param string $old_filename old filename turn on rename mod
      * @todo test it!
      */
    function createFile($filename, $content, $old_filename=NULL) {
        $space = '-';


        if(!empty($old_filename)) {
            $new_cl_space = str_replace(" ", $space, $filename);
            $new = translitIt($new_cl_space);
            if($old_filename !== $new) {
                rename($old_filename,$new);
                $save_filename = $filename;
            } else {
                $save_filename = $filename;
            }                            
        } else {
            $save_filename = $filename;
        }
                


        $save_cl_space = str_replace(" ", $space, $save_filename);
        $save = translitIt($save_cl_space);

// file_put_contents ???
        $handle = fopen ($save,"a");
        flock ($handle,LOCK_EX);
        ftruncate ($handle,0);
        fputs($handle,$content);
        fflush ($handle);
        flock ($handle,LOCK_UN);
        fclose ($handle);
    }


     /**
      * Delete current file
      * @param string $filename filename
      */
    function deleteFile($filename) {
        if(file_exists($filename)) {
            unlink($filename);
        }
    }




    /**
     * Rename file
     * @param string $from Original file location
     * @param string $to Desitination location of the file
     */
    function renameFile($from, $to) {
        if (!file_exists($to)) {
            return rename($from, $to);
        }
    }


    function loadFile($file) {
        if(file_exists($file)) {
            return file_get_contents($file);
        }
    }


    /**
     * Updates the file modified time to the current time
     * @param string $file filename
     * @return boolean
     */
    function touchFile($file) {
        return touch($file);
    }


    /**
     * Determines if a file is writable
     * @param string $file filename
     * @return boolean  
     */
    function writable($file) { // гениально, здесь наверняка глубокий смысл
        return is_writable($file);
    }


    /**
     * Determines if a file is readable
     * @param string $file filename
     * @return boolean
     */
    function readable($file) {
        return is_readable($file);
    }


    /**
     * Copy file
     * @param string $from Original file location
     * @param string $to Desitination location of the file
     * @todo test it!
     */
    function copyFile($from, $to) {
        if (file_exists($from) && !file_exists($to)) {
            copy($from, $to);
        }
    }


    /**
     * Creates a directory
     * @param string $dir name of directory to create
     */
    function createDir($dir) {
        if (!is_dir($dir)) {
            mkdir($dir, 0775);
        }
    }


    /**
     * Delete directory
     * @param string $dir name of directory to delete
     * @todo test IT!
     */
    function deleteDir($dir) {
        if (is_dir($dir)) $dir_handle = opendir($dir);
        if ($dir_handle) {
            while($file = readdir($dir_handle)) {
                if ($file != "." && $file != "..") {
                    if (!is_dir($dir."/".$file)) {
                        unlink($dir."/".$file);
                    } else {
                        delete_directory($dir.'/'.$file);
                    }
                }
            }
            closedir($dir_handle);
            rmdir($dir);
        }
    }


    /**
     * Check dir permission
     * @param string $dir directory to check
     * @return string
     */
    function checkDirPerm($dir) {
        clearstatcache();
        return substr(sprintf('%o', fileperms($dir)), -4);
    }




    
    /**
     * Extension enables to transparently read or write
     * ZIP compressed archives and the files inside them.
     */
    $zip = new ZipArchive(); // а вот и всё дерьмо откуда растёт, можно было обойтись templatecms_filesystem_getZip()
// а не гадить в глобальную область видимости
// и не понятно, зачем завязываться на расширение.


    


    /**
     * Zip folders
     * @global object $zip
     * @param string $folder
     * @param string $zip_name
     */
    function zipFolders($folder, $zip_name=NULL) {
        global $zip;


        $files = array();


        $interator = new RecursiveDirectoryIterator($folder);
        foreach(new RecursiveIteratorIterator($interator) as $file) {
            $files[] = $file;
        }


        if(!empty($zip_name)) {
            $folder = $zip_name;
        }


        if ($zip->open($folder.'.zip', ZipArchive::CREATE) === true) {
            foreach($files as $file) {
                $zip->addFile($file, $file);
            }
            $zip->close();
        }
    }


    /**
     * Zip file
     * @global object $zip
     * @param string $file
     * @param string $zip_name
     */
    function zipFile($file, $zip_name=NULL) {
        global $zip;


        if(!empty($zip_name)) {
            $file = $zip_name;
        }


        if ($zip->open($file.'.zip', ZipArchive::CREATE) === true) {
            $zip->addFile($file, $file);
            $zip->close();
        }
    }




    /**
     * Unpack zip
     * @global object $zip
     * @param string $file
     */
    function unZip($file) {
        global $zip;
        if($zip->open($file) === true) {
            $zip->extractTo(basename($file,'.zip'));
            $zip->close();
        }
    }
?>
 
Сверху