Редактировать параметры форматирования, передаваемые URL CakePHP 3

1

У меня есть форма с одним полем, na input type = "text" когда форма отправляется URL следующим образом:

http://localhost:8765/products/search?search=notebook

Я желаю, чтобы он встал следующим образом, когда он подвергался форме:

http://localhost:8765/products/search/notebook

Набрав URL-адрес вручную, он отлично работает (я создал метод, который может получить содержимое после поиска/, также созданный маршрут указывает, что URL-адрес указан выше).

Код маршрута (routes.php):

$routes->connect('/products/search/:search', ['controller' => 'Products', 'action' => 'search'], 
[':search' => '\w+', 'pass' => ['search']]); 

Код продуктаController.php (метод, отвечающий за поиск действий)

public function search($search) 
{ 
if($this->request->is('get')) 
{ 
//$product = $this->request->params['pass']; 
$this->paginate = [ 
'fields' => ['product_name', 'quantity', 'sold', 'description', 'price', 'old_price', 'thumbnail'], 
'conditions' => ['product_name LIKE' => '%'.$search.'%'], 
'order' => ['price' => 'DESC'], 
'limit' => 3 
]; 

$this->set('products', $this->paginate($this->Products)); 
} 
} 

форма Код:

<?= $this->Form->create(null, ['url' => ['controller' => 'Products', 'action' => 'search'], 'type' => 'get', 'id' => 'search-form', 'class' => 'navbar-form span7 text-center']) ?> 
<button class="btn btn-info" title="Favorite o Site"> 
<span class="glyphicon glyphicon-star"></span> 
</button> 
<?= $this->Form->text('search', ['class' => 'form-control', 'placeholder' => 'Search']) ?> 
<?= $this->Form->button('Buscar <span class="glyphicon glyphicon-search"></span>', ['type' => 'submit', 'class' => 'btn btn-default']) ?> 
<?= $this->Form->end() ?> 

OBS1: Я предполагаю, что изменение должно быть сделано в этой form (просто догадка).

Теги:
cakephp
cakephp-3.0

2 ответа

4
Лучший ответ

Существует два основных решения

Использовать Js

Вы можете использовать js для изменения URL-адреса, который отправляет форма:

<form 
    method="GET" 
    action="/base/url/" 
    onsubmit="document.location=this.action+document.getElementById('search-input-id').value; return false;"
>
  <input id="search-input" />
</form>

Это очень просто и не имеет логики на стороне сервера.

Использовать Post-Redirect-Get

В качестве альтернативы отправьте форму через сообщение и перенаправьте пользователя на соответствующий URL-адрес, чтобы увидеть результаты (шаблон, известный как PRG).

Например:

<form method="POST">
  <input name="search-input" id="search-input" />
</form>

При наличии соответствующего действия контроллера:

public function search($search = null) 
{
    if($this->request->is('post')) {
        $term = $this->request->data['search-item'];
        // Any verification/validation/logic required
        // Redirect to same controller action with this search term
        return $this->redirect([$term]); 
    }
    ...
    // GET request, with $search term

Преимущество этой методики заключается в том, что имеет смысл контролировать/проверять/проверять поисковый запрос, прежде чем отправлять пользователя на URL-адрес страницы результатов.

  • 0
    Хорошо, я подам заявку и вернусь к разговору, если это сработало
  • 0
    Я использую первое решение, которое сработало, но добавляется в конец строки запроса url, модифицированной путем получения javascript следующим образом: localhost:8765/products/search/notebook?search=notebook @ AD7six
2

Я использовал jQuery lib для отправки form подавляя поведение по умолчанию, создавая новый URL-адрес и перенаправляя:

$("#search-form").submit(function(event){
    event.preventDefault(); // suppress default behavior
    action = $(this).attr('action') + '/' + document.getElementById('search').value; // create a new urldesejado
    window.location.href = action; //make the redirection
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню