Прокачиваем свой MODx

Нашел в интернете:

Проблема: при увеличении кол-ва страниц на сайте, значительно разрастается кэш сайта. Это связано с тем, что MODx Revolution кэширует все варианты ЧПУ:

  1. ID-документа - ЧПУ
  2. ЧПУ - ID-документа
  3. Родители и дочерние записи и т.п.

В результате на 20 000 страниц мы имеем почти 20 Мб кэш. Мало того, что это просто извращение, подгружать 20 метров кэша для того, чтобы выдать 20 кило конечного HTML, так дело еще в том, что это почти что лимит для MODx Revolution, и 50 000 страниц нам просто  никогда не создать.
Но это в базовой комплектации.  Слава  Богу MODx Revolution имеет очень мощное API, и при желании платформу можно адаптировать практически под любые нужды.
В нашем случае мы поставили для себя задачу - прокачать MODx Revolution  так, чтобы он легко работал с 200 000 документами.
Хотя я  буду максимально подробно все расписывать, все же сразу оговорюсь о необходимых минимальных знаниях, чтобы без труда все это сделать:

  1. PHP ООП
  2. PDO/xPDO
  3. Javascript + ExtJS/Sencha
  4. MySQL
  5. Синтаксис JSON
  6. Средства отладки Ajax-запросов, к примеру Firefox  + Firebug
  7. Синтаксис XML

Разгон MODx Revolution

Отличная статья, помогает в прокачке навыка MODx. 
Все-таки отличная CMS MODx, она достаточно проста, чтобы новичек мог ее освоить и в то же время она очень глубока, что позволяет извращаться над ней как душе угодно :)
Читать далее »

