Riding the Rails: Aktiva menyobjekt

Fredrik W visade mig en riktigt stilig sak häromdagen på ett Rails-projekt vi håller på med. Att göra layouter och framför allt visa vilket menyobjekt som är ”aktivt”, dvs vilken sida du är på just nu.

Lägg in denna helpern, i exempelvis application_helper.rb:

def menu_item(text, link, options = {:use_span => false, :only_controller => false})
   active = Rails.application.routes.recognize_path link
   text = content_tag("span", text) if options[:use_span]
 
   link_is_currently_active = options[:only_controller] ? params[:controller] == active[:controller] : params[:controller] == active[:controller] && params[:action] == active[:action]
 
   klass = link_is_currently_active ? "active" : ""
   return content_tag("li", link_to(text, link), :class => klass)
end
 
def menu(options = {}, &block)
  return content_tag("ul", options, &block)
end

Vi läser alltså av existerande routen och jämför den med menyobjektets. Så nu istället för att länk runt dig i applikationen med link_to så kan du nu använda blocket menu:

<% menu do %>
  <%= menu_item "Link 1", project_path(@project) %>
  <%= menu_item "Link 2", project_medias_path(@project) %>
<% end %>

Vips, så har vi nu fått en lista med det aktiva objektets klass som ”active”.

Nu är det klart att detta är en väldigt begränsad lösning och kanske inte lämpar sig i större projekt med stora menystrukturer, men för enklare projekt fungerar detta alldeles utmärkt.

WordPress pluginguide: Sätta ny titel i en shortcode

Jag håller på med ett Reddit-liknande WordPress-plugin på ett projekt hos Populate.

Systemet listar ett antal frågor som du som besökare kan ”rösta upp”, sedan visar man de populäraste frågorna och lite annat. Varje fråga har en egen landningssida, exempelvis /fraga/10 (där 10 är id:t på frågan). Landningssidan och listningen av frågorna definieras av shortcodes i sidor, exempelvis: [poll_show_single] och [poll_list].

På sidan som innehåller [poll_show_single], i det här fallet är det sidan ‘fraga’, vill jag ha möjlighet att sätta frågans rubrik som ny titel (via filtret wp_title).

Det går tyvärr inte att ändra titeln inifrån shortcoden, utan man får identifiera vilken sida som shortcoden finns på och sen sätta titeln separat. Detta kan du göra på följande sätt:

function locate_shortcode ($shortcode) {
  global $wpdb;
 
  $search = ((!empty($search))?" OR ":"")."post_content LIKE '%$shortcode%'";
 
  $query = "SELECT ID,post_title,post_name,post_content FROM $wpdb->posts WHERE $search AND post_type='page'";
  $result = $wpdb->get_results($query);
 
  return array('id' => $result[0]->ID, 'title' => $result[0]->post_title, 'name' => $result[0]->post_name, 'uri' => get_page_uri($result[0]->ID) );
}

Sedan läser du av den:

$pollSingle = locate_shortcode( 'poll_show_single' );  
$pollSingleURI = $pollSingle['uri'];

Då får jag fram vilken sida som innehåller shortcoden för att visa en enskild fråga, därefter kan jag haka in mig på filtret ‘wp’ och sätta titeln:

add_filter('wp', 'titles' );

I titels() kollar vi sedan upp om vi står på rätt sida (den som finns i $pollSingleURI) och jämför den med $wp_query->query['pagename']:

function titles() {
  global $wp_query, $wpdb, $newTitle, $pollSingleURI;
 
  // Single poll
  if ($wp_query->query['pagename'] == $pollSingleURI) {
    if (preg_match("/\d+\/?$/", $wp_query->query['page'])) {
      $pollID = str_replace('/', '', $wp_query->query['page']);
      $result = $wpdb->get_results( sprintf("SELECT subject FROM %spoll WHERE id = %d LIMIT 1", $wpdb->prefix, $wpdb->escape($pollID) ) );
 
      // Set title
      $newTitle = esc_html($result[0]->subject);
      add_filter('wp_title', 'frontend_set_title' , 10, 2 );
    }
  }
}

Ovanstående SQL-fråga hämtar just nu frågans titel, men detta ändrar du givetvis till det du vill ha som titel.

Och eftersom PHP fortfarande har lite problem med closures/anonyma funktioner så måste titeln sättas separat:

function frontend_set_title($title, $separator) {
  global $newTitle;
  return esc_html($newTitle)." ".$separator;
}

Allt är ryckt ur en klass för att lättare kunna visa hur det fungerar, därav alla globala variabler *urk*. Denna metod kräver inga ”rewrites” eller ”template redirect intercepts”.

Intressanta länkar

För att hålla mig uppdaterad om vad som händer i programmerings- och webbvärlden så tänkte jag lista de platser som jag gör ett besök på varje dag.

Ovanstående är endast sidor som jag besöker manuellt, dvs. sidor som jag inte har i mitt RSS-flöde pga. jag vill inte ha allt som publiceras på de.

