Symfony交替采取新行动

时间:2011-12-09 12:24:52

标签: php symfony-forms symfony-1.4 admin-generator

我有一台服务器,我需要存储一些图像。现在,图像可以上传或动态创建,让我们说只是通过添加一些文本到一些默认图片(所以我为此创建了一个文件MakenewForm.php)。我的数据库中的表将文件名存储在本地文件系统中。现在上传很简单,我可以使用默认的_new动作。为了创建图片,我做了一个新动作,比如makenewnewmakenew都显示在列表视图中。我将newSuccess.php复制到了makenewSuccess.php。现在我想为他们提供一组不同的提交按钮。我似乎无法弄清楚如何做到这一点。我所看到的就是:

<div id="sf_admin_content">
<?php include_partial('poster/form', array('poster' => $poster, 'form' => $form,       'configuration' => $configuration, 'helper' => $helper)) ?>
</div>

我不知道什么是$配置,什么是$ helper。有人可以告诉我他们的情况吗?我需要改变哪一个?如何?

另外,正如您可以推断的那样,new操作的提交操作只需要执行$form->save(),但makenew的提交操作需要输入和写入所有文本图像文件(假设使用 imagejpeg

我需要一些指导来实现这一目标。

1 个答案:

答案 0 :(得分:0)

我希望能够专注于您所寻找的目标。

关于$configuration$helper,正如您在cache\mypplication\dev\modules\autoMymodule\actions\actions.class.php中找到的那样,函数preExecute()也用于创建它们:

$this->configuration = new mymoduleGeneratorConfiguration();
$this->helper = new mymoduleGeneratorHelper();

这些类位于apps\docdesk\modules\mymodule\lib。您可以在cache\mypplication\dev\modules\autoMymodule\lib中找到基类。查看这些基类以了解如何使用以及管理生成器可用的配置函数和帮助函数。

为了处理你的新动作,我不知道你正在开发的功能,所以我会试着想象两种可能的情况。您只能使用表单切换上传/创建图片的功能,通过自定义窗口小部件,覆盖模板_form.php,在您的代码段中调用,以及新操作等等,或者,这就是您关注的方式,创建一个完全独立的动作,表单和所有需要的模板。所以在你的makenewSucces.php中你可以包含一个用

调用的模板_makeform.php

<?php include_partial('poster/makeform', array('poster' => $poster, 'form' => $form, 'configuration' => $configuration, 'helper' => $helper)) ?>

当然,您必须将模板_makeform.php放在apps\docdesk\modules\mymodule\template中作为每个新模板或覆盖模板。

我不太清楚你在保存图像时遇到的麻烦...我想你要求图像的保存链以及你如何以及在哪里管理你需要的东西。 要添加小部件以在PosterForm类中上传图像,您可以使用这样的代码段,我们假设photo为小部件名称,根据架构字段photo: { type: varchar(255), required: true },当然自定义:

    public function configure()
    {
        $photo = $this->getObject()->getPhoto(); // get the photo name
        $photo = sfConfig::get('sf_upload_image_dir').$photo;

        $this->widgetSchema['photo'] = new sfWidgetFormInputFileEditable(array(
            'label'     => 'Photo',
            'file_src'  => $photo,
            'is_image'  => true,
            'edit_mode' => !$this->isNew(),
            'delete_label' => 'check to remove',
            'template'  => '<div>%input%<br/><br/>%file%<br/><br/>%delete%<p>%delete_label%<br/><p></div>'
        ));

        $this->validatorSchema['photo'] = new sfValidatorFile(array(
            'required'   => true,
            'path'            => sfConfig::get('sf_upload_image_dir'),
            'mime_categories' => array('web_images' => array(
                'image/jpeg',
                'image/pjpeg',
                'image/png',
                'image/x-png'
            )),
            'mime_types' => 'web_images',
        ));

        $this->validatorSchema['photo_delete'] = new sfValidatorPass();
    }

请注意,我upload_image_dir的设置为%SF_UPLOAD_DIR%/images/

Symfony会为您上传并保存图片!

然后,您可以根据自己的需要覆盖doSave功能,并在PosterForm课程中添加相同功能:

protected function doSave($con = null)
{
    $delete = $this->getValue('photo_delete');
    if ( $delete )
    {
        // ...
    }

    $upload = $this->getValue('photo');
    if ( $upload )
    {
        // ...
    }
    return parent::doSave($con);
}

最后要删除您的图像,即文件,当您删除对象时,即图像名称为字段的db记录,您必须将此代码放入模型类Poster:< / p>

public function delete(PropelPDO $con = null) // using Propel
{
    $photo = sfConfig::get('sf_upload_image_dir').$this->getPhoto();
    if ( file_exists($photo) )
        unlink($photo);

    return parent::delete($con);
}

我希望这可以帮到你。