Fuelphp - route index with parameters - fuelphp

Using Fuelphp, I'd like to be able to use a URL system similar to here on StackOverflow to get to specific pages.
Desired behavior:
-stackoverflow.com/questions -> page with many questions
-stackoverflow.com/questions/1982 ->page with specific question
Here's my controller:
class Controllers_Images extends Controller_Template
{
public function action_index($id=null)
{
if($id)
{
//Use Model_Image to find specific image
//Create appropriate view
}
else
{
//Use Model_Image to find many images
//Create appropriate view
}
}
}
I can access the "generic" page with mysite.com/images/ - this is routed to the action_index function. I can access a "specific" page with mysite.com/images/index/1. What I'd like to do is be able to skip index in this case too, so that mysite.com/images/1 works. Right now I'm getting 404. How do I set up routing for this?

After poking around a bit more, I came up with a solution that works fine:
class Controllers_Images extends Controller_Template
{
public function action_index()
{
//Use Model_Image to find many images
//Create appropriate view
}
public function get_id($id)
{
//Use Model_Image to find specific image
//Create appropriate view
}
}
In routes.php:
return array(
'images/(:num)'=>'images/id/$1',
//other routing stuff...
);
With this setup, the url "mysite.com/images/1" now appropriately displays the selected image as if "mysite.com/images/id/1" was used instead. Not a huge deal, but it is a nicer interface, which is important!

Related

MvvmCross navigation on screen

Our designer created a layout something like the screen above. The main idea was to create an application with only one screen, just the red part of the screen is changing (i.e. 2 textbox instead of 1 textbox) when you tap on a button. This application will be a multiplatform application and I'm using MvvmCross to create it. My question is that how can i achieve this behavior in Mvvm? My first thought was sg. like the code below, but I'm not satisfied with this solution. Do you have any better solution to this problem? Should i somehow overwrite default navigation on ShowViewModel()?
public class MainViewModel : MvxViewModel
{
private MvxViewModel _currentViewModel;
public MvxViewModel CurrentViewModel
{
get { return _currentViewModel; }
set { _currentViewModel = value; RaisePropertyChanged(() => CurrentViewModel); }
}
public MainViewModel()
{
CurrentViewModel = new DefaultViewModel();
}
public void OnButtonClick()
{
CurrentViewModel = new SecondViewModel();
}
}
public partial class MainViewModel : MvxViewController
{
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
FirstViewModel.WeakSubscribe(ViewModelPropertyChanged);
}
private void ViewModelPropertyChanged(object sender, PropertyChangedEventArgs args)
{
if (args.PropertyName == "CurrentViewModel")
{
if (Model.CurrentViewModel != null)
{
if (Model.CurrentViewModel is SecondViewModel)
{
//remove bindings
//change View
//bind new viewmodel
}
}
}
}
The alternatives for this kind of 'non-page navigation' are similar to those in MvvmCross Dialog:
You can:
Customize the MvxPresenter to allow ShowViewModel to be used
Put a special interface in the Core project and use Inversion of Control to inject the implementation from the UI project to the Core project
Use the MvxMessenger plugin and share messages between the Core and UI project which trigger this type of navigation.
Use a property with a special interface (like IInteractionRequest) on the ViewModel - that property will fire an event when the UI needs to change.
Personally, for your situation, I quite like the first of these options - intercepting ShowViewModel using a presenter.
One other alternative which I might consider is to use some kind of 'Adapter-driven' control which could very easily update it's child contents based on the CurrentViewModel property. On Android, this would be as easy as using an MvxLinearLayout with an adapter. On iOS, however, I think you'd have to write something new to do this - just because iOS doesn't really have a LinearLayout/StackPanel control.

MvvmCross: Android custom webview urls handlers

