Monday, November 08, 2010 at 12:05 AM.

system.verbs.builtins.radio.weblog.editCategory

on editCategory (bgcolor=radio.data.htmlColors.cellBgColor, hilightBgColor=radio.data.htmlColors.highlightColor) {
	<<Changes
		<<10/13/02; 2:39:20 AM by JES
			<<Localized prompt strings.
		<<6/21/02; 2:27:39 PM by JES
			<<Fixed broken help link.
		<<2/14/01; 1:03:50 PM by JES
			<<Fixed a bug where editing a category which has no theme applied, would result in a macro error: "The file "-none- selected.fttb" wasn't found."
		<<2/13/02; 11:31:46 PM by JES
			<<Maintain the theme sub-table of the category table, when applying or removing a Theme.
		<<2/4/02; 6:44:39 PM by JES
			<<When applying a Theme to the category folder, make sure the folder exists first. Avoids a file not found macro error.
		<<2/4/02; 3:07:08 PM by JES
			<<Added a Theme popup, which allows you to use a separate Theme for each category. There's also a -None- option, which clears the Theme templates out of the category's sub-folder.
		<<1/28/02; 6:32:25 PM by JES
			<<If this is MacOS, convert the category name and description to Mac text, before saving the values.
		<<1/21/02; 1:43:53 PM by DW
			<<Make notification checkbox work for new categories.
		<<1/21/02; 11:59:28 AM by DW
			<<New checkbox to send notification to Weblogs.Com when a category that's rendered in HTML has updated.
		<<1/20/02; 8:17:17 PM by DW
			<<New language popup.
		<<1/8/02; 9:20:19 PM by JES
			<<Added error handling for the case where the user failed to supply the name for a new category.
		<<12/21/01; 12:36:12 PM by JES
			<<Changed help link to the Edit Category help page.
		<<12/2/01; 11:04:20 PM by JES
			<<Changed help link to link to the correct page.
		<<1/21/01; 6:03:08 PM by DW
			<<Rewrite. Takes no params. If there's a catname attribute we edit an existing category, otherwise it's a new category.
		<<1/12/01; 2:21:14 PM by PBS
			<<The Submit button appears at the end of the form when editing a category.
			<<Link to the RSS file of the category if it exists.
		<<1/11/01; 6:24:09 PM by PBS
			<<flNew is a new optional parameter. If true, a new category is being created.
		<<1/10/01; 4:03:12 PM by PBS
			<<Edit a category's attributes.
	local (pta = html.getpagetableaddress ());
	local (adrdata = radio.weblog.init ());
	local (helplink = radio.userInterface.helpLink ("The Categories page"));
	local (htmltext = "\r", indentlevel = 0);
	on add (s) {
		htmltext = htmltext + string.filledstring ("\t", indentlevel) + s + "\r\n"};
	local (catname = "", flnewcategory = true, adrcat = nil, referer = "", flrenderhtml = false, errormessage = "");
	if pta^.method == "GET" {
		local (args);
		new (tabletype, @args);
		webserver.parseargs (pta^.searchargs, @args);
		<<scratchpad.args = args; edit (@scratchpad.args)
		if defined (args.catname) {
			catname = args.catname;
			adrcat = @adrdata^.categories.[catname];
			flnewcategory = false};
		if defined (args.referer) {
			referer = args.referer}};
	if pta^.method == "POST" {
		local (args);
		new (tabletype, @args);
		webserver.parseargs (pta^.requestbody, @args);
		<<scratchpad.args = args; edit (@scratchpad.args)
		on renderCategoryPageIfNeeded (adrcat) {
			local (f = radio.weblog.file.getCategoryFolder (nameOf (adrcat^), adrdata) + "index.txt");
			if radio.file.locateFileIgnoringExtension (f, @f) {
				radio.weblog.publish (adrdata, nameOf (adrcat^))}};
		on applyThemeIfNeeded (adrcat, theme) {
			if adrcat^.flRenderHtml {
				local (catname = nameOf (adrcat^));
				local (folder = radio.weblog.file.getCategoryFolder (catname, adrdata));
				file.sureFilePath (folder + "xxx");
				if args.theme == "-none-" { //remove the Theme files from the folder
					on deleteFileIgnoringExtension (fname) {
						local (fileToDelete);
						if radio.file.locateFileIgnoringExtension (folder + fname, @fileToDelete) {
							file.delete (fileToDelete)}};
					deleteFileIgnoringExtension ("#template");
					deleteFileIgnoringExtension ("#homeTemplate");
					deleteFileIgnoringExtension ("#dayTemplate");
					deleteFileIgnoringExtension ("#itemTemplate");
					deleteFileIgnoringExtension ("#desktopWebsiteTemplate");
					if defined (adrcat^.theme) {
						delete (@adrcat^.theme)};
					local (lastThemeApplied = "-none-");
					try {lastThemeApplied = adrcat^.lastThemeApplied};
					adrcat^.lastThemeApplied = "-none-";
					if adrcat^.lastThemeApplied != lastThemeApplied {
						renderCategoryPageIfNeeded (adrcat)}}
				else { //apply the theme to the category folder
					local (fname = theme + ".fttb");
					local (f = radio.theme.getThemesFolder () + fname);
					local (theme);
					radio.theme.importThemeFile (f, @theme);
					radio.theme.apply.main (@theme, folder, @adrcat^.theme);
					local (lastThemeApplied = "-none-");
					try {lastThemeApplied = adrcat^.lastThemeApplied};
					adrcat^.lastThemeApplied = radio.theme.getShortName (theme.info.name);
					if adrcat^.lastThemeApplied != lastThemeApplied {
						renderCategoryPageIfNeeded (adrcat)}}}};
		if args.flnewcategory {
			flrenderhtml = defined (args.flRenderHtml);
			if args.displayName != "" { //we need a name for the table
				local (displayName = args.displayName);
				local (description = args.description);
				if system.environment.isMac {
					displayName = string.latinToMac (displayName);
					description = string.latinToMac (description)};
				radio.weblog.newCategory (displayName, description, flrenderhtml, args.language, defined (args.flNotify));
				adrcat = @adrdata^.categories.[displayName];
				applyThemeIfNeeded (adrcat, args.theme)}
			else { //error -- there was no name provided
				errormessage = radio.string.getLocalizedString ("editCategory.noNameError")}}
		else {
			catname = args.catname;
			adrcat = @adrdata^.categories.[catname];
			adrcat^.displayName = args.displayName;
			adrcat^.description = args.description;
			adrcat^.flRenderHtml = defined (args.flRenderHtml);
			adrcat^.language = args.language;
			adrcat^.flNotifyWeblogsCom = defined (args.flNotify);
			applyThemeIfNeeded (adrcat, args.theme);
			flnewcategory = false};
		if defined (args.referer) and (errormessage == "") {
			radio.webServer.redirect (args.referer);
			return (true)}};
	bundle { //set flrenderhtml
		if adrcat != nil {
			if defined (adrcat^.flRenderHtml) {
				flrenderhtml = adrcat^.flRenderHtml}}};
	bundle { //set the page title, add the intro
		if flnewcategory {
			pta^.title = radio.string.getlocalizedstring ("editCategory.newCategoryTitle");
			add ("<p>" + radio.string.getlocalizedstring ("editCategory.newCategoryIntro") + " " + helplink + "</p>")}
		else {
			pta^.title = radio.string.getlocalizedstring ("editCategory.editCategoryTitle") + ": " + catname;
			add ("<p>" + radio.string.getlocalizedstring ("editCategory.editCategoryIntro") + " " + helplink + "</p>")}};
	bundle { //add error message if there was an error
		if errormessage != "" {
			add ("<p><font color=\"maroon\">" + errormessage + "</font></p>")}};
	bundle { //add the form
		local (initialname, initialdescription, languagePopup, themePopup);
		bundle { //set initialname, initialdescription
			if adrcat == nil {
				initialname = "";
				initialdescription = "";
				if pta^.method == "POST" and (errormessage != "") {
					try {
						initialname = pta^.radioResponder.postArgs.displayName;
						initialdescription = pta^.radioResponder.postArgs.description}}}
			else {
				initialname = adrcat^.displayname;
				initialdescription = adrcat^.description}};
		bundle { //set languagePopup
			local (s = string (radio.data.localization.languages.english.strings.editCategory.languages));
			local (defaultLanguage = "\"none\"");
			try {defaultLanguage = "\"" + adrcat^.language + "\""};
			languagePopup = string.replace (s, defaultLanguage, defaultLanguage + " selected")};
		bundle { //set themePopup
			local (s = "<select name=\"theme\">\r");
			local (defaultTheme = "\"-none-\"");
			try {defaultTheme = "\"" + adrcat^.lastThemeApplied + "\""};
			
			s = s + "\t<option value=\"-none-\">- None -";
			
			local (folder = radio.theme.getThemesFolder ());
			local (floop);
			fileloop (floop in folder) {
				try {
					local (fname = file.fileFromPath (floop));
					if not (string.lower (fname) endsWith ".fttb") {
						continue};
					
					local (themeTable);
					radio.theme.importThemeFile (floop, @themeTable);
					
					local (adrinfo = @themeTable.info);
					local (name = adrinfo^.name);
					local (shortname = radio.theme.getShortName (name));
					s = s + "\t<option value=\"" + shortname + "\">" + name + "\r";
					
					if defined (adrcat^.lastThemeApplied) {
						if adrcat^.lastThemeApplied == shortname {
							defaultTheme = "\"" + shortname + "\""}}}};
			
			s = s + "</select>";
			
			themePopup = string.replace (s, defaultTheme, defaultTheme + " selected")};
		add ("<form method=\"POST\">"); indentlevel++;
		add ("<table cellspacing=\"0\" cellpadding=\"5\">"); indentlevel++;
		add ("<tr><td>" + radio.string.getLocalizedString ("editCategory.categoryPrompt") + "</td><td><input name=\"displayName\" size=\"30\" value=\"" + initialname + "\"></td></tr>");
		add ("<tr><td valign=\"top\">" + radio.string.getLocalizedString ("editCategory.descriptionPrompt") + "</td><td><textarea name=\"description\" rows=\"7\" cols=\"55\">" + initialdescription + "</textarea></td></tr>");
		bundle { //add render html checkbox
			local (label = radio.string.getlocalizedstring ("editCategory.checkToRenderHtml"));
			if flrenderhtml { //checked
				add ("<tr><td colspan=\"2\"><input type=\"checkbox\" name=\"flRenderHtml\" value=\"xxx\" checked> " + label + "</td></tr>")}
			else { //unchecked
				add ("<tr><td colspan=\"2\"><input type=\"checkbox\" name=\"flRenderHtml\"> " + label + "</td></tr>")}};
		bundle { //add Weblogs.Com checkbox
			local (fnotify = false);
			try {fnotify = adrcat^.flNotifyWeblogsCom};
			local (label = radio.string.getlocalizedstring ("editCategory.checkToNotify"));
			if fnotify { //checked
				add ("<tr><td colspan=\"2\"><input type=\"checkbox\" name=\"flNotify\" value=\"xxx\" checked> " + label + "</td></tr>")}
			else { //unchecked
				add ("<tr><td colspan=\"2\"><input type=\"checkbox\" name=\"flNotify\"> " + label + "</td></tr>")}};
		add ("<tr><td valign=\"top\">" + radio.string.getLocalizedString ("editCategory.themePrompt") + "</td><td>" + themePopup + "</td></tr>");
		add ("<tr><td valign=\"top\">" + radio.string.getLocalizedString ("editCategory.languagePrompt") + "</td><td>" + languagePopup + "</td></tr>");
		add ("<tr><td colspan=\"2\" valign=\"top\"><br><input type=\"submit\" value=\"" + radio.string.getlocalizedstring ("editCategory.submitButton") + "\"></td></tr>");
		add ("</table>"); indentlevel--;
		add ("<input type=\"hidden\" name=\"flnewcategory\" value=\"" + flnewcategory + "\">");
		add ("<input type=\"hidden\" name=\"catname\" value=\"" + catname + "\">");
		add ("<input type=\"hidden\" name=\"referer\" value=\"" + referer + "\">");
		add ("</form>"); indentlevel--};
	<<bundle //add the recent posts from this category
		<<if catname != ""
			<<htmltext = htmltext + radio.macros.weblogRecentPosts (adrdata, bgcolor, hilightBgColor, catname)
	return (htmltext)}
<<bundle //testing
	<<html.setPageTableAddress (@workspace.pt)
	<<editCategory ()



This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.