specific sort and direction routes in cakephp - sorting

I looked around to find answers and though I found topics about the routes, none of the answers I found worked in this case. So here I go, trying to explain my problem =]
Background information
I'm making a website in Cakephp for an estate agent. On this website you have the possibility to sort houses based on the street, publish date and price.
What I want
I want to change these current urls:
websitename.nl/houses/index/page:4/sort:street/direction:desc
websitename.nl/houses/index/sort:street/direction:desc/page:4
to something like:
websitename.nl/houses/street/descending/4
websitename.nl/houses/price/ascending/4
Street/price and descending/ascending will be translated to dutch.
What I already tried
I tried to add this in routes.php:
Router::connect('/huizenaanbod/datum/aflopend/:page', array('controller' => 'houses', 'action' => 'index', 'sort'=>'published', 'direction' => 'desc'), array('page' => '[0-9]+'));
Router::connect('/huizenaanbod/datum/oplopend/:page', array('controller' => 'houses', 'action' => 'index', 'sort'=>'published', 'direction' => 'asc'), array('page' => '[0-9]+'));
But it ignored the desc and only the asc worked.. So I tried to add this at the index.ctp:
if((!empty($this->params['sort']) && $this->params['sort'] == "published") && $this->params['direction'] == 'desc'){
echo $this->Paginator->sort('published', 'datum', array('direction' => 'asc', 'escape' => false));
} else {
echo $this->Paginator->sort('published', 'datum', array('direction' => 'desc', 'escape' => false));
}
And eventhough the url does change now, the results of the sort are still ordered ASC.
So my question is:
How can I make an url in routes, combined with :page, for a specific sort and direction?
If you need more information, let me know.
And thank you in advance =]

