Symfony чередует новое действие - PullRequest
1 голос
/ 09 декабря 2011

У меня есть сервер, на котором мне нужно хранить некоторые изображения.Теперь изображения можно загружать или создавать «на лету», скажем, просто добавив некоторый текст к некоторому изображению по умолчанию (поэтому я сделал для этого файл MakenewForm.php).Таблица в моей базе данных хранит имя файла в локальной файловой системе.Теперь загрузка проста, я могу просто использовать для этого действие _new по умолчанию.Для создания картинки я сделал новое действие, скажем makenew.new и makenew оба отображаются в виде списка.Я скопировал newSuccess.php в makenewSuccess.php.Теперь я хочу другой набор кнопок отправки для них.Я не могу понять, как это сделать.Все, что я вижу, это:

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

Я не знаю, что такое $ configuration и что такое $ helper.Может кто-нибудь рассказать мне о них?Какой из них мне нужно изменить и как?

Кроме того, как вы можете сделать вывод, действие submit для действия new должно выполнять только $form->save(), а действие submit makenew должновзять весь ввод текста и написать файл изображения (скажем, используя imagejpeg )

Мне нужны некоторые указатели для достижения этой цели.

1 Ответ

0 голосов
/ 10 декабря 2011

Я надеюсь сосредоточиться на том, что вы ищете.

О $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);
}

Наконец, чтобы удалить ваше изображение, то есть файл, когда вы удаляете объект, то есть запись в БД, где имя изображения является полем, вы должны поместить этот код в класс вашей модели Poster:

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);
}

Надеюсь, это поможет вам.

...