👁 查看:MemberConfigForm.class.php
路径:/virtual/bigbrother/sns/lib/form/MemberConfigForm.class.php
大小:5.1 KB · 修改:2010-08-10 13:59:42 · 权限:0644 · 可写
<?php

/**
 * This file is part of the OpenPNE package.
 * (c) OpenPNE Project (http://www.openpne.jp/)
 *
 * For the full copyright and license information, please view the LICENSE
 * file and the NOTICE file that were distributed with this source code.
 */

/**
 * MemberConfig form.
 *
 * @package    form
 * @subpackage member_config
 * @author     Kousuke Ebihara <ebihara@tejimaya.com>
 */
class MemberConfigForm extends sfForm
{
  protected $memberConfigSettings = array();
  protected $category = '';
  protected $member;
  protected $isNew = false;
  protected $isAutoGenerate = true;

  public function __construct(Member $member = null, $options = array(), $CSRFSecret = null)
  {
    $this->setMemberConfigSettings();

    $this->member = $member;
    if (is_null($this->member)) {
      $this->isNew = true;
      $this->member = new Member();
      $this->member->setIsActive(false);
    } elseif (!$this->member->getIsActive()) {
      $this->isNew = true;
    }

    parent::__construct(array(), $options, $CSRFSecret);

    if ($this->isAutoGenerate) {
      $this->generateConfigWidgets();
    }

    $this->widgetSchema->setNameFormat('member_config[%s]');
  }

  public function generateConfigWidgets()
  {
    foreach ($this->memberConfigSettings as $key => $value) {
      if ($this->isNew && $value['IsRegist'] || !$this->isNew && $value['IsConfig']) {
        $this->setMemberConfigWidget($key);
      }
    }
  }

  public function setMemberConfigSettings()
  {
    $categories = sfConfig::get('openpne_member_category');
    $configs = sfConfig::get('openpne_member_config');

    if (!$this->category) {
      $this->memberConfigSettings = $configs;
      return true;
    }

    foreach ($categories[$this->category] as $value)
    {
      $this->memberConfigSettings[$value] = $configs[$value];
    }
  }

  public function setMemberConfigWidget($name)
  {
    $config = $this->memberConfigSettings[$name];
    $this->widgetSchema[$name] = opFormItemGenerator::generateWidget($config);
    $this->widgetSchema->setLabel($name, $config['Caption']);
    $memberConfig = MemberConfigPeer::retrieveByNameAndMemberId($name, $this->member->getId());
    if ($memberConfig) {
      $this->setDefault($name, $memberConfig->getValue());
    }
    $this->validatorSchema[$name] = opFormItemGenerator::generateValidator($config);

    if (!empty($config['IsConfirm'])) {
      $this->validatorSchema[$name.'_confirm'] = $this->validatorSchema[$name];
      $this->widgetSchema[$name.'_confirm'] = $this->widgetSchema[$name];
      $this->widgetSchema->setLabel($name.'_confirm', $config['Caption'].' (Confirm)');

      $this->mergePostValidator(new sfValidatorSchemaCompare($name, '==', $name.'_confirm'));
    }

    if (!empty($config['IsUnique'])) {
      $this->mergePostValidator(new sfValidatorCallback(array(
        'callback' => array($this, 'isUnique'),
        'arguments' => array('name' => $name),
      )));
    }

    if (!empty($config['Info']))
    {
      $this->widgetSchema->setHelp($name, $config['Info']);
    }
  }

  public function isUnique($validator, $value, $arguments = array())
  {
    if (empty($arguments['name'])) {
      throw new InvalidArgumentException('Invalid argument');
    }

    $name = $arguments['name'];
    $data = MemberConfigPeer::retrieveByNameAndValue($name, $value[$name]);
    if (!$data || !$data->getMember()->getIsActive() || $data->getMember()->getId() == $this->member->getId()) {
      return $value;
    }

    throw new sfValidatorError($validator, 'This '.$name.' address already exists.');
  }

  public function isValid()
  {
    if ($this->member)
    {
      return parent::isValid();
    }

    opActivateBehavior::disable();

    foreach ($this->getValues() as $key => $value)
    {
      if (!empty($this->memberConfigSettings[$key]['IsUnique']))
      {
        $memberConfig = MemberConfigPeer::retrieveByNameAndValue($key.'_pre', $value);
        if ($memberConfig)
        {
          $member = $memberConfig->getMember();
          if (!$member->getIsActive())
          {
            $this->member = $member;
          }
        }
      }
    }

    opActivateBehavior::enable();
    return parent::isValid();
  }

  public function save()
  {
    foreach ($this->getValues() as $key => $value)
    {
      if (strrpos($key, '_confirm'))
      {
        continue;
      }

      $this->saveConfig($key, $value);
    }

    return true;
  }

  public function saveConfig($name, $value)
  {
    $memberConfig = MemberConfigPeer::retrieveByNameAndMemberId($name, $this->member->getId());
    if (!$memberConfig) {
      $memberConfig = new MemberConfig();
      $memberConfig->setName($name);
      $memberConfig->setMember($this->member);
    }
    $memberConfig->setValue($value);

    $memberConfig->save();
  }

  public function savePreConfig($name, $value)
  {
    $memberConfig = MemberConfigPeer::retrieveByNameAndMemberId($name.'_pre', $this->member->getId());
    if (!$memberConfig) {
      $memberConfig = new MemberConfig();
      $memberConfig->setName($name);
      $memberConfig->setMember($this->member);
    }

    $memberConfig->setValue($value);
    $memberConfig->savePre();
    $memberConfig->saveToken();
  }
}
ページが見つかりませんでした – Lumiere Shop
ここを指しているリンクに誤りがあったようです。検索してみるのはいかがですか ?
お買い物カゴ