My Android application had some complex text with hyperlinks embedded inside. The easiest way for me to handle this was to just use an embedded WebView and detect hyperlink clicks to perform custom commands. I am trying to do this the MvvmCross way. Is there a binding available for WebView.SetBackgroundColor or WebView.LoadData? Once I get my custom html inside and the user clicks on hyperlinks, I have used WebView.SetWebViewClient to install my own client which can detect hyperlink clicks and perform custom actions. Any way to turn all of that into proper MvxCommand usage?
Is there a binding available for WebView.SetBackgroundColor
For View color binding see the sample: https://github.com/slodge/MvvmCross-Tutorials/tree/master/ValueConversion
or WebView.LoadData?
See Dynamic Binding UIWebView in MVVMCross
I have used WebView.SetWebViewClient to install my own client which can detect hyperlink clicks and perform custom actions. Any way to turn all of that into proper MvxCommand usage?
It's not clear to me what your question is. Maybe try coding something first and then coming back with some sample code for the problem - eg come back with a specific question about a specific ViewModel so that others can try to answer at a code level instead of at this more general level. Perhaps also try asking one question at a time and asking with a deeper level of detail - How to ask may help you get better results - see https://stackoverflow.com/questions/how-to-ask
I created a custom WebView by inheriting and added Command properties. I then added a custom WebViewClient to detect certain URL's and to call the corresponding command that was bound. Is this a good way to accomplish this?
public class AboutWebView : WebView
{
public IMvxCommand AboutCommand { get; set; }
public IMvxCommand LicenseCommand { get; set; }
public IMvxCommand PrivacyCommand { get; set; }
public AboutWebView (Context ctx,IAttributeSet aset) : base(ctx,aset)
{
SetWebViewClient (new AboutWebViewClient(this));
}
private class AboutWebViewClient : WebViewClient
{
private AboutWebView _parent = null;
public AboutWebViewClient(AboutWebView parent)
{
_parent = parent;
}
public override bool ShouldOverrideUrlLoading (WebView view, string url)
{
if (url.StartsWith ("about://"))
_parent.AboutCommand.Execute ();
else if (url.Equals (App.LICENSE_URL))
_parent.LicenseCommand.Execute ();
else
_parent.PrivacyCommand.Execute ();
return(true);
}
}
}

Redirect action to mobile view

public ActionResult Home()
{
return View();
}
This is what I have for my current site within the HomeController. How can I detect if the action is called from a mobile device, and if it is, re-direct to MobileHome.aspx instead of Home.aspx.
I don't need to know the details of the device, because I am implementing the view in JQuery Mobile, which should adjust itself correctly depending on the view it's rendered in.
You may find the following blog post useful.
The following is an override on the Controller class. I have not tested this, so consider it pseudo code:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (this.Request.Browser.IsMobileDevice && filterContext.Result is ViewResultBase)
{
var viewResult = filterContext.Result as ViewResultBase;
viewResult.ViewName = "Mobile" + viewResult.ViewName;
}
base.OnActionExecuted(filterContext);
}
You can use the Request.Browser.IsMobileDevice to determine if the device is mobile (obviously), and then check to see if the result it a view. However, changing the view name is not sufficient if you pass an actual view to the result of your action.

How to access child controls inside inherited class?

Here is what I'm doing, I have a large amount of reports, rather than copy and pasting the repeated code, I have the following..
public class ReportPage : System.Web.UI.Page
{
// Code
}
My report Pages have
public class MyReportPage : ReportPage
{
}
Problem I'm having is, I want to be able to access a control inside MyReportPage within ReportPage, for instance, I want all pages grid to have a specific property.
Inside ReportPage I tried
protected void Page_PreRender(object s, EventArgs e)
{
var obj = this.FindControl("reportGridName");
}
But unable to find the control, went through all the controls to see if I could it in, no luck..
Any ideas how to get the grid access on the inherit?
Page page = (Page)HttpContext.Current.Handler;
var obj = page.FindControl("reportGridName");
Does that work? I'm having the exact same problem and stumbled upon this link

N2 CMS - My Items dont show in the tree

Anyone familier with N2 CMS ??
ive just started using it, and so far so good, but i have an issue that im sure you guys will know whats wrong.
i have this simple Item class...
using N2;
using N2.Details;
using MVCSite.ContentCMSItems;
[PageDefinition("Home page", Description = "The Page for the home page")]
[WithEditableName]
public class PageItem : AbstractBaseClass
{
/// <summary>
/// There are code snippets to help generate these properties.
/// Look in the snippets directory of the package.
/// </summary>
[EditableFreeTextArea("MainText", 97)]
public virtual string MainText
{
get { return (string)GetDetail("MainText"); }
set { SetDetail("MainText", value); }
}
[EditableFreeTextArea("Home Page Fotter Text", 100)]
public virtual string FooterText
{
get { return (string)GetDetail("Home Page Fotter Text"); }
set { SetDetail("Home Page Fotter Text", value); }
}
}
In edit mode, N2 CMS picks it up and i can create a page and fill in all the data.
Once this is done i expect to see it in the tree, below my start page, but it never shows.
All the data is in the database but not in the tree, so once its created i cannot edit it :(
can anyone suggest what im doing wrong ??
thanks for your time
Truegilly
Found the problem, as i copied the AbstractBaseClass which it inherits, from the N2CMS MVC example project, it contained methods that caused this problem. After removing these it now shows in the tree.
Truegilly