Как я уже сказал, главным нововведением в e2 Selecta (release 1.3) будет подсистема черновиков.
Скрытые заметки
Строго говоря, в e2 тысячу лет была возможность писать черновики. Эта «возможность» представляла собой поле IsVisible в таблице заметок и галочку «Отображать заметку» в интерфейсе. Я её сделал «на всякий случай» и быстро убедился, что это совсем не лишняя возможность. Но у неё было несколько проблем, которые последовательно решались через жопу, о чём я сейчас вам и расскажу. Это очень интересная история, вот смотрите.
Когда галочка «Отображать заметку» была только в форме редактирования, это было неудобно, потому, что за ней надо было идти в эту форму, поэтому галочке в пару была быстро добавлена ссылка под заметкой: «Скрыть заметку» или «Показать заметку».
Оказалось, однако, что с этой системой самая большая проблема в том, что дата заметки определялась в момент её создания, а не «первого делания видимой». То есть, если начать писать скрытую заметку, то она оставалась в календаре там, где ты её первый раз сохранил. В результате, если после такой недописанной заметки начать писать новые, имея в виду вернуться к недописанной через недельку-другую, то она постепенно вообще съезжала из поля зрения. Когда заметка была готова, приходилось идти в «Настройку заметки» и там править дату на текущую.
Вдобавок к тому, что это было неудобно, это ещё и порождало глюк. Допустим, заметка была создана 1 июня (скрытой). Потом вторая заметка в этот же день была сразу опубликована видимой и получила УРЛ вида ##адрес-блога/2007/06/01/2/##. На неё кто-нибудь поставил ссылку. Теперь, допустим, 6 июня мы, наконец, дописали ту, первую заметку, перетащили её на 6 июня и сделали видимой. Заметка от первого июня стала теперь видна по адресу ##адрес-блога/2007/06/01/1/## и ссылка на неё сломалась. И все подписчики RSS получили её по второму разу, потому, что УРЛ изменился. Классно?
Всплывание скрытых заметок
Сначала я стал бороться с неудобством. В какой-то версии при редактировании скрытой заметки появилась галочка «Сохранить эту заметку так, будто я написал её только что (обновить дату-время)». Формулировка изысканная, но я не знал, как написать короче. Теперь при окончательной публикации заметки можно было не идти в её настройку, а просто поставить тут галочку.
Но это не решило проблемы «уезжания» заметки по мере написания других. Поэтому я решил, что эта галочка будет по умолчанию включена, чтобы заметка при редактировании всегда «всплывала».
Наверное, вы уже видите, что это удесятерило вероятность проявления глюка с ломающимися УРЛами и RSS; зато стало хоть чуть-чуть удобнее. Да, но это добавило ещё новый глюк. Некоторые заметки являются скрытыми не потому, что их ещё не сделали видимыми, а потому, что их скрыли. Я скрываю некоторые свои старые заметки, потерявшие актуальность для публики, но важные для меня. И вот, если такую заметку начать редактировать (например, чтобы опечатку исправить), то она вдруг всплывала в самом верху блога. Я так накололся один раз, но этого хватило. Естественно, я просто забыл убрать чёртову галочку.
Это ещё не всё. Всплывали всё новые проблемы. При создании заметки делались некоторые «волшебные» действия, такие, как отправка заметки в ЖЖ, рассылка трекбеков. Но нужно ли отправлять в ЖЖ заметку, созданную скрытой? Пожалуй, нет. Поэтому в коде создания заметке всё то, что отвечало за эти действия, было завёрнуто в if, который не давал всему этому произойти, если заметка была скрытой.
«Черновики»
Тут был сделан важный вывод: нужно как-то отличать «черновики» от «скрытых заметок».
В очередном обновлении при создании скрытой заметки её идентификатор в базе стал сохраняться в реестр (##/system_data/drafts##, кажется). И она считалась «черновиком». Когда заметка становилась видимой, её идентификатор удалялся из реестра (если он там был, разумеется). Теперь для любой заметки критерием «черновиковости» было наличие идентификатора в реестре, и галочка с длинным названием отображалась только у «черновиков».
При переходе от скрытости к видимости для «черновиков» выполнялся тот набор действий, который выполнялся для заметок, сразу же публикующихся видимыми.
По мере того, как «черновики» становились более «удобными», я стал пользоваться ими всё чаще, делать всё больше заготовок заметок. Я всё чаще стал создавать заметки сначала невидимыми, чтобы посмотреть, что написал, перечитать не в редакторе, а просто на странице, а уже потом, убедившись, что всё в порядке, делать их видимыми. Постоянное снятие галочки «Отображать заметку» стало напрягать, — и в настройку движка добавилась опция, позволявшая сделать эту галочку выключенной по умолчанию.
От «черновиков» к черновикам
Примерно в таком состоянии система прожила довольно длительное время. В последнем доступном релизе, Oranda Third Edition, всё работает именно так. То есть, если не знать всех подробностей, которые вы теперь знаете, более-менее неплохо. Но если подробности знать, то становится понятно, что всё это ни в какие ворота не лезет. Проблема со «съезжающими» УРЛами хоть и не сильно разрушительная, но всё же неприятная, так и не была решена.
В одном из внутренних билдов, появившихся уже после Oranda Third Edition, появилась незаметная фича, которая при обращении к заметке с несуществующим номером за данный день, открывала просто последнюю заметку этого дня. То есть в примере выше по адресу ##адрес-блога/2007/06/01/2/## заметка, ставшая номером 1, оставалась видимой. Эта фича делала всю конструкцию почти замечательной внешне.
И я не прекращал ей активно пользоваться. Настолько активно, что в какой-то момент у меня получилось так, что когда я залогинивался, на главной странице у меня показывались только скрытые заметки (то есть черновики), а все реально опубликованные заметки уезжали. Вкупе с ощущением общей корявости и громоздкости конструкции, это не давало мне покоя.
Важный вывод был сделан во второй раз с едва уловимой разницей: нужно как-то отличать черновики от скрытых заметок. Этот вывод воплотился в решении, которое должно было бы быть реализовано в тот день, когда я впервые начал использовать скрытые заметок в качестве «черновиков»:
ALTER TABLE Notes ADD IsPublished TINYINT (1) DEFAULT ’1’ NOT NULL AFTER Text
ALTER TABLE Notes CHANGE IsPublished IsPublished TINYINT (1) DEFAULT ’0’ NOT NULL
Начиная с v1511 черновик — это черновик, а не «черновик». В одной из следующих серий я расскажу, как прекрасно теперь всё работает, и даже покажу скриншоты. Последний внутренний билд называется v1648.
Для меня это была больная тема, и я очень рад, что наконец сделал всё по-людски.