you better look at other web agencies web site to see how they do the filtering. look at the link below see how the parameters is passed.. e.g.
http://www.rightmove.co.uk/property-for-sale/find.html?searchType=SALE&locationIdentifier=REGION%5E92826&insId=1&radius=0.0&displayPropertyType=&minBedrooms=&maxBedrooms=3&minPrice=&maxPrice=&retirement=&partBuyPartRent=&maxDaysSinceAdded=&_includeSSTC=on&sortByPriceDescending=&primaryDisplayPropertyType=&secondaryDisplayPropertyType=&oldDisplayPropertyType=&oldPrimaryDisplayPropertyType=&newHome=&auction=false
Now lets get back to you question.. for passing all the parameters you need to use /** e.g.
Router::connect(
'/action_name/**', //once you requesting rather than star you need to put your parameters
array('controller' => 'pages', 'action' => 'show')
);
//www.exsmple.com/action_name/parameters here...
Reference
you can also customize your pagination class from here

Related

How to display two dynamic names within one url using laravel

The following code:
{{url('/'.$subjecttype->name)}}
is the name 'garden' wrapped up in a url. This gives me localhost/garden with obviously garden as the dynamic name. With my routes setup like so:
Route::get('/{subject}/', array( 'as' => 'subject', 'uses' =>
'SubjectController#getsubject'));
The question is how would I setup two dynamic names within one route? For example
localhost/garden/12
so i would want my route to look something like this
Route::get('/{subject}/{id}/', array( 'as' => 'subjectid', 'uses' => 'SubjectController#getsubjectid'));
but more importantly what would it look like in my view? so that I have the of my garden header wrapped up in a url that looks like this:
'gardening tips for beginners' which is {{$subjecttype->title}}
below is my very poor attempt at what i want but i hope you get the picture.
{{url('/$subjecttype->name/$subjecttype->id/'.$subjecttype->title)}}
Thanks
For your route:
Route::get(
'/{subject}/{id}/',
array(
'as' => 'subjectid',
'uses' => 'SubjectController#getsubjectid'
)
);
you can generate the URL with the following code:
$url = URL::route(
'subjectid',
array(
'subject' => $subjecttype->name,
'id' => $subjecttype->id
)
);
or, if you prefer to use the helper functions:
$url = route(
'subjectid',
array(
'subject' => $subjecttype->name,
'id' => $subjecttype->id
)
);
That's going to give you a URL like http://example.com/subjectname/42. If you want to add another parameter like the title at the end of the URL, you'll need to add another parameter to your route definition. If you don't you're going to get 404 errors because no route will match the URL.
For the second part of my question using the 'gardening tips for beginners' example:
gardening tips for beginners

Create custom validation for form entity

I am using the form builder to create an choice-field form an entity looking like this:
$form->add(
'existing_items','entity', array(
'label' => 'Artikel aus',
'class' => 'ProjectShoppinglistBundle:Item',
'empty_value' => 'Bitte einen Artikel auswählen',
'property' => 'name',
'query_builder' => function(EntityRepository $er) use ($options) {
return $er->createQueryBuilder('item')
->leftJoin('item.userItems', 'userItem')
->where('userItem.user = ' . $options['attr']['id'])
->orderBy('item.name', 'ASC');
},
'attr' => array(
'class' => 'form-control',
),
));
but I am using jquery to change the content of the dropdown, so I need to change the validation for the field, how can I achieve that the values in the form are valid for all elements in the items-table and not just the one's which are linked to my the userId used in the query?
This is necessary for my approach because I have a second dropdown where the user can define if he wants to see the items on his own list, of other lists or all items
I have already taken a look at this but I still don't really get it how I can use the eventListener to get the desired result.
If someone could give me a useful hint, I would appreciate this very much.

How to create route for static pages in laravel 4

I have a page in the database. I want to have a URL like mysite.com/page_alias for the page. How do I properly write route in laravel 4.
In kohana i did this:
Route::set('static', '<page>', array('page' => "page|page2|page3|etc"))
->defaults(array(
'action' => 'index',
'controller' => 'Static',
'directory' => 'Index',
));
Thanks.
Sorry for my english.
I never use Kohana but looking at its doc, if I'm right, this is the closest way to do what you used to do with Kohana.
Route::get('{page}', 'StaticController#index')->where('page', 'page|page2|page3|etc');
PS: take a look at this http://laravel.com/docs/4.2/routing (you probably have already checked the doc but in case..)

Adding custom columns in order grid (Magento 1.7.0.0)

I'm having this problem with adding custom columns in the order grid in Magento 1.7.0.0 and I was hoping you'd be able to give me a hand in here.
Basically I followed this guide http://www.atwix.com/magento/customize-orders-grid/ which explained I had to make a local version of /app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php and make a couple of changes to have the extra columns I want. By following said guide, it said that I had to edit the function _prepareCollection() to add this line (specifying the fields I want to extract in the array)
$collection->getSelect()->join('magento_sales_flat_order_address', 'main_table.entity_id = magento_sales_flat_order_address.parent_id',array('telephone', 'email'));
Before
return parent::_prepareCollection();
And add the two columns in _prepareColumns() like this:
$this->addColumn('telephone', array(
'header' => Mage::helper('sales')->__('Telephone'),
'index' => 'telephone',
));
$this->addColumn('email', array(
'header' => Mage::helper('sales')->__('Email'),
'index' => 'email',
));
And that was it, apparently... Or maybe not, since it throws the following error when I do that:
Item (Mage_Sales_Model_Order) with the same id "XXXX" already exist
To which the solution, according to the comments underneath, was to add the following line in _prepareCollection before $this->setCollection($collection):
$collection->getSelect()->group('main_table.entity_id');
After adding the line, the Order Grid now shows the Email and Phone columns just like I want it, but turns out the pagination stopped working, it only shows the most recent 20 and it says "Pages 1 out of 1", "2 records found" on top. I can't seem to figure out why this is happening and every comment I see around doesn't go beyond the last instruction above. What could possibly be the cause of this issue?
I assume it could be replicated since I haven't made any other modifications of this model.
Alright, solved it. This is what I did:
Inspired by this answer https://stackoverflow.com/a/4219386/2009617, I made a copy of the file lib/Varien/Data/Collection/Db.php, placed it under app/core/local/Varien/Data/Collection/Db.php and copied the modifications suggested on that answer to fix the group select count error that was giving me problems above. So far it seemed to work.
However, there was a problem in the rows, when I clicked on the orders it said the Order "no longer exists", so I checked the actual url and turns out the order_id in the url was the same as the "entity_id" in the order_address table, which didn't correspond with the actual associative id of the order (parent_id). After tweaking for a long time with the MySQL query, I realized the issue was in the functions called by the _prepareColumns() and getRowUrl() functions in the /app/code/local/Mage/Adminhtml/Block/Sales/Order/Grid.php I made, since they were retrieving the wrong Id. So I made the following changes:
In _prepareColumns(), within the code corresponding to the Action column, I changed the 'getter' to 'getParentId', like this:
if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/view')) {
$this->addColumn('action',
array(
'header' => Mage::helper('sales')->__('Action'),
'width' => '50px',
'type' => 'action',
//~ 'getter' => 'getId',
'getter' => 'getParentId',
'actions' => array(
array(
'caption' => Mage::helper('sales')->__('View'),
'url' => array('base'=>'*/sales_order/view'),
'field' => 'order_id',
)
),
'filter' => false,
'sortable' => false,
'index' => 'stores',
'is_system' => true,
));
}
And in the getRowUrl() function, I changed the $row statement within the getUrl() function like this:
public function getRowUrl($row)
{
if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/view')) {
//~ return $this->getUrl('*/sales_order/view', array('order_id' => $row->getId()));
return $this->getUrl('*/sales_order/view', array('order_id' => $row->getParentId()));
}
return false;
}
And now it works like a charm. I hope this helps somebody else.
The problem is in query. Instead of this query:
$collection->getSelect()->join('magento_sales_flat_order_address', 'main_table.entity_id = magento_sales_flat_order_address.parent_id',array('telephone', 'email'));
You should use this:
$collection->getSelect()->join('sales_flat_order_address', 'main_table.entity_id = sales_flat_order_address.parent_id AND sales_flat_order_address.address_type = "shipping" ',array('telephone', 'email'));
In the table sales_flat_order_address, parent_id is duplicated. The first is for billing and the second one is for shipping. So you just need to select one of this: billing or shipping. This values are in column address_type...
Try using filter_index in the addColumn function:
$this->addColumn('telephone', array(
'header' => Mage::helper('sales')->__('Telephone'),
'index' => 'telephone',
'filter_index' => 'tablename.telephone'
));
You can find out the table name with printing out the sql query:
var_dump((string)$collection->getSelect())

