26b33d4f4ae62d4890aa0cc16adc83757dd05433

Author: José Lorenzo Rodríguez

Date: 2009-04-20 16:55:59 -0430

Updating TaggableBehavior to work on new cake Adding beforeFind callback to TaggableBehavior in order to add adhoc joins in case of doing a search by tag Adding the ability to search questions by tag name Updated QuizSchema to add tags join table

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>