Вы, наверное, уже читали интересную статью о том, как можно отключать эффекты :hover при скроле – это позволяет здорово сохранить отзывчивость сайта, но имеет один недостаток – вам приходится опираться на один общий класс, и это плохо.
До вольно не редко приходиться на ходить враз личных текст ах не сколько о шибок. При чём большая части на писано во общем то грамот но, но нет-нет да и на рвётся глас на не верное при мнение слово форм. На пример из вечное не верное из пользование со ответствующих пост фиксов. По мимо э того в друг от делиться при ставка или при лепиться пред лог, как до ста точный при мер, и к роме того не редко до водиться не на ходить за пятых на за конных места х.
В той связист ала по степенно при ходит мыс ль что не плохо бы на ваять та кой пост в ко тором бы лоб макс и мал но воз можно е коли чес т во о шибко но что бы тестовый процесс ор да же бы и не за подозревал об том что что-то тут не так. Но что бы при том сам текст был на имение читаем им.
Топик рассказывает о настройке быстрого и недорогого хостинга для MODx Revolution. В принципе, вещи тут описаны общие, так что информация подойдет для любой CMS. Позже была смонтирована и видеоверсия этой инструкции.
На всякий случай, приложу видео, как должна работать админка MODx Revo.
Для быстрой и комфортной работы желательно:
Быстрый браузер — Google Chrome. Админка Revo работает в нем молниеносно
Хороший интернет-канал. Тут без вариантов, нужно всем и всегда.
Качественный хостинг — про него и пишу.
В конце поста есть ссылки на скрипты для автоматической установки MODx с созданием юзера, хоста nginx, процесса php5-fpm и базы дынных.
В статье я собрал советы по использованию media query. Расскажу, как можно более эффективно использовать media query. В конце статьи есть список использованных источников.
Хочу представить вашему вниманию свою разработку по быстрому выводу контента на сайтах MODX Revolution.
Как известно, эта система целиком построена на собственной ORM под названием xPDO. Она очень упрощает работу, позволяет писать один универсальный код для разных БД, и еще много чего.
К сожалению, она не может похвастаться скоростью вывода (как, наверное, вообще любая ORM), поэтому я попробовал совместить её плюсы с обычным PDO, добавить лучшую работу с чанками и сделать удобную библиотеку для MODX.
Основные особенности:
Быстрая работа с БД. Все запросы составляются на xPDO, а выбираются без объектов — на PDO.
Предварительная обработка простых плейсхолдеров в чанках. Парсер MODX разбирается только со сложными вызовами.
Код чанков можно указывать прямо при вызове сниппета, загружать обычным образом или из статичных файлов.
Правильная сортировка, подготовка, обработка и вывод ТВ параметров.
Ведение подробного журнала работы сниппета с отметками времени, для отладки.
Удобная загрузка классов и множество функций, которые можно применять в своих разработках.
В комплекте 8 универсальных сниппетов, которые дают хороший базис разработчику.
Не устаю удивляться возможностям, которые предоставляет компонент MIGX от Bruno17 для MODX Revolution. Выглядит он пока неказисто и встречаются ошибочки, но критических проблем нет. Всё, что написано в этой статье, актуально для MIGX версии 2.5.8-pl (последняя на данный момент).
Многие используют MIGX для создания фотогалерей, но этим его функционал не ограничивается. Это настоящий конструктор для управления данными любых таблиц БД. Можно даже выводить список дочерних ресурсов (документов MODX) в любом контейнере. Об этом и пойдет речь в данной статье. Кое что я узнал из документации MIGDB, но, на сколько я понял, она уже порядком устарела и многое из описанного там просто не работает.
В данном посте я расскажу о наиболее интересных командах, которые могут быть очень полезны при работе в консоли. Однозначных критериев определения какая команда лучше другой — нет, каждый сам для своих условий выбирает лучшее. Я решил построить список команд на основе наиболее рейтинговых приемов работы с консолью от commandlinefu.com, кладовой консольных команд. Результат выполнения одной из таких команд под Linux приведен на картинке. Если заинтересовало, прошу под кат.
Компания Brainbench, как уже было год назад, объявляет о возможности сдать 600 сертификатов бесплатно (так называемые Bench Games).
Для этого достаточно пройти по ссылке и войти в свой аккаунт на Brainbench или зарегистрироваться на сайте, а потом зайти в раздел поиска сертификатов.
Одно но. Если год назад бесплатно выдавали хотя бы электронные сертификаты, теперь этого нет.
*These certification tests do not include electronic or paper certificates.
По всей видимости, единственная возможность похвастаться своим сертификатом — дать ссылку на свой аккаунт на Brainbench с разделом полученных сертификатов. К тому же, тестирования проходит через интернет и фактически любой может сдать сертификат за друга/знакомого.
Доброго времени суток, Хабражители. Хочу поделиться неким опытом (советами) при работе с JavaScript + jQuery (по сути, вместо jQuery можете подставить любой другой JS фреймворк). Статья будет интересна новичкам JS и jQuery, но и динозаврам опытным проходить мимо не стоит, в ней вполне можно найти полезную информацию. В основном, в статье я привожу не однозначные случаи, но и место для «стоТыщРазПовтор» я счёл уместным.
Инициализация
Сплошь и рядом встречаю загрузку JS файлов в теге . В большинстве случаев - это не корректно! Почему? В этом случае JS начинает загружаться до загрузки HTML, и как следствие клиент дольше ждёт загрузки информации за которой он пришёл. Размещение скриптов в оправдано только в тех случаях, когда JS используется в качестве контроллера (к примеру, всё содержимое на странице мы достаём поблочно через AJAX запросы, в зависимости от URL или Hash). Если не используем, то гораздо лучше вставлять скрипты перед зыкрытием тэга . JS начнёт загружаться только после того, как посетитель увидит страницу.
Часто, когда разработчик выбирает движок для очередного магазина, он обычно оценивает этот вопрос по нескольким критериям:
Платный/бесплатный (если платный, то сколько).
Какой функционал есть «из коробки».
Насколько легко докрутить какой-то свой функционал.
Как много он потянет товаров, чтобы на хостинг не разориться.
Насколько гибкие политики безопасности, чтобы обеспечить совместную работу различных отделов.
Какие платежные системы поддерживаются.
Под катом я расскажу о новой готовой сборке интернет-магазина, которая разрабатывалась с учетом этих критериев, и думаю, может заставить призадуматься даже искушенных разработчиков.
В конце статьи видео с кратким обзором движка и двумя способами установки
Важно!!! Забыл сказать: кто поленится посмотреть видео, но развернет у себя сборку, логин/пароль в админку по умолчанию: admin/admin.
Сразу скажу, что разворачивая данную сборку, вы сразу получаете вот такой сайт. То есть сразу есть модель каталога, регистрация/авторизация через соцсети, оплата через робокассу и т.п. (само собой на своей копии надо будет прописать в конфигах свои данные робокассы и привязать сайт к социалкам).
Основа движка (а так же довольно большая предыстория)
За основу был взят фреймворк MODX Revolution. Только не торопитесь плеваться и закрывать страницу. Это не в точности тот MODX, с которым вам возможно приходилось встречаться. Я с MODX работаю с начала 2009-го года, и знаю его вдоль и поперек. И да, я как и многие сталкивался со многими его минусами (типа шаблонов и чанков в базе данных, тормоза и т.п.). Плюс к этому до знакомства с MODX много работал с различными самописками и другими движками, и на MODX-е я остался именно за его гибкость. Да, мне не все в нем нравится, но он позволяет с легкостью многое в нем изменить, при этом не трогая самого ядра. В процессе у меня появилось несколько компонентов, которые дополняют или меняют определенный функционал MODX-а. Вот парочка наиболее важных из них: phpTemplates — позволяет статические MODX-шаблоны вызывать как обычные php-файлы. modxSmarty — Подключает для фронта шаблонизатор Smarty и дополняет его некоторыми плюшками, обеспечивая тесное взаимодействие с самим MODX-ом. shopModx — модуль для разработки интернет-магазинов.
В итоге MODX обретает не только полноценную шаблонизацию, но и гораздо бОльшую производительность. Сайты с десятками тысяч документов работают с откликом 0,02 — 0,6 секунд. Плюс к этому можно практически полностью забить на синтаксис самого MODX-а, и если вы умеете программировать на php и знаете Smarty — то здесь в разработке у вас никаких проблем не возникнет.
Но одна из самых важных вещей в MODX-е, которая точно меня держит цепями — это система пакетов (модулей для MODX-а). Она реально классная. Я даже написал модуль, который позволяет создавать свои собственные репозитории пакетов. Это особенно полезно различным веб-студиям и активным разработчикам. При этом самая вкусняшка заключается в том, что упаковывать можно не только отдельные модули, но и вообще все что угодно на сайте, хоть целиком, хоть по отдельности, хоть весь сайт вообще. Так появились снапшоты MODX-сайтов. Изначально это было реализовано только на самом modxcloud.com (официальный хостинг от разработчиков MODX-а), но совершенно без документации и каких-либо релизов ими был выложен скрипт vapor, который предназначался для того, чтобы любой мог сделать снимок своего сайта и закинуть его на modxcloud.com. При этом обратная связь как бы и не подразумевалась (то есть брать снимки с modxcloud.com и разворачивать на любом своем хостинге). Не буду вдаваться в подробности, но я взял этот vapor, модифицировал его и добавил ему еще один скрипт (import.php). Теперь с помощью этого скрипта можно как делать снимки сайтов, так и разворачивать их поверх чистого сайта. Скачать мой vapor можно из официального репозитория. И вот как раз с этим вапором я взял курс не только на отдельные модули, но и на готовые сборки сайтов.
В чем смысл таких сборок?
Смысл в том, что когда на проекте используется сразу несколько каких-то отдельных компонентов, которые совместно должны дать какой-то ожидаемый результат, важно не только их наличие, но и тонкая настройка, чтобы обеспечить наилучший эффект + максимальную гибкость. И понятно, что для этого надо не только очень хорошо их знать, но и иметь опыт применения, знать как лучше сделать, какие подводные камни бывают и т.п. А вот если дать разработчику уже готовый сайт, где уже все установлено и настроено, то потолок вхождения и объем работ снижаются в разы.
Вот эта сборка как раз и есть готовый интернет-магазин на базе моих и стандартных модулей, обеспечивая наилучшую производительность, гибкость и управляемость.
Что уже есть в этой сборке?
Добавлен компонент Billing. На этом модуле завязано все, что связано с заказами, оплатой и т.п.
Корзина перестала существовать отдельно. Теперь Корзина — это еще не оформленный Заказ (Order). Теперь даже не оформленные заказы хранятся в базе данных, что как минимум позволяет видеть кого что интересует, а так же определять реальный процент конверсии и выявлять возможные ошибки.
Компонент Basket (Корзина) остался, но почти все, что связано с самими заказами, перенесено в Billing. Basket и дальше останется отдельным модулем, а в Billing-е будет только необходимый минимум логики. Рассчет на то, что сам механизм заказа, оплаты и т.п. можно будет реализовывать в любых сторонних модулях, которые будут взаимодействовать с биллингом.
Добавлен и сверстан новый шаблон по умолчанию с использованием bootstrap. Много всяких аджаксовых плюшек и полноценное JS-API.
Добавлен табличный редактор документов.
Добавлено управление заказами.
Добавлен личный кабинет пользователя, регистрация, смена пароля, восстановление пароля и т.п.
Настроена регистрация через Login, смена/восстановление пароля и т.п.
Добавлен модуль modHybridAuth (авторизация через социальные сети). Пока четко проверены Twitter, Facebook и Google, но должны и другие работать.
Подключен сервис оплаты Robokassa.
Настроены политики безопасности:
Контент-менеджер;
Администратор магазина;
Менеджер магазина;
Продвинутый менеджер магазина.
Что дальше делать с этим сайтом после установки?
Делаете копию шаблона и меняете в нем все, что угодно. Шаблонизация на Smarty, входные данные массивами, все процессоры на классах. То есть не трогая ядра, можно переделать сайт как угодно.
Пример, как добавлять еще платежные системы
Вот у нас есть оплата через робокассу, и стоит задача прикрутить еще какой-нибудь способ оплаты. Посмотрим, как это делается.
Это базовый процессор для любых типов оплаты.
<?php
/*
Абстрактный класс на проведение оплаты.
Его нельзя вызывать напрямую, чтобы исключить случаи инжекта оплаты.
Этот класс должен расширяться другим классом конкретной платежной системы,
чтобы использовать методы проверки платежа самой платежной системы
*/
abstract class modWebPaymentsCreateProcessor extends modObjectCreateProcessor{
public $classKey = 'Payment';
protected $BillingProcessorsPath;
public function checkPermissions() {
// Проверяем подпись платежной системы
$ok = $this->checkSignature();
if($ok !== true){
$this->error($ok);
return false;
}
return parent::checkPermissions();
}
public function initialize(){
$this->BillingProcessorsPath = MODX_CORE_PATH . 'components/billing/processors/';
$this->setDefaultProperties(array(
'currency_id' => $this->modx->getOption('shopmodx.default_currency'),
));
if(!$this->getProperty('paysystem_id')){
return $this->error("Не был получен ID платежной системы");
}
return parent::initialize();
}
public function beforeSet(){
$this->setProperties(array(
"createdby" => $this->modx->user->id ? $this->modx->user->id : null,
"date" => time(),
));
return parent::beforeSet();
}
public function beforeSave(){
if(
!$currency_id = (int)$this->getProperty('currency_id')
OR !$currency = $this->modx->getObject('modResource', $currency_id)
OR ! $currency instanceof ShopmodxResourceCurrency
){
return $this->error("Не был получен объект валюты");
}
if(
!$paysystem_id = (int)$this->getProperty('paysystem_id')
OR !$paysystem = $this->modx->getObject('Paysystem', $paysystem_id)
OR ! $paysystem instanceof Paysystem
){
return $this->error("Не был получен объект платежной системы");
}
// Проверяем, если указан счет платежной системы, то надо убедиться, что
// он еще не числится в биллинге
if($paysys_invoice_id = $this->object->get('paysys_invoice_id')){
if($this->modx->getCount($this->classKey, array(
'paysys_invoice_id' => $paysys_invoice_id,
'paysystem_id' => $paysystem_id,
))){
return $this->error("Данный счет уже создан в системе.");
}
}
$this->object->addOne($currency);
$this->object->addOne($paysystem);
return parent::beforeSave();
}
/*
Обязательно надо прописывать метод, в котором будет выполняться проверка
подписи с сервера платежной системы
*/
abstract protected function checkSignature();
protected function log($msg, $level = null){
if($level === null){
$level = xPDO::LOG_LEVEL_INFO;
}
$this->modx->log($level, "[Basket - ".__CLASS__."] {$msg}");
$this->modx->log($level, print_r($this->getProperties(), true));
return $msg;
}
protected function error($msg){
return $this->log($msg, xPDO::LOG_LEVEL_ERROR);
}
/*
Логируем все ошибки процессора, на всякий случай
*/
public function failure($msg = '',$object = null) {
$this->error($msg);
if(!empty($this->object) && is_object($this->object)){
$this->error(print_r($this->object->toArray(), true));
}
return parent::failure($msg,$object);
}
public function cleanup() {
/*
// Если оплата прошла успешно, то обновляем статус заказа
*/
if($order_id = $this->object->get('order_id')){
$this->modx->runProcessor('mgr/orders/status/pay', array(
'order_id' => $order_id,
), array(
'processors_path' => $this->BillingProcessorsPath,
));
// На всякий случай сбрасываем счетчик ошибок, если вдруг в вызываемом
// процессоре были ошибки
$this->modx->error->reset();
}
return $this->success($this->getSuccessMessage(), $this->object);
}
protected function getSuccessMessage(){
return '';
}
}
return 'modWebPaymentsCreateProcessor';
Он абстрактный, и его нельзя вызвать напрямую, так как у каждой конкретной платежной системы свои механизмы проверки платежа. Но этот класс уже обеспечивает всю необходимую логику, и от расширяющего процессора ждет только одного: подтверждения правильности платежа и установки суммы и прочих данных платежа.
А вот расширяющий процессор конкретно для робокассы:
Как видно, это всего 60 строчек кода. Но в результате не только будет проведена оплата с учетом кто платил, через что, сколько и т.п., но и будет автоматически изменен статус заказа на Оплачен. И вот прикрутить еще какой-нибудь способ оплаты — это всего несколько десятков строк.
Итоги
В итоге, получился на самом деле очень не плохой движок. Сразу скажу, что помимо гибкости, производительность у него тоже весьма не плохая. Как раз недавно наткнулся на топик, в котором народ рассуждал, что даже 40 000 товаров уже напрягает не хило их магазины. Я делал магазины на shopModx с десятками тысяч товаров без всяких особых ухищрений, и все нормально работает. И даже если товаров будут сотни тысяч (я уже делал один на 150 000 товаров), то с небольшими доработками магазин и столько потянет.
И самое главное: эта сборка совершенно бесплатная! Конечно мы всегда открыты для приема донейтов от благодарных разработчиков, но де факто движок полностью бесплатный.
И напоследок видео с кратким обзором движка и двумя способами установки.
Недавний поиск списка CMS, на примере которых можно было бы объяснить студентам архитектуру и структуру сложного web-сайта, привел меня к любопытной статье с классификацией CMS, которая, однако, на текущий момент немного устарела, да и написана несколько сумбурно. Это подвигло меня составить новый обзор, собрав больше решений и дополнив их по возможности ссылками на официальные сайты, страницы закачки и демо-панели.
Я рассматривала CMS на php, в основном бесплатные, за некоторым исключением. В результате на текущий момент получился такой набор:
Адаптивный дизайн стремительно становится индустриальным стандартом, что влечет за собой целую карусель передового опыта, платформ и инструментов. В результате происходит сдвиг в мышлении специалистов и, в частности, в понимании того, как адаптировать рабочий процесс для повышения его эффективности.
Конечно, из-за того, что процесс работы над адаптивным проектом очень индивидуален и итеративен, проанализировать его и дать решения на все случаи жизни довольно трудно. Тем не менее, некоторые общие способы и техники можно применять практически всегда.
Мы рассмотрим семь техник по улучшению адаптивного дизайна начиная со структуры контента и заканчивая масштабируемыми изображениями.
Музей J. Paul Getty открыл часть своей коллекции и передал её в общественное достояние. В рамках программы Open Content Program почти 4600 изображений высокого разрешения полностью освобождены от исключительных прав на интеллектуальную собственность. Кто угодно может использовать их без всяких ограничений, например, в качестве иллюстраций в Википедии.
Сколько уже было сломано копий о задачу выравнивания элементов на странице. Предлагаю вашему вниманию перевод отличной статьи с решением этой проблемы от Стефана Шоу (Stephen Shaw) для Smashing Magazine — Absolute Horizontal And Vertical Centering In CSS.
Все мы знали о margin: 0 auto; для горизонтального центрирования, но margin: auto; не работало для вертикального. Это можно легко исправить, просто задав высоту и применив следующие стили:
Я не первый, кто предложил это решение, однако такой подход редко применяется при вертикальном выравнивании. В комментариях к статье How to Center Anything With CSS Simon ссылается на пример jsFiddle, где приводится отличное решение для вертикального центрирования. Вот ещенесколькоисточников на эту тему.
Сегодня утром стартовал очередной, уже четвёртый по счёту набор в школу программистов HeadHunter.
Занятия будут проходить по вечерам, два раза в неделю с октября по апрель в московском офисе технического департамента, недалеко от метро Алексеевская. Преподаватели – наши специалисты, в числе которых blv, mikesub, tum0rc0re и ваш покорный слуга. Во время обучения студентам выплачивается ежемесячная стипендия – 15 тыс. рублей. Лучшим выпускникам будущей весной мы предложим присоединиться к нашей команде.
В этом году мы кардинально изменили программу обучения – студенты будут проходить обучение по двум независимым направлениям: фронтенд-разработка и разработка мобильных приложений. Каждый студент теперь сможет выбрать, по какому направлению он будет обучаться. При этом у всех студентов будет и общий курс лекций. Ещё больше внимания будет уделено решению практических задач — прежде всего мы хотим, чтобы выпускники были хорошо подготовлены к работе в бизнес-среде. Изменились и правила набора: вместо нескольких отборочных туров мы предлагаем потенциальным студентам выполнить тестовое задание, по результатам которого лучшие будут приглашены на собеседование. Так мы не теряем в качестве отбора, но значительно его ускоряем.
Digital Ocean — лоукостер на рынке облачных VPS провайдеров. Пользуется технологией виртуализации KVM. Хорош по соотношению цена/качество и бла-бла-бла, вы сами всё это знаете.
Но есть в нём и несколько минусов, одним из которых является ограничение в поддерживаемых операционных системах. Официальная позиция хостера состоит в том, что место на дисках в дроплетах (образах виртуальных машин) может быть расширено из панели управления без необходимости переустановки системы, поэтому загрузчик туда лучше не ставить. В связи с этим, libvirt не читает загрузчик внутри образа, а использует предустановленное в панели управления ядро с хостовой машины.
Поддержку загрузки пользовательских ядер они обещают сделать со дня на день… уже чуть больше года.
Адаптивные дизайн становится все популярнее, сегодня это уже не просто модная новая технология. Ниже собраны самые частые ошибки, допускаемые при разработке адаптивного сайта, своеобразный чек-лист.
Скрывать контент
Не стоит прятать части сайта только потому, что они не помещаются на экране мобильного устройства. Мобильные пользователю хотят видеть тот же контент и функционал, что и пользователи десктопов. Нужно проектировать интерфейс так, чтобы по возможности помещалось все.
Наверняка вы слышали о сервисах Amazon EC2, Rackspace и им подобным. Может быть даже пользовались. Лично мне бывает нужен иногда личный VPN-сервер. Для этих целей я уже давно держал микро-инстанс на Амазоне, предоставляемый им в течении первого года бесплатно. Плюс использовал для архивов Amazon Glacier, который с его ценой «1 цент за гигабайт в месяц» можно считать тоже почти бесплатным. Но вот год закончился и за EC2 стало нужно платить. Архивы мои тоже разрослись прилично и затраты на Glacier аналогично перестали радовать.
Случайно пробежавший мимо обзор сервиса DigitalOcean по-началу оставил меня равнодушным. Ну, облачный сервис, ну виртуалки. Ну да, чуть-чуть дешевле (но не так чтобы уж очень), чего-то аналогичного Glacier вроде бы нет да и вообще оно того не стоит.
Я сильно ошибался. Ниже будет рассказано как на базе DigitalOcean сделать себе VPN-сервер в пару десятков раз дешевле такого же на Амазоне и сервис хранения архивов, в бесконечность раз дешевле Glacier.