* * *
* * *

Javascript: Replace all string occurrences

На Stackoverflow советуют использовать new RegExp(find, 'g'), чтобы заменить все вхождения подстроки в строку. Но все забывают о том, что у регексов свой специфический синтаксис.

Например, от вызова str.replaceAll('.', '!') мы ждём, что функция заменит все точки на восклицательные знаки, а не сделает все символы в строке восклицательными знаками. Потому считаю, что нужно эскейпить все символы в подстроке:

String.prototype.replaceAll = function(search, replace){
    var regex = search.replace(/(.)/g, "\$1");
    return this.replace(new RegExp(regex, "g"), replace);
}
Оставить комментарий
* * *

Обзор самых полезных модулей для Orchard CMS

Далее список модулей, которые лучше сразу установить в Orchard CMS.

Оставить комментарий
* * *

Orchard CMS: No persister for record

Oops. Something went wrong ... sorry An unhandled exception has occurred and the request was terminated. Please refresh the page. If the error persists, go back No persister for: Record NHibernate.MappingException: No persister for: Record в NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)

Происходит из-за того, что namespace с record'aми должен оканчиваться на Models, а не Model.

1 комментарий | Оставить комментарий
* * *

Позиционирование блоков контента в Orchard CMS

Введение

При работе с Orchard CMS у многих возникает вопрос: как отобразить один список справа, другой слева, если весь контент выводится в @Zone(Modеl.Content)?

Эта статья является ответом на этот вопрос. Для ясности я сделал демосайт, который можно скачать себе, запустить и посмотреть, как всё работает (логин: admin, пароль: admin123) .

2 коментариев | Оставить комментарий
* * *

C#: XML-cериализация объекта в строку

public static class XmlSerialization
{
	public static string Serialize<T>(this T value)
	{
		var xmlSerializer = new XmlSerializer(typeof(T));
		using (var textWriter = new StringWriter())
		{
			xmlSerializer.Serialize(textWriter, value);
			return textWriter.ToString();    
		}            
	}

	public static T Deserialize<T>(this string xml) 
	{
		if (string.IsNullOrEmpty(xml))
		{
			return default(T);
		}
		using (var sr = new StringReader(xml))
		{
			var xmlSerializer = new XmlSerializer(typeof(T));
			using (var reader = XmlReader.Create(sr))
			{
				return (T)xmlSerializer.Deserialize(reader);
			}
		}
	}
}
Оставить комментарий
* * *

TechEd 2012 Россия

27 - 28 ноября я побывал на конференции Microsoft TechEd 2012 в Москве. Надо сказать, что это самая большая конференция, на которой мне приходилось до этого бывать. Чтобы оценить масштаб конференции стоит только сказать, что одновременно там проходило 12 докладов, плюс были выставки разных компаний (Fujitsu, IBM, Nokia,...) и продуктов Microsoft (Office 2013, Visual Studio 2012, Dynamics CRM).

На выставку приехали разные ребята из MS, например, я видел живого Скотта Гаттри, посмотрел на Ларри Либермана, который является главным по Windows Phone.

Скотт Гатри одобряет Черномордикова
Скотт Гатри одобряет Черномордикова
Оставить комментарий
* * *

Orchard CMS: Модуль Amba.ImageMultiPicker

Amba.ImageMultiPicker

Слабое место Orchard CMS - это очень слабая поддержка работы с изображениями. Фактически есть стандартный Media Picker, который рассчитан на работу с любыми типами файлов и ряд модулей, которые имеют ряд недостатков. Я написал модуль Amba.ImageMultiPicker , который содержит Image MultiPicker Field, превосходящий стандартный Media Picker при работе с изображениями.

На базе этого модуля можно легко создать свою галерею.

Основные особенности на данный момент такие:

  1. Выбор одной или нескольких изображений.
  2. Отображения разрешения изображения в пикселах.
  3. Картинки можно упорядочивать внутри списка.
  4. Выбранные картинки можно сразу видеть на странице редактирования Content Item'a.
  5. Модуль содержит кеширующий серверный ресайзер картинок, что позволяет быстрее загружать превью больших картинок.

Посмотреть скриншоты и больше узнать о функциях модуля можно на странице проекта: imagemultipicker.codeplex.com

Оставить комментарий
* * *

Orchard CMS: Layout для страницы 404 NotFound

В Orchard CMS есть возможность сделать свою кастомную страницу 404. У Orchard есть ErrorController, который имеет NotFound action:

[Themed]
public class ErrorController : Controller {

    public ActionResult NotFound(string url) {
        return HttpNotFound();
    }
}

Для задания своей кастомной страницы 404 достаточно создать шаблон NotFound.cshtml в папке Views вашей темы.