18 регулярных выражений для валидации

  • Номер кредитки:
    [0-9]{13,16}
  • ICQ:
    ([1-9])+(?:-?\d){4,}
  • Набор из букв и цифр (латиница):
    ^[a-zA-Z0-9]+$
  • Набор из букв и цифр (латиница + кириллица):
    ^[а-яА-ЯёЁa-zA-Z0-9]+$
  • Домен (например abcd.com):
    ^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$
  • IPv4: (подкорректировано runcore)
    ((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
  • IPv6:
    ((^|:)([0-9a-fA-F]{0,4})){1,8}$
  • Имя пользователя (с ограничением 2-20 символов, которыми могут быть буквы и цифры, но первый символ обязательно буква):
    ((^|:)([0-9a-fA-F]{0,4})){1,8}$
  • Пароль (Строчные и прописные латинские буквы, цифры):
    ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$
  • Пароль (Строчные и прописные латинские буквы, цифры, спецсимволы. Минимум 8 символов):
    (?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$
  • Дата в формате YYYY-MM-DD:
    [0-9]{4}-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01]) 
    Более строгая проверка, предложенная runcore:
    (19|20)\d\d-((0[1-9]|1[012])-(0[1-9]|[12]\d)|(0[13-9]|1[012])-30|(0[13578]|1[02])-31)
  • Дата в формате DD/MM/YYYY:
    (0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d
  • Целые числа и числа с плавающей точкой (разделитель точка):
    \-?\d+(\.\d{0,})?
  • UUID:
    ^[0-9A-Fa-f]{8}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{12}$
  • Широта или долгота:
    -?\d{1,3}\.\d+ 
  • E-mail (от kvf77):
    ^[-\w.]+@([A-z0-9][-A-z0-9]+\.)+[A-z]{2,4}$
  • URL на латинице. Если нужно распознавать и кириллические домены, необходимо изменить все «a-z0-9» на «а-яёa-z0-9» и добавить в список доменных зон «рф» (от kvf77):
    ~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:ru|su|com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&?+=\~/-]*)?(?:#[^ '\"&]*)?$~i
  • Время в формате HH:MM:SS (от runcore):
    ^([0-1]\d|2[0-3])(:[0-5]\d){2}$
Читать далее »

Новая версия MODx 2.1.2

Вышла новая версия MODx 2.1.2.

Основные изменения:

  • Исправлены проблемы с кэшированием
  • Решена проблема с путями до иконок в менеджере файлов
  • Исправлена проблема со скроллом на настраиваемых страницах админки, которые не используют ExtJS
  • Оптимизация работы с Microsoft SQL Server
  • Улучшение юзабилити админки
Скачать новую версию можно с официального сайта
Читать далее »

Пара классов из SPL для облегчения жизни

SPL расшифровывается как Standard PHP Library. Это набор классов и интерфейсов для решения стандартных задач на PHP. В основном она состоит из различного рода итераторов. Библиотека доступна по умолчанию, начиная с PHP 5.

Приведу несколько примеров, начнем с класса Traversable. Этот интерфейс показывает что к данному объекту применим foreach. Этот базовый интерфейс нельзя реализовать напрямую, а через интерфейсы IteratorAggregate или Iterator.  

Iterator

Iterator - класс для перебора внутренних параметров. Объявление итератора:

Iterator extends Traversable {
/* Методы */
abstract public mixed current ( void ) // Возвращает объект на который указывает итератор
abstract public scalar key ( void ) // Возвращает текущую позицию итератора
abstract public void next ( void ) // Переход к следующему элементу
abstract public void rewind ( void ) // Возврат к началу
abstract public boolean valid ( void ) // Проверка на доступность объекта, на который указывает итератор
}

Каждый из этих методов должен быть реализовать в классе - потомке, реализуя функционал итератора. Приведу пример:

class myIterator implements Iterator {
    private $position = 0; // Текущая позиция
    // Перечень элементов, именно по нему будет бегать итератор
    private $array = array( 
        "firstelement",
        "secondelement",
        "lastelement",
    );  

    // Конструктор, кэп
    public function __construct() {
        $this->position = 0;
    }
    
    function rewind() {
        var_dump(__METHOD__);
        $this->position = 0;
    }

    function current() {
        var_dump(__METHOD__);
        return $this->array[$this->position];
    }

    function key() {
        var_dump(__METHOD__);
        return $this->position;
    }

    function next() {
        var_dump(__METHOD__);
        ++$this->position;
    }

    function valid() {
        var_dump(__METHOD__);
        return isset($this->array[$this->position]);
    }
}

$it = new myIterator;

foreach($it as $key => $value) {
    var_dump($key, $value);
    echo "\n";
}

Как видно из кода, сначала объявляется класс, в которой существует массив, по которому и будет бегать наш итератор. Потом мы пробегаемся по каждому элементу при помощи foreach. В результате выполнения этого кода, будет выведено следующее:

string(18) "myIterator::rewind"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(0)
string(12) "firstelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(1)
string(13) "secondelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(2)
string(11) "lastelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"

По этому коду можно проследить порядок работы итератора. 

ArrayAccess

Этот класс предоставляет возможность обращаться к объекту как к массиву, что в некоторых случаях может сильно облегчить код, а также ввести в когнитивный диссонанс человека, не знакомого с этим интерфейсом.

ArrayAccess {
/* Методы */
abstract public boolean offsetExists ( mixed $offset ) // Существует ли объект с данным ключом.
abstract public mixed offsetGet ( mixed $offset ) // Получение объекта
abstract public void offsetSet ( mixed $offset , mixed $value ) // Присвоение
abstract public void offsetUnset ( mixed $offset ) // Удаление
}

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

Пример:

class obj implements arrayaccess {
    private $container = array();
    public function __construct() {
        $this->container = array(
            "one"   => 1,
            "two"   => 2,
            "three" => 3,
        );
    }
    public function offsetSet($offset, $value) {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }
    public function offsetExists($offset) {
        return isset($this->container[$offset]);
    }
    public function offsetUnset($offset) {
        unset($this->container[$offset]);
    }
    public function offsetGet($offset) {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }
}

$obj = new obj;

var_dump(isset($obj["two"]));
var_dump($obj["two"]);
unset($obj["two"]);
var_dump(isset($obj["two"]));
$obj["two"] = "A value";
var_dump($obj["two"]);
$obj[] = 'Append 1';
$obj[] = 'Append 2';
$obj[] = 'Append 3';
print_r($obj);

В результате получили:

bool(true)
int(2)
bool(false)
string(7) "A value"
obj Object
(
    [container:obj:private] => Array
        (
            [one] => 1
            [three] => 3
            [two] => A value
            [0] => Append 1
            [1] => Append 2
            [2] => Append 3
        )
)

При правильном использовании поможет вам сделать ваш код лаконичнее и красивее. 

Читать далее »

Про Битрикс веб-кластер

Нашел на Хабре:

Добрый день, коллеги!

Сегодня хочу рассказать о технологиях кластеризации, которые появились в 10-й версии платформы 1С-Битрикс. Также разберем, какие важные задачи они позволят решить Вам, как руководителю веб-проекта и как эффективно использовать данные технологии, если Вы — разработчик. В конце статьи рассмотрим конкретные архитектуры работающих веб-кластеров на платформе 1С-Битрикс, в т.ч. ресурса www.1c-bitrix.ru.

Но прежде — постараемся объективно ответить на вопрос — в каких случаях все же целесообразно для реализации веб-проекта выбирать фреймворк или коробочное решение, а в каких — создавать веб-проект «с нуля».

Технологии кластеризации — повышаем надежность и производительность веб-проекта 

Читать далее »

Про псевдоклассы

Нашел в интернете:

  • :link — отвечает за стили непосещенной ссылки;
  • :hover — состояние объекта (не обязательно ссылки) при наведении на него мышкой;
  • :active — состояние активного объекта (например, для ссылки и зажатие ее мышкой);
  • :visited — состояние посещенной ссылки;
  • :focus — когда вы используете какой-то объект на страницы, то на нем устанавливается фокус (в случае и текстовым поле это постановка курсора в это поле);
  • :first-child — первый дочерний элемент текущего элемента;
  • :last-child — соответственно, последний дочерний элемент чего-то;
  • :only-child — применяет стиль к элементу, если он единственный дочерний элемент;
  • :nth-child() — какой-то по счету с начала дочерний элемент, например p:nth-child(4);
  • :nth-last-child() — аналогично, только отчет с конца; интересно, что в этом и предыдущем селекторах можно задавать не только конкретные цифры, но и счетность, к примеру вот так: ul li:nth-last-child(2n+1);

Псевдоклассы в CSS 

Временно.нет радует.

Читать далее »

Создание компонента Битрикса.

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

Структура папки компонента имеет вид:

Компонент Битрикс

Разберем каждый файл отдельно.

Читать далее »

Материалы конференции DevCon`11

Опубликованы материалы конференции DevCon`11. Это, конечно, Microsoft конфренция, а ее продуктами я при веб-разработке почти не пользуюсь, но есть несколько докладов которые меня заитересовали, в осном они касаются стартапов.

Программа конференции

Выбор статегии стартапа 

Карьера разработчика - кому вы будете нужны завтра и  сколько вам станут платить 

Свой стартап: не так страшно, как вам кажется + Communication Tube: Стартап-экспертиза 

Примеры успешных бизнес-моделей последних лет

Читать далее »
Scroll To Top