Här kommer några guldkorn från RSS-listan (206 flöden and counting…):

  • WordPress Development Log – Utvecklingsteamet bakom WordPress postar uppdateringar.
  • Dan Nilsson – Dan Nilsson skriver om E-handel och webben med glimten i ögat, väldigt roligt!
  • Axon – Här kommer ett wildcard, den här bloggen har inte med webbutveckling att göra, utan handlar om träning. Väldigt bra om du är intresserad av träning.
  • Jonathan Sulo – Funnits på både Loopia och Binero, skriver om webbutveckling och webben i allmänhet
  • Weblog Tools Collection – Dessa postar artiklar med inriktning på wordpress.
  • Mikael Söderström – Även fast jag inte arbetar med ASP.NET brukar jag alltid ta mig tid att läsa Mikaels välskrivna inlägg

Har du några att tipsa mig om? Posta i kommentarerna eller använd kontaktformuläret!

Visa ID på Media i WordPress

Jag hade nyss ett behov på jobbet att visa vilket ID ett objekt har i mediaredigeraren (WordPress). Detta kan vara bra att ha när man ska bygga gallerier, framförallt när man exkluderar vissa bilder genom att använda ID:et.

Kod:

add_filter('attachment_fields_to_edit', 'enable_media_id', 10, 2);
function enable_media_id( $form_fields, $post ) {
    $form_fields["enable-media-id"] = array("label" => "MediaID", "input" => "html", "html" => "<p>".$post->ID."</p>");
 
    return $form_fields;
}

Bild på hur det kommer se ut:

(Jag såg idag att någon hade önskat denna funktionaliteten på WordPress.org -> Ideas)

R.I.P PHPSidan 2002-2010

PHPSidan var ända fram tills nedläggningen en av Sveriges ledande diskussionsforum för webbutveckling, främst inom PHP.

PHPSidan startades av mig och Björn Enochsson i högstadiet (2002) som ett roligt projekt, främst för att jag ville lära mig PHP bättre. På den tiden höll jag på med ASP (Classic) och hade precis börjat titta på PHP. Namnet PHPSidan kommer ifrån den kända ASPsidan.

I början driftade jag PHPSidan på en server som jag hade hemma hos mina föräldrar i Orsa, efter ett tag så växte sidan sig allt för stor för att jag skulle vilja drifta den på en ostabil 0.5 Mbit/s -lina. Därefter fick vi sponsring från lite olika håll innan vi till slut hamnade hos Loopia.

Så, vad hände sen?

Väldigt mycket (de första åren), sen blev det mindre och mindre tid över till PHPSidan från både mitt och Björns håll. Om jag inte minns fel så var det 2006 vi släppte PHPSidan version 6, därefter gjorde vi många försök för att få klart en helt ny version som skulle passa våra (och hela webbens) nya behov bättre. Men på grund av tidsbristen så blev aldrig den nya versionen riktigt klar.

En av mina personliga anledningar till att PHPSidan aldrig färdigsställdes, var att jag blev mer och mer övertygad om att de engelska resurserna som fanns (finns) är så mycket bättre än det vi kan publicera. Därför kände jag aldrig det personliga behovet av att göra allt det som de gjorde, fast på svenska.

Nu då?

Efter en lång tids velande så tog vi beslutet att lägga ner PHPSidan. Besökarantalet på sidan har sakta men säkert dalat. Jag bestämde att jag inte ville att någon skulle ta över PHPSidan och driva vidare den. En av anledningarna till det beslutet är att domänen fortfarande används aktivt av mig. Att låta någon ta över en viss ”del” av domänen, men att jag får behålla någon slags kontroll över eposten kändes inte riktigt rätt mot den personen, den personen skulle nog aldrig kunna satsa 110% på PHPSidan utan fullständig kontroll över domänen.

Jag antar att jag samtidigt på något sätt ville att PHPSidan v7 skulle göras på ”mitt” sätt.

PHPSidan har betytt enormt mycket för mig personligen, jag har fått vänner som jag fortfarande har kontakt med och träffar aktivt. Jag har fått höra från många andra att PHPSidan har betytt väldigt mycket och fått dem att börja med programmering.

Strax innan nedläggningen så startade några på PHPSidan upp PHP Sverige, jag hoppas att många hittar dit och att de gör något riktigt bra av den sidan. Några andra webbplatser ni kan besöka ifall för PHP-relaterade ämnen är W3sidan och PHPportalen. Det är fortfarande aktivitet på IRC-kanalen #phpsidan på Quakenet ifall ni känner för att prata med någon av oss.

Summan av kardemumman

Tack för denna tid allihop, hoppas vi hörs på andra diskussionsforum och om inte annat så hör gärna av er till mig för att snacka webb. Stort tack till Loopia för att ni har tagit hand om oss så länge!

Nostalgitripp

Här kan vi se olika utseenden som PHPSidan haft under åren som gått. Ni kan även se några av de tidiga konceptbilderna på version 7.

© Copyright 2002 - 2010 Anders Hassis

Byggt på Notes Blog Core