Тёмное прошлое «черновиков» в e2

Как я уже сказал, главным нововведением в 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.

Для меня это была больная тема, и я очень рад, что наконец сделал всё по-людски.

Дальше
5 комментариев
Роман Парпалак 2007

Недавно я у себя в блоге сделал следующую систему.

Во-первых, у меня административный интерфейс полностью отделен от того, что видят посетители. Во-вторых, в этом самом административном интерфейсе есть несколько вкладок: форма для редактирования записи, предварительный просмотр (срабатывает css блога), форма для редактирования ключевых слов (правда, очень редко используемая), список всех записей и комментарии.

Не знаю, насколько оправдана идея с выводом списка всех записей (вместе с заголовками выводится дата написания, id, ключевые слова, количество комментариев, причем есть возможность отсортировать таблицу по любому из этих столбцов), но пока она у меня успешно работает (сейчас количество записей больше 200). В принципе, можно сделать фильтрацию записей в списке по дате, ключевым словам и другим критериям.

В форме редактирования есть поля даты создания заметки, даты изменения, флажок «Показать». Правда, там еще много чего есть, но речь сейчас не об этом.

Когда я пишу и сохраняю заметки, я всегда убираю флажок «Показать». Тогда заметка в блоге нигде не отображается, она доступна только из списка записей. Когда пришло время сделать заметку видимой, я ставлю этот флажок, делаю дату создания и изменения текущей (для этого есть специальная ссылка, запускающая функцию на javascript). После сохранения заметка появляется в блоге и rss. Дальше можно нажать на кнопочку экспорта в ЖЖ. Я не реализовал автоматическую отправку, так как не все записи публикую там.

Урлы в блоге имеют вид, например, http://written.ru/blog/2007/06/06/PhysQuestions, с ними никаких проблем нет. И нет других проблем, которые были Вами упомянуты. После публикации я всегда смотрю, как выглядит заметка в блоге, поэтому забыть про галочку «Показать» невозможно. Единственное, что можно забыть, так это установить дату создания и изменения текущей. Однако для того, чтобы заметить подобную оплошность, достаточно посмотреть на главную страницу блога или на список записей (который по умолчанию отсортирован по дате).

В общем, хотелось бы обсудить с Вами то решение, которое я реализовал.

Judicator 2007

Роман Парпалак, насколько я понимаю, «nickname» заметки («PhysQuestions» в примере) вы указываете в момент ее написания наряду с заголовком и собственно текстом заметки. То есть автор блога заполняет при публикации каждой заметки еще одно лишнее поле. На мой взгляд, это неудобно.
Как вариант, можно было бы проводить транслитерацию заголовка заметки и на его основе формировать постоянный URL (пример: http://written.ru/blog/2007/06/06/Fizika_v_voprosah_i_otvetah). Но выглядят такие URL не очень...
У Ильи это сделано удобнее для автора блога.

Роман Парпалак 2007

Поле, которое предназначено для ввода части URL, не обязательно для заполнения. Если я сохраняю запись с пустым полем, оно автоматически заполняется транслитерацией заголовка. Однако при необходимости я могу ввести тот URL, который нужно. Я, как автор, никаких неудобств не испытываю.

buddah 2007

Роман, тогда вы — гений! ;)
А Илья-то, вон как мучался..

buddah 2007

А вообще — полистал тут чего нового появилось в движке..
Очень приятно видеть. Скоро придется согласиться со слоганом на страничке с e2.

Удобно все сделано. И потому — приятно.

Мои книги