2

SugarCRM でアカウントを検索するときにワイルドカード検索を行う方法を探していますが、クエリが正しく機能しません。

build_generic_where_clause() 関数は次のとおりです。

function build_generic_where_clause ($the_query_string) {
    $where_clauses = Array();
    $the_query_string = $this->db->quote($the_query_string);
    array_push($where_clauses, "accounts.name like '%$the_query_string%'");
    if (is_numeric($the_query_string)) {
        array_push($where_clauses, "accounts.phone_alternate like '%$the_query_string%'");
        array_push($where_clauses, "accounts.phone_fax like '%$the_query_string%'");
        array_push($where_clauses, "accounts.phone_office like '%$the_query_string%'");
    }

    $the_where = "";
    foreach($where_clauses as $clause)
    {
        if(!empty($the_where)) $the_where .= " or ";
        $the_where .= $clause;
    }


    $log = fopen('1.txt', "a");
    fwrite($log, $the_where . "\n");

    return $the_where;
}

array_push($where_clauses, "accounts.name like '%$the_query_string%'");the_query_string の両側にパーセント記号を含めるように変更しただけです。

view.list.php の processSearchForm() は次のとおりです。

 function processSearchForm(){


        if(isset($_REQUEST['query']))
        {
            // we have a query
            if(!empty($_SERVER['HTTP_REFERER']) && preg_match('/action=EditView/', $_SERVER['HTTP_REFERER'])) { // from EditView cancel
                $this->searchForm->populateFromArray($this->storeQuery->query);
            }
            else {
                $this->searchForm->populateFromRequest();
            }

            $where_clauses = $this->searchForm->generateSearchWhere(true, $this->seed->module_dir);

            if (count($where_clauses) > 0 )$this->where = '('. implode(' ) AND ( ', $where_clauses) . ')';
            $GLOBALS['log']->info("List View Where Clause: $this->where");

            $log = fopen('1.txt', "a");
            fwrite($log, $this->where . "\n");

        }
        if($this->use_old_search){
            switch($view) {
                case 'basic_search':
                    $this->searchForm->setup();
                    $this->searchForm->displayBasic($this->headers);
                    break;
                 case 'advanced_search':
                    $this->searchForm->setup();
                    $this->searchForm->displayAdvanced($this->headers);
                    break;
                 case 'saved_views':
                    echo $this->searchForm->displaySavedViews($this->listViewDefs, $this->lv, $this->headers);
                   break;
            }
        }else{
            echo $this->searchForm->display($this->headers);
        }
    }

$this->where をキャッチするためにログ ファイルの書き込みのみを追加したことに注意してください。検索ボックスを使用して「Newbold」や「New York Design」などのアカウントを検索すると、結果として「Newbold」のみが表示され、ログ ファイルには(accounts.name like 'new%'). したがって、最初のパーセント記号は何らかの形で削除されています。私は processSearchForm() がどこかにあると信じています。それが事実なのか、それとも犯人が別の場所にあるのかを突き止めるのは難しい. このコードは少し複雑であちこちにあると思いますが、これは私が行う必要がある唯一のカスタマイズです。どんな助けでも大歓迎です。

4

1 に答える 1

0

コードを変更せずにこれを実行できるはずです。アカウント リスト ビューから検索する場合は、フォーム内の検索にワイルドカードを追加するだけです。検索フォームに「%$the_query_string%」を入力してください。

プログラムでワイルドカードを使用してレコードを検索する場合は、次のようにすることができます。

<?php

$filter = 'ABC%'; // account names that start with 'ABC'
$account = BeanFactory::getBean('Accounts');
$accounts = $account->get_list("", "accounts.name like '".$filter."'");

foreach ($accounts['list'] as $account)
{
    // do something with $account
}

get_list() は必要なものを取得します。注意すべきことの 1 つは、get_list() は、リスト ビューが返すレコードの数のみを返すことです。したがって、リスト ビューに 20 レコードしか表示されない場合、get_list() は最大 20 レコードを返します。すべての結果を取得する場合は、get_full_list() を使用します。

于 2013-08-24T20:17:53.547 に答える