Symfony 1.4 Динамические шаблоны - PullRequest
0 голосов
/ 03 марта 2012

Я действительно новичок в Symfony и работаю над приложением на 1.4. Я мог бы использовать некоторые входные данные для некоторой логики, над которой я работаю, и надеюсь, что кто-то здесь может указать мне правильное направление.

В настоящее время я работаю над простым модулем поиска (а не модулем для поиска работы или поиска по Zend), который запрашивает несколько таблиц с текстом, который вводит пользователь. Текст, введенный пользователем, может быть найден в одной или нескольких из трех столов: предметы, квесты, NPC. Все найденные результаты будут отображаться в поисковой операции поискового модуля.

Что мне нужно, так это чтобы результаты поиска отображались в виде ссылок на соответствующий модуль (Предмет, Квесты, NPC соответственно), но ТОЛЬКО если найдены результаты такого типа. Пример (если найдены совпадения квестов и предметов, но не NPC):

 Your search found 1 Item:
 Item 1

 Your search found 1 quest:
 Quest 1

Поскольку не было найдено ни одного NPC, не было необходимости даже сообщать пользователю, что его не было, поэтому он опущен. Вот где я сталкиваюсь с неприятностями. Я не совсем уверен, КАК это делать. Я мог бы просто выписать и использовать операторы if в searchSuccess.php и показывать их только в том случае, если count () массивов было больше 1, но такого рода поражение цели mvc, верно? Это единственное логическое решение, чтобы это произошло, или я не вижу другого пути?

Буду очень признателен за любые отзывы.

1 Ответ

1 голос
/ 03 марта 2012

Существует множество способов сделать это, простейший, вероятно, что-то вроде этого:

// controller
public function executeSearch(sfWebRequest $request)
{
   $this->results = array();
   // well assume you are using sfForm and have validated the search query
   // which is $searchTerm and that each of your tables has a search method

   // well also assume youre using object routes for these models
   $this->actionMap = array(
      'Npc' => 'npc_show',
      'Quest' => 'quest_show',
      'Item' => 'item_show'
   );

   foreach(array_keys($this->actionMap) as $model)
   {
      $modelResults = Doctrine_Core::getTable($model)->search($searchTerm);
      if($modelResults)
      {
         $this->results[$model] = $modelResults;
      }
   }

   return sfView::SUCCESS;  
}

Итак, что мы имеем в виду, это $results многомерный массив, состоящий из элементов верхнего уровня для моделей, в которых запрос вернул результаты. Модели, у которых не было совпадений, опущены. $actionMap содержит массив ModelName => Routename отображений.

// in your searchSuccess

<?php if(count($results)): ?>
   <?php foreach($results as $model => $modelResults): ?>
       <?php printf("<h3>Your search found %s %s results:</h3>", $modelResults->count(), $model); ?>
       <ul>
          <?php foreach($modelResults as $result): ?>
             <li><?php echo link_to($result, $actionMap[$model], $result); ?></li> 
          <?php endforeach; ?>
       </ul> 
   <?php endforeach; ?>
<?php else: ?>
   <h3>No results found.</h3>
<?php endif; ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...