Давайте посмотрим мою ЦМС

Neuron

Новичок
PHP:
foreach ($files as $file) {
	require_once($file);
}
Почему подключаешь все файлы, а не только те, что нужны только во время работы?

PHP:
list($usec, $sec) = explode(" ", microtime());
можно заменить просто на microtime(true);


PHP:
$_COOKIE	= strip($_COOKIE);
$_GET		= strip($_GET);
$_POST		= strip($_POST);
я бы заменил бы на что-то типа такого
PHP:
if (get_magic_quotes_gpc()) {
    $_POST   = array_map('strip', (array) $_POST);
    $_GET    = array_map('strip', (array) $_GET);
    $_COOKIE = array_map('strip', (array) $_COOKIE);
  }
 

Активист

Активист
Команда форума
Почему подключаешь все файлы, а не только те, что нужны только во время работы?
Если они там лежат, то они все там нужны. Те, которые не нужны удаляются, это позволяет инсталировать модули простым копированием, если нужы какие-либо либы, то собственно заливается в rc.d скрипт инициализации, то что к ядру - в classes/. Инклудить форичем как-то стало удобнее, не надо замарачиваться с редактированием файлов.

Сабж находится в функции, хотя да, очевидней вытащить в точку входа.

getmicrotime выпилится, либо оформиться в dev|public версии.
 

Активист

Активист
Команда форума
о каком холиваре речь, если я открыв в браузере код вижу нечитабельный пиздец? статья - говно. автора параллельной статьи заклевали действительно тупые ламеры, не знающие, что любая система при нажатии табуляции ставит пробелы.
Сделай чекоут и открой в редакторе

.
 

Активист

Активист
Команда форума
Кстати, сейчас начну разрабатывать модуль страниц, до завтрашнего вечера надо сделать. Так вот , идея какая:
1. Сделать объект типа "страницы" с типичным набором аттрибутов и методов
2. Помимо типичных аттрибутов и методов интегрировать верхную прослойку, скажем "хранилище" (надо в большой четверки найти подходящий название паттерна), фактически это будет синглтон, работа с котором будет внедрен в основные методы аггрегатора и работы с объектами родителями/детьми, прослойка будет фактически хранить все ранее запрошенные из БД объекты (или при необходимости инициализироваться всеми объектами типа страницы, скажем для построения всего дерева). Эта прослойка позволить вытаскивать родителей/потомков из БД лишь единожды, что позволить минимизировать количество запросов к БД при множественном обращении к типу "страницы" из разных виджетов, а также при повтором изолирвоанном запуске модуля (скажем , в результате интеграции).

Вообще, идея внедрения хранилища мне как-то очень понравилась (пришла в голову), ведь хранилище, как объект, можно серилизовать и отправить в файлов кеш/кеш памяти, конечно, там, где это надо. Единственное, нет замеров по скорости по поводу серилизации/десерилизации множества объектов, нужно будет сделать.
 

cDLEON

Онанист РНРСlub
Вот о синглтонах я и говорил. Они очень редко нужны в вебе. Вернее, я бы даже сказал, в 99% случаев, они являются симптомом плохой архитектуры.
Теперь о "хранилище". Какой смысл "минимизировать" запросы к БД, которые делаются по примари индексам? Какой от этого профит? Ты можешь придумать задачу в вебе, в которой имеется 2+ "виджетов", которые, в свою очередь, могут отображать одинаковую инфу ?
И третий, последний вопрос. Что, если тебе нужно будет засунуть какой то свой виджет своей КМСки, в чужой код ? Такие задачи очень часто возникают. А два виджета ?
 
http://svn.local.prime-gr.ru/svn/baikalia.web.local/core/functions.php

PHP:
function genRandomString($len = 10) {
		$buffer = "qwertyuiopasdfghjklzxcvbnm1234567890";
		$return = "";
		for ($i = 1; $i <= $len; $i++) {
			$return .= substr($buffer, mt_rand(0, strlen($buffer)-1), 1);
		}
		return $return;
		
}
Субъективное мнение - это немного пошло. Комбинаций меньше - коллизий больше.
Может попробуйте, что-либо из уже имеющихся аналогов. Скажем: PHPClasses Package

Кстати, в дополнение проверки версии PHP, насколько я помню, абстрактные классы в PHP4 не поддерживались (прошу старожилов подправить, если ошибаюсь) и проверку на наличие PHP5 ставить придется в любом случае.

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

Активист

Активист
Команда форума
Вот о синглтонах я и говорил. Они очень редко нужны в вебе. Вернее, я бы даже сказал, в 99% случаев, они являются симптомом плохой архитектуры.
Теперь о "хранилище". Какой смысл "минимизировать" запросы к БД, которые делаются по примари индексам? Какой от этого профит? Ты можешь придумать задачу в вебе, в которой имеется 2+ "виджетов", которые, в свою очередь, могут отображать одинаковую инфу ?
И третий, последний вопрос. Что, если тебе нужно будет засунуть какой то свой виджет своей КМСки, в чужой код ? Такие задачи очень часто возникают. А два виджета ?
Хм. Первый раз слышу, что бы одиночки были "плохим тоном". Одиночки нужны тогда, когда нужно обеспечить уникальность объекта, в случае, например тип "core" и я не думаю, что это как-то зависит от типов проекта. Да, мне интересно, конечно услышать в чем это плохо, а главное как без них обойтись.

По поводу второго - это применение "кусков" из этой системы в других проектах. Что бы ответить на этот вопрос, я слегка объясню суть.
Загрузчик, в частности - /core/core.php обеспечивает загрузку всех классов, и все. Сама система начинает работать только после того, как выполняется первый запрос интерфейса модуля
($controller = core::getInstance()->modulesInterface()->start())
По сути этот запрос на вызов интерфейса доступа запускает всю систему, создаются множество объектов, но, лишь те, которые понадобились. Так, если посмотреть цепочку, то при запуске модуля, создает обект типа urlInterface, который начинает парсить урл (описан в конструкторе). Задача парсинга урлы на всем этапе будет всего один раз, это обеспечивает родитель core, который синглтон, далее, если нужно рождается обект типа languageInterface и так далее.

Сама система на начальном этапе загрузки вообще не пораждает обектов, так, если не будет необходимости обратиться, скажем к usersInterface из любой части приложения (будь то модуль, шаблон или виджет), то он так и не будет рождает, по сути это своего рода набор инструментов в гараже, они есть, но могут и не понадобиться, при этом они не мешают. За все это отвечают именно интерфейсы доступа.

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

Использование виджетов в сторонних проектах. Во-первых, я сомневаюсь, что большинство систем вообще поддерживают подобные интеграции, но давайте представим, что у меня появилась такая задача. Вся система делится на модули, в которых есть контроллер, модель и вид, при этом, контроллер и модель модели отвечают только за реквисты, все остальное лежит на плечах аггрегаторов и самих типов. Так, например, если где-то в чужом коде мне понадобилось использовать непосредственно объекты (т.е. те данные, с которым я буду работать), скажем country и city, то мне будет достаточно создать новый класс типа countryPHPbb который унаследуется от типа country. В этом классе, скорее всего, я опишу лишь изменения, касающиеся записи объектов и все. Фактически, эти объекты изолированы от системы в целом, и являются независимыми.

По поводу хранилища надо делать замеры.
 

Mols

Новичок
1. Вот это что за прикол здесь ?
PHP:
	/**
	 * Load all countries
	 * @return void
	 */
	public function loadAllCountries(MySQL $MySQL) {
		$countriesAggregator = new countriesAggregator();
		$countriesAggregator->loadAll($MySQL);
		$this->countries = $countriesAggregator->all();
	}
Зачем передаётся объект базы?
Сделайте какой нить доступ к текущему адаптеру, чтобы явно не передавать и не ограничивать только МуСКЛ.

2. Здесь в один метод явно передаётся тот же объект в другом получается вот таким образом
PHP:
$MySQL = core::getInstance()->databaseInterface()->MySQL();
3. Все мапперы приведите к какому-то общему интерфейсу. Последнее время лично я склоняюсь к тому, что мапперы должны иметь набор методов близкий к этому. То есть маппер использует объект запроса и проксирует большинство методов этого объекта.
Но например не проксирует метод from(...). Это значение может(и обязан) установить только маппер. Такой подход позволит конструировать массу различных выборок не изменяя код маппера.

4. вот это что ?
PHP:
private function setUrl() {
		$this->url = "/".
					 core::getInstance()->languageInterface()->getCurrentLanguage().
					 "/".
					 core::getInstance()->modulesInterface()->currentModule.
					 "/".
					 $this->getCountry()->getUrlPart().
					 "/".
					 $this->urlPart.".html";
	}
Почему путь создаётся в объекте "страны"? Тем более часть отвечающая за локализацию? В каждом классе будете это делать?
ИМХО надо что-то вроде.
PHP:
core::getInstance()->getRouter()->makeUrl($this)
ну и находиться этот метод должен в каком-то общем паренте сущностей(которые стоит отделить от мапперов)


Это всё очень поверхностно конечно.... надеюсь чем-то поможет.
 

Активист

Активист
Команда форума
ok
Спасибо за конструктивные замечания.

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

PHP:
class router {
	function makeUrl($object)  {
		if ($object instanceof city) {
			return 	 "/".
					(EASYCMS_MULTI_LANG ? core::getInstance()->languageInterface()->getCurrentLanguage()."/" : "").
                     core::getInstance()->modulesInterface()->currentModule.
                     "/".
                     $object->getCountry()->getUrlPart().
                     "/".
                     $object->urlPart.".html";
		}
	}
}
В любом случае, у каждого объекта будет строится по своей технологии урл, хотя можно классифицировать по:
- ограниченная вложенность
- древовидные