Data validation with custom route issue (default url when errors occur)

I'm building a user panel, and having some problems with data validation. As an example, the page where you change your password (custom validation rule comparing string from two fields (password, confirm password)):
Route:
Router::connect('/profile/password', array('controller' => 'users', 'action' => 'profile_password'));
Controller:
function profile_password()
{
$this->User->setValidation('password'); // using the Multivalidatable behaviour
$this->User->id = $this->Session->read('Auth.User.id');
if (empty($this->data))
{
$this->data = $this->User->read();
} else {
$this->data['User']['password'] = $this->Auth->password($this->data['User']['password_change']);
if ($this->User->save($this->data))
{
$this->Session->setFlash('Edytowano hasło.', 'default', array('class' => 'success'));
$this->redirect(array('action' => 'profile'));
}
}
}
The problem is, that when I get to http://website.com/profile/password and mistype in one of the fields, the script goes back to http://website.com/users/profile_password/5 (5 being current logged users' id). When I type it correctly then it works, but I don't really want the address to change.
It seems that routes aren't supported by validation... (?) I'm using Cake 1.3 by the way.
Any help would be appreciated,
Paul
EDIT 1:
Changing the view from:
echo $form->create(
'User',
array(
'url' => array('controller' => 'users', 'action' => 'profile_password'),
'inputDefaults' => array('autocomplete' => 'off')
)
);
to:
echo $form->create(
'User',
array(
'url' => '/profile/password',
'inputDefaults' => array('autocomplete' => 'off')
)
);
does seem to do the trick, but that's not ideal.
Check the URL of the form in the profile_password.ctp view file.
Try the following code:
echo $this->Form->create('User', array('url' => array('controller' => 'users', 'action' => 'profile_password')));
Also, I think your form might be a little vulnerable. Try using Firebug or something similar to POST a data[User][id] to your action. If I'm right, you should be setting:
$this->data['User']['id'] = $this->Auth->user('id');
instead of:
$this->User->id = $this->Session->read('Auth.User.id');
because your id field is set in $this->data.
HTH.

Resources