September 30, 2013

Klasa dla aktywnego elementu menu

Prosta sprawa – chcemy mieć zawsze zaznaczony element menu dla strony która aktualnie wyświetlamy.
Proste rozwiązanie – Helper, który będzie przypisywał naszą klasę “aktywności” do elementu, którego controller/action będzie się pokrywał z aktualnymi danymi z ViewContext.RouteData.

 public static MvcHtmlString MenuActionLink(this HtmlHelper htmlHelper, string name, string action, string controllerName, object routeValues, string activeClassName = null, IDictionary<string, object> htmlAttributes = null)
        {
            var url = new UrlHelper(htmlHelper.ViewContext.RequestContext);
            var anchor = new TagBuilder("a");
            anchor.MergeAttribute("href", url.Action(action, controllerName, routeValues));

            var routeData = htmlHelper.ViewContext.RouteData;
            var currentAction = routeData.GetRequiredString("action");
            var currentController = routeData.GetRequiredString("controller");

            if (string.Equals(currentAction, action, StringComparison.OrdinalIgnoreCase) && string.Equals(currentController, controllerName, StringComparison.OrdinalIgnoreCase))
            {
                anchor.MergeAttribute("class", activeClassName ?? "active");
            }

            if (htmlAttributes != null)
            {
                foreach (var htmlAttribute in htmlAttributes)
                {
                    anchor.MergeAttribute(htmlAttribute.Key, htmlAttribute.Value.ToString());
                }
            }
            
            anchor.InnerHtml = name;

            return MvcHtmlString.Create(anchor.ToString(TagRenderMode.Normal));
        }
August 25, 2013

Orchard Multitenancy Themes

Stawianie tenantów w Orchardzie i przypisywanie specyficznych tematów dla danego tenanta ma jedną wadę. Nie można włączyć tego procesu automatycznego konfigurowania Orcharda. Jest to proces całkowicie manualny. Można jedynie wejść do opcji zarządzania tenantami i zaznaczyć, które tematy chcemy aby były dostępne dla konkretnego tenanta. Druga opcja to edycja pliku settings.txt.
Jeżeli chcemy dołączyć możliwość automatycznego ustawiania tematów dla tenantów potrzebujemy polecenia w konsoli Orcharda. Dlatego nie pozostaje nic innego jak utworzyć swój własny moduł z rozszerzeniem możliwości konsoli Orcharda.

Dodatkową komendę dodajemy tworząc nową klasę dziedziczącą z Orchard.Commands.DefaultOrchardCommandHandler.
Sam proces dodawania i konfigurowania nowej komendy Orcharda opisany jest tutaj
Po utworzeniu nowej metody i wstrzyknięciu serwisu tenantów, pozostaje nam już tylko wykonać update tenanta/ów z listą id (id – nie nameów) wybranych tematów.
Całość modułu dostępna jest na GitHubie pod tym linkiem.

August 24, 2013

IE IFrame i PDF

Internet Explorer ma zadziwiająca moc, dzieki której rosną nasze umiejętności kombinowania i tworzenia przeróżnych workaroundów. Ostatnio poziom adrenaliny podniósł mi feature przeglądarki Microsoftu w którym wyświetlanie plików pdf przez plugin Adobe jest nadrzędne jeśli chodzi o kolejność wyświetlania warstw.

Problem przedstawia się tak:

<style type="text/css">
	.box {
		width: 400px;
		height: 300px;
		background-color: #212121;
		position: absolute;
		z-index: 2;
	}
	iframe {
		width:100%;
		z-index: 1;
	}
	</style>

     <div class="box"></div>
     <iframe src="http://download.fds-ncom.nokia.com/supportFiles/phones/files/guides/Nokia_E51_UG_pl.pdf"></iframe>

IE IFrame Bug

Niestety w żaden cywilizowany sposób nie da się “przeskoczyć” pliku pdf. Jedyną możliwością jest oszukanie IE i podstawienie pod element który chcemy by był nadrzędny względem iframe drugiego pustego elementu iframe.

<style type="text/css">
	.box {
		width: 400px;
		height: 300px;
		background-color: #212121;
		position: absolute;
		z-index: 2;
	}
	.iframe {
		width:100%;
		z-index: 1;
	}
	.fake-iframe {
		position: absolute;
		width: 100%;
		height: 100%;
	}
	</style>

        <div class="box">
	    <iframe src="about:blank" class="fake-iframe"></iframe>
	</div>
	<iframe class="iframe" src="http://download.fds-ncom.nokia.com/supportFiles/phones/files/guides/Nokia_E51_UG_pl.pdf"></iframe>

Dostając porządany efekt:
IE IFrame bug fixed