26b33d4f4ae62d4890aa0cc16adc83757dd05433
Author: José Lorenzo RodrÃguez
Date: 2009-04-20 16:55:59 -0430
diff --git a/models/behaviors/searchable.php b/models/behaviors/searchable.php
index 7356561..45eb7df 100644
--- a/models/behaviors/searchable.php
+++ b/models/behaviors/searchable.php
@@ -14,7 +14,7 @@ class SearchableBehavior extends ModelBehavior {
function beforeFind(&$Model,$query) {
if (empty($query['search']))
return $query;
-
+
$conditions = $this->searchConditions($Model,$query['search']);
if (!empty($query['conditions']))
$query['conditions'] = am($conditions,$query['conditions']);
@@ -25,7 +25,7 @@ class SearchableBehavior extends ModelBehavior {
function searchConditions(&$Model,$searchables) {
$schema = $Model->schema();
-
+ $conditions = array();
foreach ($searchables as $modelName => $fields) {
foreach ($fields as $field => $comparison) {
$object =& $Model;
diff --git a/models/behaviors/taggable.php b/models/behaviors/taggable.php
index 8025077..e96b636 100755
--- a/models/behaviors/taggable.php
+++ b/models/behaviors/taggable.php
@@ -109,9 +109,11 @@ class TaggableBehavior extends ModelBehavior {
$missing = array_diff($tags,$existingTagNames);
$alreadyAssigned = array();
-
+ $with = empty($model->hasAndBelongsToMany['Tag']['with']) ?
+ Inflector::classify($this->settings[$model->alias]['joinTable']) :
+ $model->hasAndBelongsToMany['Tag']['with'];
if (!empty($model->id)) {
- $alreadyAssigned = $model->{$model->hasAndBelongsToMany['Tag']['with']}->find('all',
+ $alreadyAssigned = $model->{$with}->find('all',
array('conditions' => array(
$this->settings[$model->alias]['foreignKey'] => $model->id
)
@@ -135,17 +137,62 @@ class TaggableBehavior extends ModelBehavior {
$this->settings[$model->alias]['associationForeignKey'] => $tag
);
if (isset($model->data[$model->alias]['tagging_user']) && !empty($model->data[$model->alias]['tagging_user'])
- && $model->{$model->hasAndBelongsToMany['Tag']['with']}->hasField('member_id')
+ && $model->{$with}->hasField('member_id')
) {
$data['member_id'] = $model->data[$model->alias]['tagging_user'];
}
- $model->{$model->hasAndBelongsToMany['Tag']['with']}->create();
- $model->{$model->hasAndBelongsToMany['Tag']['with']}->save($data);
+ $model->{$with}->create();
+ $model->{$with}->save($data);
}
return true;
}
+ function beforeFind(&$model,$query) {
+ $conditions = array();
+ if (!empty($query['search'][$model->alias]['tags'])) {
+ $conditions = $query['search'][$model->alias]['tags'];
+ unset($query['search'][$model->alias]['tags']);
+ }
+ elseif (!empty($query['conditions']['tags'])) {
+ $conditions = $query['conditions']['tags'];
+ }
+
+ if (empty($conditions))
+ return $query;
+
+ $with = empty($model->hasAndBelongsToMany['Tag']['with']) ?
+ Inflector::classify($this->settings[$model->alias]['joinTable']) :
+ $model->hasAndBelongsToMany['Tag']['with'];
+ $query['joins'][] = array(
+ 'table' => $this->settings[$model->alias]['joinTable'],
+ 'alias' => $with,
+ 'type' => 'inner',
+ 'foreignKey' => false,
+ 'conditions' => array("{$with}.{$this->settings[$model->alias]['foreignKey']} = {$model->alias}.{$model->primaryKey}")
+ );
+ $query['joins'][] = array(
+ 'table' => 'tags',
+ 'alias' => 'Tag',
+ 'type' => 'inner',
+ 'foreignKey' => false,
+ 'conditions' => array(
+ "Tag.id = {$with}.{$this->settings[$model->alias]['associationForeignKey']}",
+ 'Tag.name' => explode(' ',$conditions),
+ )
+ );
+ if (is_string($query['fields'])) {
+ $query['fields'] = 'DISTINCT '.$query['fields'];
+ }
+ else if (is_array($query['fields']) && current($query['fields'])) {
+ array_unshift($query['fields'],'DISTINCT '. array_shift($query['fields']));
+ }
+ if (empty($query['fields'])) {
+ $query['fields'][] = 'DISTINCT *';
+ }
+ return $query;
+ }
+
}
?>
diff --git a/plugins/quiz/controllers/quizzes_controller.php b/plugins/quiz/controllers/quizzes_controller.php
index 7f29661..dcd30e9 100755
--- a/plugins/quiz/controllers/quizzes_controller.php
+++ b/plugins/quiz/controllers/quizzes_controller.php
@@ -129,7 +129,11 @@ class QuizzesController extends QuizAppController {
$quizQuestions = Set::extract('/Question/id',$quiz);
if (!empty($this->params['named'])) {
- $this->paginate['Question']['search'] = $this->params['named'];
+ $searchables = array('body','tags');
+ foreach ($searchables as $field) {
+ if (isset($field,$this->params['named'][$field]))
+ $this->paginate['Question']['search']['Question'][$field] = $this->params['named'][$field];
+ }
}
if (!empty($quizQuestions)) {
diff --git a/plugins/quiz/controllers/text_questions_controller.php b/plugins/quiz/controllers/text_questions_controller.php
index 46bc73e..bf68300 100755
--- a/plugins/quiz/controllers/text_questions_controller.php
+++ b/plugins/quiz/controllers/text_questions_controller.php
@@ -127,8 +127,7 @@ class TextQuestionsController extends QuizAppController {
function preview($id) {
$question = $this->TextQuestion->find('first',array(
'conditions' => array('TextQuestion.id' => $id),
- 'fields' => array('body'),
- 'recursive' => -1
+ 'recursive' => 0
)
);
$this->set('question',$question);
diff --git a/plugins/quiz/models/question.php b/plugins/quiz/models/question.php
index c45ea49..9221755 100755
--- a/plugins/quiz/models/question.php
+++ b/plugins/quiz/models/question.php
@@ -43,10 +43,16 @@ class Question extends QuizAppModel {
),
);
- var $actsAs = array('Quiz.Inheritable' => array(
+ var $actsAs = array(
+ 'Quiz.Inheritable' => array(
'method' => 'CTIPARENT',
'pluginScope' => 'Quiz'
- )
+ ),
+ 'Taggable' => array(
+ 'joinTable' => 'quiz_questions_tags',
+ 'foreignKey' => 'question_id'
+ ),
+ 'Searchable',
);
var $validate = array(
'body' => array(
diff --git a/plugins/quiz/vendors/css/quiz.css b/plugins/quiz/vendors/css/quiz.css
index 14d4096..0b83b98 100755
--- a/plugins/quiz/vendors/css/quiz.css
+++ b/plugins/quiz/vendors/css/quiz.css
@@ -43,6 +43,8 @@
.question-list .add {
padding:3px 0pt 0pt 200px;
font-size:0.9em;
+ float:left;
+ margin-top:0;
}
.droplist ul{
margin:0;
@@ -100,6 +102,27 @@
margin-top:0;
}
+.question-list .search .input {
+ float:left;
+ clear:none;
+ padding-right:5px;
+}
+.question-list .search .submit{
+ float:left;
+ margin:0;
+}
+
+.question-list .search .input label{
+ width:auto;
+ margin-top:3px;
+ vertical-align:center;
+}
+
+.question-list .search .input input{
+ padding:3px 0px;
+}
+
+
#questions {
clear:both;
}
diff --git a/plugins/quiz/views/quizzes/edit.ctp b/plugins/quiz/views/quizzes/edit.ctp
index d8a610a..da2ec34 100755
--- a/plugins/quiz/views/quizzes/edit.ctp
+++ b/plugins/quiz/views/quizzes/edit.ctp
@@ -3,9 +3,20 @@
<div class="question-list">
<?php
echo $this->element('question_drop_list', array('quiz_id' => $this->data['Quiz']['id']));
- echo $form->create('Quiz');
- echo $form->input('Search.body');
- echo $form->end(__('Search',true));
+ echo $form->create('Quiz',array('class' => 'search'));
+ echo $form->input('Search.body',array(
+ 'default' => empty($this->params['named']['body']) ? '' : $this->params['named']['body'],
+ )
+ );
+ echo $form->input('Search.tags',array(
+ 'default' => empty($this->params['named']['tags']) ? '' : $this->params['named']['tags'],
+ 'label' => __('Tagged',true)
+ )
+ );
+ echo $form->end(array(
+ 'label' => __('Search',true),
+ )
+ );
?>
<div id="questions">
<div class="pagination-counter">
diff --git a/plugins/quiz/views/text_questions/add.ctp b/plugins/quiz/views/text_questions/add.ctp
index 053c2bc..8265e8d 100755
--- a/plugins/quiz/views/text_questions/add.ctp
+++ b/plugins/quiz/views/text_questions/add.ctp
@@ -9,6 +9,7 @@
<?php
echo $form->input('Question.body', array('label' => array('text' => __('Something', true), 'class' => 'hidden')));
echo $form->input('format');
+ echo $form->input('tags',array('class' => 'tags'));
?>
</div>
</fieldset>