Но здесь кроется такая проблема: ErrorController имеет атрибут Themed, который применяет к данному View Layout.cshtml. Если вы явно хотите указать Layout для страницы 404, то хороший план, это добавить в тему LayoutFilter:

1 комментарий | Оставить комментарий
* * *

Управление контентом в Orchard CMS

Orchard CMS можно назвать документоориентированной CMS: в Orchard есть понятие Content Item, что практически эквивалентно понятию Document в Umbraco.

Content Item — это единица контента. Например, запись в блоге, страница, статья. Соответственно, каждый Content Item является экземпляром какого-нибудь Content Type'а.

Content Type — определение типа Content Item'а, это аналог Document Template в Umbraco. Для управления Content Item'ами в Orchard CMS по-умолчанию есть один единственный грид:

Этот грид снабжён фильтром по Content Type, но каждый раз выставлять фильтр неудобно. Можно наделать себе в браузере закладок на страницы с фильтрами, но проще установить модуль Vandelay Industries. В этом модуле есть фича Vandelay Content Admin Menu, которая добавляет ссылки на cписки конкретных Сontent Item'ов.

Раскрывающееся меню контента
Раскрывающееся меню контента

На этом примере хорошо видно, что по-умолчанию Orchard CMS имеет довольно неудобную админку, и до приемлемого состояния её приходится доводить сторонними модулями.

Оставить комментарий
* * *

Как изучать Orchard CMS

The documentation that we have today is only covering a very small part of the platform. Your best reference today is the source code.
Bertrand Le Roy

Очень полезно сделать себе инсталляцию Orchard CMS из исходников и понаставить на него разных модулей из Orchard Gallery. Так можно быстро получить исходники кучи модулей, но помните, что к тому, что пишет народ надо относиться скептически. Даже в популярных модулях народ применяет странные решения.

Важное об Orchard CMS

При работе с Orchard CMS следует помнить следующие вещи:

Orchard CMS — это не совсем Content Management System. Это скорее Content Management Framework — основа для вашей узкоспециализированной CMS. Orchard хорошо расширяем за счёт модулей, но базовая поставка бедна возможностями, если сравнивать её с Umbraco.

Модуль в Orchard CMS может содержать в себе что угодно: от JavaScript-файла, который вы можете использовать на сайте, до расширений CMS и ASP.NET MVC Area. Разработчики Orchard CMS вместо создания большой гибкой системы, сделали маленькую, но очень расширяемую. Вряд ли вобще возможно сделать на Orchard приличный сайт, не написав модуль.

В Orchard CMS не соблюдается обратная совместимость. Потому модули от Orchard 1.3 могут не работать на версии 1.4. ИМХО, это самая большая проблема этой системы.

Orchard CMS — это Open Source-проект. Так что вы всегда можете посмотреть отладчиком что не так, сходить на сайт проекта и посмотреть нет ли вашей проблемы в списке багов. Стоит отметить, что разработчики Orchard CMS хорошо отвечают на вопросы на Stackoverflow.com и http://orchard.codeplex.com/discussions

На хабре ничего путного я не увидел, только евангелисты переводят официальную документацию.

Кое-что можно нарыть в блогах:

2 коментариев | Оставить комментарий
* * *
* * *

Orchard CMS: Консольная утилита (scaffolding)

Создание модуля:
codegen module <module-name> /IncludeInSolution:true
codegen controller <module-name> <controller-name>
codegen datamigration <feature-name>
Создание темы:
codegen theme <theme-name> /CreateProject:true /IncludeInSolution:true
Создание Part'a ( codegen extensions):
codegen part <module_name> <part_name> [/Properties:<comma-delimited list of name:type pairs>]
Оставить комментарий
* * *

HTML5 Canvas: рисуем отрезок толщиной в 1px

При изучении HTML5 и Canvas первое, что хочется сделать — это нарисовать отрезок толщиной в 1 пиксель. Оказалось, что задать толщину в 1px не достаточно, надо ещё к координатам концов отрезка добавить полпикселя. Ниже на canvas'e я вывел "толстый" и "тонкий" отрезок:

<canvas id="sample1" width="100" height="100" style="border: 1px solid black">
</canvas>
<script type="text/javascript">
var ctx = document.getElementById('sample1').getContext('2d'); 
ctx.strokeStyle = "black";
ctx.fillStyle = "black";
ctx.lineWidth = 1;

// рисуем "толстый" отрезок
ctx.beginPath();
ctx.moveTo(25, 5);
ctx.lineTo(25, 95);
ctx.stroke();

// рисуем "тонкий" отрезок
ctx.beginPath();
ctx.moveTo(45.5, 5.5);
ctx.lineTo(45.5, 95.5);
ctx.stroke();

</script>
Оставить комментарий
* * *