2011-12-08 9 views
1

ユーザープロファイルにカスタムフィールドを追加するJoomla 1.7プラグインを作成しました。私は基本として、Joomlaに含まれているプロファイルプラグインから始めました。Joomlaのプロファイルプラグインにチェックボックスを保存するにはどうしたらいいですか?

私は以下のようにチェックボックスフィールドを追加しました:

<?xml version="1.0" encoding="utf-8"?> 
<form> 
    <fields name="profile"> 
     <fieldset name="profile" label="PLG_USER_WISPROFILE_SLIDER_LABEL"> 
      <field name="speltak1" type="checkboxes" label="PLG_USER_WISPROFILE_SPELTAK_LABEL" 
       description="PLG_USER_WISPROFILE_SPELTAK_DESC"> 
       <option value="Bevers">PLG_USER_WISPROFILE_OPTION_BEVERS</option> 
       <option value="Welpen Ochtend Horde">PLG_USER_WISPROFILE_OPTION_WELPENOCHTEND 
       </option> 
       <option value="Welpen Middag Horde">PLG_USER_WISPROFILE_OPTION_WELPENMIDDAG 
       </option> 
       <option value="Scouts Verkenners">PLG_USER_WISPROFILE_OPTION_SCOUTSVERKENNERS 
       </option> 
       <option value="Scouts Verkensters">PLG_USER_WISPROFILE_OPTION_SCOUTSVERKENSTERS 
       </option> 
       <option value="Explorers">PLG_USER_WISPROFILE_OPTION_EXPLORERS</option> 
       <option value="Klimstam">PLG_USER_WISPROFILE_OPTION_KLIMSTAM</option> 
      </field> 
     </fieldset> 
    </fields> 
</form> 

をこれは正しく登録し、ユーザープロファイルの編集時にフォームにフィールドを追加します。しかし、プロファイルを保存しようとすると、データベースに何も保存されません。チェックボックスフィールドは$ data変数の配列に変換されます。しかし、サンプルコードではこれをデータベースに保存することはできません。誰もこれを行う方法を知っていますか?

答えて

1

フォームの作成を正しく傍受し、フィールドをフォームに追加しているようです。

フォームの保存時に実行するコード/関数については言及していません。おそらくあなたはJoomlaがあなたの新しいフィールドデータを魔法のように捕捉して保存することを期待していますか?もしそうなら、残念ながらそれはそのようには機能しません。あなたは少し余分な仕事をする必要があります。

ドキュメントからこのページを見て、 'function onUserAfterSave'部分に注目してください。 http://docs.joomla.org/Creating_a_profile_plugin

1

保存しない理由は、配列要素をSQLクエリに渡すためです。このフォームを変更する必要があります。データをシリアル化するか、jsonなどに変換します。この時点で、dbに保存されます。

function onUserAfterSave($data, $isNew, $result, $error){ 
    $userId = JArrayHelper::getValue($data, 'id', 0, 'int'); 

    if ($userId && $result && isset($data['gw2atpprofile']) && (count($data['gw2atpprofile']))){ 
     try { 
      $db = &JFactory::getDbo(); 
      $db->setQuery('DELETE FROM #__user_profiles WHERE user_id = '.$userId.' AND profile_key LIKE \'gw2atpprofile.%\''); 
      if (!$db->query()) { 
       throw new Exception($db->getErrorMsg()); 
      } 

      $tuples = array(); 
      $order = 1; 
      foreach ($data['gw2atpprofile'] as $k => $v) { 
       if (is_array($v)){ 
        $v = serialize($v); 
       } 
       $tuples[] = '('.$userId.', '.$db->quote('gw2atpprofile.'.$k).', '.$db->quote($v).', '.$order++.')'; 
      } 

      $db->setQuery('INSERT INTO #__user_profiles VALUES '.implode(', ', $tuples)); 
      if (!$db->query()) { 
       throw new Exception($db->getErrorMsg()); 
      } 
     } catch (JException $e) { 
      $this->_subject->setError($e->getMessage()); 
      return false; 
     } 
    } 

    return true; 
} 

この時点で、情報を取得する方法を作成する必要があります。私はこのスレッドが古いことを知っていますが、私はちょうどこの質問につまずくかもしれない新しいメンバーの理由を投稿したいと思いました。

関連する問題