Например, для ограниченной вложенности использовать что-то подобное выше, а вот для древовидных уролов с отношениями родитель/ребенок ввести абстрактный метод, который нужно будет обязательно описывать для таких типов объектов. Вот первое, что пришло в голову:
PHP:
class router {
	function makeLevelsUrl(treeObject $object)  {
		$url = array(core::getInstance()->languageInterface()->getCurrentLanguage());
		foreach ($object->getParents() as $parent) {
			$url[] = $parent->getUrlPart();
		}
		return "/".implode("/", $url)."/".$object->getUrlPart().".html";
	}
}

class page implements treeObject {
	public function getParents() {
		return $this->parents;
	}
}

interface treeObject {
	public function getParents();
	public function getUrlPart();
}
Как лучше?
 

Mols

Новичок
Активист
Роутер не должен брать текущий модуль/контроллер/актион. Всё это потребуется изменять. То есть ссылки из одного модуля на другой и т.п По дефолту он конечно может устанавливать текущие. Но должен быть интерфейс для того, чтобы устанавливать эти параметры.

Хардкорить можно конечно... но можно и в конфигах писапть.... сущность такая-то следовательно модуль такой-то, актион такой-то

Вообще вот для размышлений.
То есть, конечно, лучше почитать и сделать свой вывод)))
Я пока склоняюсь к тому, что для каждой сущности должно быть определено вот это

PHP:
array(
    'action'     => 'view',
    'controller' => 'post',
    'module'     => 'blog',
    'params'     => array('id' => null)
);
То есть ИД есть в любом случае. Кроме ИД у меня гарантированно есть "имя сущности" Ну скажем "CityEntity" (можно сделать общий метод типа getParams и дополнять параметры если нужно что-то кроме ИД и имени сущности)
Этого уже достаточно, чтобы отобразить в общем то даже дерево (при условии что сущность умеет возвращать сущность своего " родителя").
Допустим есть путь "Планета-Континент-Страна-Город"
Вот идет запрос на действие для отображения города..
Получили город. Потом делаем
PHP:
   $o->getParent();
Для города и для всех вышестоящих.
И даже если где-то будет структура вида "Планета-Страна-Город" (пропущен континент), то мы всё равно получим всю цепочку.
Остаётся только вид создать такой, чтобы он умел отображать дерево родителей.


Если же будет иерархия "коммент - коммент_к_комменту....." и т.д., то скрипт вида ещё проще.
Но !!! Я никогда не делал именно ЦМС ! имейте это в виду ))) Это всё немного из другой оперы, но суть похожа вроде.
 

fixxxer

К.О.
Партнер клуба
Когда я зашел в тред, первая мысль - какой **** поднял тему десятилетней давности?

Не, правда, че тут обсуждать то =)
 

Mols

Новичок
fixxxer
эм.... а чо?
Как раз полезное дело я считаю... ветка может и не та... это на офтоп тянет...
А польза как минимум для Активист есть.
Любой взгляд со стороны это гуд)))
 

fixxxer

К.О.
Партнер клуба
Не, просто первая мысль, как раз раньше такие обсуждения были в моде.

В 2011 году я, если честно, не понимаю смысла написания подобных вещей с нуля. Разве что для самообучения. Непрактично совершенно.
 

Духовность™

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

В 2011 году я, если честно, не понимаю смысла написания подобных вещей с нуля. Разве что для самообучения. Непрактично совершенно.
Омич, ты не прав.
 

fixxxer

К.О.
Партнер клуба
Духовность™

Ну ты известный велосипедист, ты бы и этот форум, например, сел с нуля писать. :)
 

vovanium

Новичок
http://svn.local.prime-gr.ru/svn/baikalia.web.local/core/classes/class.mysql.php

PHP:
$this->query("SET NAMES 'cp1251'");
        self::$count--;
        $this->query("SET CHARACTER SET 'cp1251'");
        self::$count--;
        $this->query("SET @@collation_connection = cp1251_general_ci");
        self::$count--;
А зачем тут вообще 3 запроса? достаточно одного SET NAMES, а еще лучше mysql_set_charset, так как без нее функция mysql_real_escape_string не будет правильно работать (хотя для русскоязычных сайтов это и не особо актуально).
 

Alien85

I like my cat
раз уж создаете цмс в 2011 году, так используйте пространства имен!

да и на цмс код не тянет, максимум очередной фреймворк для себя. В цмс главное - модульность, причем очень строгая, один модуль не влияет на работу другого.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Alien85
2011 и пространства имен как-то связаны? Есть суть в пространствах? Зачем они нужны? В данном случае?

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

PS: Активист, не слушай их, если есть тяга - пиши и делай.
 
  • Like
Реакции: craz
Сверху